@next-bricks/ai-portal 0.64.9 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/bricks.json +16 -20
  2. package/dist/chunks/2742.670f78d2.js +2 -0
  3. package/dist/chunks/2742.670f78d2.js.map +1 -0
  4. package/dist/chunks/3186.5c0ff6ad.js +2 -0
  5. package/dist/chunks/3186.5c0ff6ad.js.map +1 -0
  6. package/dist/chunks/4208.694d7deb.js +2 -0
  7. package/dist/chunks/4208.694d7deb.js.map +1 -0
  8. package/dist/chunks/5452.a5594a29.js +2 -0
  9. package/dist/chunks/5452.a5594a29.js.map +1 -0
  10. package/dist/chunks/7139.4195ba95.js +2 -0
  11. package/dist/chunks/7139.4195ba95.js.map +1 -0
  12. package/dist/chunks/7712.06a445a6.js +2 -0
  13. package/dist/chunks/7712.06a445a6.js.map +1 -0
  14. package/dist/chunks/{chat-panel.abf4cbf4.js → chat-panel.313d3906.js} +2 -2
  15. package/dist/chunks/{chat-panel.abf4cbf4.js.map → chat-panel.313d3906.js.map} +1 -1
  16. package/dist/chunks/{chat-stream.c13cfc3f.js → chat-stream.90aa7647.js} +2 -2
  17. package/dist/chunks/{chat-stream.c13cfc3f.js.map → chat-stream.90aa7647.js.map} +1 -1
  18. package/dist/chunks/{elevo-sidebar.4aa42ab3.js → elevo-sidebar.fba49f67.js} +3 -3
  19. package/dist/chunks/elevo-sidebar.fba49f67.js.map +1 -0
  20. package/dist/chunks/main.97d00f7b.js +2 -0
  21. package/dist/chunks/{main.33e078cf.js.map → main.97d00f7b.js.map} +1 -1
  22. package/dist/examples.json +10 -13
  23. package/dist/images/d5f57ce1.png +0 -0
  24. package/dist/index.01059b82.js +2 -0
  25. package/dist/index.01059b82.js.map +1 -0
  26. package/dist/manifest.json +137 -169
  27. package/dist/types.json +96 -237
  28. package/dist-types/bootstrap.d.ts +0 -1
  29. package/dist-types/chat-stream/NodeChunk/NodeReasoning.d.ts +6 -0
  30. package/dist-types/chat-stream/i18n.d.ts +3 -1
  31. package/dist-types/chat-stream/interfaces.d.ts +6 -1
  32. package/dist-types/shared/ActivityPlan/ActivityPlan.d.ts +11 -0
  33. package/dist-types/shared/{PlanProgress → ActivityPlan}/i18n.d.ts +3 -2
  34. package/dist-types/shared/ChatBox/i18n.d.ts +3 -1
  35. package/dist-types/shared/constants.d.ts +1 -0
  36. package/dist-types/shared/getFlatChunks.d.ts +1 -1
  37. package/dist-types/shared/interfaces.d.ts +1 -1
  38. package/package.json +2 -2
  39. package/dist/chunks/1447.32e6384d.js +0 -2
  40. package/dist/chunks/1447.32e6384d.js.map +0 -1
  41. package/dist/chunks/3186.7220c09a.js +0 -2
  42. package/dist/chunks/3186.7220c09a.js.map +0 -1
  43. package/dist/chunks/4208.54a5a7dd.js +0 -2
  44. package/dist/chunks/4208.54a5a7dd.js.map +0 -1
  45. package/dist/chunks/4820.51e9c918.js +0 -2
  46. package/dist/chunks/4820.51e9c918.js.map +0 -1
  47. package/dist/chunks/778.1a43bbd5.js +0 -2
  48. package/dist/chunks/778.1a43bbd5.js.map +0 -1
  49. package/dist/chunks/9273.760f5efc.js +0 -2
  50. package/dist/chunks/9273.760f5efc.js.map +0 -1
  51. package/dist/chunks/elevo-sidebar.4aa42ab3.js.map +0 -1
  52. package/dist/chunks/gantt-chart.6c8b41fd.js +0 -2
  53. package/dist/chunks/gantt-chart.6c8b41fd.js.map +0 -1
  54. package/dist/chunks/main.33e078cf.js +0 -2
  55. package/dist/index.a6348301.js +0 -2
  56. package/dist/index.a6348301.js.map +0 -1
  57. package/dist-types/shared/PlanProgress/PlanProgress.d.ts +0 -15
  58. package/docs/gantt-chart.md +0 -37
  59. /package/dist/chunks/{elevo-sidebar.4aa42ab3.js.LICENSE.txt → elevo-sidebar.fba49f67.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks/3186.5c0ff6ad.js","mappings":"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","sources":["webpack:///./src/cruise-canvas/i18n.ts","webpack:///./src/cruise-canvas/Nav/Nav.module.css","webpack:///../../src/mergeRects.ts","webpack:///./src/cruise-canvas/styles.module.css?7c94","webpack:///./src/cruise-canvas/constants.ts","webpack:///./src/cruise-canvas/NodeJob/NodeJob.module.css?69ec","webpack:///./src/cruise-canvas/useZoom.ts","webpack:///./src/cruise-canvas/useLayout.ts","webpack:///./src/cruise-canvas/ZoomBar/ZoomBar.module.css?7d53","webpack:///./src/cruise-canvas/ZoomBar/ZoomBar.tsx","webpack:///./src/cruise-canvas/NodeStart/NodeStart.module.css?c135","webpack:///./src/cruise-canvas/NodeStart/NodeStart.tsx","webpack:///./src/cruise-canvas/NodeRequirement/NodeRequirement.module.css?7927","webpack:///./src/cruise-canvas/NodeRequirement/NodeRequirement.tsx","webpack:///./src/cruise-canvas/NodeInstruction/NodeInstruction.module.css?5e68","webpack:///./src/cruise-canvas/NodeInstruction/NodeInstruction.tsx","webpack:///./src/cruise-canvas/AIEmployeeAvatar/AIEmployeeAvatar.module.css?6f51","webpack:///./src/cruise-canvas/AIEmployeeAvatar/AIEmployeeAvatar.tsx","webpack:///./src/cruise-canvas/NodeJob/NodeJob.tsx","webpack:///./src/cruise-canvas/NodeEnd/NodeEnd.module.css?bd4b","webpack:///./src/cruise-canvas/NodeEnd/NodeEnd.tsx","webpack:///./src/cruise-canvas/ToolCallDetail/ToolCallDetailDrawer.tsx","webpack:///./src/cruise-canvas/utils/handleKeyboardNav.ts","webpack:///./src/cruise-canvas/Nav/Nav.module.css?7d2d","webpack:///./src/cruise-canvas/Nav/Nav.tsx","webpack:///./src/cruise-canvas/NodeLoading/NodeLoading.module.css?c803","webpack:///./src/cruise-canvas/NodeLoading/NodeLoading.tsx","webpack:///./src/shared/JsxEditor/JsxEditor.module.css?1c9c","webpack:///./src/shared/JsxEditor/JsxEditor.tsx","webpack:///./src/cruise-canvas/NodeError/NodeError.module.css?3e0b","webpack:///./src/cruise-canvas/NodeError/NodeError.tsx","webpack:///./src/cruise-canvas/NodeChunk/NodeChunk.tsx","webpack:///./src/cruise-canvas/CruiseCanvas.tsx","webpack:///./src/cruise-canvas/useConversationGraph.ts","webpack:///./src/cruise-canvas/useAutoCenter.ts","webpack:///./src/cruise-canvas/utils/getScrollTo.ts","webpack:///./src/cruise-canvas/NodeLoading/NodeLoading.module.css","webpack:///./src/cruise-canvas/AIEmployeeAvatar/AIEmployeeAvatar.module.css","webpack:///./src/cruise-canvas/styles.module.css","webpack:///./src/cruise-canvas/NodeRequirement/NodeRequirement.module.css","webpack:///./src/shared/JsxEditor/JsxEditor.module.css","webpack:///./src/cruise-canvas/NodeJob/NodeJob.module.css","webpack:///./src/cruise-canvas/NodeStart/NodeStart.module.css","webpack:///./src/cruise-canvas/NodeInstruction/NodeInstruction.module.css","webpack:///./src/cruise-canvas/NodeEnd/NodeEnd.module.css","webpack:///./src/cruise-canvas/ZoomBar/ZoomBar.module.css","webpack:///./src/cruise-canvas/NodeError/NodeError.module.css"],"sourcesContent":["import { i18n } from \"@next-core/i18n\";\n\nexport enum K {\n YES = \"YES\",\n NO = \"NO\",\n TASK_COMPLETED = \"TASK_COMPLETED\",\n SHARE = \"SHARE\",\n TYPE_YOUR_MESSAGE_HERE = \"TYPE_YOUR_MESSAGE_HERE\",\n SWITCH_TO_CHAT = \"SWITCH_TO_CHAT\",\n BACK_TO_CENTER = \"BACK_TO_CENTER\",\n ZOOM_IN = \"ZOOM_IN\",\n ZOOM_OUT = \"ZOOM_OUT\",\n FULLSCREEN = \"FULLSCREEN\",\n SEND_MESSAGE = \"SEND_MESSAGE\",\n UNTITLED = \"UNTITLED\",\n DOWNLOAD = \"DOWNLOAD\",\n INITIATING_SERVICE_FLOW = \"INITIATING_SERVICE_FLOW\",\n STARTING_SERVICE_FLOW_ACTIVITY = \"STARTING_SERVICE_FLOW_ACTIVITY\",\n}\n\nconst en: Locale = {\n YES: \"Yes\",\n NO: \"No\",\n TASK_COMPLETED: \"Task completed\",\n SHARE: \"Share\",\n TYPE_YOUR_MESSAGE_HERE: \"Type your message here\",\n SWITCH_TO_CHAT: \"Switch to chat\",\n BACK_TO_CENTER: \"Back to center\",\n ZOOM_IN: \"Zoom in\",\n ZOOM_OUT: \"Zoom out\",\n FULLSCREEN: \"Fullscreen\",\n SEND_MESSAGE: \"Send message\",\n UNTITLED: \"Untitled\",\n DOWNLOAD: \"Download\",\n INITIATING_SERVICE_FLOW: \"Initiating service flow: {{ name }}\",\n STARTING_SERVICE_FLOW_ACTIVITY: \"Starting service flow activity: {{ name }}\",\n};\n\nconst zh: Locale = {\n YES: \"是\",\n NO: \"否\",\n TASK_COMPLETED: \"任务完成\",\n SHARE: \"分享\",\n TYPE_YOUR_MESSAGE_HERE: \"在这里输入信息\",\n SWITCH_TO_CHAT: \"切换为聊天\",\n BACK_TO_CENTER: \"回中\",\n ZOOM_IN: \"放大\",\n ZOOM_OUT: \"缩小\",\n FULLSCREEN: \"全屏\",\n SEND_MESSAGE: \"发送消息\",\n UNTITLED: \"未命名\",\n DOWNLOAD: \"下载\",\n INITIATING_SERVICE_FLOW: \"发起业务流:{{ name }}\",\n STARTING_SERVICE_FLOW_ACTIVITY: \"开始业务流活动:{{ name }}\",\n};\n\nexport const NS = \"bricks/ai-portal/cruise-canvas\";\n\nexport const locales = { en, zh };\n\nexport const t = i18n.getFixedT(null, NS);\n\ntype Locale = { [k in K]: string } & {\n [k in K as `${k}_plural`]?: string;\n};\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.container--nviLvTo4{position:absolute;right:0;top:72px;bottom:72px;padding:48px 0;overflow-y:auto;scrollbar-width:none;pointer-events:none}.nav--lm9zwHhG{list-style:none;margin:0;padding:20px 0;background:rgba(255,255,255,0);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);pointer-events:auto}.container--nviLvTo4,\n.nav--lm9zwHhG{border-radius:8px 0px 0px 8px}.link--sJDeRfjL{display:flex;align-items:center;width:170px;height:36px;border-radius:18px 0 0 18px;padding:0 24px 0 16px;font-size:13px}.link--sJDeRfjL,\n.link--sJDeRfjL:hover{color:rgba(93,105,126,0.7)}.link--sJDeRfjL.disabled--UpGab11N{cursor:default}.item--B4GvcxMx:not(:first-child){margin-top:12px}.icon--YLvYVRdC{margin-right:12px;font-size:14px;color:#abaab7}.text--PwKz_ODc{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.link--sJDeRfjL:not(.disabled--UpGab11N):hover,\n.item--B4GvcxMx.active--DwuLIQY_ .link--sJDeRfjL{background-color:rgba(255,255,255,0.2)}.item--B4GvcxMx.active--DwuLIQY_ .link--sJDeRfjL{font-size:14px;color:#424a58;padding-right:16px}.completed--ZPZ8DEeN .icon--YLvYVRdC{color:#0fbe59}.failed--dxvB8UKT .icon--YLvYVRdC{color:#f24c25}.working--IbqFvpPm .icon--YLvYVRdC{color:var(--elevo-color-brand)}.input-required--zcO5ZufK .icon--YLvYVRdC{color:#12aacc}.canceled--GqvLm_YF .icon--YLvYVRdC{color:#fcaa07}@media (max-height: 639px){.container--nviLvTo4{padding:0}}@media (max-width: 719px){.container--nviLvTo4{display:none}}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"container\": `container--nviLvTo4`,\n\t\"nav\": `nav--lm9zwHhG`,\n\t\"link\": `link--sJDeRfjL`,\n\t\"disabled\": `disabled--UpGab11N`,\n\t\"item\": `item--B4GvcxMx`,\n\t\"icon\": `icon--YLvYVRdC`,\n\t\"text\": `text--PwKz_ODc`,\n\t\"active\": `active--DwuLIQY_`,\n\t\"completed\": `completed--ZPZ8DEeN`,\n\t\"failed\": `failed--dxvB8UKT`,\n\t\"working\": `working--IbqFvpPm`,\n\t\"input-required\": `input-required--zcO5ZufK`,\n\t\"canceled\": `canceled--GqvLm_YF`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","export interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Merges multiple rectangles into a single bounding rectangle.\n */\nexport function mergeRects(rects: Rect[]): Rect {\n let left = Infinity;\n let top = Infinity;\n let right = -Infinity;\n let bottom = -Infinity;\n for (const rect of rects) {\n const r = rect.x + rect.width;\n const b = rect.y + rect.height;\n if (rect.x < left) {\n left = rect.x;\n }\n if (r > right) {\n right = r;\n }\n if (rect.y < top) {\n top = rect.y;\n }\n if (b > bottom) {\n bottom = b;\n }\n }\n\n const width = right - left;\n const height = bottom - top;\n\n return { x: left, y: top, width, height };\n}\n","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./styles.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./styles.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","export const DEFAULT_SCALE_RANGE_MIN = 0.5;\nexport const DEFAULT_SCALE_RANGE_MAX = 2;\nexport const START_NODE_ID = \"<START>\";\nexport const END_NODE_ID = \"<END>\";\nexport const FEEDBACK_NODE_ID = \"<FEEDBACK>\";\nexport const REQUIREMENT_NODE_ID = \"<REQUIREMENT>\";\nexport const LOADING_NODE_ID = \"<LOADING>\";\nexport const ERROR_NODE_ID = \"<ERROR>\";\nexport const REPLAY_NODE_ID = \"<REPLAY>\";\nexport const CANVAS_PADDING_TOP = 20;\nexport const CANVAS_PADDING_RIGHT = 20;\n// 20 + 48 + 8 + 26 + 20\nexport const CANVAS_PADDING_BOTTOM = 122;\nexport const CANVAS_PADDING_LEFT = 160;\nexport const RANK_SEP = 40;\nexport const NODE_SEP = 42;\nexport const EDGE_SEP = 10;\n\n// istanbul ignore next\nexport const IS_MAC = /mac/i.test(\n (\n navigator as Navigator & {\n userAgentData?: {\n platform: string;\n };\n }\n ).userAgentData?.platform ??\n navigator.platform ??\n navigator.userAgent\n);\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeJob.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeJob.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: hard to test with d3-zoom\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { select } from \"d3-selection\";\nimport { zoom, type ZoomBehavior } from \"d3-zoom\";\nimport type {\n RangeTuple,\n TransformLiteral /* , ActiveTarget */,\n} from \"./interfaces\";\nimport {\n DEFAULT_SCALE_RANGE_MIN,\n DEFAULT_SCALE_RANGE_MAX,\n IS_MAC,\n} from \"./constants\";\n// import type { ActiveTarget } from \"./interfaces\";\nimport jobStyles from \"./NodeJob/NodeJob.module.css\";\n\nexport interface UseZoomOptions {\n rootRef: React.RefObject<HTMLDivElement>;\n zoomable?: boolean;\n scrollable?: boolean;\n pannable?: boolean;\n pannableWithCtrl?: boolean;\n scaleRange?: RangeTuple;\n manualScrolledUpRef: React.MutableRefObject<boolean>;\n onSwitchActiveTarget?(target: unknown | null): void;\n}\n\nexport interface UseZoomResult {\n grabbing: boolean;\n transform: TransformLiteral;\n transformRef: React.MutableRefObject<TransformLiteral>;\n scaleRange: RangeTuple;\n zoomer: ZoomBehavior<HTMLDivElement, unknown>;\n}\n\n// istanbul ignore next\nfunction wheelData(event: WheelEvent) {\n // On Windows with normal mouse, deltaY is too big when scroll with ctrlKey pressed,\n // which cause the zooming too fast.\n // While on mac OS, we need to keep default behavior of d3-zoom.\n return (\n -event.deltaY *\n (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) *\n (event.ctrlKey && IS_MAC ? 10 : 1)\n );\n}\n\nexport function useZoom({\n rootRef,\n zoomable,\n scrollable,\n pannable,\n pannableWithCtrl,\n scaleRange: _scaleRange,\n manualScrolledUpRef,\n onSwitchActiveTarget,\n}: UseZoomOptions): UseZoomResult {\n const [grabbing, setGrabbing] = useState(false);\n const [transform, setTransform] = useState<TransformLiteral>({\n k: 1,\n x: 0,\n y: 0,\n });\n const transformRef = useRef(transform);\n\n const scaleRange = useMemo(\n () =>\n _scaleRange ??\n ([DEFAULT_SCALE_RANGE_MIN, DEFAULT_SCALE_RANGE_MAX] as RangeTuple),\n [_scaleRange]\n );\n\n const zoomer = useMemo(\n () => zoom<HTMLDivElement, unknown>().wheelDelta(wheelData),\n []\n );\n\n // istanbul ignore next: d3-zoom currently hard to test\n useEffect(() => {\n let moved = false;\n zoomer\n .scaleExtent(zoomable ? scaleRange : [1, 1])\n .on(\"start\", () => {\n moved = false;\n setGrabbing(true);\n })\n .on(\"zoom\", (e: { transform: TransformLiteral }) => {\n moved = true;\n setTransform(e.transform);\n transformRef.current = e.transform;\n })\n .on(\"end\", () => {\n setGrabbing(false);\n if (!moved) {\n onSwitchActiveTarget?.(null);\n }\n })\n .filter(\n (event) =>\n // For wheel event, ignore d3 default behavior, because we control it manually.\n // Except for the trackpad pinch event on Mac OS (with ctrlKey).\n (event.type === \"wheel\"\n ? event.ctrlKey\n : pannableWithCtrl\n ? pannable || event.ctrlKey\n : !event.ctrlKey) && !event.button\n );\n }, [\n onSwitchActiveTarget,\n scaleRange,\n zoomable,\n zoomer,\n pannableWithCtrl,\n pannable,\n ]);\n\n useEffect(() => {\n if (pannableWithCtrl) {\n const onContextMenu = (e: MouseEvent) => {\n if (e.ctrlKey) {\n e.preventDefault();\n }\n };\n document.addEventListener(\"contextmenu\", onContextMenu, true);\n return () => {\n document.removeEventListener(\"contextmenu\", onContextMenu, true);\n };\n }\n }, [pannableWithCtrl]);\n\n // istanbul ignore next: d3-zoom currently hard to test\n useEffect(() => {\n const root = rootRef.current;\n if (!root) {\n return;\n }\n\n const rootSelection = select(root);\n\n const unsetZoom = () => {\n rootSelection\n .on(\".zoom\", null)\n .on(\".zoom.custom\", null)\n .on(\"wheel\", null);\n };\n\n if (!(zoomable || scrollable || pannable)) {\n unsetZoom();\n return;\n }\n\n if (zoomable || scrollable) {\n // Do not override default d3 zoom handler.\n // Only handles *panning*\n rootSelection.on(\n \"wheel.zoom.custom\",\n (e: WheelEvent & { wheelDeltaX: number; wheelDeltaY: number }) => {\n // Mac OS trackpad pinch event is emitted as a wheel.zoom and d3.event.ctrlKey set to true\n if (!e.ctrlKey && scrollable) {\n const node = (e.target as HTMLElement).closest(\n `.${jobStyles.body}`\n );\n if (node) {\n if (checkScrollableY(node, e.deltaY)) {\n return;\n }\n }\n\n if (e.cancelable) {\n if (e.deltaY < 0) {\n manualScrolledUpRef.current = true;\n }\n e.preventDefault();\n zoomer.translateBy(\n rootSelection,\n e.wheelDeltaX / 5,\n e.wheelDeltaY / 5\n );\n }\n }\n // zoomer.scaleBy(rootSelection, Math.pow(2, defaultWheelDelta(e)))\n }\n );\n }\n\n rootSelection\n .call(zoomer)\n .on(\"wheel\", (e: WheelEvent) => {\n if (scrollable || (zoomable && e.ctrlKey)) {\n e.preventDefault();\n }\n })\n .on(\"dblclick.zoom\", null);\n\n if (!pannable && !pannableWithCtrl) {\n rootSelection.on(\"mousedown.zoom\", null);\n }\n\n if (!pannable) {\n rootSelection\n .on(\"touchstart.zoom\", null)\n .on(\"touchmove.zoom\", null)\n .on(\"touchend.zoom\", null);\n }\n\n return unsetZoom;\n }, [\n pannableWithCtrl,\n pannable,\n rootRef,\n manualScrolledUpRef,\n scrollable,\n zoomable,\n zoomer,\n ]);\n\n return { grabbing, transform, transformRef, zoomer, scaleRange };\n}\n\n// 检查元素是否还能滚动\nfunction checkScrollableY(element: Element, delta: number) {\n if (!delta) {\n return false;\n }\n const isScrollingDown = delta > 0;\n // 还能向下滚动 或 还能向上滚动\n if (isScrollingDown) {\n const maxScroll = element.scrollHeight - element.clientHeight;\n return element.scrollTop <= maxScroll - 1;\n }\n return element.scrollTop >= 1;\n}\n\n// 检查元素是否还能滚动\n// function checkScrollableX(element: Element, delta: number) {\n// if (!delta) {\n// return false;\n// }\n// const isScrollingRight = delta > 0; // Updated variable name for clarity\n// // 还能向右滚动 或 还能向左滚动\n// if (isScrollingRight) {\n// const maxScroll = element.scrollWidth - element.clientWidth; // Changed to scrollWidth and clientWidth\n// return element.scrollLeft <= maxScroll - 1; // Changed to scrollLeft\n// }\n// return element.scrollLeft >= 1;\n// }\n","import dagre from \"@dagrejs/dagre\";\nimport { useMemo, useRef } from \"react\";\nimport type {\n NodePosition,\n NodeRect,\n GraphEdge,\n GraphNode,\n SizeTuple,\n} from \"./interfaces\";\nimport {\n EDGE_SEP,\n END_NODE_ID,\n FEEDBACK_NODE_ID,\n NODE_SEP,\n RANK_SEP,\n REPLAY_NODE_ID,\n START_NODE_ID,\n} from \"./constants\";\n\nexport interface UseLayoutOptions {\n rawNodes: GraphNode[] | undefined;\n rawEdges: GraphEdge[] | undefined;\n sizeMap: Map<string, SizeTuple> | null;\n completed?: boolean;\n failed?: boolean;\n finished?: boolean;\n showFeedback?: boolean;\n showFeedbackAfterFailed?: boolean;\n replay?: boolean;\n noTasks?: boolean;\n}\n\nexport function useLayout({\n rawNodes: _rawNodes,\n rawEdges: _rawEdges,\n sizeMap,\n completed,\n failed,\n finished,\n showFeedback,\n showFeedbackAfterFailed,\n replay,\n noTasks,\n}: UseLayoutOptions) {\n const memoizedPositionsRef = useRef<Map<string, NodePosition> | null>(null);\n\n const { initialNodes, initialEdges } = useMemo(() => {\n const initialNodes: GraphNode[] = [\n {\n type: \"start\",\n id: START_NODE_ID,\n },\n ];\n const initialEdges: GraphEdge[] = [];\n const finishedNodeIds: string[] = [];\n const rawNodes = _rawNodes ?? [];\n const rawEdges = _rawEdges ?? [];\n\n const hasSource = new Set<string>(rawEdges.map((edge) => edge.target));\n const failedFeedback = failed && showFeedback && showFeedbackAfterFailed;\n const shouldAppend = replay\n ? finished\n : !noTasks && (completed || failedFeedback);\n const hasTarget = shouldAppend\n ? new Set<string>(rawEdges.map((edge) => edge.source))\n : null;\n\n for (const node of rawNodes) {\n if (!hasSource.has(node.id)) {\n initialEdges.push({\n source: START_NODE_ID,\n target: node.id,\n });\n }\n\n if (shouldAppend && !hasTarget!.has(node.id)) {\n finishedNodeIds.push(node.id);\n }\n }\n\n initialNodes.push(...rawNodes);\n initialEdges.push(...rawEdges);\n\n if (finishedNodeIds.length > 0) {\n let sourceIds = finishedNodeIds;\n\n if (replay && finished) {\n initialNodes.push({\n id: END_NODE_ID,\n type: \"end\",\n });\n initialEdges.push(\n ...sourceIds.map((id) => ({\n source: id,\n target: END_NODE_ID,\n }))\n );\n initialNodes.push({\n id: REPLAY_NODE_ID,\n type: \"replay\",\n });\n initialEdges.push({\n source: END_NODE_ID,\n target: REPLAY_NODE_ID,\n });\n } else {\n if (completed) {\n initialNodes.push({\n id: END_NODE_ID,\n type: \"end\",\n });\n initialEdges.push(\n ...sourceIds.map((id) => ({\n source: id,\n target: END_NODE_ID,\n }))\n );\n sourceIds = [END_NODE_ID];\n }\n\n if (showFeedback && !noTasks && (completed || failedFeedback)) {\n initialNodes.push({\n id: FEEDBACK_NODE_ID,\n type: \"feedback\",\n });\n for (const id of sourceIds) {\n initialEdges.push({\n source: id,\n target: FEEDBACK_NODE_ID,\n });\n }\n }\n }\n }\n\n const memoizedPositions = memoizedPositionsRef.current;\n if (memoizedPositions) {\n for (const node of initialNodes) {\n const view = memoizedPositions.get(node.id);\n if (view) {\n node.view = view as NodeRect;\n }\n }\n }\n\n return { initialNodes, initialEdges };\n }, [\n _rawNodes,\n _rawEdges,\n completed,\n failed,\n finished,\n showFeedback,\n showFeedbackAfterFailed,\n replay,\n ]);\n\n const startNodePositionRef = useRef<NodePosition | null>(null);\n\n return useMemo(() => {\n for (const node of initialNodes) {\n if (!sizeMap?.has(node.id)) {\n return { sizeReady: false, nodes: initialNodes, edges: [] };\n }\n }\n\n const graph = new dagre.graphlib.Graph();\n graph.setGraph({\n rankdir: \"TB\",\n nodesep: NODE_SEP,\n edgesep: EDGE_SEP,\n ranksep: RANK_SEP,\n });\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function () {\n return {};\n });\n for (const edge of initialEdges) {\n graph.setEdge(edge.source, edge.target);\n }\n for (const node of initialNodes) {\n const [width, height] = sizeMap!.get(node.id)!;\n graph.setNode(node.id, {\n id: node.id,\n width,\n height,\n });\n }\n dagre.layout(graph);\n\n // Make the start node position unchanged\n let offsets: NodePosition | null = null;\n\n const nodes = initialNodes.map<GraphNode>((node) => {\n const nodeView = graph.node(node.id);\n const x = nodeView.x - nodeView.width / 2;\n const y = nodeView.y - nodeView.height / 2;\n\n if (node.type === \"start\") {\n if (startNodePositionRef.current) {\n offsets = {\n x: startNodePositionRef.current.x - x,\n y: startNodePositionRef.current.y - y,\n };\n } else {\n startNodePositionRef.current = { x, y };\n }\n }\n\n return {\n ...node,\n view: {\n x,\n y,\n width: nodeView.width,\n height: nodeView.height,\n },\n };\n });\n\n if (offsets) {\n for (const node of nodes) {\n Object.assign(node.view!, getPositionWithOffsets(node.view!, offsets));\n }\n }\n\n const memoizedPositions = (memoizedPositionsRef.current ??= new Map());\n for (const node of nodes) {\n const { x, y } = node.view!;\n memoizedPositions.set(node.id, { x, y });\n }\n\n const edges = initialEdges.map((edge) => {\n const source = graph.node(edge.source);\n const sourcePosition = getPositionWithOffsets(source, offsets);\n const target = graph.node(edge.target);\n const targetPosition = getPositionWithOffsets(target, offsets);\n // const turnY =\n // (sourcePosition.y +\n // source.height / 2 +\n // targetPosition.y -\n // target.height / 2) /\n // 2;\n const turnY = targetPosition.y - (target.height + RANK_SEP) / 2;\n const points: NodePosition[] = [\n { x: sourcePosition.x, y: sourcePosition.y + source.height / 2 },\n { x: sourcePosition.x, y: turnY },\n { x: targetPosition.x, y: turnY },\n { x: targetPosition.x, y: targetPosition.y - target.height / 2 },\n ];\n\n return {\n ...edge,\n points,\n };\n });\n\n return {\n sizeReady: true,\n nodes,\n edges,\n };\n }, [initialEdges, initialNodes, sizeMap]);\n}\n\nfunction getPositionWithOffsets<T extends NodePosition>(\n position: T,\n offsets: NodePosition | null\n): NodePosition {\n if (!offsets) {\n return {\n x: position.x,\n y: position.y,\n };\n }\n return {\n x: position.x + offsets.x,\n y: position.y + offsets.y,\n };\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./ZoomBar.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./ZoomBar.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React, { useCallback } from \"react\";\nimport type { GeneralIconProps } from \"@next-bricks/icons/general-icon\";\nimport styles from \"./ZoomBar.module.css\";\nimport toolbarStyles from \"../toolbar.module.css\";\nimport { WrappedIconButton } from \"../../shared/bricks\";\nimport { K, t } from \"../i18n\";\nimport { ICON_CHAT } from \"../../shared/constants\";\n\nconst ICON_BACK_TO_CENTER: GeneralIconProps = {\n lib: \"easyops\",\n icon: \"back-to-center\",\n};\nconst ICON_ZOOM_OUT: GeneralIconProps = {\n lib: \"antd\",\n icon: \"minus-circle\",\n};\nconst ICON_ZOOM_IN: GeneralIconProps = {\n lib: \"antd\",\n icon: \"plus-circle\",\n};\n\nexport interface ZoomBarProps {\n scale: number;\n showUiSwitch?: boolean;\n onScaleChange?: (scale: number) => void;\n onReCenter?: () => void;\n onSwitchToChat?: () => void;\n}\n\nexport function ZoomBar({\n scale,\n showUiSwitch,\n onScaleChange,\n onReCenter,\n onSwitchToChat,\n}: ZoomBarProps): JSX.Element {\n const handleZoomIn = useCallback(() => {\n onScaleChange?.(scale + 0.1);\n }, [onScaleChange, scale]);\n\n const handleZoomOut = useCallback(() => {\n onScaleChange?.(scale - 0.1);\n }, [onScaleChange, scale]);\n\n return (\n <div className={`${toolbarStyles.toolbar} ${styles[\"zoom-bar\"]}`}>\n {showUiSwitch && (\n <>\n <WrappedIconButton\n variant=\"mini\"\n icon={ICON_CHAT}\n onClick={onSwitchToChat}\n />\n <div className={toolbarStyles.divider}></div>\n </>\n )}\n <WrappedIconButton\n variant=\"mini\"\n icon={ICON_BACK_TO_CENTER}\n onClick={onReCenter}\n title={t(K.BACK_TO_CENTER)}\n />\n <div className={toolbarStyles.divider}></div>\n <WrappedIconButton\n variant=\"mini\"\n icon={ICON_ZOOM_OUT}\n onClick={handleZoomOut}\n title={t(K.ZOOM_OUT)}\n />\n <WrappedIconButton\n variant=\"mini\"\n icon={ICON_ZOOM_IN}\n onClick={handleZoomIn}\n title={t(K.ZOOM_IN)}\n />\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeStart.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeStart.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React from \"react\";\nimport styles from \"./NodeStart.module.css\";\n\nexport function NodeStart(): JSX.Element {\n return (\n <div className={styles[\"node-start\"]}>\n <div className={styles.icon} />\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeRequirement.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeRequirement.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type {\n EoEasyopsAvatar,\n EoEasyopsAvatarProps,\n} from \"@next-bricks/basic/easyops-avatar\";\nimport moment from \"moment\";\nimport classNames from \"classnames\";\nimport styles from \"./NodeRequirement.module.css\";\nimport type { CommandPayload, FileInfo } from \"../../shared/interfaces\";\nimport { ReadableCommand } from \"../../shared/ReadableCommand/ReadableCommand\";\nimport { FileList } from \"../../shared/FilePreview/FileList\";\n\nconst WrappedEasyOpsAvatar = wrapBrick<EoEasyopsAvatar, EoEasyopsAvatarProps>(\n \"eo-easyops-avatar\"\n);\n\nexport interface NodeRequirementProps {\n username?: string;\n content?: string;\n startTime?: number;\n active?: boolean;\n cmd?: CommandPayload;\n mentionedAiEmployeeId?: string;\n files?: FileInfo[];\n}\n\nexport function NodeRequirement({\n username,\n content,\n startTime,\n active,\n cmd,\n mentionedAiEmployeeId,\n files,\n}: NodeRequirementProps): JSX.Element {\n return (\n <div\n className={classNames(styles[\"node-requirement\"], {\n [styles.active]: active,\n })}\n >\n <div className={styles.heading}>\n <WrappedEasyOpsAvatar\n className={styles.avatar}\n nameOrInstanceId={username}\n showName\n size=\"xs\"\n />\n <div className={styles.time}>\n {startTime && moment(startTime * 1000).format(\"MM-DD HH:mm\")}\n </div>\n </div>\n <div className={styles.body}>\n {(cmd || mentionedAiEmployeeId) && (\n <ReadableCommand\n cmd={cmd}\n mentionedAiEmployeeId={mentionedAiEmployeeId}\n size=\"small\"\n />\n )}\n {content}\n {files?.length ? <FileList files={files} /> : null}\n </div>\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeInstruction.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeInstruction.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React from \"react\";\nimport classNames from \"classnames\";\nimport styles from \"./NodeInstruction.module.css\";\nimport sharedStyles from \"../shared.module.css\";\n\nexport interface NodeInstructionProps {\n content?: string;\n loading?: boolean;\n}\n\nexport function NodeInstruction({\n content,\n loading,\n}: NodeInstructionProps): JSX.Element {\n return (\n <div className={styles[\"node-instruction\"]}>\n <div\n className={classNames(styles.text, {\n [sharedStyles[\"shine-text\"]]: loading,\n })}\n title={content}\n >\n {content}\n </div>\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./AIEmployeeAvatar.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./AIEmployeeAvatar.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { Suspense, use, useMemo } from \"react\";\nimport { wrapBrick } from \"@next-core/react-element\";\nimport type { AvatarProps, EoAvatar } from \"@next-bricks/basic/avatar\";\nimport type { ElevoApi_ListElevoAiEmployeesResponseItem } from \"@next-api-sdk/llm-sdk\";\nimport fallbackAvatar from \"./fallback-avatar.png\";\nimport styles from \"./AIEmployeeAvatar.module.css\";\nimport { fetchEmployee } from \"../../shared/fetchEmployee\";\n\nconst WrappedAvatar = wrapBrick<EoAvatar, AvatarProps>(\"eo-avatar\");\n\nexport interface AIEmployeeAvatarProps {\n aiEmployeeId: string;\n}\n\nexport function AIEmployeeAvatar({ aiEmployeeId }: AIEmployeeAvatarProps) {\n return (\n <Suspense\n fallback={\n <WrappedAvatar\n className={styles.avatar}\n showName\n size=\"xs\"\n name={aiEmployeeId}\n src={fallbackAvatar}\n />\n }\n >\n <LegacyAIEmployeeAvatar aiEmployeeId={aiEmployeeId} />\n </Suspense>\n );\n}\n\nfunction LegacyAIEmployeeAvatar({ aiEmployeeId }: AIEmployeeAvatarProps) {\n const employeePromise = useMemo(() => {\n return fetchEmployee(aiEmployeeId);\n }, [aiEmployeeId]);\n\n const employee = use(employeePromise);\n\n const props = useMemo(() => {\n if (!employee) {\n return {\n name: aiEmployeeId,\n src: fallbackAvatar,\n };\n }\n const { name, avatar } =\n employee as ElevoApi_ListElevoAiEmployeesResponseItem & {\n avatar?: string;\n };\n const src = avatar\n ? new URL(avatar, location.origin).toString()\n : fallbackAvatar;\n return {\n name,\n src,\n };\n }, [employee, aiEmployeeId]);\n\n return (\n <WrappedAvatar className={styles.avatar} showName size=\"xs\" {...props} />\n );\n}\n","// istanbul ignore file: experimental\nimport React, {\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport styles from \"./NodeJob.module.css\";\nimport sharedStyles from \"../shared.module.css\";\nimport type { CmdbInstanceDetailData } from \"../interfaces\";\nimport { FileInfo, Job } from \"../../shared/interfaces\";\nimport { ToolCallStatus } from \"../ToolCallStatus/ToolCallStatus.js\";\nimport { EnhancedMarkdown } from \"../EnhancedMarkdown/EnhancedMarkdown\";\nimport { CmdbInstanceDetail } from \"../CmdbInstanceDetail/CmdbInstanceDetail\";\nimport { FileList } from \"../../shared/FilePreview/FileList\";\nimport { RequestHumanAction } from \"../../shared/RequestHumanAction/RequestHumanAction\";\nimport { AIEmployeeAvatar } from \"../AIEmployeeAvatar/AIEmployeeAvatar\";\nimport { CreatedView } from \"../../shared/CreatedView/CreatedView\";\nimport { CanvasContext } from \"../CanvasContext\";\nimport { ViewToolbar } from \"../../shared/CreatedView/ViewToolbar\";\n\n// 当 markdown 中包含超过 4 列的表格时,对节点使用大尺寸样式\nconst RegExpLargeTableInMarkdown = /^\\s*\\|(?:\\s*:?-+:?\\s*\\|){4,}\\s*$/m;\n\nexport interface NodeJobProps {\n job: Job;\n active?: boolean;\n isLeaf?: boolean;\n}\n\nexport function NodeJob({ job, active, isLeaf }: NodeJobProps): JSX.Element {\n const toolName = job.toolCall?.name;\n\n const [toolMarkdownContent, cmdbInstanceDetails, files, sizeLarge] =\n useMemo(() => {\n const contents: string[] = [];\n const instanceDetails: CmdbInstanceDetailData[] = [];\n const files: FileInfo[] = [];\n let large = toolName === \"llm_answer\";\n job.messages?.forEach((message) => {\n if (message.role === \"tool\") {\n for (const part of message.parts) {\n if (part.type === \"data\") {\n switch (part.data?.type) {\n case \"markdown\":\n contents.push(part.data.content);\n break;\n case \"cmdb_instance_detail\":\n instanceDetails.push(part.data as CmdbInstanceDetailData);\n if (!large) {\n large =\n Object.keys(\n part.data?.outputSchema?.type === \"object\"\n ? part.data.outputSchema.properties\n : part.data.detail\n ).length > 6;\n }\n break;\n }\n } else if (part.type === \"file\") {\n files.push(part.file);\n }\n }\n }\n });\n\n const markdownContent = contents.join(\"\");\n\n large = large || RegExpLargeTableInMarkdown.test(markdownContent);\n\n return [markdownContent, instanceDetails, files, large] as const;\n }, [job.messages, toolName]);\n\n const [viewSize, setViewSize] = useState<\"medium\" | \"large\">(\"medium\");\n\n const handleViewSizeChange = useCallback((value: \"medium\" | \"large\") => {\n setViewSize(value);\n }, []);\n\n return (\n <div\n className={classNames(styles[\"node-job\"], {\n [styles.error]: job.isError,\n [styles.active]: active,\n [styles.large]: sizeLarge || viewSize === \"large\",\n })}\n >\n <div className={styles.background} />\n {job.aiEmployeeId ? (\n <div className={styles.heading}>\n <AIEmployeeAvatar aiEmployeeId={job.aiEmployeeId} />\n {job.generatedView ? <ViewToolbar job={job} /> : null}\n </div>\n ) : null}\n <div className={styles.body}>\n {job.toolCall && <ToolCallStatus job={job} />}\n {job.messages?.map((message, index) =>\n message.role === \"tool\" ? null : (\n <div\n key={index}\n className={classNames(styles.message, sharedStyles.markdown, {\n [styles[\"role-user\"]]:\n message.role === \"tool\" || message.role === \"user\",\n })}\n >\n {message.parts?.map((part, partIndex) => (\n <React.Fragment key={partIndex}>\n {part.type === \"text\" && (\n <EnhancedMarkdown\n className={sharedStyles[\"markdown-wrapper\"]}\n content={part.text}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n )\n )}\n {toolMarkdownContent && (\n <div\n className={classNames(styles.message, sharedStyles.markdown)}\n style={{ padding: \"0 8px\" }}\n >\n <EnhancedMarkdown\n className={sharedStyles[\"markdown-wrapper\"]}\n content={toolMarkdownContent}\n />\n </div>\n )}\n {cmdbInstanceDetails.map((detail, index) => (\n <CmdbInstanceDetail key={index} {...detail} />\n ))}\n {files.length > 0 && <FileList files={files} large={sizeLarge} />}\n {isLeaf &&\n !job.humanAction &&\n job.requestHumanAction &&\n (job.state === \"working\" || job.state === \"input-required\") && (\n <RequestHumanAction action={job.requestHumanAction} />\n )}\n </div>\n {job.generatedView ? (\n <ViewContainer job={job} onSizeChange={handleViewSizeChange} />\n ) : null}\n </div>\n );\n}\n\ninterface ViewContainerProps {\n job: Job;\n onSizeChange?: (value: \"medium\" | \"large\") => void;\n}\n\nfunction ViewContainer({ job, onSizeChange }: ViewContainerProps) {\n const ref = useRef<HTMLDivElement>(null);\n const { setHoverOnScrollableContent } = useContext(CanvasContext);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n let found = false;\n let scrollableContent: HTMLElement | undefined;\n for (const el of e.nativeEvent.composedPath()) {\n if (el === ref.current) {\n break;\n }\n if (!(el instanceof HTMLElement)) {\n continue;\n }\n if (el.tagName === \"PRE\") {\n if (el.scrollWidth > el.clientWidth) {\n found = true;\n break;\n }\n } else if (el.classList.contains(\"ant-table-content\")) {\n scrollableContent = el;\n } else if (\n el.classList.contains(\"ant-table\") &&\n el.classList.contains(\"ant-table-scroll-horizontal\")\n ) {\n if (\n scrollableContent &&\n scrollableContent.scrollWidth > scrollableContent.clientWidth\n ) {\n found = true;\n break;\n }\n }\n }\n setHoverOnScrollableContent(found);\n },\n [setHoverOnScrollableContent]\n );\n\n const handleMouseLeave = useCallback(() => {\n setHoverOnScrollableContent(false);\n }, [setHoverOnScrollableContent]);\n\n return (\n <div\n className={styles[\"view-container\"]}\n ref={ref}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n <CreatedView job={job} noHeading onSizeChange={onSizeChange} />\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeEnd.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeEnd.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React, { useContext } from \"react\";\nimport styles from \"./NodeEnd.module.css\";\nimport { K, t } from \"../i18n\";\nimport { WrappedIcon } from \"../../shared/bricks\";\nimport { TaskContext } from \"../../shared/TaskContext\";\n\nexport function NodeEnd(): JSX.Element {\n const { onShare, replay, conversationState } = useContext(TaskContext);\n\n return (\n <div className={styles[\"node-end\"]}>\n {replay && conversationState === \"completed\" && (\n <div className={styles.content}>\n <span className={styles.icon}>\n <WrappedIcon lib=\"fa\" prefix=\"fas\" icon=\"check\" />\n </span>\n <span className={styles.text}>{t(K.TASK_COMPLETED)}</span>\n </div>\n )}\n {!replay && (\n <button className={styles.button} onClick={onShare}>\n {t(K.SHARE)}\n </button>\n )}\n </div>\n );\n}\n","import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { Drawer } from \"@next-bricks/containers/drawer\";\nimport type { Job } from \"../../shared/interfaces\";\nimport { WrappedDrawer } from \"../../shared/bricks\";\nimport { TaskContext } from \"../../shared/TaskContext\";\nimport { ToolCallStatus } from \"../ToolCallStatus/ToolCallStatus\";\nimport { ToolCallDetail } from \"./ToolCallDetail\";\n\nexport interface ToolCallDetailDrawerProps {\n job: Job;\n}\n\nfunction getDrawerWidth() {\n const { innerWidth } = window;\n return innerWidth < 800\n ? Math.min(500, innerWidth)\n : innerWidth < 1000\n ? innerWidth * 0.8\n : 800;\n}\n\nexport function ToolCallDetailDrawer({\n job,\n}: ToolCallDetailDrawerProps): JSX.Element {\n const { setActiveDetail } = useContext(TaskContext);\n const toolCall = job.toolCall!;\n const toolTitle = toolCall.annotations?.title;\n\n const handleClose = useCallback(() => {\n setTimeout(() => {\n setActiveDetail(null);\n }, 300);\n }, [setActiveDetail]);\n\n const ref = useRef<Drawer>(null);\n\n useEffect(() => {\n setTimeout(() => {\n ref.current?.open();\n });\n }, []);\n\n const [width, setWidth] = useState(getDrawerWidth);\n\n useEffect(() => {\n const onResize = () => {\n setWidth(getDrawerWidth);\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n }, []);\n\n return (\n <WrappedDrawer\n ref={ref}\n customTitle={toolTitle || toolCall.name}\n width={width}\n closable\n mask\n maskClosable\n keyboard\n themeVariant=\"elevo\"\n onClose={handleClose}\n >\n <ToolCallStatus job={job} variant=\"read-only\" />\n <ToolCallDetail job={job} />\n </WrappedDrawer>\n );\n}\n","import { maxBy, minBy } from \"lodash\";\nimport type { GraphNode, NodePosition, NodeRect } from \"../interfaces\";\nimport { IS_MAC } from \"../constants\";\n\nexport type KeyboardAction =\n | KeyboardActionSwitchActiveNode\n | KeyboardActionEnter\n | KeyboardActionScroll;\n\nexport interface KeyboardActionSwitchActiveNode {\n action: \"switch-active-node\";\n node: GraphNode | null;\n}\n\nexport interface KeyboardActionEnter {\n action: \"enter\";\n node: GraphNode;\n}\n\nexport interface KeyboardActionScroll {\n action: \"scroll\";\n direction: \"up\" | \"down\" | \"left\" | \"right\";\n range: \"line\" | \"page\" | \"document\";\n node?: undefined;\n}\n\n/**\n * Keyboard navigation:\n * - When no node is active, simulate browser page scrolling shortcuts:\n * - Space: scroll down (or up with shift) by page\n * - Arrow keys: scroll by line in the direction of the arrow\n * - Arrow up/down with ⌘ on Mac: scroll to top/bottom of document\n * - Home/end: scroll to top/bottom of document\n * - When a node is active:\n * - Arrow keys: switch active node in the direction of the arrow\n * - Arrow up/down with ⌘ on Mac: switch active node to the top/bottom most node\n * - Escape: clear active node\n * - Enter: Enter the detail of the active node\n */\nexport function handleKeyboardNav(\n event: KeyboardEvent,\n {\n activeNodeId,\n nodes,\n }: {\n activeNodeId: string | null;\n nodes: GraphNode[];\n }\n): KeyboardAction | undefined {\n if (event.ctrlKey || event.altKey) {\n return;\n }\n\n const activeNode = activeNodeId\n ? nodes.find((node) => node.id === activeNodeId)\n : null;\n\n const key = event.key;\n\n if (!activeNode) {\n if (key === \" \" && !event.metaKey) {\n return {\n action: \"scroll\",\n direction: event.shiftKey ? \"down\" : \"up\",\n range: \"page\",\n };\n }\n\n if (event.shiftKey || (!IS_MAC && event.metaKey)) {\n return;\n }\n\n switch (key) {\n case \"Home\":\n return {\n action: \"scroll\",\n direction: \"up\",\n range: \"document\",\n };\n case \"End\":\n return {\n action: \"scroll\",\n direction: \"down\",\n range: \"document\",\n };\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const direction = key === \"ArrowUp\" ? \"up\" : \"down\";\n if (event.metaKey) {\n return {\n action: \"scroll\",\n direction,\n range: \"document\",\n };\n }\n return {\n action: \"scroll\",\n direction,\n range: \"line\",\n };\n }\n case \"ArrowLeft\":\n case \"ArrowRight\":\n if (!event.metaKey) {\n return {\n action: \"scroll\",\n direction: key === \"ArrowLeft\" ? \"left\" : \"right\",\n range: \"line\",\n };\n }\n }\n\n // Move up or down by arrow keys\n\n return;\n }\n\n if (event.shiftKey || (!IS_MAC && event.metaKey)) {\n return;\n }\n\n const moveOnAxis = (axis: \"x\" | \"y\", direction: 1 | -1) => {\n if (event.metaKey && axis === \"x\") {\n return;\n }\n const oppositeAxis = axis === \"x\" ? \"y\" : \"x\";\n const activePosition = getCenterPosition(activeNode.view!);\n const candidates = nodes.filter((node) => {\n let diff: number;\n let position: NodePosition;\n return (\n node !== activeNode &&\n node.type !== \"start\" &&\n node.type !== \"end\" &&\n node.type !== \"feedback\" &&\n node.type !== \"error\" &&\n node.type !== \"replay\" &&\n node.type !== \"instruction\" &&\n ((position = getCenterPosition(node.view!)),\n (diff = (position[axis] - activePosition[axis]) * direction),\n diff > 0) &&\n diff > Math.abs(activePosition[oppositeAxis] - position[oppositeAxis])\n );\n });\n return (event.metaKey ? maxBy : minBy)(candidates, (node) => {\n const position = getCenterPosition(node.view!);\n return (\n (activePosition[oppositeAxis] - position[oppositeAxis]) ** 2 +\n (activePosition[axis] - position[axis]) ** 2\n );\n });\n };\n\n let node: GraphNode | undefined | null;\n let action: \"switch-active-node\" | \"enter\" | undefined;\n\n switch (key) {\n case \"ArrowLeft\":\n action = \"switch-active-node\";\n node = moveOnAxis(\"x\", -1);\n break;\n case \"ArrowUp\":\n action = \"switch-active-node\";\n node = moveOnAxis(\"y\", -1);\n break;\n case \"ArrowRight\":\n action = \"switch-active-node\";\n node = moveOnAxis(\"x\", 1);\n break;\n case \"ArrowDown\":\n action = \"switch-active-node\";\n node = moveOnAxis(\"y\", 1);\n break;\n case \"Escape\":\n action = \"switch-active-node\";\n node = null;\n break;\n case \"Enter\":\n action = \"enter\";\n node = activeNode;\n break;\n }\n\n if (action && node !== undefined) {\n return { action, node: node! };\n }\n}\n\nfunction getCenterPosition(view: NodeRect): NodePosition {\n return {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n };\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./Nav.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./Nav.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport classNames from \"classnames\";\nimport styles from \"./Nav.module.css\";\nimport type { GraphNavItem } from \"../interfaces\";\nimport { WrappedIcon } from \"../../shared/bricks\";\nimport { DONE_STATES } from \"../../shared/constants\";\nimport type {\n ConversationState,\n JobState,\n TaskState,\n} from \"../../shared/interfaces\";\n\nexport interface NavProps {\n nav: GraphNavItem[] | undefined;\n currentNavId: string | null;\n taskState: TaskState | ConversationState | undefined;\n onClick: (jobId: string) => void;\n}\n\ninterface MergedNavItem extends Omit<GraphNavItem, \"state\"> {\n disabled?: boolean;\n state?: JobState;\n}\n\nexport function Nav({ nav, currentNavId, taskState, onClick }: NavProps) {\n const ref = useRef<HTMLUListElement>(null);\n useEffect(() => {\n const navElement = ref.current;\n if (!navElement || !currentNavId) {\n return;\n }\n navElement\n .querySelector(`[data-job-id=\"${currentNavId}\"]`)\n ?.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }, [currentNavId]);\n\n useEffect(() => {\n const navElement = ref.current;\n if (!navElement || currentNavId) {\n return;\n }\n\n const lastActiveItem = nav?.findLast(\n (item) =>\n DONE_STATES.includes(item.state || \"unknown\") ||\n item.state === \"working\" ||\n item.state === \"input-required\"\n );\n if (lastActiveItem) {\n navElement\n .querySelector(`[data-job-id=\"${lastActiveItem.id}\"]`)\n ?.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, [currentNavId, nav]);\n\n return (\n <div className={styles.container}>\n <ul className={styles.nav} ref={ref}>\n {nav?.map((item) => (\n <NavItem\n key={item.id}\n {...item}\n currentNavId={currentNavId}\n taskState={taskState}\n onClick={onClick}\n />\n ))}\n </ul>\n </div>\n );\n}\n\ninterface NavItemProps extends MergedNavItem {\n currentNavId: string | null;\n taskState: TaskState | ConversationState | undefined;\n onClick: (jobId: string) => void;\n}\n\nfunction NavItem({\n id,\n title,\n state,\n level,\n taskState,\n currentNavId,\n disabled,\n onClick,\n}: NavItemProps) {\n const { className, icon } = useMemo(() => {\n return getClassNameAndIconProps(state, taskState);\n }, [state, taskState]);\n\n return (\n <li\n className={classNames(styles.item, {\n [styles.active]: currentNavId === id,\n })}\n style={{ marginLeft: `${level * 20}px` }}\n >\n <a\n className={classNames(styles.link, className, {\n [styles.disabled]: disabled,\n })}\n data-job-id={id}\n title={title}\n onClick={() => {\n if (!disabled) {\n onClick(id);\n }\n }}\n >\n <WrappedIcon className={styles.icon} {...icon} />\n <span className={styles.text}>{title}</span>\n </a>\n </li>\n );\n}\n\nfunction getClassNameAndIconProps(\n state: JobState | undefined,\n taskState: TaskState | ConversationState | undefined\n) {\n switch (state) {\n case \"completed\":\n return {\n className: styles.completed,\n icon: {\n lib: \"fa\",\n prefix: \"fas\",\n icon: \"check\",\n },\n };\n case \"submitted\":\n case \"working\":\n if (taskState === \"terminated\") {\n return {\n icon: {\n lib: \"fa\",\n prefix: \"far\",\n icon: \"circle-stop\",\n },\n };\n }\n return {\n className: styles.working,\n icon: {\n lib: \"antd\",\n theme: \"outlined\",\n icon: \"loading-3-quarters\",\n spinning: true,\n },\n };\n case \"input-required\":\n return {\n className: styles[\"input-required\"],\n icon: {\n lib: \"fa\",\n prefix: \"far\",\n icon: \"circle-user\",\n },\n };\n case \"failed\":\n return {\n className: styles.failed,\n icon: {\n lib: \"fa\",\n prefix: \"fas\",\n icon: \"xmark\",\n },\n };\n case \"canceled\":\n case \"terminated\" as JobState:\n return {\n className: styles.canceled,\n icon: {\n lib: \"fa\",\n prefix: \"far\",\n icon: \"circle-stop\",\n },\n };\n case \"skipped\":\n return {\n icon: {\n lib: \"fa\",\n prefix: \"fas\",\n icon: \"ban\",\n },\n };\n default:\n return {\n icon: {\n lib: \"fa\",\n prefix: \"far\",\n icon: \"clock\",\n },\n };\n }\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeLoading.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeLoading.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","// istanbul ignore file: experimental\nimport React from \"react\";\nimport styles from \"./NodeLoading.module.css\";\n\nexport function NodeLoading(): JSX.Element {\n return (\n <div className={styles.loading}>\n <div className={styles.inner} />\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./JsxEditor.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./JsxEditor.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { Suspense, useContext, useMemo, useState } from \"react\";\nimport { asyncWrapBrick } from \"@next-core/react-runtime\";\nimport type { CodeEditor, CodeEditorProps } from \"@next-bricks/vs/code-editor\";\nimport nextTsxDefinition from \"@next-tsx/core/index.d.ts?raw\";\nimport componentsDefinition from \"@next-tsx/converter/lib/components.d.ts?raw\";\nimport styles from \"./JsxEditor.module.css\";\nimport { WrappedButton, WrappedIconButton } from \"../bricks\";\nimport { ICON_CLOSE } from \"../constants\";\nimport { TaskContext } from \"../TaskContext\";\nimport { getAsyncConstructedView } from \"../getAsyncConstructedView\";\n\ninterface CodeEditorEvents {\n \"code.change\": CustomEvent<string>;\n}\n\ninterface CodeEditorMapEvents {\n onCodeChange: \"code.change\";\n}\n\nconst editorLibs: CodeEditorProps[\"extraLibs\"] = [\n {\n filePath: \"/node_modules/next-tsx/components.d.ts\",\n content: componentsDefinition.replaceAll(\"export interface\", \"interface\"),\n },\n {\n filePath: \"/node_modules/next-tsx/package.json\",\n content: JSON.stringify({\n name: \"next-tsx\",\n types: \"./index.d.ts\",\n }),\n },\n {\n filePath: \"/node_modules/next-tsx/index.d.ts\",\n content: nextTsxDefinition,\n },\n {\n filePath: \"/node_modules/next-tsx/contracts.d.ts\",\n content: `type ContractMap = Record<string, any>;`,\n },\n];\n\nconst AsyncWrappedCodeEditor = React.lazy(async () => ({\n default: await asyncWrapBrick<\n CodeEditor,\n CodeEditorProps,\n CodeEditorEvents,\n CodeEditorMapEvents\n >(\"vs.code-editor\", {\n onCodeChange: \"code.change\",\n }),\n}));\n\nexport function JsxEditor() {\n const {\n workspace,\n manuallyUpdatedViews,\n updateView,\n activeJsxEditorJob,\n setActiveJsxEditorJob,\n } = useContext(TaskContext);\n const view =\n manuallyUpdatedViews?.get(activeJsxEditorJob!.id) ??\n activeJsxEditorJob!.generatedView!;\n const source = view.code;\n const [code, setCode] = useState(source);\n\n const libs = useMemo(() => {\n const commonLibs = editorLibs!;\n if (view.withContexts?.RESPONSE) {\n return [\n ...commonLibs,\n {\n filePath: \"tsx-view/response.d.ts\",\n content: `const RESPONSE_VALUE = ${JSON.stringify(view.withContexts.RESPONSE, null, 2)};\n\ndeclare const RESPONSE: typeof RESPONSE_VALUE;`,\n },\n ];\n }\n return commonLibs;\n }, [view.withContexts?.RESPONSE]);\n\n return (\n <div className={styles.container}>\n <div className={styles.editor}>\n <div className={styles.header}>\n <span className={styles.title}>JSX Editor</span>\n <WrappedIconButton\n icon={ICON_CLOSE}\n onClick={() => {\n setActiveJsxEditorJob?.(undefined);\n }}\n />\n </div>\n <div className={styles.body}>\n <div className={styles.content}>\n <Suspense fallback=\"Loading...\">\n <AsyncWrappedCodeEditor\n value={source}\n onCodeChange={(e) => {\n setCode(e.detail);\n }}\n language=\"typescript\"\n uri=\"file:///view.tsx\"\n automaticLayout=\"fit-container\"\n theme=\"tm-vs-dark\"\n extraLibs={libs}\n data-override-theme=\"dark-v2\"\n />\n </Suspense>\n </div>\n </div>\n <div className={styles.footer}>\n <WrappedButton\n themeVariant=\"elevo\"\n type=\"primary\"\n onClick={() => {\n const newView = {\n ...view,\n code,\n };\n newView.asyncConstructedView = getAsyncConstructedView(\n newView,\n workspace\n );\n updateView?.(activeJsxEditorJob!.id, newView);\n setActiveJsxEditorJob?.(undefined);\n }}\n >\n Save\n </WrappedButton>\n </div>\n </div>\n </div>\n );\n}\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeError.module.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../../../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[3].use[2]!./NodeError.module.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from \"react\";\nimport styles from \"./NodeError.module.css\";\nimport jobStyles from \"../NodeJob/NodeJob.module.css\";\nimport classNames from \"classnames\";\n\nexport interface NodeErrorProps {\n content: string;\n}\n\nexport function NodeError({ content }: NodeErrorProps) {\n return (\n <div className={classNames(jobStyles[\"node-job\"], jobStyles.error)}>\n <div className={styles.error}>{content}</div>\n </div>\n );\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport styles from \"../NodeJob/NodeJob.module.css\";\nimport type { ActivityRun, ServiceFlowRun } from \"../../shared/interfaces\";\nimport { K, t } from \"../i18n\";\n\nexport interface NodeChunkProps {\n type: \"flow\" | \"activity\";\n active?: boolean;\n flow: ServiceFlowRun;\n activity?: ActivityRun;\n}\n\nexport function NodeChunk({ type, active, flow, activity }: NodeChunkProps) {\n return (\n <div\n className={classNames(styles[\"node-job\"], {\n [styles.active]: active,\n })}\n >\n <div className={styles.background} />\n <div className={styles.body}>\n {type === \"flow\"\n ? t(K.INITIATING_SERVICE_FLOW, { name: flow.name })\n : t(K.STARTING_SERVICE_FLOW_ACTIVITY, { name: activity!.name })}\n </div>\n </div>\n );\n}\n","// istanbul ignore file: experimental\nimport React, {\n memo,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { getBasePath, getRuntime } from \"@next-core/runtime\";\nimport \"@next-core/theme\";\nimport classNames from \"classnames\";\nimport ResizeObserver from \"resize-observer-polyfill\";\nimport { select, type Selection, type TransitionLike } from \"d3-selection\";\nimport { ZoomTransform } from \"d3-zoom\";\nimport { mergeRects } from \"@next-shared/diagram\";\nimport styles from \"./styles.module.css\";\nimport { useZoom } from \"./useZoom.js\";\nimport type {\n SizeTuple,\n GraphNode,\n RequirementGraphNode,\n JobGraphNode,\n ZoomAction,\n FeedbackDetail,\n FlowGraphNode,\n ActivityGraphNode,\n} from \"./interfaces.js\";\nimport { useAutoCenter } from \"./useAutoCenter.js\";\nimport { useLayout } from \"./useLayout.js\";\nimport { useConversationDetail } from \"./useConversationDetail\";\nimport { useConversationGraph } from \"./useConversationGraph\";\nimport { ZoomBar } from \"./ZoomBar/ZoomBar.js\";\nimport { NodeStart } from \"./NodeStart/NodeStart.js\";\nimport { NodeRequirement } from \"./NodeRequirement/NodeRequirement.js\";\nimport { NodeInstruction } from \"./NodeInstruction/NodeInstruction.js\";\nimport { NodeJob } from \"./NodeJob/NodeJob.js\";\nimport { NodeEnd } from \"./NodeEnd/NodeEnd.js\";\nimport {\n CANVAS_PADDING_BOTTOM,\n CANVAS_PADDING_LEFT,\n CANVAS_PADDING_RIGHT,\n CANVAS_PADDING_TOP,\n END_NODE_ID,\n FEEDBACK_NODE_ID,\n REPLAY_NODE_ID,\n} from \"./constants.js\";\nimport { DONE_STATES, GENERAL_DONE_STATES } from \"../shared/constants.js\";\nimport { WrappedIcon } from \"../shared/bricks\";\nimport { CanvasContext } from \"./CanvasContext.js\";\nimport { ToolCallDetailDrawer } from \"./ToolCallDetail/ToolCallDetailDrawer\";\nimport { getScrollTo } from \"./utils/getScrollTo.js\";\nimport { handleKeyboardNav } from \"./utils/handleKeyboardNav.js\";\nimport { ExpandedView } from \"../shared/ExpandedView/ExpandedView.js\";\nimport { Nav } from \"./Nav/Nav.js\";\nimport { ChatBox } from \"../shared/ChatBox/ChatBox.js\";\nimport { NodeFeedback } from \"../shared/NodeFeedback/NodeFeedback.js\";\nimport { TaskContext } from \"../shared/TaskContext.js\";\nimport { NodeLoading } from \"./NodeLoading/NodeLoading.js\";\nimport { JsxEditor } from \"../shared/JsxEditor/JsxEditor.js\";\nimport { NodeError } from \"./NodeError/NodeError.js\";\nimport type {\n GeneratedView,\n FileInfo,\n Job,\n CommandPayload,\n ActiveDetail,\n ServiceFlowRun,\n ActivityRun,\n ExtraChatPayload,\n ActiveImages,\n} from \"../shared/interfaces\";\nimport { NodeReplay } from \"./NodeReplay/NodeReplay.js\";\nimport type { ConversationDetail, CruiseCanvasProps } from \".\";\nimport { useFlowAndActivityMap } from \"../shared/useFlowAndActivityMap\";\nimport { useFulfilledActiveDetail } from \"../shared/useFulfilledActiveDetail\";\nimport { NodeChunk } from \"./NodeChunk/NodeChunk\";\nimport { FilePreview } from \"../shared/FilePreview/FilePreview\";\nimport { ImagesPreview } from \"../shared/FilePreview/ImagesPreview\";\nimport { useHandleEscape } from \"../shared/useHandleEscape\";\n\nconst MemoizedNodeComponent = memo(NodeComponent);\n\ninterface CruiseCanvasComponentProps extends CruiseCanvasProps {\n conversationId: string;\n onShare: () => void;\n onTerminate: () => void;\n onSubmitFeedback: (detail: FeedbackDetail) => void;\n onSwitchToChat: () => void;\n onFeedbackOnView: (viewId: string) => void;\n onDetailChange: (detail: ConversationDetail) => void;\n}\n\ninterface ScrollToOptions {\n nodeId?: string;\n jobId?: string;\n\n /**\n * @default \"auto\"\n */\n behavior?: \"smooth\" | \"instant\" | \"auto\";\n\n /**\n * When set to \"start\", force scroll even if the node is fully visible.\n *\n * @default \"nearest\"\n */\n block?: \"start\" | \"nearest\";\n}\n\nexport interface CruiseCanvasRef {\n resumed?: () => void;\n feedbackSubmitDone: () => void;\n feedbackSubmitFailed: () => void;\n feedbackOnViewDone: (viewId: string) => void;\n}\n\nexport function CruiseCanvasComponent(\n {\n conversationId,\n initialRequest,\n replay,\n replayDelay,\n supports,\n showHiddenJobs,\n showHumanActions,\n showFeedback: propShowFeedback,\n showFeedbackAfterFailed,\n showFeedbackOnView,\n showUiSwitch,\n showJsxEditor,\n previewUrlTemplate,\n showCases,\n exampleProjects,\n tryItOutUrl,\n separateInstructions,\n aiEmployees,\n commands,\n uploadOptions,\n onShare,\n onTerminate,\n onSubmitFeedback,\n onSwitchToChat,\n onFeedbackOnView,\n onDetailChange,\n }: CruiseCanvasComponentProps,\n ref: React.Ref<CruiseCanvasRef>\n) {\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n conversation,\n tasks,\n serviceFlows,\n errors,\n humanInputRef,\n skipToResults,\n watchAgain,\n } = useConversationDetail(\n conversationId,\n initialRequest,\n replay,\n replayDelay\n );\n const { flowMap, activityMap } = useFlowAndActivityMap(serviceFlows);\n const graph = useConversationGraph(\n conversation,\n tasks,\n errors,\n flowMap,\n activityMap,\n {\n showHiddenJobs,\n showHumanActions,\n separateInstructions,\n }\n );\n const rawNodes = graph?.nodes;\n const rawEdges = graph?.edges;\n const nav = graph?.nav;\n const views = graph?.views;\n const jobMap = graph?.jobMap;\n const pageTitle = conversation?.title ?? \"\";\n const conversationState = conversation?.state;\n const [activeNodeId, setActiveNodeId] = useState<string | null>(null);\n const currentNavId = useMemo(() => {\n if (activeNodeId) {\n const [type, jobId] = activeNodeId.split(\":\");\n if (type === \"job\" || type === \"view\") {\n return jobId;\n }\n }\n return null;\n }, [activeNodeId]);\n\n useEffect(() => {\n onDetailChange({\n projectId: conversation?.projectId,\n });\n }, [onDetailChange, conversation?.projectId]);\n\n const [submittingFeedback, setSubmittingFeedback] = useState(false);\n const [submittedFeedback, setSubmittedFeedback] = useState(false);\n const [showFeedback, setShowFeedback] = useState<boolean>(!!propShowFeedback);\n useEffect(() => {\n setShowFeedback(!!propShowFeedback);\n }, [propShowFeedback]);\n const [feedbackDoneViews, setFeedbackDoneViews] = useState<\n Set<string> | undefined\n >();\n\n const handleSubmitFeedback = useCallback(\n (detail: FeedbackDetail) => {\n setSubmittingFeedback(true);\n onSubmitFeedback(detail);\n },\n [onSubmitFeedback]\n );\n\n useImperativeHandle(\n ref,\n () => ({\n feedbackSubmitDone: () => {\n setSubmittedFeedback(true);\n setTimeout(() => {\n setShowFeedback(false);\n }, 3000);\n },\n feedbackSubmitFailed: () => {\n setSubmittingFeedback(false);\n },\n feedbackOnViewDone: (viewId: string) => {\n setFeedbackDoneViews((prev) => {\n const newSet = new Set(prev);\n newSet.add(viewId);\n return newSet;\n });\n },\n }),\n []\n );\n\n // Enable transition after 3 seconds to avoid initial flicker\n const transitionEnabledRef = useRef(false);\n useEffect(() => {\n const timer = setTimeout(() => {\n transitionEnabledRef.current = true;\n }, 3e3);\n return () => {\n clearTimeout(timer);\n };\n }, []);\n\n useEffect(() => {\n getRuntime().applyPageTitle(pageTitle);\n }, [pageTitle]);\n\n const humanInput = useCallback(\n (input: string | null, action?: string, extra?: ExtraChatPayload) => {\n humanInputRef.current?.(input, action, extra);\n },\n [humanInputRef]\n );\n\n const [sizeMap, setSizeMap] = useState<Map<string, SizeTuple> | null>(null);\n const onNodeResize = useCallback((id: string, size: SizeTuple | null) => {\n // Handle resize logic here\n setSizeMap((prev) => {\n if (!size) {\n if (!prev) {\n return null;\n }\n const newMap = new Map(prev);\n const deleted = newMap.delete(id);\n return deleted ? newMap : prev;\n }\n return prev ? new Map(prev).set(id, size) : new Map([[id, size]]);\n });\n }, []);\n\n const { sizeReady, nodes, edges } = useLayout({\n rawNodes,\n rawEdges,\n completed: conversationState === \"completed\",\n failed: conversationState === \"failed\",\n finished: conversation?.finished,\n sizeMap,\n showFeedback,\n showFeedbackAfterFailed,\n replay,\n noTasks: tasks.length === 0,\n });\n\n // Disable auto scroll when the user manually scrolled up\n const detectScrolledUpRef = useRef(false);\n const manualScrolledUpRef = useRef(false);\n\n const [hoverOnScrollableContent, setHoverOnScrollableContent] =\n useState(false);\n\n const { grabbing, transform, transformRef, zoomer /* , scaleRange */ } =\n useZoom({\n rootRef,\n zoomable: sizeReady,\n scrollable: sizeReady && !hoverOnScrollableContent,\n pannable: sizeReady,\n manualScrolledUpRef,\n });\n\n const transitionRef = useRef(false);\n\n const pushZoomTransition = useMemo(() => {\n let nextAction: ZoomAction | null = null;\n\n const run = (action: ZoomAction) => {\n const current = transformRef.current;\n const target = typeof action === \"function\" ? action(current) : action;\n\n if (!target) {\n return;\n }\n\n const { transform, translateBy } = target;\n\n let selection:\n | Selection<HTMLDivElement, unknown, null, undefined>\n | TransitionLike<HTMLDivElement, unknown> = select(rootRef.current!);\n\n if (transitionEnabledRef.current && target.duration !== 0) {\n transitionRef.current = true;\n selection = selection\n .transition()\n .duration(target.duration ?? 300)\n .ease((t) => t * (2 - t)) // Ease in-out\n .on(\"end\", () => {\n transitionRef.current = false;\n if (nextAction) {\n const next = nextAction;\n nextAction = null;\n run(next);\n }\n });\n }\n\n if (transform) {\n zoomer.transform(\n selection,\n new ZoomTransform(\n transform.k ?? current.k,\n transform.x ?? current.x,\n transform.y ?? current.y\n )\n );\n } else {\n zoomer.translateBy(selection, translateBy[0] ?? 0, translateBy[1] ?? 0);\n }\n };\n\n return (action: ZoomAction) => {\n if (transitionRef.current) {\n nextAction = action;\n } else {\n run(action);\n }\n };\n }, [transformRef, zoomer]);\n\n const { centered, setCentered, reCenterRef } = useAutoCenter({\n nodes,\n sizeReady,\n zoomer,\n rootRef,\n pushZoomTransition,\n });\n\n const conversationDone = DONE_STATES.includes(conversationState);\n const canChat = conversationDone || conversationState === \"input-required\";\n\n const nonLeafNodes = useMemo(() => {\n return new Set<string>(edges.map((edge) => edge.source));\n }, [edges]);\n\n const bottom = useMemo(() => {\n if (!sizeReady) {\n return null;\n }\n\n const leafNodes: GraphNode[] = [];\n for (const node of nodes) {\n if (!nonLeafNodes.has(node.id)) {\n leafNodes.push(node);\n }\n }\n if (leafNodes.length > 0) {\n const y1 = Math.max(\n ...leafNodes.map((node) => node.view!.y + node.view!.height)\n );\n return y1;\n }\n\n return null;\n }, [nodes, nonLeafNodes, sizeReady]);\n\n const bottomRef = useRef<number | null>(null);\n useEffect(() => {\n bottomRef.current = bottom;\n }, [bottom]);\n\n // Make the latest (bottom most) node visible\n useEffect(() => {\n const root = rootRef.current;\n if (\n !root ||\n bottom === null ||\n (detectScrolledUpRef.current && manualScrolledUpRef.current)\n ) {\n return;\n }\n pushZoomTransition((current) => {\n const { offsetHeight } = root;\n const transformedBottom = bottom * current.k + current.y;\n const diffY = offsetHeight - CANVAS_PADDING_BOTTOM - transformedBottom;\n if (diffY < 0) {\n // Use `zoomer.transform()` which will not be restricted to its translate/scale extent\n return {\n transform: {\n y: current.y + diffY,\n },\n duration: diffY > -100 ? 100 : diffY < -500 ? 300 : 200,\n };\n }\n return null;\n });\n }, [bottom, pushZoomTransition]);\n\n // Detect if the user scrolled up manually\n useEffect(() => {\n const bottom = bottomRef.current;\n const root = rootRef.current;\n if (!root || bottom === null || transitionRef.current) {\n return;\n }\n const { offsetHeight } = root;\n const transformedBottom = bottom * transform.k + transform.y;\n\n const diffY = offsetHeight - CANVAS_PADDING_BOTTOM - transformedBottom;\n detectScrolledUpRef.current = diffY < 0;\n }, [transform, zoomer]);\n\n const handleReCenter = useCallback(() => {\n reCenterRef.current = true;\n setCentered(false);\n }, [reCenterRef, setCentered]);\n\n const handleScaleChange = useCallback(\n (scale: number) => {\n zoomer.scaleTo(select(rootRef.current!), scale);\n },\n [zoomer]\n );\n\n const fullRect = useMemo(() => {\n if (!sizeReady) {\n return null;\n }\n return mergeRects(nodes.map((node) => node.view!));\n }, [nodes, sizeReady]);\n\n useEffect(() => {\n if (!fullRect) {\n return;\n }\n const root = rootRef.current;\n if (!root) {\n return;\n }\n\n const distance = 20;\n const { offsetWidth, offsetHeight } = root;\n const viewportWidth = offsetWidth / transform.k;\n const viewportHeight = offsetHeight / transform.k;\n const minX = -(viewportWidth - distance - fullRect.x);\n const maxX = viewportWidth - distance + (fullRect.x + fullRect.width);\n const minY = -(viewportHeight - distance - fullRect.y);\n const maxY = viewportHeight - distance + (fullRect.y + fullRect.height);\n\n zoomer.translateExtent([\n [minX, minY],\n [maxX, maxY],\n ]);\n }, [zoomer, transform.k, fullRect]);\n\n const scrollTo = useCallback(\n ({ nodeId, jobId, behavior, block }: ScrollToOptions) => {\n /**\n * - When the node is fully visible, take no action.\n * - Otherwise, scroll to make it fully visible while make the scroll\n * distance as small as possible.\n * - Special cases:\n * - When the node is higher or wider than the viewport, scroll to\n * the top or left of the node.\n */\n const root = rootRef.current;\n const targets = nodes.filter((n) => {\n if (nodeId && n.id !== nodeId) {\n return false;\n }\n if (jobId && (n as JobGraphNode).job?.id !== jobId) {\n return false;\n }\n return true;\n });\n if (!root || targets.length === 0) {\n return;\n }\n const rect = mergeRects(targets.map((node) => node.view!));\n\n const { x, y } = getScrollTo(\n rect,\n [root.offsetWidth, root.offsetHeight],\n [\n CANVAS_PADDING_TOP,\n CANVAS_PADDING_RIGHT,\n CANVAS_PADDING_BOTTOM,\n CANVAS_PADDING_LEFT,\n ],\n transformRef.current,\n block\n );\n\n if (x || y) {\n pushZoomTransition({\n translateBy: [x, y],\n duration: behavior === \"instant\" ? 0 : undefined,\n });\n }\n },\n [nodes, pushZoomTransition, transformRef]\n );\n\n const scrollBy = useCallback(\n (\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n range: \"line\" | \"page\" | \"document\"\n ) => {\n const root = rootRef.current;\n if (!root || !sizeReady) {\n return;\n }\n let x = 0;\n let y = 0;\n let duration = 300;\n let distance: number;\n const isHorizontal = direction === \"left\" || direction === \"right\";\n if (range === \"line\") {\n const lineHeight = 40;\n distance =\n lineHeight * (direction === \"up\" || direction === \"left\" ? 1 : -1);\n duration = 150;\n } else if (range === \"page\") {\n const pageHeight = root.offsetHeight - CANVAS_PADDING_BOTTOM;\n distance = pageHeight * (direction === \"up\" ? -1 : 1);\n } else {\n const { y: top, height } = mergeRects(nodes.map((node) => node.view!));\n\n if (direction === \"down\") {\n const bottom = top + height;\n const targetHeight = bottom - top + CANVAS_PADDING_BOTTOM;\n distance = root.offsetHeight - targetHeight - transformRef.current.y;\n } else {\n distance = top + CANVAS_PADDING_TOP - transformRef.current.y;\n }\n }\n\n if (isHorizontal) {\n x = distance;\n } else {\n y = distance;\n }\n\n if (x || y) {\n pushZoomTransition({\n translateBy: [x, y],\n duration,\n });\n }\n },\n [nodes, pushZoomTransition, sizeReady, transformRef]\n );\n\n const [activeDetail, setActiveDetail] = useState<ActiveDetail | null>(null);\n const [subActiveDetail, setSubActiveDetail] = useState<ActiveDetail | null>(\n null\n );\n\n const [activeExpandedViewJobId, setActiveExpandedViewJobId] = useState<\n string | null\n >(null);\n const [activeFile, setActiveFile] = React.useState<FileInfo | null>(null);\n const [activeJsxEditorJob, setActiveJsxEditorJob] = useState<\n Job | undefined\n >();\n const [manuallyUpdatedViews, setManuallyUpdatedViews] = useState<\n Map<string, GeneratedView> | undefined\n >();\n const updateView = useCallback((jobId: string, view: GeneratedView) => {\n setManuallyUpdatedViews((prev) => {\n const next = new Map(prev);\n next.set(jobId, view);\n return next;\n });\n }, []);\n\n const firstNode = rawNodes?.[0];\n const requirementNode = firstNode?.type === \"requirement\" ? firstNode : null;\n\n const [activeImages, setActiveImages] = useState<ActiveImages | null>(null);\n\n const workspace = conversationId;\n\n const taskContextValue = useMemo(\n () => ({\n conversationId,\n conversationState,\n tasks,\n errors,\n workspace,\n previewUrlTemplate,\n replay,\n showCases,\n exampleProjects,\n aiEmployees,\n commands,\n uploadOptions,\n\n humanInput,\n onShare,\n onTerminate,\n supports,\n\n activeExpandedViewJobId,\n setActiveExpandedViewJobId,\n activeDetail,\n setActiveDetail,\n subActiveDetail,\n setSubActiveDetail,\n\n submittingFeedback,\n submittedFeedback,\n onSubmitFeedback: handleSubmitFeedback,\n setShowFeedback,\n\n showJsxEditor,\n activeJsxEditorJob,\n setActiveJsxEditorJob,\n manuallyUpdatedViews,\n updateView,\n showFeedbackOnView,\n onFeedbackOnView,\n feedbackDoneViews,\n\n skipToResults,\n watchAgain() {\n watchAgain();\n setCentered(false);\n },\n tryItOut() {\n const win = window.open(\n `${getBasePath().slice(0, -1)}${tryItOutUrl ?? \"/elevo\"}`,\n \"_blank\"\n );\n if (win) {\n win.__elevo_try_it_out = requirementNode\n ? {\n content: requirementNode.content,\n cmd: requirementNode.cmd,\n mentionedAiEmployeeId: requirementNode.mentionedAiEmployeeId,\n }\n : {};\n }\n },\n separateInstructions,\n activeFile,\n setActiveFile,\n activeImages,\n setActiveImages,\n }),\n [\n conversationId,\n conversationState,\n tasks,\n errors,\n workspace,\n previewUrlTemplate,\n replay,\n showCases,\n exampleProjects,\n aiEmployees,\n commands,\n uploadOptions,\n\n humanInput,\n onTerminate,\n onShare,\n supports,\n\n activeExpandedViewJobId,\n activeDetail,\n subActiveDetail,\n\n submittingFeedback,\n submittedFeedback,\n handleSubmitFeedback,\n\n showJsxEditor,\n activeJsxEditorJob,\n manuallyUpdatedViews,\n updateView,\n showFeedbackOnView,\n onFeedbackOnView,\n feedbackDoneViews,\n\n skipToResults,\n watchAgain,\n setCentered,\n requirementNode,\n tryItOutUrl,\n separateInstructions,\n activeFile,\n activeImages,\n ]\n );\n\n const canvasContextValue = useMemo(\n () => ({\n onNodeResize,\n setActiveNodeId,\n hoverOnScrollableContent,\n setHoverOnScrollableContent,\n }),\n [hoverOnScrollableContent, onNodeResize]\n );\n\n const fulfilledActiveDetail = useFulfilledActiveDetail(\n activeDetail,\n jobMap,\n flowMap,\n activityMap\n );\n\n const handleRootClick = useCallback((e: React.MouseEvent) => {\n for (const element of e.nativeEvent.composedPath()) {\n if (\n element instanceof HTMLElement &&\n element.classList.contains(styles.node)\n ) {\n // If the click is on a node, do not reset active node\n return;\n }\n if (element === rootRef.current) {\n break;\n }\n }\n setActiveNodeId(null);\n }, []);\n\n useEffect(() => {\n const root = rootRef.current;\n if (\n !root ||\n fulfilledActiveDetail ||\n activeExpandedViewJobId ||\n activeFile\n ) {\n return;\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n document.activeElement &&\n document.activeElement !== document.body &&\n document.activeElement !== root\n ) {\n return;\n }\n\n const keyboardAction = handleKeyboardNav(e, { activeNodeId, nodes });\n if (!keyboardAction) {\n return;\n }\n const { action, node } = keyboardAction;\n\n if (action === \"scroll\") {\n scrollBy(keyboardAction.direction, keyboardAction.range);\n } else if (action === \"enter\") {\n if (\n node.type !== \"job\" /* &&\n node.type !== \"flow\" &&\n node.type !== \"activity\" */\n ) {\n return;\n }\n }\n e.preventDefault();\n e.stopPropagation();\n\n if (action === \"enter\") {\n if (node.type === \"job\") {\n setActiveDetail({\n type: node.type,\n id: (node as JobGraphNode).job.id,\n });\n } /* else {\n setActiveDetail({\n type: node.type as \"flow\",\n id: (node as FlowGraphNode).taskId,\n });\n } */\n } else if (action === \"switch-active-node\") {\n if (node) {\n setActiveNodeId(node.id);\n if (node.type === \"job\") {\n scrollTo({\n jobId: node.job.id,\n behavior: \"smooth\",\n });\n } else {\n scrollTo({\n nodeId: node.id,\n behavior: \"smooth\",\n });\n }\n } else {\n setActiveNodeId(null);\n }\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n activeDetail,\n fulfilledActiveDetail,\n activeNodeId,\n activeExpandedViewJobId,\n activeFile,\n nodes,\n scrollTo,\n scrollBy,\n ]);\n\n useHandleEscape(taskContextValue);\n\n return (\n <TaskContext.Provider value={taskContextValue}>\n <CanvasContext.Provider value={canvasContextValue}>\n <div\n className={classNames(styles.root, {\n [styles.loading]: !conversation,\n })}\n ref={rootRef}\n style={{\n cursor: grabbing ? \"grabbing\" : \"grab\",\n }}\n tabIndex={-1}\n onClick={handleRootClick}\n >\n {!conversation && (\n <div className={styles[\"loading-icon\"]}>\n <WrappedIcon\n lib=\"antd\"\n theme=\"outlined\"\n icon=\"loading-3-quarters\"\n spinning\n />\n </div>\n )}\n <div\n className={classNames(styles.canvas, {\n [styles.ready]: sizeReady && centered,\n })}\n style={{\n transform: `translate3d(${transform.x}px, ${transform.y}px, 0) scale(${transform.k})`,\n }}\n >\n <svg className={styles.edges}>\n {edges.map((edge) =>\n edge.target === END_NODE_ID ||\n edge.target === REPLAY_NODE_ID ||\n edge.target === FEEDBACK_NODE_ID ? null : (\n <path\n className={styles.edge}\n key={`${edge.source}-${edge.target}`}\n d={edge\n .points!.map(\n ({ x, y }, i) => `${i === 0 ? \"M\" : \"L\"}${x},${y}`\n )\n .join(\" \")}\n />\n )\n )}\n </svg>\n {nodes.map((node) => (\n <MemoizedNodeComponent\n key={node.id}\n id={node.id}\n type={node.type}\n username={(node as RequirementGraphNode).username}\n content={(node as RequirementGraphNode).content}\n cmd={(node as RequirementGraphNode).cmd}\n mentionedAiEmployeeId={\n (node as RequirementGraphNode).mentionedAiEmployeeId\n }\n files={(node as RequirementGraphNode).files}\n job={(node as JobGraphNode).job}\n flow={(node as FlowGraphNode).flow}\n activity={(node as ActivityGraphNode).activity}\n startTime={conversation?.startTime}\n instructionLoading={\n node.type === \"instruction\" &&\n !nonLeafNodes.has(node.id) &&\n !DONE_STATES.includes(node.state!) &&\n !GENERAL_DONE_STATES.includes(conversationState!)\n }\n isLeaf={!nonLeafNodes.has(node.id)}\n x={node.view?.x}\n y={node.view?.y}\n active={activeNodeId === node.id}\n />\n ))}\n </div>\n </div>\n <div className={styles.widgets}>\n <Nav\n nav={nav}\n currentNavId={currentNavId}\n taskState={conversationState}\n onClick={(jobId: string) => {\n setActiveNodeId(`job:${jobId}`);\n scrollTo({ jobId, block: \"start\" });\n }}\n />\n <ZoomBar\n scale={transform.k}\n showUiSwitch={showUiSwitch}\n onScaleChange={handleScaleChange}\n onReCenter={handleReCenter}\n onSwitchToChat={onSwitchToChat}\n />\n {replay ? (\n !conversation?.finished && (\n <div className={styles[\"footer-container\"]}>\n <NodeReplay />\n </div>\n )\n ) : supports?.chat ? (\n <div className={styles[\"footer-container\"]}>\n <ChatBox state={conversationState} canChat={canChat} />\n </div>\n ) : null}\n </div>\n {fulfilledActiveDetail?.type === \"job\" && (\n <ToolCallDetailDrawer job={fulfilledActiveDetail.job} />\n )}\n {activeExpandedViewJobId && <ExpandedView views={views!} />}\n {activeFile && <FilePreview file={activeFile} />}\n {activeImages && <ImagesPreview images={activeImages} />}\n {showJsxEditor && activeJsxEditorJob && <JsxEditor />}\n </CanvasContext.Provider>\n </TaskContext.Provider>\n );\n}\n\ninterface NodeComponentProps {\n id: string;\n type: GraphNode[\"type\"];\n username?: string;\n content?: string;\n job?: Job;\n flow?: ServiceFlowRun;\n activity?: ActivityRun;\n startTime?: number;\n instructionLoading?: boolean;\n isLeaf?: boolean;\n x?: number;\n y?: number;\n active?: boolean;\n cmd?: CommandPayload;\n mentionedAiEmployeeId?: string;\n files?: FileInfo[];\n}\n\nfunction NodeComponent({\n id,\n type,\n job,\n flow,\n activity,\n username,\n content,\n startTime,\n instructionLoading,\n isLeaf,\n x,\n y,\n active,\n cmd,\n mentionedAiEmployeeId,\n files,\n}: NodeComponentProps) {\n const nodeRef = useRef<HTMLDivElement>(null);\n const { onNodeResize, setActiveNodeId } = useContext(CanvasContext);\n\n useEffect(() => {\n const element = nodeRef.current;\n if (!element) {\n return;\n }\n const observer = new ResizeObserver(() => {\n onNodeResize(id, [element.offsetWidth, element.offsetHeight]);\n });\n observer.observe(element);\n return () => {\n observer.disconnect();\n onNodeResize(id, null);\n };\n }, [id, onNodeResize]);\n\n useEffect(() => {\n const element = nodeRef.current;\n if (!element) {\n return;\n }\n const handleMouseDown = (e: MouseEvent) => {\n e.stopPropagation();\n };\n element.addEventListener(\"mousedown\", handleMouseDown);\n return () => {\n element.removeEventListener(\"mousedown\", handleMouseDown);\n };\n }, []);\n\n const handleClick = useCallback(() => {\n if (type !== \"start\" && type !== \"instruction\") {\n setActiveNodeId(id);\n }\n }, [id, setActiveNodeId, type]);\n\n return (\n <div\n className={classNames(styles.node, {\n [styles.ready]: x != null && y != null,\n })}\n ref={nodeRef}\n style={{\n left: x,\n top: y,\n }}\n onClick={handleClick}\n >\n {type === \"start\" ? (\n <NodeStart />\n ) : type === \"end\" ? (\n <NodeEnd />\n ) : type === \"feedback\" ? (\n <NodeFeedback />\n ) : type === \"requirement\" ? (\n <NodeRequirement\n username={username}\n content={content}\n startTime={startTime}\n active={active}\n cmd={cmd}\n mentionedAiEmployeeId={mentionedAiEmployeeId}\n files={files}\n />\n ) : type === \"loading\" ? (\n <NodeLoading />\n ) : type === \"error\" ? (\n <NodeError content={content!} />\n ) : type === \"replay\" ? (\n <NodeReplay finished />\n ) : type === \"flow\" || type === \"activity\" ? (\n <NodeChunk\n type={type}\n active={active}\n flow={flow!}\n activity={activity}\n />\n ) : type === \"instruction\" ? (\n <NodeInstruction\n content={job!.instruction}\n loading={instructionLoading}\n />\n ) : (\n <NodeJob job={job!} active={active} isLeaf={isLeaf} />\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type {\n GraphEdge,\n GraphNode,\n GraphNavItem,\n GraphGeneratedView,\n} from \"./interfaces\";\nimport { LOADING_NODE_ID } from \"./constants\";\nimport type {\n ActivityWithFlow,\n ConversationBaseDetail,\n ConversationError,\n ServiceFlowRun,\n Task,\n} from \"../shared/interfaces\";\nimport { getFlatChunks } from \"../shared/getFlatChunks\";\nimport { DONE_STATES } from \"../shared/constants\";\n\nexport function useConversationGraph(\n conversation: ConversationBaseDetail | null | undefined,\n tasks: Task[],\n errors: ConversationError[],\n flowMap?: Map<string, ServiceFlowRun>,\n activityMap?: Map<string, ActivityWithFlow>,\n options?: {\n showHiddenJobs?: boolean;\n showHumanActions?: boolean;\n separateInstructions?: boolean;\n }\n) {\n const { /* showHiddenJobs, */ showHumanActions, separateInstructions } =\n options ?? {};\n\n return useMemo(() => {\n if (!conversation) {\n return null;\n }\n\n const { chunks, jobMap } = getFlatChunks(\n tasks,\n errors,\n flowMap,\n activityMap,\n false,\n true\n );\n\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const nav: GraphNavItem[] = [];\n const views: GraphGeneratedView[] = [];\n const jobLevels = new Map<string, number>();\n\n const userInputNodes: string[] = [];\n let username: string | undefined;\n let previousNodeId: string | undefined;\n\n for (const chunk of chunks) {\n const nodeIds: string[] = [];\n\n if (chunk.type === \"job\") {\n const job = chunk.job;\n jobLevels.set(job.id, chunk.level);\n const { messages } = job;\n const hasMessages =\n (Array.isArray(messages) && messages.length > 0) || job.toolCall;\n\n const userInput = messages\n ?.find((msg) => msg.role === \"user\")\n ?.parts?.find((part) => part.type === \"text\")?.text;\n\n const isRequirementJob =\n userInput !== undefined &&\n (chunk === chunks[0] || messages!.length === 1);\n if (isRequirementJob) {\n const requirementId = `requirement:${job.id}`;\n username = job.username;\n nodes.push({\n type: \"requirement\",\n id: requirementId,\n content: userInput,\n username,\n cmd: job.cmd,\n mentionedAiEmployeeId: job.mentionedAiEmployeeId,\n files: messages\n ?.filter((msg) => msg.role === \"user\")\n .flatMap((msg) => msg.parts)\n .filter((part) => part.type === \"file\")\n .map((part) => part.file),\n });\n nodeIds.push(requirementId);\n userInputNodes.push(requirementId);\n } else {\n if (job.instruction) {\n if (separateInstructions || !job.toolCall) {\n const instructionNodeId = `instruction:${job.id}`;\n nodes.push({\n type: \"instruction\",\n id: instructionNodeId,\n job,\n state: job.state,\n });\n nodeIds.push(instructionNodeId);\n }\n\n nav.push({\n id: job.id,\n title: job.instruction,\n state: job.state,\n level: chunk.level,\n });\n } else if (job.toolCall?.annotations?.title) {\n nav.push({\n id: job.id,\n title: job.toolCall.annotations.title,\n state: job.state,\n level: chunk.level,\n });\n }\n\n const jobNodeId = `job:${job.id}`;\n if (hasMessages) {\n nodes.push({\n type: \"job\",\n id: jobNodeId,\n job,\n state: job.state,\n });\n nodeIds.push(jobNodeId);\n }\n\n const view = job.generatedView;\n if (view) {\n views.push({\n id: job.id,\n view,\n });\n }\n\n if (showHumanActions && job.humanAction) {\n const humanActionNodeId = `human-action:${job.id}`;\n nodes.push({\n type: \"requirement\",\n id: humanActionNodeId,\n content: job.humanAction,\n username,\n });\n nodeIds.push(humanActionNodeId);\n }\n\n // Make sure every job in the list has at least one corresponding node\n if (nodeIds.length === 0) {\n nodes.push({\n type: \"job\",\n id: jobNodeId,\n job,\n state: job.state,\n });\n nodeIds.push(jobNodeId);\n }\n\n if (userInput !== undefined && job.state === \"completed\") {\n userInputNodes.push(nodeIds[nodeIds.length - 1]);\n }\n }\n } else if (chunk.type === \"error\") {\n const errorNodeId = `error:${nodes.length}`;\n nodes.push({\n type: \"error\",\n id: errorNodeId,\n content: chunk.error,\n });\n nodeIds.push(errorNodeId);\n } else if (chunk.type === \"flow\" || chunk.type === \"activity\") {\n const nodeId = `${chunk.type}:${chunk.task.id}`;\n nodes.push({\n type: chunk.type,\n id: nodeId,\n taskId: chunk.task.id,\n flow: chunk.flow,\n ...(chunk.type === \"activity\" ? { activity: chunk.activity } : null),\n } as GraphNode);\n nodeIds.push(nodeId);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unexpected chunk type:\", chunk);\n }\n\n for (let i = 1; i < nodeIds.length; i++) {\n edges.push({\n source: nodeIds[i - 1],\n target: nodeIds[i],\n });\n }\n if (nodeIds.length > 0) {\n if (previousNodeId) {\n edges.push({\n source: previousNodeId,\n target: nodeIds[0],\n });\n }\n previousNodeId = nodeIds[nodeIds.length - 1];\n }\n }\n\n if (!DONE_STATES.includes(conversation.state)) {\n if (nodes.length === 0) {\n nodes.push({\n type: \"loading\",\n id: LOADING_NODE_ID,\n });\n } else {\n let counter = 0;\n for (const nodeId of userInputNodes) {\n if (!edges.some((edge) => edge.source === nodeId)) {\n const loadingId = `${LOADING_NODE_ID}:${counter++}`;\n nodes.push({\n type: \"loading\",\n id: loadingId,\n });\n edges.push({\n source: nodeId,\n target: loadingId,\n });\n }\n }\n }\n }\n\n return {\n nodes,\n edges,\n nav,\n views,\n jobMap,\n };\n }, [\n conversation,\n errors,\n separateInstructions,\n // showHiddenJobs,\n showHumanActions,\n tasks,\n flowMap,\n activityMap,\n ]);\n}\n","import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport type { ZoomBehavior } from \"d3-zoom\";\nimport { mergeRects } from \"@next-shared/diagram\";\nimport type { GraphNode, ZoomAction } from \"./interfaces\";\nimport { CANVAS_PADDING_BOTTOM } from \"./constants\";\n\nexport interface UseAutoCenterOptions {\n nodes: GraphNode[];\n sizeReady: boolean;\n zoomer: ZoomBehavior<HTMLDivElement, unknown>;\n rootRef: RefObject<HTMLDivElement>;\n pushZoomTransition: (action: ZoomAction) => void;\n}\n\nexport function useAutoCenter({\n nodes,\n sizeReady,\n zoomer,\n rootRef,\n pushZoomTransition,\n}: UseAutoCenterOptions) {\n const [centered, setCentered] = useState(false);\n const reCenterRef = useRef(false);\n\n // Transform to horizontal center once.\n useEffect(() => {\n const root = rootRef.current;\n if (sizeReady && root && !centered && nodes.length > 0) {\n const {\n x: left,\n y: top,\n width,\n height,\n } = mergeRects(nodes.map((node) => node.view!));\n const right = left + width;\n const bottom = top + height;\n\n const x = (root.clientWidth - (right + left)) / 2;\n let y = 30;\n if (reCenterRef.current) {\n const height = bottom - top + CANVAS_PADDING_BOTTOM;\n const diffY = height - root.clientHeight;\n if (diffY > 0) {\n y = -diffY - top;\n } else {\n y = (root.clientHeight - (bottom + top)) / 2;\n }\n }\n pushZoomTransition({\n transform: { k: 1, x, y },\n duration: reCenterRef.current ? undefined : 0,\n });\n setCentered(true);\n }\n\n reCenterRef.current = false;\n }, [centered, nodes, rootRef, sizeReady, zoomer, pushZoomTransition]);\n\n return { centered, setCentered, reCenterRef };\n}\n","import type { NodeRect, SizeTuple, TransformLiteral } from \"../interfaces\";\n\n/**\n * Get the scroll movement so that the given rectangle is visible in container.\n */\nexport function getScrollTo(\n rect: NodeRect,\n containerSize: SizeTuple,\n padding: [top: number, right: number, bottom: number, left: number],\n transform: TransformLiteral,\n block?: \"start\" | \"nearest\"\n) {\n const [containerWidth, containerHeight] = containerSize;\n const [paddingTop, paddingRight, paddingBottom, paddingLeft] = padding;\n const { x: left, y: top, width, height } = rect;\n const right = left + width;\n const bottom = top + height;\n\n const transformedTop = top * transform.k + transform.y;\n const transformedBottom = bottom * transform.k + transform.y;\n\n const diffYTop = paddingTop - transformedTop;\n const diffYBottom = containerHeight - paddingBottom - transformedBottom;\n const y =\n diffYTop > 0 || block === \"start\"\n ? diffYTop / transform.k\n : diffYBottom < 0\n ? diffYBottom / transform.k\n : 0;\n\n const transformedLeft = left * transform.k + transform.x;\n const transformedRight = right * transform.k + transform.x;\n\n const diffXLeft = paddingLeft - transformedLeft;\n const diffXRight = containerWidth - paddingRight - transformedRight;\n const x =\n diffXLeft > 0\n ? diffXLeft / transform.k\n : diffXRight < 0\n ? diffXRight / transform.k\n : 0;\n\n return { x, y };\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.loading--LlSQxd6c{width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:rgba(69,94,255,0.5);border-radius:24px;animation:loading--LlSQxd6c 1s infinite linear}.inner--I4b7rAPw{width:12px;height:12px;background:rgb(69,94,255);border-radius:12px}@keyframes loading--LlSQxd6c{0%{transform:scale(1);opacity:1}100%{transform:scale(1.5);opacity:0}}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"loading\": `loading--LlSQxd6c`,\n\t\"inner\": `inner--I4b7rAPw`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.avatar--v2FiKghW::part(avatar){background-color:rgb(213,214,230);padding:1px}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"avatar\": `avatar--v2FiKghW`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"./images/background.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `ai-portal\\\\.cruise-canvas{display:block;position:relative;width:100%;height:100%;overflow:hidden;background-color:#fff;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});background-size:cover;background-repeat:no-repeat;background-position:center;background-attachment:fixed;color:#262626;--cruise-canvas-node-border:1px solid gray;--cruise-canvas-node-width-small:330px;--cruise-canvas-node-width-medium:453px;--cruise-canvas-node-width-large:800px;--cruise-canvas-primary-color:var(--elevo-color-brand);--cruise-canvas-input-background:rgba(255,255,255,0.8);--cruise-canvas-input-box-shadow:0px 1px 0px 0px #ffffff,inset 0px 2px 4px 0px #b3bcf9}.root--z6jdb_BU{width:100%;height:100%;position:relative}.widgets--r6lUPOu2{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;-webkit-user-select:none;user-select:none}.root--z6jdb_BU.loading--m5r507Hp .canvas--u6C26uH_,\n.root--z6jdb_BU.loading--m5r507Hp + .widgets--r6lUPOu2{visibility:hidden}.loading-icon--UkRBMlBy{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:48px;color:#fff}.widgets--r6lUPOu2 > *{pointer-events:auto;-webkit-user-select:text;user-select:text}.canvas--u6C26uH_,\n.edges--uNPQGWZg{width:100%;height:100%;position:absolute;transform-origin:0% 0%;-webkit-user-select:none;user-select:none}.node--IBGywwp4{position:absolute;-webkit-user-select:text;user-select:text;cursor:auto}.node--IBGywwp4:not(.ready--pmh440go),\n.canvas--u6C26uH_:not(.ready--pmh440go) > .edges--uNPQGWZg{visibility:hidden}svg.edges--uNPQGWZg{pointer-events:none;overflow:visible}.edge--muRUWYG1{fill:none;stroke-width:2px;stroke:rgba(255,255,255,0.6);stroke-dasharray:5,5}.go-back--myNmSpSv{position:absolute;top:20px;left:20px}.go-back--myNmSpSv::part(link){width:32px;height:32px;display:flex;justify-content:center;align-items:center;background:rgba(255,255,255,0.7);box-shadow:0px 3px 14px 0px rgba(0,0,0,0.1),0px 1px 4px 0px rgba(0,0,0,0.06);border-radius:8px;border:1px solid rgba(255,255,255,0.3);color:inherit;box-sizing:border-box}.go-back--myNmSpSv::part(link):hover{background:rgba(255,255,255,0.5)}.go-back--myNmSpSv::part(link):active{background:rgba(255,255,255,0.3)}.footer-container--sTjEGP7I{position:absolute;bottom:28px;left:50%;transform:translate(-50%,0);width:var(--cruise-canvas-node-width-large);max-width:80%}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"root\": `root--z6jdb_BU`,\n\t\"widgets\": `widgets--r6lUPOu2`,\n\t\"loading\": `loading--m5r507Hp`,\n\t\"canvas\": `canvas--u6C26uH_`,\n\t\"loading-icon\": `loading-icon--UkRBMlBy`,\n\t\"edges\": `edges--uNPQGWZg`,\n\t\"node\": `node--IBGywwp4`,\n\t\"ready\": `ready--pmh440go`,\n\t\"edge\": `edge--muRUWYG1`,\n\t\"go-back\": `go-back--myNmSpSv`,\n\t\"footer-container\": `footer-container--sTjEGP7I`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../images/requirement@2x.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.node-requirement--aVjY3LFY{width:var(--cruise-canvas-node-width-medium);max-width:90vw;background-color:rgba(255,255,255,0.4);background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});background-position:center bottom;background-size:var(--cruise-canvas-node-width-medium) 128px;background-repeat:no-repeat;box-shadow:0px 4px 10px 0px rgba(54,64,80,0.18);border-radius:12px;-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);border:1px solid rgba(255,255,255,0.4);padding:8px;white-space:pre-wrap;position:relative}.node-requirement--aVjY3LFY.active--aEZLkOZe{border-color:#a1b5ff}.heading--F8b1aIJT{display:flex;align-items:center;margin-bottom:11px;font-size:13px}.avatar--BbtS9D46{flex:1;min-width:0}.avatar--BbtS9D46::part(avatar){border:1px solid #fff}.time--IRwoiblW{color:#8c8c8c}.body--JYv_r9n_{background:#f1f6ff;box-shadow:0px 1px 0px 0px #ffffff;border-radius:9px;padding:15px 10px;overflow-wrap:break-word}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"node-requirement\": `node-requirement--aVjY3LFY`,\n\t\"active\": `active--aEZLkOZe`,\n\t\"heading\": `heading--F8b1aIJT`,\n\t\"avatar\": `avatar--BbtS9D46`,\n\t\"time\": `time--IRwoiblW`,\n\t\"body\": `body--JYv_r9n_`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.container--qJxxNcfJ{position:fixed;top:0;right:0;bottom:0;left:0;padding:20px;background-color:var(--mask-bg)}.editor--SCuHEqYM{height:100%;max-width:1200px;margin:0 auto;background:#ffffff;box-shadow:1px 1px 10px 0px rgba(0,10,26,0.1);border-radius:12px;display:flex;flex-direction:column}.header--nRP4oDyL{height:52px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(0,0,0,0.15);padding:0 20px}.title--Tq8TUpVz{font-weight:500;font-size:16px;color:#262626}.body--uTZ0qYhS{flex:1;min-height:0;padding:20px;display:flex;flex-direction:column}.content--_WNf_qJr{height:100%}.footer--cblnjGHn{padding:12px 20px;border-top:1px solid rgba(0,0,0,0.15)}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"container\": `container--qJxxNcfJ`,\n\t\"editor\": `editor--SCuHEqYM`,\n\t\"header\": `header--nRP4oDyL`,\n\t\"title\": `title--Tq8TUpVz`,\n\t\"body\": `body--uTZ0qYhS`,\n\t\"content\": `content--_WNf_qJr`,\n\t\"footer\": `footer--cblnjGHn`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../images/job-background.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.node-job--soTYrcA7{width:var(--cruise-canvas-node-width-medium);max-width:90vw;background:linear-gradient(180deg,#f5f8ff 0%,#edf0f9 100%);box-shadow:0px 4px 10px 0px rgba(177,149,207,0.4),0px 2px 4px 0px rgba(0,0,0,0.06);border-radius:12px;border:1px solid rgba(255,255,255,0.5);padding:8px;position:relative}.node-job--soTYrcA7.active--WIcgH7xW{border-color:#a1b5ff}.background--CKldFV7M{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:12px;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});background-repeat:no-repeat;background-position:top right;z-index:0;transition:opacity 0.15s;opacity:0}.node-job--soTYrcA7.active--WIcgH7xW .background--CKldFV7M,\n.node-job--soTYrcA7:hover .background--CKldFV7M{opacity:1}.background--CKldFV7M ~ *{position:relative;z-index:1}.fit-content--HuAZHd31{min-width:var(--cruise-canvas-node-width-medium);width:min-content}.node-job--soTYrcA7.large--bn_n8RL5{width:var(--cruise-canvas-node-width-large)}.error--IwtdD0T6{box-shadow:inset 0px 0px 8px 2px rgba(242,76,37,0.6);border-color:rgba(242,76,37,0.6)}.heading--GZqrhPqL{display:flex;align-items:center;justify-content:space-between;padding:0 5px 5px;font-size:13px;color:#8c8c8c}.body--V34MsV9R{padding:9px 4px 4px}.scrollable--LudR_5Pj{max-height:462px;overflow-y:auto}.message--iVQBlD6k:not(:first-child){margin-top:6px}.role-assistant--Y8vd9Oms,\n.role-user--nAW4Hzsu{background:var(--cruise-canvas-input-background);border-radius:9px;border:1px solid #ccd1de;padding:6px 16px}.role-user--nAW4Hzsu{white-space:pre-wrap}.role-user--nAW4Hzsu:empty{display:none}.human-input--wFc6ovnT{margin-top:1em;display:block;width:100%;padding:10px 16px;color:inherit;background:var(--cruise-canvas-input-background);box-shadow:var(--cruise-canvas-input-box-shadow);border-radius:9px;border:none;font-size:14px;line-height:22px;height:64px}.human-input--wFc6ovnT:focus{outline:none}.human-input--wFc6ovnT::placeholder{color:#bfbfbf}.node-job--soTYrcA7 *::-webkit-scrollbar{width:5px;height:5px;background:transparent}.node-job--soTYrcA7 *::-webkit-scrollbar-thumb{background-color:#d8d8d8;border-radius:3px}.node-job--soTYrcA7 *::-webkit-scrollbar-track{background:transparent}.view-container--ra1sVc4C{margin-top:10px}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"node-job\": `node-job--soTYrcA7`,\n\t\"active\": `active--WIcgH7xW`,\n\t\"background\": `background--CKldFV7M`,\n\t\"fit-content\": `fit-content--HuAZHd31`,\n\t\"large\": `large--bn_n8RL5`,\n\t\"error\": `error--IwtdD0T6`,\n\t\"heading\": `heading--GZqrhPqL`,\n\t\"body\": `body--V34MsV9R`,\n\t\"scrollable\": `scrollable--LudR_5Pj`,\n\t\"message\": `message--iVQBlD6k`,\n\t\"role-assistant\": `role-assistant--Y8vd9Oms`,\n\t\"role-user\": `role-user--nAW4Hzsu`,\n\t\"human-input\": `human-input--wFc6ovnT`,\n\t\"view-container\": `view-container--ra1sVc4C`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../images/start@2x.png\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.node-start--Mrh1iP5r{width:65px;height:65px;position:relative;overflow:visible}.icon--NxC4u6Wl{width:75px;height:75px;background-image:url(${___CSS_LOADER_URL_REPLACEMENT_0___});background-size:75px 75px;background-repeat:no-repeat;background-position:center;position:absolute;left:-5px;top:-1px}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"node-start\": `node-start--Mrh1iP5r`,\n\t\"icon\": `icon--NxC4u6Wl`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.node-instruction--Gu7k6RDs{max-width:437px;max-width:min(437px,90vw);background:rgba(255,255,255,0.2);box-shadow:0px 4px 10px 0px rgba(54,64,80,0.08);border-radius:9999px;border:1px solid rgba(255,255,255,0.284);padding:6px 16px;color:rgba(0,0,0,0.45)}.text--jsSeLl7B{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;--shine-text-color:rgba(0,0,0,0.45);--shine-text-highlight-color:#dcdcdc}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"node-instruction\": `node-instruction--Gu7k6RDs`,\n\t\"text\": `text--jsSeLl7B`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.node-end--yzRaOZnC{display:flex;flex-direction:column;align-items:center;gap:20px}.content--iXSH199p{display:flex;align-items:center}.icon--IVcHjGFO{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:#fff;background:#29cc49;border-radius:18px;font-size:14px;margin-right:6px}.text--dW7Y74et{font-weight:500}.button--mkIwsPzt{width:120px;height:30px;background:rgba(0,0,0,0.04);border:none;border-radius:15px;text-align:center;cursor:pointer}.button--mkIwsPzt:hover{background:rgba(0,0,0,0.08)}.button--mkIwsPzt:active{background:rgba(0,0,0,0.15)}.button--mkIwsPzt:focus{outline:none}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"node-end\": `node-end--yzRaOZnC`,\n\t\"content\": `content--iXSH199p`,\n\t\"icon\": `icon--IVcHjGFO`,\n\t\"text\": `text--dW7Y74et`,\n\t\"button\": `button--mkIwsPzt`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.zoom-bar--MTw5VGPl{left:20px;bottom:20px}@media (max-width: 1123px){.zoom-bar--MTw5VGPl{left:auto;bottom:auto;top:20px;right:80px}}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"zoom-bar\": `zoom-bar--MTw5VGPl`\n};\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.error--D_UJOZDA{color:var(--color-error);padding:8px;white-space:pre-wrap;word-break:break-word}`, \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"error\": `error--D_UJOZDA`\n};\nexport default ___CSS_LOADER_EXPORT___;\n"],"names":["K","NS","locales","en","YES","NO","TASK_COMPLETED","SHARE","TYPE_YOUR_MESSAGE_HERE","SWITCH_TO_CHAT","BACK_TO_CENTER","ZOOM_IN","ZOOM_OUT","FULLSCREEN","SEND_MESSAGE","UNTITLED","DOWNLOAD","INITIATING_SERVICE_FLOW","STARTING_SERVICE_FLOW_ACTIVITY","zh","t","i18n","getFixedT","___CSS_LOADER_EXPORT___","push","module","id","locals","mergeRects","rects","left","Infinity","top","right","bottom","rect","r","x","width","b","y","height","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","undefined","DEFAULT_SCALE_RANGE_MIN","DEFAULT_SCALE_RANGE_MAX","START_NODE_ID","END_NODE_ID","FEEDBACK_NODE_ID","LOADING_NODE_ID","REPLAY_NODE_ID","CANVAS_PADDING_TOP","CANVAS_PADDING_RIGHT","CANVAS_PADDING_BOTTOM","CANVAS_PADDING_LEFT","RANK_SEP","NODE_SEP","EDGE_SEP","IS_MAC","test","_ref","_userAgentData$platfo","_userAgentData","navigator","userAgentData","platform","userAgent","wheelData","event","deltaY","deltaMode","ctrlKey","getPositionWithOffsets","position","offsets","ICON_BACK_TO_CENTER","lib","icon","ICON_ZOOM_OUT","ICON_ZOOM_IN","ZoomBar","scale","showUiSwitch","onScaleChange","onReCenter","onSwitchToChat","handleZoomIn","useCallback","handleZoomOut","React","className","toolbarStyles","toolbar","styles","WrappedIconButton","variant","ICON_CHAT","onClick","divider","title","NodeStart","WrappedEasyOpsAvatar","wrapBrick","NodeRequirement","username","content","startTime","active","cmd","mentionedAiEmployeeId","files","classNames","heading","avatar","nameOrInstanceId","showName","size","time","moment","format","body","ReadableCommand","length","FileList","NodeInstruction","loading","text","sharedStyles","WrappedAvatar","AIEmployeeAvatar","aiEmployeeId","Suspense","fallback","name","src","fallbackAvatar","LegacyAIEmployeeAvatar","_ref2","employeePromise","useMemo","fetchEmployee","employee","use","props","URL","location","origin","toString","_extends","RegExpLargeTableInMarkdown","NodeJob","_job$toolCall","_job$messages2","job","isLeaf","toolName","toolCall","toolMarkdownContent","cmdbInstanceDetails","sizeLarge","_job$messages","contents","instanceDetails","large","messages","forEach","message","role","part","parts","_part$data","type","data","_part$data2","Object","keys","outputSchema","properties","detail","file","markdownContent","join","viewSize","setViewSize","useState","handleViewSizeChange","value","error","isError","background","generatedView","ViewToolbar","ToolCallStatus","map","index","_message$parts","key","markdown","partIndex","EnhancedMarkdown","style","padding","CmdbInstanceDetail","humanAction","requestHumanAction","state","RequestHumanAction","action","ViewContainer","onSizeChange","ref","useRef","setHoverOnScrollableContent","useContext","CanvasContext","handleMouseMove","e","scrollableContent","found","el","nativeEvent","composedPath","current","HTMLElement","tagName","scrollWidth","clientWidth","classList","contains","handleMouseLeave","onMouseMove","onMouseLeave","CreatedView","noHeading","NodeEnd","onShare","replay","conversationState","TaskContext","WrappedIcon","prefix","button","getDrawerWidth","innerWidth","window","Math","min","ToolCallDetailDrawer","_toolCall$annotations","setActiveDetail","toolTitle","annotations","handleClose","setTimeout","useEffect","_ref$current","open","setWidth","onResize","addEventListener","removeEventListener","WrappedDrawer","customTitle","closable","mask","maskClosable","keyboard","themeVariant","onClose","ToolCallDetail","getCenterPosition","view","Nav","nav","currentNavId","taskState","_navElement$querySele","navElement","querySelector","scrollIntoView","behavior","block","lastActiveItem","findLast","item","DONE_STATES","includes","_navElement$querySele2","container","NavItem","level","disabled","completed","working","theme","spinning","failed","canceled","getClassNameAndIconProps","marginLeft","link","NodeLoading","inner","editorLibs","filePath","componentsDefinition","replaceAll","JSON","stringify","types","nextTsxDefinition","AsyncWrappedCodeEditor","async","default","asyncWrapBrick","onCodeChange","JsxEditor","_manuallyUpdatedViews","_view$withContexts2","workspace","manuallyUpdatedViews","updateView","activeJsxEditorJob","setActiveJsxEditorJob","get","source","code","setCode","libs","_view$withContexts","commonLibs","withContexts","RESPONSE","editor","header","ICON_CLOSE","language","uri","automaticLayout","extraLibs","footer","WrappedButton","newView","asyncConstructedView","getAsyncConstructedView","NodeError","jobStyles","NodeChunk","flow","activity","MemoizedNodeComponent","memo","NodeComponent","CruiseCanvasComponent","_conversation$title","conversationId","initialRequest","replayDelay","supports","showHiddenJobs","showHumanActions","showFeedback","propShowFeedback","showFeedbackAfterFailed","showFeedbackOnView","showJsxEditor","previewUrlTemplate","showCases","exampleProjects","tryItOutUrl","separateInstructions","aiEmployees","commands","uploadOptions","onTerminate","onSubmitFeedback","onFeedbackOnView","onDetailChange","rootRef","conversation","tasks","serviceFlows","errors","humanInputRef","skipToResults","watchAgain","useConversationDetail","flowMap","activityMap","useFlowAndActivityMap","graph","chunks","jobMap","getFlatChunks","nodes","edges","views","jobLevels","Map","userInputNodes","previousNodeId","chunk","nodeIds","_messages$find","set","hasMessages","Array","isArray","userInput","find","msg","instruction","instructionNodeId","jobNodeId","humanActionNodeId","requirementId","filter","flatMap","errorNodeId","nodeId","task","taskId","console","i","target","counter","some","edge","loadingId","useConversationGraph","rawNodes","rawEdges","pageTitle","activeNodeId","setActiveNodeId","jobId","split","projectId","submittingFeedback","setSubmittingFeedback","submittedFeedback","setSubmittedFeedback","setShowFeedback","feedbackDoneViews","setFeedbackDoneViews","handleSubmitFeedback","useImperativeHandle","feedbackSubmitDone","feedbackSubmitFailed","feedbackOnViewDone","viewId","prev","newSet","Set","add","transitionEnabledRef","timer","clearTimeout","getRuntime","applyPageTitle","humanInput","input","extra","_humanInputRef$curren","call","sizeMap","setSizeMap","onNodeResize","newMap","delete","sizeReady","_rawNodes","_rawEdges","finished","noTasks","memoizedPositionsRef","initialNodes","initialEdges","finishedNodeIds","hasSource","failedFeedback","shouldAppend","hasTarget","node","has","sourceIds","memoizedPositions","startNodePositionRef","_memoizedPositionsRef","dagre","Graph","setGraph","rankdir","nodesep","edgesep","ranksep","setDefaultEdgeLabel","setEdge","setNode","nodeView","assign","sourcePosition","targetPosition","turnY","points","useLayout","detectScrolledUpRef","manualScrolledUpRef","hoverOnScrollableContent","grabbing","transform","transformRef","zoomer","zoomable","scrollable","pannable","pannableWithCtrl","scaleRange","_scaleRange","onSwitchActiveTarget","setGrabbing","setTransform","k","zoom","wheelDelta","moved","scaleExtent","on","onContextMenu","preventDefault","document","root","rootSelection","select","unsetZoom","closest","element","delta","maxScroll","scrollHeight","clientHeight","scrollTop","checkScrollableY","cancelable","translateBy","wheelDeltaX","wheelDeltaY","useZoom","transitionRef","pushZoomTransition","nextAction","run","selection","_target$duration","_transform$k","_transform$x","_transform$y","_translateBy$","_translateBy$2","duration","transition","ease","next","ZoomTransform","centered","setCentered","reCenterRef","diffY","useAutoCenter","canChat","nonLeafNodes","leafNodes","max","bottomRef","offsetHeight","transformedBottom","handleReCenter","handleScaleChange","scaleTo","fullRect","offsetWidth","viewportWidth","viewportHeight","minX","maxX","minY","maxY","translateExtent","scrollTo","targets","n","_job","containerSize","containerWidth","containerHeight","paddingTop","paddingRight","paddingBottom","paddingLeft","diffYTop","diffYBottom","diffXLeft","diffXRight","getScrollTo","scrollBy","direction","range","distance","isHorizontal","targetHeight","activeDetail","subActiveDetail","setSubActiveDetail","activeExpandedViewJobId","setActiveExpandedViewJobId","activeFile","setActiveFile","setManuallyUpdatedViews","firstNode","requirementNode","activeImages","setActiveImages","taskContextValue","tryItOut","win","getBasePath","slice","__elevo_try_it_out","canvasContextValue","fulfilledActiveDetail","useFulfilledActiveDetail","handleRootClick","handleKeyDown","activeElement","keyboardAction","altKey","activeNode","metaKey","shiftKey","moveOnAxis","axis","oppositeAxis","activePosition","candidates","diff","abs","maxBy","minBy","handleKeyboardNav","stopPropagation","useHandleEscape","Provider","cursor","tabIndex","canvas","ready","d","_ref3","_node$view","_node$view2","instructionLoading","GENERAL_DONE_STATES","widgets","NodeReplay","chat","ChatBox","ExpandedView","FilePreview","ImagesPreview","images","_ref4","nodeRef","observer","ResizeObserver","observe","disconnect","handleMouseDown","handleClick","NodeFeedback","___CSS_LOADER_URL_IMPORT_0___","___CSS_LOADER_URL_REPLACEMENT_0___"],"sourceRoot":""}