@runfusion/fusion 0.26.0 → 0.27.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.
- package/dist/bin.js +11036 -1992
- package/dist/client/assets/AgentDetailView-B7QRcHJH.css +1 -0
- package/dist/client/assets/AgentDetailView-DwLmRXTY.js +18 -0
- package/dist/client/assets/{AgentsView-D6Zi5zfP.js → AgentsView-D-N6aA0P.js} +12 -7
- package/dist/client/assets/ChatView-DnCdKu8Z.js +1 -0
- package/dist/client/assets/{DevServerView--_WBvIDQ.js → DevServerView-BiA1nYtt.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-xedtR-Rd.js → DirectoryPicker-DvBviDG6.js} +1 -1
- package/dist/client/assets/{DocumentsView-Bg2oaZks.js → DocumentsView-BWXOxpuq.js} +1 -1
- package/dist/client/assets/{EvalsView-B3uOCXfr.js → EvalsView-CJFbtL7i.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-Bx6yXVS5.js → ExperimentalAgentOnboardingModal-DuGIPd0B.js} +1 -1
- package/dist/client/assets/InsightsView-BBpRiolN.js +11 -0
- package/dist/client/assets/{MemoryView-xcN_eouf.js → MemoryView-48LuNkKk.js} +2 -2
- package/dist/client/assets/NodesView-CGQWSNZM.js +14 -0
- package/dist/client/assets/{PiExtensionsManager-Cc8aAZXg.js → PiExtensionsManager-i-7UL2oh.js} +2 -2
- package/dist/client/assets/PluginManager-DoSAykD6.js +1 -0
- package/dist/client/assets/{ResearchView-CERNf7sJ.js → ResearchView-XZuRtOxE.js} +1 -1
- package/dist/client/assets/{SettingsModal-Cis-4Lot.css → SettingsModal-Ci0_sqbU.css} +1 -1
- package/dist/client/assets/{SettingsModal-B1r0yASu.js → SettingsModal-CmeF8CN4.js} +1 -1
- package/dist/client/assets/SettingsModal-DBcjf9Bu.js +31 -0
- package/dist/client/assets/SettingsModal-DWKgRxBA.css +1 -0
- package/dist/client/assets/{SetupWizardModal-D1q548_L.js → SetupWizardModal-CgtvpMX9.js} +1 -1
- package/dist/client/assets/{SkillsView-ClLM6u6p.js → SkillsView-DErYRumF.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-ze0pEZ5U.js → StashRecoveryView-QJrNS4Vg.js} +1 -1
- package/dist/client/assets/{TodoView-CTmIfy2M.js → TodoView-BD9NRwq0.js} +2 -2
- package/dist/client/assets/{dashboard-view-CyWN-d02.js → dashboard-view-BWGH_fAq.js} +1 -1
- package/dist/client/assets/dashboard-view-BoTzlP8b.css +1 -0
- package/dist/client/assets/dashboard-view-Ws9_ZnKu.js +21 -0
- package/dist/client/assets/{folder-open-BZuKESeq.js → folder-open-CHSlllzf.js} +1 -1
- package/dist/client/assets/index-DCovGm5b.css +1 -0
- package/dist/client/assets/index-bEwSVl7B.js +692 -0
- package/dist/client/assets/{star-D75YKEq-.js → star-BgVwWAPz.js} +1 -1
- package/dist/client/assets/{upload-BYYTgWFj.js → upload-CAzycxr9.js} +1 -1
- package/dist/client/assets/{users-RS90Aii3.js → users-CZnxCCCJ.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/droid-cli/src/__tests__/index.test.ts +228 -0
- package/dist/extension.js +5517 -1193
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +36 -22
- package/dist/pi-claude-cli/src/provider.ts +7 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/manifest.json +19 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +20 -2
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/TestRunnerPanel.test.tsx +99 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/config-flow.test.ts +91 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/dashboard-view.test.tsx +40 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/dashboard-views.test.ts +46 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/draft-store.test.ts +50 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/fixtures/exec-mock.ts +80 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/fixtures/fixtures.test.ts +40 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/fixtures/registry.ts +82 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/generator.test.ts +54 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/manage-view.test.tsx +98 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/manifest.test.ts +21 -5
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/registration.test.ts +29 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/run-routes.test.ts +98 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/runner.test.ts +55 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/runtime-availability.test.ts +61 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/validation.test.ts +30 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/wizard-routes.test.ts +61 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-integration.test.ts +19 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/dashboard-view.css +43 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/dashboard-view.tsx +49 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/generation/generator.ts +95 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/generation/redact.ts +9 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/generation/runner.ts +79 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/generation/types.ts +31 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/index.ts +46 -2
- package/dist/plugins/fusion-plugin-cli-printing-press/src/manage/EditDraftModal.tsx +75 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/manage/useDrafts.ts +73 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/manage-view.css +79 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/manage-view.tsx +122 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/routes/wizard-routes.ts +272 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/run/TestRunnerPanel.css +70 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/run/TestRunnerPanel.tsx +98 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/run/useRunGeneratedCli.ts +37 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/runtime/__tests__/executor-runtime-env.test.ts +191 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/runtime/executor-runtime-env.ts +75 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/storage/draft-store.ts +85 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/store/__tests__/cli-press-store.test.ts +128 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/store/__tests__/credentials.test.ts +62 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/store/cli-press-store.ts +427 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/store/cli-press-types.ts +110 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/store/credentials.ts +95 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/wizard/steps.tsx +55 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/wizard/types.ts +33 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/src/wizard/validation.ts +63 -0
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/manifest.json +10 -0
- package/dist/plugins/fusion-plugin-reports/package.json +18 -2
- package/dist/plugins/fusion-plugin-reports/src/__tests__/approval.test.ts +164 -0
- package/dist/plugins/fusion-plugin-reports/src/__tests__/manifest.test.ts +14 -0
- package/dist/plugins/fusion-plugin-reports/src/__tests__/routes-approval.test.ts +109 -0
- package/dist/plugins/fusion-plugin-reports/src/__tests__/scaffold.test.ts +60 -0
- package/dist/plugins/fusion-plugin-reports/src/__tests__/share-blocks.test.ts +83 -0
- package/dist/plugins/fusion-plugin-reports/src/aggregation.ts +23 -0
- package/dist/plugins/fusion-plugin-reports/src/approval.ts +97 -0
- package/dist/plugins/fusion-plugin-reports/src/cadence.ts +23 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/ReportsView.css +82 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/ReportsView.tsx +24 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/ReportComparisonDrawer.test.tsx +12 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/ReportDetailPanel.test.tsx +12 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/ReportFiltersBar.test.tsx +14 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/ReportsView.test.tsx +27 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/api.test.ts +19 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/useReportSectionDiff.test.ts +11 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/__tests__/useReports.test.ts +13 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/api.ts +85 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportApprovalPanel.css +59 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportApprovalPanel.tsx +58 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportComparisonDrawer.tsx +21 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportDetailPanel.tsx +29 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportEmptyState.tsx +3 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportFiltersBar.tsx +19 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ReportListItem.tsx +8 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.css +29 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.tsx +43 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ReportApprovalPanel.test.tsx +38 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ShareBlocksPanel.test.tsx +24 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/test-setup.ts +18 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/types.ts +22 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/useReportPreview.ts +44 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/useReportSectionDiff.ts +59 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/useReports.ts +71 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard/useViewportMode.ts +13 -0
- package/dist/plugins/fusion-plugin-reports/src/dashboard-view.tsx +6 -0
- package/dist/plugins/fusion-plugin-reports/src/index.ts +48 -2
- package/dist/plugins/fusion-plugin-reports/src/pipeline.ts +58 -0
- package/dist/plugins/fusion-plugin-reports/src/render/__tests__/escape.test.ts +20 -0
- package/dist/plugins/fusion-plugin-reports/src/render/__tests__/html-template.test.ts +110 -0
- package/dist/plugins/fusion-plugin-reports/src/render/__tests__/standalone-html.test.ts +66 -0
- package/dist/plugins/fusion-plugin-reports/src/render/escape.ts +12 -0
- package/dist/plugins/fusion-plugin-reports/src/render/html-styles.ts +40 -0
- package/dist/plugins/fusion-plugin-reports/src/render/html-template.ts +137 -0
- package/dist/plugins/fusion-plugin-reports/src/render/index.ts +4 -0
- package/dist/plugins/fusion-plugin-reports/src/render/standalone-html.ts +75 -0
- package/dist/plugins/fusion-plugin-reports/src/report-schema.ts +31 -0
- package/dist/plugins/fusion-plugin-reports/src/routes/__tests__/report-export-routes.test.ts +104 -0
- package/dist/plugins/fusion-plugin-reports/src/routes/report-approval-routes.ts +98 -0
- package/dist/plugins/fusion-plugin-reports/src/routes/report-export-routes.ts +77 -0
- package/dist/plugins/fusion-plugin-reports/src/routes/report-list-routes.ts +72 -0
- package/dist/plugins/fusion-plugin-reports/src/runs-store.ts +69 -0
- package/dist/plugins/fusion-plugin-reports/src/share-blocks.ts +82 -0
- package/dist/plugins/fusion-plugin-reports/src/store/report-store.ts +51 -2
- package/dist/plugins/fusion-plugin-reports/src/store/report-types.ts +6 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +1528 -29391
- package/dist/plugins/fusion-plugin-roadmap/manifest.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/references/engine-tools.md +1 -1
- package/skill/fusion/references/extension-tools.md +3 -3
- package/skill/fusion/references/fusion-capabilities.md +1 -1
- package/dist/client/assets/AgentDetailView-BwJaLqZh.css +0 -1
- package/dist/client/assets/AgentDetailView-Cv-vgOj3.js +0 -18
- package/dist/client/assets/ChatView-CAHjY9uO.js +0 -1
- package/dist/client/assets/InsightsView-Q1zvtF4F.js +0 -11
- package/dist/client/assets/NodesView-RxXg58_Q.js +0 -14
- package/dist/client/assets/PluginManager-BEkyBajl.js +0 -1
- package/dist/client/assets/SettingsModal-BLsac7CJ.js +0 -31
- package/dist/client/assets/SettingsModal-BNSrO1M9.css +0 -1
- package/dist/client/assets/dashboard-view-4xAN3yO5.js +0 -21
- package/dist/client/assets/dashboard-view-BkTMSZYn.css +0 -1
- package/dist/client/assets/index-Bdw6llW6.js +0 -692
- package/dist/client/assets/index-CZGlyJuS.css +0 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.css +0 -1093
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.cli-binary-panel{display:flex;flex-direction:column;gap:12px;padding:0 var(--space-xl);margin-top:var(--space-lg);border:0;background:transparent}.cli-binary-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.cli-binary-header .settings-section-heading{margin:0}.cli-binary-pill{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}.cli-binary-pill--ok{background:#2ea0432e;color:#57c97a;border:1px solid rgba(46,160,67,.4)}.cli-binary-pill--warn{background:#d299222e;color:#e3b341;border:1px solid rgba(210,153,34,.4)}.cli-binary-pill--err{background:#da36332e;color:#f48581;border:1px solid rgba(218,54,51,.4)}.cli-binary-help{color:var(--text-secondary, #98a3b1);line-height:1.4}.cli-binary-help code{background:#ffffff0f;padding:1px 6px;border-radius:4px;font-size:.92em}.cli-binary-status-line{margin:0;color:var(--text-secondary, #98a3b1)}.cli-binary-status-line code{background:#ffffff0f;padding:1px 6px;border-radius:4px}.cli-binary-detail{display:flex;flex-direction:column;gap:12px}.cli-binary-info-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:13px}.cli-binary-info-list li{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cli-binary-info-list span{color:var(--text-secondary, #98a3b1);min-width:64px}.cli-binary-info-list code{background:#ffffff0f;padding:1px 6px;border-radius:4px;word-break:break-all}.cli-binary-expected{color:var(--text-secondary, #98a3b1);font-size:12px}.cli-binary-actions{display:flex;gap:8px;flex-wrap:wrap}.cli-binary-install-btn,.cli-binary-refresh-btn,.cli-binary-copy-btn{cursor:pointer;border-radius:6px;padding:6px 12px;font-size:13px;border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.cli-binary-install-btn{background:var(--accent, #3b82f6);color:#fff}.cli-binary-install-btn:hover:not(:disabled){background:var(--accent-hover, #2563eb)}.cli-binary-install-btn:disabled,.cli-binary-refresh-btn:disabled{opacity:.55;cursor:not-allowed}.cli-binary-refresh-btn,.cli-binary-copy-btn{background:#ffffff0a;color:var(--text-primary, #e6edf3);border-color:#ffffff1f}.cli-binary-refresh-btn:hover:not(:disabled),.cli-binary-copy-btn:hover{background:#ffffff14}.cli-binary-commands{display:flex;flex-direction:column;gap:6px}.cli-binary-commands label{font-size:12px;color:var(--text-secondary, #98a3b1);text-transform:uppercase;letter-spacing:.04em}.cli-binary-command-row{display:flex;align-items:center;gap:8px;background:#00000040;border:1px solid rgba(255,255,255,.06);border-radius:6px;padding:6px 8px 6px 12px}.cli-binary-command-row code{flex:1;font-family:var(--font-mono, ui-monospace, "SFMono-Regular", monospace);font-size:12.5px;color:var(--text-primary, #e6edf3);white-space:nowrap;overflow-x:auto}.cli-binary-install-log{border-top:1px solid rgba(255,255,255,.06);padding-top:10px;font-size:12.5px}.cli-binary-install-log summary{cursor:pointer;color:var(--text-secondary, #98a3b1)}.cli-binary-install-output{margin:6px 0 0;padding:8px 10px;background:#00000059;border-radius:4px;max-height:220px;overflow:auto;white-space:pre-wrap;font-size:12px;line-height:1.4}.cli-binary-install-output--err{color:#f48581}.cli-binary-permissions-hint{margin:6px 0;padding:8px 10px;background:#da36331a;border-left:3px solid rgba(218,54,51,.55);border-radius:0 4px 4px 0;color:#f7c4c2;font-size:12.5px;line-height:1.5}.prompt-manager{display:flex;flex-direction:column;gap:var(--space-md);padding:0 var(--space-xl);margin-top:var(--space-md)}.prompt-manager-tabs{display:flex;gap:var(--space-xs);border-bottom:1px solid var(--border);padding-bottom:var(--space-sm)}.prompt-manager-tab{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:none;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.prompt-manager-tab:hover{color:var(--text);background:var(--surface)}.prompt-manager-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.prompt-manager-tab.active{color:var(--text);background:var(--surface);border-color:var(--border)}.prompt-manager-content{min-height:200px}.prompt-manager-templates-tab,.prompt-manager-assignments-tab,.prompt-manager-overrides-tab{display:flex;flex-direction:column;gap:var(--space-lg)}.prompt-template-section{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-section-title{font-size:14px;font-weight:600;color:var(--text);margin:0}.prompt-template-section-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-template-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-card{padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.prompt-template-card:hover{border-color:var(--text-dim)}.prompt-template-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.prompt-template-card-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-template-card-name{font-weight:600;color:var(--text);font-size:14px}.prompt-template-badge-built-in,.prompt-template-badge-custom,.prompt-template-badge-override{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.02em}.prompt-template-badge-built-in{background:var(--surface);color:var(--text-muted);border:1px solid var(--border)}.prompt-template-badge-custom{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.prompt-template-badge-override{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.prompt-template-badge-role{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm)}.prompt-template-badge-built-in,.prompt-template-badge-role,.prompt-role-badge{--prompt-role-color: var(--color-muted)}.prompt-role-tone--executor{--prompt-role-color: var(--todo)}.prompt-role-tone--triage{--prompt-role-color: var(--triage)}.prompt-role-tone--reviewer{--prompt-role-color: var(--in-review)}.prompt-role-tone--merger{--prompt-role-color: var(--done)}.prompt-role-tone--scheduler{--prompt-role-color: var(--color-info)}.prompt-role-tone--engineer{--prompt-role-color: var(--color-warning)}.prompt-role-tone--custom{--prompt-role-color: var(--color-muted)}.prompt-template-badge-role,.prompt-role-badge{background:color-mix(in srgb,var(--prompt-role-color) 15%,transparent);color:var(--prompt-role-color)}.prompt-template-badge-built-in.prompt-role-tone--executor,.prompt-template-badge-built-in.prompt-role-tone--triage,.prompt-template-badge-built-in.prompt-role-tone--reviewer,.prompt-template-badge-built-in.prompt-role-tone--merger,.prompt-template-badge-built-in.prompt-role-tone--scheduler,.prompt-template-badge-built-in.prompt-role-tone--engineer,.prompt-template-badge-built-in.prompt-role-tone--custom{border-color:var(--prompt-role-color)}.prompt-template-card-actions{display:flex;gap:var(--space-xs)}.prompt-template-card-actions .btn-icon{padding:var(--space-xs)}.prompt-template-card-description{font-size:12px;color:var(--text-muted);margin:0 0 var(--space-sm) 0;line-height:1.4}.prompt-template-card-preview{background:var(--surface);border-radius:var(--radius-sm);padding:var(--space-sm);overflow:hidden}.prompt-template-card-preview code{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;display:block;max-height:120px;overflow-y:auto}.prompt-template-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:13px;background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius-md)}.prompt-template-add-btn{align-self:flex-start;margin-top:var(--space-sm)}.prompt-template-editor{padding:var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.prompt-template-editor-title{font-size:14px;font-weight:600;color:var(--text);margin:0 0 var(--space-md) 0}.prompt-template-editor-fields{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-field{display:flex;flex-direction:column;gap:var(--space-xs)}.prompt-template-field label{font-size:12px;font-weight:500;color:var(--text-muted)}.prompt-template-field input,.prompt-template-field select,.prompt-template-prompt-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;transition:border-color var(--transition-fast)}.prompt-template-field input:focus,.prompt-template-field select:focus,.prompt-template-prompt-textarea:focus{outline:none;border-color:var(--todo)}.prompt-template-prompt-textarea{font-family:var(--font-mono);font-size:12px;line-height:1.5;resize:vertical;min-height:120px}.prompt-template-error{padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-sm);color:var(--color-error);font-size:12px}.prompt-template-editor-actions{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-sm)}.prompt-template-delete-confirm{padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-template-delete-confirm p{margin:0;font-size:13px;color:var(--text)}.prompt-template-delete-actions{display:flex;gap:var(--space-sm)}.prompt-assignments-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-role-assignment-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-role-assignment-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.prompt-role-assignment-label{display:flex;align-items:center;gap:var(--space-md)}.prompt-role-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);font-size:12px;font-weight:600;border-radius:var(--radius-sm)}.prompt-role-assignment-status{font-size:12px;color:var(--text-muted)}.prompt-role-select{min-width:200px;padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;cursor:pointer}.prompt-role-select:focus{outline:none;border-color:var(--todo)}.prompt-role-select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.prompt-assignments-note{margin-top:var(--space-md);padding:var(--space-md);background:var(--surface);border-radius:var(--radius-md);font-size:12px;color:var(--text-muted);line-height:1.5}.prompt-assignments-note strong{color:var(--text)}.prompt-overrides-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-overrides-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-override-item{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.prompt-override-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md);cursor:pointer;transition:background var(--transition-fast)}.prompt-override-header:hover{background:var(--card-hover)}.prompt-override-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm);flex:1;min-width:0;border:none;background:none;color:inherit;padding:0;text-align:left;font:inherit;cursor:pointer;border-radius:var(--radius-sm)}.prompt-override-info:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-name{font-weight:600;color:var(--text);font-size:13px}.prompt-override-key{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);padding:calc(var(--space-xs) * .5) var(--space-xs);background:var(--surface);border-radius:var(--radius-sm)}.prompt-override-badge{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning);border-radius:var(--radius-sm)}.prompt-override-expand-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-expand-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-description{font-size:12px;color:var(--text-muted);margin:0;padding:0 var(--space-md) var(--space-md);line-height:1.4}.prompt-override-editor{padding:var(--space-md);border-top:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-override-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:12px;font-family:var(--font-mono);line-height:1.5;resize:vertical;min-height:calc(var(--space-xl) * 3 + var(--space-sm));transition:border-color var(--transition-fast)}.prompt-override-textarea:focus{outline:none;border-color:var(--todo)}.prompt-override-footer{display:flex;align-items:center;gap:var(--space-md)}.prompt-override-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.prompt-override-header-actions{display:flex;align-items:center;gap:var(--space-xs)}.prompt-override-fullscreen-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-fullscreen-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-fullscreen-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0px)) max(var(--space-lg),env(safe-area-inset-right,0px)) max(var(--space-lg),env(safe-area-inset-bottom,0px)) max(var(--space-lg),env(safe-area-inset-left,0px));display:flex;flex-direction:column}.prompt-override-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);flex-shrink:0}.prompt-override-fullscreen-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:var(--space-sm)}.prompt-override-fullscreen-close{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:none;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;font-size:12px;transition:all var(--transition-fast)}.prompt-override-fullscreen-close:hover{color:var(--text);border-color:var(--text-muted)}.prompt-override-fullscreen-close:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:14px;line-height:1.6}.prompt-template-fullscreen-pre{flex:1;font-family:var(--font-mono);font-size:13px;line-height:1.6;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow-y:auto;padding:var(--space-md);background:var(--bg);border-radius:var(--radius-md);border:1px solid var(--border);margin:0}.prompt-override-fullscreen .prompt-override-footer{flex-shrink:0;padding-top:var(--space-sm)}.prompt-template-prompt-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.prompt-template-prompt-label-row label{display:block}.prompt-template-fullscreen-btn{vertical-align:middle}.prompt-template-prompt-label-row .prompt-template-fullscreen-btn{margin-left:var(--space-xs)}@media(max-width:768px){.prompt-manager{padding:0 var(--space-lg)}.prompt-manager-tabs{flex-wrap:wrap}.prompt-manager-tab{flex:1;justify-content:center;min-width:calc(50% - var(--space-xs))}.prompt-role-assignment-row{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.prompt-role-select{width:100%}.prompt-template-editor-actions{flex-direction:column}.prompt-template-editor-actions .btn{width:100%}.prompt-override-fullscreen{padding:max(var(--space-md),env(safe-area-inset-top,0px)) max(var(--space-md),env(safe-area-inset-right,0px)) max(var(--space-md),env(safe-area-inset-bottom,0px)) max(var(--space-md),env(safe-area-inset-left,0px))}.prompt-override-fullscreen textarea{font-size:16px}.prompt-override-expand-btn,.prompt-override-fullscreen-btn{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs))}}@keyframes custom-provider-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-providers-section .onboarding-disclosure-content{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-list{display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.custom-provider-item:hover{border-color:var(--text-dim)}.custom-provider-item-info{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.custom-provider-item-name{font-weight:600;color:var(--text)}.custom-provider-item-meta{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-provider-item-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.custom-provider-badge{display:inline-flex;align-items:center;padding:var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.custom-provider-empty{color:var(--text-muted);padding:var(--space-sm) 0}.custom-provider-add-btn{margin-top:var(--space-sm)}.custom-provider-form{padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-top:var(--space-sm)}.custom-provider-form-row{margin-bottom:var(--space-sm)}.custom-provider-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-md)}.custom-provider-form-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error);margin-top:var(--space-xs);background:color-mix(in srgb,var(--color-error) 10%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-item-edit-form{margin-top:var(--space-xs)}.spin{animation:custom-provider-spin calc(var(--transition-slow) * 4) linear infinite}@media(max-width:768px){.custom-provider-item{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.custom-provider-item-meta{max-width:100%}.custom-provider-form{padding:var(--space-sm)}.custom-provider-item-actions{align-self:flex-end;margin-top:var(--space-xs)}}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import{r as o,j as M}from"./vendor-react-K0fH_qHe.js";import{ch as Mt,ci as Pt,t as wt,w as Ct,b5 as St}from"./index-Bdw6llW6.js";import{c as nt}from"./createLucideIcon-BazL2hk5.js";import"./vendor-xterm-DzcZoU0P.js";const ft=4;function Dt({taskId:t,position:r,scale:c,onPositionChange:l,onDragStateChange:a,onDragEnd:i}){const[d,k]=o.useState(!1),y=o.useRef(null),C=o.useRef(r),m=o.useRef(!1);C.current=r;const b=o.useCallback(s=>{y.current=null,k(!1),s&&(a?.(!1),i?.(),m.current=!0)},[i,a]),n=o.useCallback(s=>{if(!s.isPrimary)return;s.stopPropagation();const w=s.currentTarget;typeof w.setPointerCapture=="function"&&w.setPointerCapture(s.pointerId),y.current={pointerId:s.pointerId,startPointer:{x:s.clientX,y:s.clientY},startPosition:C.current}},[]),g=o.useCallback(s=>{const w=y.current;if(!w||w.pointerId!==s.pointerId)return;s.stopPropagation();const E=s.clientX-w.startPointer.x,N=s.clientY-w.startPointer.y,$=Math.hypot(E,N);if(!d&&$>=ft&&(k(!0),a?.(!0)),$<ft)return;const v=c>0?c:1;l(t,{x:w.startPosition.x+E/v,y:w.startPosition.y+N/v})},[d,a,l,c,t]),h=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),P=o.useCallback(s=>{const w=y.current;!w||w.pointerId!==s.pointerId||(s.stopPropagation(),typeof s.currentTarget.hasPointerCapture=="function"&&s.currentTarget.hasPointerCapture(s.pointerId)&&typeof s.currentTarget.releasePointerCapture=="function"&&s.currentTarget.releasePointerCapture(s.pointerId),b(d))},[b,d]),j=o.useCallback(s=>{m.current&&(m.current=!1,s.preventDefault(),s.stopPropagation())},[]);return o.useMemo(()=>({isDragging:d,onPointerDown:n,onPointerMove:g,onPointerUp:h,onPointerCancel:P,onClickCapture:j}),[d,j,P,n,g,h])}const Tt=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Nt(t){return t?t.charAt(0).toUpperCase()+t.slice(1):"Executing"}function It({style:t,position:r,scale:c,isHighlighted:l=!1,isDimmed:a=!1,onMouseEnter:i,onMouseLeave:d,onClick:k,onNodePositionChange:y,onNodeDragStateChange:C,onNodeDragEnd:m,...b}){const{task:n,globalPaused:g,taskStuckTimeoutMs:h,lastFetchTimeMs:P,onOpenDetail:j}=b,s=n.status==="failed",w=n.paused===!0,E=Mt(n,h,P),N=n.column==="triage"&&n.status==="awaiting-approval",$=!g&&!s&&!w&&!E&&!N&&(n.column==="in-progress"||Tt.has(n.status)),v=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,q=n.column==="in-review",G=Dt({taskId:n.id,position:r,scale:c,onPositionChange:y,onDragStateChange:C,onDragEnd:m});return M.jsxs("div",{className:`graph-task-node graph-node--draggable${G.isDragging?" graph-node--dragging":""}${l?" graph-task-node--highlighted graph-node--highlighted":""}${a?" graph-task-node--dimmed graph-node--dimmed":""}${$?" graph-task-node--active":""}${q?" graph-task-node--in-review":""}`,style:t,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":$&&v?String(n.currentStep):void 0,onMouseEnter:i,onMouseLeave:d,onClick:H=>{k?.(H),!H.defaultPrevented&&j(n)},onClickCapture:G.onClickCapture,onPointerDown:G.onPointerDown,onPointerMove:G.onPointerMove,onPointerUp:G.onPointerUp,onPointerCancel:G.onPointerCancel,children:[$?M.jsx("div",{className:"graph-task-active-indicator",children:M.jsx("span",{className:"graph-task-active-indicator-text",children:Nt(n.status)})}):null,M.jsx(Pt,{...b,onOpenDetail:()=>{},disableDrag:!0})]})}/**
|
|
2
|
-
* @license lucide-react v0.542.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const Rt=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],zt=nt("maximize",Rt);/**
|
|
7
|
-
* @license lucide-react v0.542.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const jt=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Et=nt("rotate-ccw",jt);/**
|
|
12
|
-
* @license lucide-react v0.542.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const Ot=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],_t=nt("zoom-in",Ot);/**
|
|
17
|
-
* @license lucide-react v0.542.0 - ISC
|
|
18
|
-
*
|
|
19
|
-
* This source code is licensed under the ISC license.
|
|
20
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
-
*/const $t=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Ht=nt("zoom-out",$t);function Gt({zoom:t,onZoomIn:r,onZoomOut:c,onFitToGraph:l,onResetView:a}){return M.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[M.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:r,children:M.jsx(_t,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:c,children:M.jsx(Ht,{size:16})}),M.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(t*100),"%"]}),M.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:l,children:M.jsx(zt,{size:16})}),M.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:a,children:M.jsx(Et,{size:16})})]})}const At=280,Lt=100;function Wt({edges:t,positions:r,nodeWidth:c=At,nodeHeight:l=Lt,highlightedEdgeIds:a}){const i=!!(a&&a.size>0);return M.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[M.jsx("defs",{children:M.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:M.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),t.map(d=>{const k=r.get(d.source),y=r.get(d.target);if(!k||!y)return null;const C=`${d.source}->${d.target}`,m=i&&(a?.has(C)??!1),b=k.x+c/2,n=k.y+l,g=y.x+c/2,h=y.y,P=n+(h-n)/2;return M.jsx("path",{"data-testid":"dependency-edge","data-edge-id":C,className:`dependency-graph-edge${m?" graph-edge--highlighted":""}${i&&!m?" graph-edge--dimmed":""}`,d:`M ${b} ${n} C ${b} ${P}, ${g} ${P}, ${g} ${h}`,fill:"none",stroke:m?"var(--todo)":"var(--border)",strokeWidth:m?"var(--space-xs)":"var(--btn-border-width)",opacity:i&&!m?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},C)})]})}const vt=new Set(["triage","todo","in-progress","in-review"]);function Yt(t){return t.filter(r=>vt.has(r.column))}const Xt={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80};function it(t,r){const c={...Xt,...r},l=t.nodes.map(n=>n.task.id);if(l.length===0)return new Map;const a=new Map,i=new Map;for(const n of l)i.set(n,0),a.set(n,[]);for(const n of t.edges)!i.has(n.source)||!i.has(n.target)||(a.get(n.target)?.push(n.source),i.set(n.source,(i.get(n.source)??0)+1));const d=l.filter(n=>(i.get(n)??0)===0),k=[];for(;d.length>0;){const n=d.shift();k.push(n);for(const g of a.get(n)??[]){const h=(i.get(g)??0)-1;i.set(g,h),h===0&&d.push(g)}}for(const n of l)k.includes(n)||k.push(n);const y=new Map;for(const n of k){const g=t.edges.filter(P=>P.source===n).map(P=>P.target);let h=0;for(const P of g)h=Math.max(h,(y.get(P)??0)+1);y.set(n,h)}const C=new Map;for(const n of l){const g=y.get(n)??0,h=C.get(g)??[];h.push(n),C.set(g,h)}const m=new Map,b=Array.from(C.keys()).sort((n,g)=>n-g);for(const n of b){const g=C.get(n)??[];g.sort();const P=-(g.length*c.nodeWidth+Math.max(0,g.length-1)*c.horizontalGap)/2;g.forEach((j,s)=>{const w=P+s*(c.nodeWidth+c.horizontalGap),E=n*(c.nodeHeight+c.verticalGap);m.set(j,{x:w,y:E})})}return m}function Zt(t){return o.useMemo(()=>{const r=t.map(a=>({task:a})),c=new Set(t.map(a=>a.id)),l=t.flatMap(a=>(a.dependencies??[]).filter(i=>c.has(i)).map(i=>({source:a.id,target:i})));return{nodes:r,edges:l}},[t])}const Q=.1,tt=3,ht=40,Ut=200;function K(t,r,c){return Math.min(c,Math.max(r,t))}function Ft(t){if(!(t instanceof HTMLElement))return!1;const r=t.tagName.toLowerCase();return t.isContentEditable||r==="input"||r==="textarea"||r==="select"}function Vt(){const[t,r]=o.useState({x:0,y:0}),[c,l]=o.useState(1),[a,i]=o.useState(!1),d=o.useRef(t),k=o.useRef(c),y=o.useRef(null),C=o.useRef(null),m=o.useRef(new Map),b=o.useRef(null);o.useEffect(()=>{d.current=t},[t]),o.useEffect(()=>{k.current=c},[c]),o.useEffect(()=>()=>{y.current!==null&&window.clearTimeout(y.current)},[]);const n=o.useMemo(()=>`translate(${t.x}px, ${t.y}px) scale(${c})`,[t.x,t.y,c]),g=o.useMemo(()=>Math.round(c*100),[c]),h=o.useCallback(u=>{if(!u){y.current!==null&&(window.clearTimeout(y.current),y.current=null),i(!1);return}i(!0),y.current!==null&&window.clearTimeout(y.current),y.current=window.setTimeout(()=>{i(!1),y.current=null},Ut)},[]),P=o.useCallback((u,p,f)=>({x:K(u.x,-p,p),y:K(u.y,-f,f)}),[]),j=o.useCallback((u,p,f,S)=>{const D=k.current,I=d.current,R=K(u,Q,tt),O=R/D,z=P({x:p.x-(p.x-I.x)*O,y:p.y-(p.y-I.y)*O},f,S);l(R),r(z)},[P]),s=o.useCallback((u,p,f,S)=>{h(!1);const D=S??{x:p/2,y:f/2};j(k.current*u,D,p,f)},[h,j]),w=o.useCallback((u,p)=>{if(u&&p){s(1.2,u,p);return}l(f=>K(f+.1,Q,tt))},[s]),E=o.useCallback((u,p)=>{if(u&&p){s(1/1.2,u,p);return}l(f=>K(f-.1,Q,tt))},[s]),N=o.useCallback(()=>{h(!0),r({x:0,y:0}),l(1)},[h]),$=o.useCallback((u,p,f,S)=>{if(h(!0),u.size===0){r({x:0,y:0}),l(1);return}const D=S?.nodeWidth??280,I=S?.nodeHeight??100,R=Array.from(u.values()),O=Math.min(...R.map(A=>A.x)),z=Math.min(...R.map(A=>A.y)),Z=Math.max(...R.map(A=>A.x+D)),W=Math.max(...R.map(A=>A.y+I)),U=Math.max(1,Z-O),F=Math.max(1,W-z),B=Math.max(1,p-ht*2),ot=Math.max(1,f-ht*2),V=K(Math.min(B/U,ot/F),Q,tt),rt=(p-U*V)/2-O*V,st=(f-F*V)/2-z*V;l(V),r(P({x:rt,y:st},p,f))},[P,h]),v=o.useCallback((u,p)=>{if(m.current.set(u,p),m.current.size===2){const[f,S]=Array.from(m.current.values());b.current={distance:Math.hypot(f.x-S.x,f.y-S.y),zoom:k.current,pan:d.current,midpoint:{x:(f.x+S.x)/2,y:(f.y+S.y)/2}},C.current=null;return}C.current={start:p,panStart:d.current}},[]),q=o.useCallback((u,p,f,S)=>{if(m.current.has(u)&&m.current.set(u,p),m.current.size>=2&&b.current){h(!1);const[R,O]=Array.from(m.current.values()),Z=Math.hypot(R.x-O.x,R.y-O.y)/Math.max(1,b.current.distance),W={x:(R.x+O.x)/2,y:(R.y+O.y)/2},U=K(b.current.zoom*Z,Q,tt),F=U/b.current.zoom,B=P({x:W.x-(b.current.midpoint.x-b.current.pan.x)*F,y:W.y-(b.current.midpoint.y-b.current.pan.y)*F},f,S);l(U),r(B);return}const D=C.current;if(!D)return;h(!1);const I={x:D.panStart.x+(p.x-D.start.x),y:D.panStart.y+(p.y-D.start.y)};r(P(I,f,S))},[P,h]),G=o.useCallback(u=>{m.current.delete(u),m.current.size<2&&(b.current=null),m.current.size===0&&(C.current=null)},[]),H=o.useCallback((u,p,f,S)=>{const D=u<0?1.1:.9;h(!1),j(k.current*D,p,f,S)},[h,j]),L=o.useCallback((u,p,f,S,D)=>{if(Ft(u.target))return;const I=u.metaKey||u.ctrlKey;if(u.key==="Escape"){u.preventDefault(),N();return}if(I){if(u.key==="="||u.key==="+"){u.preventDefault(),s(1.2,p,f);return}if(u.key==="-"){u.preventDefault(),s(1/1.2,p,f);return}if(u.key==="0"){u.preventDefault(),N();return}(u.key==="f"||u.key==="F")&&u.shiftKey&&(u.preventDefault(),$(S,p,f,D))}},[$,N,s]);return{pan:t,zoom:c,zoomPercent:g,transform:n,transitioning:a,zoomIn:w,zoomOut:E,resetView:N,fitToGraph:$,setAnimate:h,onPointerDown:v,onPointerMove:q,onPointerUp:G,onWheelZoom:H,handleKeyDown:L}}function Kt(t){const{upstreamMap:r,downstreamMap:c}=o.useMemo(()=>{const a=new Map,i=new Map;for(const d of t)a.set(d.id,new Set(d.dependencies??[])),i.has(d.id)||i.set(d.id,new Set);for(const d of t)for(const k of d.dependencies??[])i.has(k)||i.set(k,new Set),i.get(k)?.add(d.id);return{upstreamMap:a,downstreamMap:i}},[t]);return{getChain:o.useCallback(a=>{if(!r.has(a)&&!c.has(a))return new Set;const i=new Set([a]),d=(k,y)=>{const C=[k],m=new Set([k]);for(;C.length>0;){const b=C.shift();if(!b)continue;const n=y.get(b);if(n)for(const g of n)m.has(g)||(m.add(g),i.add(g),C.push(g))}};return d(a,r),d(a,c),i},[c,r])}}const ct="fusion-plugin-dependency-graph:positions";function et(t){if(!t||typeof t!="object")return!1;const r=t;return typeof r.x=="number"&&Number.isFinite(r.x)&&typeof r.y=="number"&&Number.isFinite(r.y)}function Bt(t){const r=wt(ct,t);if(!r)return{};try{const c=JSON.parse(r);if(!c||typeof c!="object")return{};const l={};for(const[a,i]of Object.entries(c))et(i)&&(l[a]=i);return l}catch{return{}}}function qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))r.has(a)&&et(i)&&(l[a]=i);Ct(ct,JSON.stringify(l),c)}function Jt(t){St(ct,t)}function Qt(t,r,c){const l={};for(const[a,i]of Object.entries(t))c.has(a)&&et(i)&&(l[a]=i);for(const[a,i]of Object.entries(r))c.has(a)&&et(i)&&(l[a]=i);return l}function te(t,r){const c={};for(const[l,a]of Object.entries(t))r.has(l)&&(c[l]=a);return c}function ee({projectId:t,visibleTaskIds:r}){const[c,l]=o.useState(null);o.useEffect(()=>{l(Bt(t))},[t]);const a=o.useCallback(d=>{qt(d,r,t),l(te(d,r))},[t,r]),i=o.useCallback(()=>{Jt(t),l(null)},[t]);return{savedPositions:c,persistPositions:a,clearSavedPositions:i}}const X=280,Y=100,gt=4;function ne({tasks:t,projectId:r,onOpenTaskDetail:c,onOpenDetail:l,addToast:a,globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j}){const s=o.useRef(null),w=o.useRef(!1),E=o.useRef(null),N=o.useRef(!1),[$,v]=o.useState(null),[q,G]=o.useState(null),H=o.useMemo(()=>Yt(t),[t]),L=Zt(H),{getChain:u}=Kt(H),p=$??q,f=o.useMemo(()=>p?u(p):new Set,[p,u]),S=o.useMemo(()=>it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80}),[L]),D=o.useMemo(()=>new Set(H.map(e=>e.id)),[H]),{savedPositions:I,persistPositions:R,clearSavedPositions:O}=ee({projectId:r,visibleTaskIds:D}),[z,Z]=o.useState(S),[W,U]=o.useState(!1);o.useEffect(()=>{const e={};for(const[T,_]of S.entries())e[T]=_;const x=I?Qt(e,I,D):e;Z(new Map(Object.entries(x)))},[S,I,D]);const{transform:F,zoom:B,transitioning:ot,zoomIn:V,zoomOut:rt,resetView:st,fitToGraph:A,onPointerDown:mt,onPointerMove:yt,onPointerUp:ut,onWheelZoom:xt,handleKeyDown:kt}=Vt();o.useEffect(()=>{if(w.current||H.length===0)return;if(!!(I&&Object.keys(I).length>0)){w.current=!0;return}const x=s.current;x&&(A(z,x.clientWidth,x.clientHeight,{nodeWidth:X,nodeHeight:Y}),w.current=!0)},[H.length,A,z,I]);const lt=o.useMemo(()=>{const e=Array.from(z.values());if(e.length===0)return{width:0,height:0};const x=Math.max(...e.map(_=>_.x+X)),T=Math.max(...e.map(_=>_.y+Y));return{width:x,height:T}},[z]),dt=o.useCallback(()=>{O();const e=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});Z(e)},[O,L]),bt=o.useCallback(()=>{const e={};for(const[x,T]of z.entries())e[x]=T;R(e)},[R,z]);return M.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[M.jsx("div",{ref:s,className:"dependency-graph__viewport",onPointerDown:e=>{W||(E.current={x:e.clientX,y:e.clientY},N.current=!1,mt(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(W)return;const x=s.current;if(!x)return;const T=E.current;if(T){const _=Math.abs(e.clientX-T.x),J=Math.abs(e.clientY-T.y);(_>gt||J>gt)&&(N.current=!0)}yt(e.pointerId,{x:e.clientX,y:e.clientY},x.clientWidth,x.clientHeight)},onPointerUp:e=>{W||ut(e.pointerId),E.current=null},onPointerCancel:e=>{W||ut(e.pointerId),E.current=null,N.current=!1},onWheel:e=>{e.preventDefault();const x=s.current;if(!x)return;const T=x.getBoundingClientRect();xt(e.deltaY,{x:e.clientX-T.left,y:e.clientY-T.top},x.clientWidth,x.clientHeight)},onKeyDown:e=>{const x=s.current;x&&kt(e,x.clientWidth,x.clientHeight,z,{nodeWidth:X,nodeHeight:Y})},tabIndex:0,style:{outline:"none"},onClick:()=>{N.current||W||G(null)},children:H.length===0?M.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):M.jsxs("div",{className:`graph-canvas-transform${ot?" graph-canvas-transform--animate":""}`,style:{transform:F,width:`${lt.width}px`,height:`${lt.height}px`},children:[M.jsx(Wt,{edges:L.edges,positions:z,nodeWidth:X,nodeHeight:Y,highlightedEdgeIds:f.size>0?new Set(L.edges.filter(e=>f.has(e.source)&&f.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),M.jsx("div",{className:"dependency-graph__nodes-layer",children:L.nodes.map(e=>{const x=z.get(e.task.id);return x?M.jsx(It,{task:e.task,projectId:r,style:{minHeight:`${Y}px`,left:`${x.x}px`,top:`${x.y}px`},position:x,scale:B,onNodePositionChange:(T,_)=>{Z(J=>{const at=J.get(T);if(at&&at.x===_.x&&at.y===_.y)return J;const pt=new Map(J);return pt.set(T,_),pt})},onNodeDragStateChange:U,onNodeDragEnd:bt,isHighlighted:f.size>0&&f.has(e.task.id),isDimmed:f.size>0&&!f.has(e.task.id),onOpenDetail:l??(T=>c?.(T.id)),addToast:a??(()=>{}),globalPaused:i,onUpdateTask:d,onArchiveTask:k,onUnarchiveTask:y,onDeleteTask:C,onRetryTask:m,onOpenDetailWithTab:b,taskStuckTimeoutMs:n,onOpenMission:g,onMoveTask:h,lastFetchTimeMs:P,workflowStepNameLookup:j,onMouseEnter:()=>v(e.task.id),onMouseLeave:()=>v(null),onClick:T=>{T.stopPropagation(),N.current=!1,G(_=>_===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),M.jsx(Gt,{zoom:B,onZoomIn:()=>{const e=s.current;e&&V(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=s.current;e&&rt(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{dt();const e=s.current;if(!e)return;const x=it(L,{nodeWidth:X,nodeHeight:Y,horizontalGap:40,verticalGap:80});A(x,e.clientWidth,e.clientHeight,{nodeWidth:X,nodeHeight:Y})},onResetView:()=>{dt(),st()}})]})}function oe(t){return new Map((t??[]).map(r=>[r.id,r.name]))}function ce({context:t}){return o.createElement(ne,{tasks:t?.tasks??[],projectId:t?.projectId,workflowStepNameLookup:oe(t?.workflowSteps),onOpenDetail:t?.openTaskDetail})}export{ne as DependencyGraph,ce as DependencyGraphDashboardView,ce as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.graph-task-node{position:absolute;z-index:1;width:min(100%,var(--graph-task-node-width, calc(var(--space-2xl) * 9)));max-width:var(--graph-task-node-max-width, calc(var(--space-2xl) * 9.5));transition:box-shadow var(--transition-fast),z-index var(--transition-fast),opacity var(--transition-fast),border-color var(--transition-fast);border:var(--btn-border-width) solid transparent;border-radius:var(--radius-sm)}.graph-task-node:hover{box-shadow:var(--shadow-md);z-index:2}.graph-task-node--highlighted{box-shadow:0 0 0 var(--btn-border-width) var(--todo),var(--shadow-md);z-index:2}.graph-task-node--dimmed{opacity:.4}.graph-task-node--active{border-color:rgba(var(--in-progress-rgb),.5);box-shadow:0 0 0 var(--btn-border-width) rgba(var(--in-progress-rgb),.45),0 0 .75rem rgba(var(--in-progress-rgb),.5),0 0 1.5rem rgba(var(--in-progress-rgb),.2);transform:scale(1.01)}.graph-task-node--in-review{border-inline-start:calc(var(--btn-border-width) * 3) solid var(--in-review);border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md)}.graph-task-active-indicator{display:flex;align-items:center;min-height:1.25rem;width:100%;padding-inline:var(--space-sm);background:rgba(var(--in-progress-rgb),.85);border-radius:var(--radius-sm) var(--radius-sm) 0 0;animation:graph-task-active-pulse calc(var(--transition-normal) * 8) ease-in-out infinite}.graph-task-active-indicator-text{font-family:var(--font-mono);font-size:.625rem;font-weight:600;line-height:1;letter-spacing:.04em;text-transform:uppercase;color:var(--card)}.graph-task-node .card{width:100%;height:100%}.graph-task-node[data-current-step="0"] .card-steps-list .card-step-item:nth-child(1),.graph-task-node[data-current-step="1"] .card-steps-list .card-step-item:nth-child(2),.graph-task-node[data-current-step="2"] .card-steps-list .card-step-item:nth-child(3),.graph-task-node[data-current-step="3"] .card-steps-list .card-step-item:nth-child(4),.graph-task-node[data-current-step="4"] .card-steps-list .card-step-item:nth-child(5),.graph-task-node[data-current-step="5"] .card-steps-list .card-step-item:nth-child(6),.graph-task-node[data-current-step="6"] .card-steps-list .card-step-item:nth-child(7),.graph-task-node[data-current-step="7"] .card-steps-list .card-step-item:nth-child(8),.graph-task-node[data-current-step="8"] .card-steps-list .card-step-item:nth-child(9),.graph-task-node[data-current-step="9"] .card-steps-list .card-step-item:nth-child(10),.graph-task-node[data-current-step="10"] .card-steps-list .card-step-item:nth-child(11),.graph-task-node[data-current-step="11"] .card-steps-list .card-step-item:nth-child(12),.graph-task-node[data-current-step="12"] .card-steps-list .card-step-item:nth-child(13),.graph-task-node[data-current-step="13"] .card-steps-list .card-step-item:nth-child(14),.graph-task-node[data-current-step="14"] .card-steps-list .card-step-item:nth-child(15),.graph-task-node[data-current-step="15"] .card-steps-list .card-step-item:nth-child(16),.graph-task-node[data-current-step="16"] .card-steps-list .card-step-item:nth-child(17),.graph-task-node[data-current-step="17"] .card-steps-list .card-step-item:nth-child(18),.graph-task-node[data-current-step="18"] .card-steps-list .card-step-item:nth-child(19),.graph-task-node[data-current-step="19"] .card-steps-list .card-step-item:nth-child(20){background:rgba(var(--in-progress-rgb),.15);border-left:calc(var(--btn-border-width) * 2) solid var(--in-progress);padding-left:var(--space-xs);font-weight:500}.graph-task-node[data-current-step="0"] .card-steps-list .card-step-item:nth-child(1) .card-step-dot,.graph-task-node[data-current-step="1"] .card-steps-list .card-step-item:nth-child(2) .card-step-dot,.graph-task-node[data-current-step="2"] .card-steps-list .card-step-item:nth-child(3) .card-step-dot,.graph-task-node[data-current-step="3"] .card-steps-list .card-step-item:nth-child(4) .card-step-dot,.graph-task-node[data-current-step="4"] .card-steps-list .card-step-item:nth-child(5) .card-step-dot,.graph-task-node[data-current-step="5"] .card-steps-list .card-step-item:nth-child(6) .card-step-dot,.graph-task-node[data-current-step="6"] .card-steps-list .card-step-item:nth-child(7) .card-step-dot,.graph-task-node[data-current-step="7"] .card-steps-list .card-step-item:nth-child(8) .card-step-dot,.graph-task-node[data-current-step="8"] .card-steps-list .card-step-item:nth-child(9) .card-step-dot,.graph-task-node[data-current-step="9"] .card-steps-list .card-step-item:nth-child(10) .card-step-dot,.graph-task-node[data-current-step="10"] .card-steps-list .card-step-item:nth-child(11) .card-step-dot,.graph-task-node[data-current-step="11"] .card-steps-list .card-step-item:nth-child(12) .card-step-dot,.graph-task-node[data-current-step="12"] .card-steps-list .card-step-item:nth-child(13) .card-step-dot,.graph-task-node[data-current-step="13"] .card-steps-list .card-step-item:nth-child(14) .card-step-dot,.graph-task-node[data-current-step="14"] .card-steps-list .card-step-item:nth-child(15) .card-step-dot,.graph-task-node[data-current-step="15"] .card-steps-list .card-step-item:nth-child(16) .card-step-dot,.graph-task-node[data-current-step="16"] .card-steps-list .card-step-item:nth-child(17) .card-step-dot,.graph-task-node[data-current-step="17"] .card-steps-list .card-step-item:nth-child(18) .card-step-dot,.graph-task-node[data-current-step="18"] .card-steps-list .card-step-item:nth-child(19) .card-step-dot,.graph-task-node[data-current-step="19"] .card-steps-list .card-step-item:nth-child(20) .card-step-dot{width:.5rem;height:.5rem;animation:graph-task-step-pulse calc(var(--transition-normal) * 10) ease-in-out infinite}@keyframes graph-task-active-pulse{0%,to{background:rgba(var(--in-progress-rgb),.85)}50%{background:rgba(var(--in-progress-rgb),.65)}}@keyframes graph-task-step-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.2);opacity:.75}}@media(max-width:768px){.graph-task-node{width:min(100%,var(--graph-task-node-mobile-width, calc(var(--space-2xl) * 8)))}.graph-task-node--active{transform:scale(1.005)}.graph-task-active-indicator{min-height:1.5rem;padding-inline:var(--space-md)}.graph-task-active-indicator-text{font-size:.6875rem}}.graph-node--highlighted{opacity:1;box-shadow:var(--shadow-glow)}.graph-node--dimmed{opacity:.25;transition:opacity var(--transition-fast)}.graph-edge--highlighted{opacity:1;stroke:var(--todo);stroke-width:var(--space-xs)}.graph-edge--dimmed{opacity:.15;transition:opacity var(--transition-fast)}@media(max-width:768px){.graph-node--dimmed,.graph-edge--dimmed{transition:opacity var(--transition-fast)}}.graph-node--draggable{cursor:grab;touch-action:none}.graph-node--dragging{z-index:3;cursor:grabbing;box-shadow:var(--shadow-lg);transform:scale(1.02);transition:transform var(--transition-fast),box-shadow var(--transition-fast),z-index var(--transition-fast)}.graph-toolbar{position:absolute;right:var(--space-md);bottom:var(--space-md);display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md);z-index:10}.graph-toolbar__zoom-label{min-width:3.5ch;color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:center}@media(max-width:768px){.graph-toolbar{right:var(--space-sm);bottom:var(--space-sm);padding:var(--space-md)}.graph-toolbar .btn-icon{min-width:calc(var(--space-xs) * 11);min-height:calc(var(--space-xs) * 11)}}.dependency-graph{position:relative;height:100%;padding:var(--space-md)}.dependency-graph__viewport{position:relative;overflow:hidden;height:100%;min-height:calc(var(--space-2xl) * 10);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface);touch-action:none}.graph-canvas-transform{position:relative;transform-origin:top left}.graph-canvas-transform--animate{transition:transform var(--transition-normal)}.dependency-graph__nodes-layer{position:relative;z-index:1}.dependency-graph__nodes-layer .graph-task-node{max-width:min(100%,calc(var(--space-2xl) * 9))}.dependency-graph-edges{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible}.dependency-graph__empty{color:var(--text-muted);display:flex;align-items:center;justify-content:center;height:100%}@media(max-width:768px){.dependency-graph{padding:var(--space-sm)}}
|