@runfusion/fusion 0.73.0-beta.2 → 0.73.0-beta.4
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/agent-browser.mjs +8 -0
- package/dist/bin.js +7664 -11386
- package/dist/child-process-worker.js +4292 -8374
- package/dist/client/.vite/manifest.json +266 -256
- package/dist/client/assets/{AgentDetailView-CUoHZPZr.js → AgentDetailView-BBOL6AgZ.js} +3 -3
- package/dist/client/assets/{AgentPermissionPolicyEditor-DKoHJIlF.js → AgentPermissionPolicyEditor-DV7OPUhR.js} +1 -1
- package/dist/client/assets/{AgentsView-CaBo-FHV.js → AgentsView-B6xoAHyV.js} +4 -4
- package/dist/client/assets/ChatView-DwVjnxM8.js +8 -0
- package/dist/client/assets/{CommandCenter-wgiEIVuC.js → CommandCenter-DYWaoYFD.js} +9 -9
- package/dist/client/assets/DevServerView-BY5up-NA.js +1 -0
- package/dist/client/assets/{DirectoryPicker-B7YwgF53.js → DirectoryPicker-fM8MJa2r.js} +1 -1
- package/dist/client/assets/DocumentsView-D2KxsPG_.js +1 -0
- package/dist/client/assets/{EvalsView-BjyqxMS_.js → EvalsView-U8dOvTRM.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-_PMSa_gN.js → ExperimentalAgentOnboardingModal-C27y8Y-1.js} +1 -1
- package/dist/client/assets/{GoalsView-BzLA8GX9.js → GoalsView-D-2wmy-O.js} +1 -1
- package/dist/client/assets/{InsightsView-Cb_tUr1V.js → InsightsView-zLyuQL_l.js} +2 -2
- package/dist/client/assets/{MemoryView-CRxOPCQq.js → MemoryView-D-tSn48u.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-XQ5rWJT3.js → PiExtensionsManager-DvwmvGEY.js} +2 -2
- package/dist/client/assets/PluginManager-BACOwQAN.js +1 -0
- package/dist/client/assets/{PullRequestView-CX6fScVe.js → PullRequestView-DULyv21u.js} +2 -2
- package/dist/client/assets/{ReportModal-BSCk5ER1.css → ReportModal-BuhhqtXJ.css} +1 -1
- package/dist/client/assets/ReportModal-CUlKMFWa.js +21 -0
- package/dist/client/assets/{ResearchView-DgKzxRUL.js → ResearchView-DM_O3IFc.js} +2 -2
- package/dist/client/assets/{SecretsView-C83SIrjR.js → SecretsView-Bq3u_nAf.js} +1 -1
- package/dist/client/assets/SessionTerminal-D00ByR6U.js +2 -0
- package/dist/client/assets/SettingsModal-Bb3pIxiX.js +21 -0
- package/dist/client/assets/SettingsModal-CMLHZBhX.css +1 -0
- package/dist/client/assets/SettingsModal-QRaBE1ds.js +1 -0
- package/dist/client/assets/{SettingsTextareaRow-BKGsmZ7C.js → SettingsTextareaRow-CHOJ-qHz.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-DIb4q-VT.js → SetupWizardModal-DriQyd81.js} +2 -2
- package/dist/client/assets/{SkillsView-D1Zxh1iX.js → SkillsView-BtDyujiZ.js} +1 -1
- package/dist/client/assets/{TodoView-CGIcE6Yr.js → TodoView-BNHUnz50.js} +2 -2
- package/dist/client/assets/{WorkflowNodeEditor-BtWrziOX.css → WorkflowNodeEditor-BNgkFJ_P.css} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-BXikFpra.js +8 -0
- package/dist/client/assets/agent-import-generation-B2kYEm1O.js +1 -0
- package/dist/client/assets/app-B_HrdDXZ.js +13 -0
- package/dist/client/assets/{app-BsIXfnu-.js → app-C6yo-M_n.js} +1 -1
- package/dist/client/assets/{app-B-IdUeIu.js → app-CH8ZgPm4.js} +1 -1
- package/dist/client/assets/{app-D9ktpVhR.js → app-D4DpgDss.js} +1 -1
- package/dist/client/assets/{app-nBTNvNKK.js → app-Qv0blCyY.js} +1 -1
- package/dist/client/assets/{app-C8muVNUU.js → app-kFdtajPy.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Dv83GkUE.js → architectureDiagram-3BPJPVTR-B-Efjj4Z.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-B_j-RJOz.js → blockDiagram-GPEHLZMM-CaOVxrlM.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Cy3f-SD1.js → c4Diagram-AAUBKEIU-D8aYt5F1.js} +1 -1
- package/dist/client/assets/channel-5bPK6pTS.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CPolddUJ.js → chunk-2J33WTMH-VSDT0J0r.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BAGPgwkc.js → chunk-4BX2VUAB-Chx1wQgD.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-dzYFOH0q.js → chunk-55IACEB6-MlqjhIJg.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-ul9hGhiR.js → chunk-727SXJPM-BheQNUi8.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C75yqe4-.js → chunk-AQP2D5EJ-C5EoJhfJ.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BwiLAyup.js → chunk-FMBD7UC4-B8_8qP3j.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CVv1sLhy.js → chunk-ND2GUHAM-BuglCGRx.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-D1c-k3xL.js → chunk-QZHKN3VN-B7_06dxp.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Dv9RQDqG.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dv9RQDqG.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DosMsFd6.js → cose-bilkent-S5V4N54A-Cm-ZOycx.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-9os-QBXe.js → dagre-BM42HDAG-Dj_Gwjpv.js} +1 -1
- package/dist/client/assets/{dashboard-view-CNVTxyWE.js → dashboard-view-B4CRL5Fy.js} +1 -1
- package/dist/client/assets/{dashboard-view-Bn7iL770.js → dashboard-view-noD9p0Zs.js} +1 -1
- package/dist/client/assets/{dashboard-view-iwAS1HTp.js → dashboard-view-pXXSUxG9.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-ChjuJgA6.js → diagram-2AECGRRQ-C_9BfShy.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Cq10aB4z.js → diagram-5GNKFQAL-Cmg2qpCj.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CKjyrzjg.js → diagram-KO2AKTUF-2FNo2HXb.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DxCc1BsH.js → diagram-LMA3HP47-DgnVeCp-.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DJWEkDsR.js → diagram-OG6HWLK6-iAIR50HH.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-gVkDYC92.js → erDiagram-TEJ5UH35-Da4I04eN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-1lw1mQRQ.js → flowDiagram-I6XJVG4X-Bv9r2T0m.js} +1 -1
- package/dist/client/assets/{folder-open-Nmr7nRmN.js → folder-open-CwWtrDh6.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-Yzq4WZRo.js → ganttDiagram-6RSMTGT7-BMeO84U_.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cFR9Gv8n.js → gitGraphDiagram-PVQCEYII-CWDh_RIb.js} +1 -1
- package/dist/client/assets/index-CB3mYxAB.css +1 -0
- package/dist/client/assets/index-CE7C_XsS.js +2661 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BbRiTnD3.js → infoDiagram-5YYISTIA-BAE4KtCL.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DD4i2Znk.js → ishikawaDiagram-YF4QCWOH-C_iXAuOy.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-qHPO2M-C.js → journeyDiagram-JHISSGLW-BnxSHwDo.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-EuFfgxUv.js → kanban-definition-UN3LZRKU-DYNRm3Nu.js} +1 -1
- package/dist/client/assets/{mermaid.core-Cru9Vzsy.js → mermaid.core-B3hvDDep.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-mCvtfapj.js → mindmap-definition-RKZ34NQL-s7KBEuPD.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BSc_a5Dz.js → pieDiagram-4H26LBE5-Cy1_IPUD.js} +1 -1
- package/dist/client/assets/{puzzle-Cz66CEWW.js → puzzle-DWc6gFQ7.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Um2SLb_d.js → quadrantDiagram-W4KKPZXB-DqgVGp41.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-B94evN7g.js → requirementDiagram-4Y6WPE33-CA5-TDeF.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BH7NLX-K.js → sankeyDiagram-5OEKKPKP-Cuvi3RgE.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DusrBGQp.js → sequenceDiagram-3UESZ5HK-Da3GfmGP.js} +1 -1
- package/dist/client/assets/{shield-alert-CcQuaRHN.js → shield-alert-_iY63ED4.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CVnY93Xy.js → standing-instructions-template-CCd2YY9c.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-GRjL9YlX.js → stateDiagram-AJRCARHV-CZ_I9ENR.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BBsv6ppQ.js → stateDiagram-v2-BHNVJYJU-BomoRVhY.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DC6UeqjY.js → timeline-definition-PNZ67QCA-C3CYvIuR.js} +1 -1
- package/dist/client/assets/{upload-CjJp7lEX.js → upload-D0RrO65v.js} +1 -1
- package/dist/client/assets/{users-DgimRYHz.js → users-CGszBY2v.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-C272zK9h.js → vennDiagram-CIIHVFJN-By9fi8NW.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-KkRF-2j9.js → wardley-L42UT6IY-DErnXPkI.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B4brtKRt.js → wardleyDiagram-YWT4CUSO-DFfXZVPk.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6--PFSKt1s.js → xychartDiagram-2RQKCTM6-9Y5oZ5mi.js} +1 -1
- package/dist/client/index.html +4 -2
- package/dist/client/version.json +1 -1
- package/dist/extension.js +4516 -8539
- package/dist/migrations/0000_initial.sql +2 -0
- package/dist/migrations/0026_bigint_counters.sql +85 -14
- package/dist/migrations/0033_fn-8505_wedge_notification.sql +5 -0
- package/dist/plugin-sdk/index.js +1 -0
- package/dist/plugins/.fusion-ce-agents/.fusion-ce-upstream-provenance.json +7 -0
- package/dist/plugins/.fusion-ce-agents/ce-adversarial-document-reviewer.md +115 -0
- package/dist/plugins/.fusion-ce-agents/ce-adversarial-reviewer.md +111 -0
- package/dist/plugins/.fusion-ce-agents/ce-agent-native-planning-strategist.md +71 -0
- package/dist/plugins/.fusion-ce-agents/ce-agent-native-reviewer.md +181 -0
- package/dist/plugins/.fusion-ce-agents/ce-ankane-readme-writer.md +50 -0
- package/dist/plugins/.fusion-ce-agents/ce-api-contract-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-architecture-strategist.md +53 -0
- package/dist/plugins/.fusion-ce-agents/ce-best-practices-researcher.md +122 -0
- package/dist/plugins/.fusion-ce-agents/ce-code-simplicity-reviewer.md +87 -0
- package/dist/plugins/.fusion-ce-agents/ce-coherence-reviewer.md +73 -0
- package/dist/plugins/.fusion-ce-agents/ce-correctness-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-data-integrity-guardian.md +75 -0
- package/dist/plugins/.fusion-ce-agents/ce-data-migration-reviewer.md +119 -0
- package/dist/plugins/.fusion-ce-agents/ce-deployment-verification-agent.md +164 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-implementation-reviewer.md +94 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-iterator.md +197 -0
- package/dist/plugins/.fusion-ce-agents/ce-design-lens-reviewer.md +56 -0
- package/dist/plugins/.fusion-ce-agents/ce-feasibility-reviewer.md +65 -0
- package/dist/plugins/.fusion-ce-agents/ce-figma-design-sync.md +172 -0
- package/dist/plugins/.fusion-ce-agents/ce-framework-docs-researcher.md +100 -0
- package/dist/plugins/.fusion-ce-agents/ce-git-history-analyzer.md +47 -0
- package/dist/plugins/.fusion-ce-agents/ce-issue-intelligence-analyst.md +207 -0
- package/dist/plugins/.fusion-ce-agents/ce-julik-frontend-races-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-learnings-researcher.md +254 -0
- package/dist/plugins/.fusion-ce-agents/ce-maintainability-reviewer.md +77 -0
- package/dist/plugins/.fusion-ce-agents/ce-pattern-recognition-specialist.md +62 -0
- package/dist/plugins/.fusion-ce-agents/ce-performance-oracle.md +115 -0
- package/dist/plugins/.fusion-ce-agents/ce-performance-reviewer.md +54 -0
- package/dist/plugins/.fusion-ce-agents/ce-pr-comment-resolver.md +63 -0
- package/dist/plugins/.fusion-ce-agents/ce-previous-comments-reviewer.md +68 -0
- package/dist/plugins/.fusion-ce-agents/ce-product-lens-reviewer.md +92 -0
- package/dist/plugins/.fusion-ce-agents/ce-project-standards-reviewer.md +84 -0
- package/dist/plugins/.fusion-ce-agents/ce-reliability-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-repo-research-analyst.md +263 -0
- package/dist/plugins/.fusion-ce-agents/ce-scope-guardian-reviewer.md +79 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-lens-reviewer.md +48 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-reviewer.md +54 -0
- package/dist/plugins/.fusion-ce-agents/ce-security-sentinel.md +98 -0
- package/dist/plugins/.fusion-ce-agents/ce-session-historian.md +89 -0
- package/dist/plugins/.fusion-ce-agents/ce-slack-researcher.md +133 -0
- package/dist/plugins/.fusion-ce-agents/ce-spec-flow-analyzer.md +87 -0
- package/dist/plugins/.fusion-ce-agents/ce-swift-ios-reviewer.md +107 -0
- package/dist/plugins/.fusion-ce-agents/ce-testing-reviewer.md +52 -0
- package/dist/plugins/.fusion-ce-agents/ce-web-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/.fusion-ce-upstream-provenance.json +7 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/SKILL.md +318 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/brainstorm-sections.md +354 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/handoff.md +172 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/html-rendering.md +662 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/synthesis-summary.md +271 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/universal-brainstorming.md +71 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/references/visual-probes.md +128 -0
- package/dist/plugins/.fusion-ce-skills/ce-brainstorm/scripts/visual-probe-server.js +419 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/SKILL.md +821 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/action-class-rubric.md +26 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/bulk-preview.md +112 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/cross-model-review.md +63 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/diff-scope.md +41 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/findings-schema.json +137 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/persona-catalog.md +63 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/adversarial-reviewer.md +102 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/agent-native-reviewer.md +173 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/api-contract-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/correctness-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/data-migration-reviewer.md +111 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/deployment-verification-agent.md +157 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/julik-frontend-races-reviewer.md +44 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/maintainability-reviewer.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/performance-reviewer.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/previous-comments-reviewer.md +59 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/project-standards-reviewer.md +75 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/reliability-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/security-reviewer.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/swift-ios-reviewer.md +99 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/personas/testing-reviewer.md +43 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/review-output-template.md +170 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/subagent-template.md +199 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/tracker-defer.md +149 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/validator-template.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/references/walkthrough.md +249 -0
- package/dist/plugins/.fusion-ce-skills/ce-code-review/scripts/cross-model-adversarial-review.sh +218 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit/SKILL.md +105 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/SKILL.md +134 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/references/branch-creation.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-commit-push-pr/references/pr-description-writing.md +115 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/SKILL.md +712 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/assets/resolution-template.md +94 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/performance-oracle.md +108 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/security-sentinel.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/agents/session-historian.md +83 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/concepts-vocabulary.md +78 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/schema.yaml +231 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/references/yaml-schema.md +118 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/discover-sessions.sh +130 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-errors.py +254 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-metadata.py +456 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/session-history/extract-skeleton.py +570 -0
- package/dist/plugins/.fusion-ce-skills/ce-compound/scripts/validate-frontmatter.py +137 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/SKILL.md +257 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/anti-patterns.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/defense-in-depth.md +35 -0
- package/dist/plugins/.fusion-ce-skills/ce-debug/references/investigation-techniques.md +374 -0
- package/dist/plugins/.fusion-ce-skills/ce-doc-review/SKILL.md +70 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/SKILL.md +401 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/issue-intelligence-analyst.md +200 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/agents/web-researcher.md +121 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/divergent-ideation.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/html-rendering.md +662 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/ideation-sections.md +191 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/post-ideation-workflow.md +166 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/universal-ideation.md +107 -0
- package/dist/plugins/.fusion-ce-skills/ce-ideate/references/web-research-cache.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/SKILL.md +858 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/agent-native-planning-strategist.md +62 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/architecture-strategist.md +46 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/best-practices-researcher.md +114 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/data-migration-reviewer.md +103 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/deployment-verification-agent.md +157 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/framework-docs-researcher.md +93 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/learnings-researcher.md +247 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/performance-oracle.md +108 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/repo-research-analyst.md +256 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/security-sentinel.md +91 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/slack-researcher.md +127 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/spec-flow-analyzer.md +80 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/agents/web-researcher.md +121 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/approach-altitude.md +55 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/deepening-workflow.md +259 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/html-rendering.md +668 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/markdown-rendering.md +236 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/plan-handoff.md +126 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/plan-sections.md +405 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/synthesis-summary.md +396 -0
- package/dist/plugins/.fusion-ce-skills/ce-plan/references/universal-planning.md +168 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/SKILL.md +53 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/agents/pr-comment-resolver.md +56 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/evaluation-rubric.md +106 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/full-mode.md +283 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/references/targeted-mode.md +45 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/get-pr-comments +159 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/get-thread-for-comment +76 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/reply-to-pr-thread +33 -0
- package/dist/plugins/.fusion-ce-skills/ce-resolve-pr-feedback/scripts/resolve-pr-thread +23 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/SKILL.md +97 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/references/interview.md +143 -0
- package/dist/plugins/.fusion-ce-skills/ce-strategy/references/strategy-template.md +89 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/SKILL.md +429 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/agents/figma-design-sync.md +165 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/execution-engines.md +85 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/non-code-execution.md +23 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/review-findings-followup.md +104 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/shipping-workflow.md +133 -0
- package/dist/plugins/.fusion-ce-skills/ce-work/references/tracker-defer.md +149 -0
- package/dist/plugins/fusion-plugin-compound-engineering/.bundled.reload-3.js +11266 -0
- package/dist/plugins/fusion-plugin-compound-engineering/.bundled.reload-4.js +11266 -0
- package/dist/plugins/fusion-plugin-dependency-graph/.bundled.reload-1.js +8206 -0
- package/dist/plugins/fusion-plugin-grok-runtime/.bundled.reload-2.js +26623 -0
- package/package.json +6 -3
- package/skill/fusion/references/engine-tools.md +6 -2
- package/dist/client/assets/ChatView-Bv0J5p5U.js +0 -8
- package/dist/client/assets/DevServerView-Ue9XG_4H.js +0 -1
- package/dist/client/assets/DocumentsView-C1Ptwcv5.js +0 -1
- package/dist/client/assets/PluginManager-CXPSlWxs.js +0 -1
- package/dist/client/assets/ReportModal-JhZZXZlj.js +0 -21
- package/dist/client/assets/SessionTerminal-BrK3psiC.js +0 -2
- package/dist/client/assets/SettingsModal-Bby9vLGx.js +0 -21
- package/dist/client/assets/SettingsModal-DVLqY1-7.js +0 -1
- package/dist/client/assets/SettingsModal-DXArgTTx.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-BXUC0lim.js +0 -8
- package/dist/client/assets/app-DUszvars.js +0 -13
- package/dist/client/assets/channel-BuhC8kaT.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-vpRR5WOg.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-vpRR5WOg.js +0 -1
- package/dist/client/assets/index-Cg9ahVtV.js +0 -2661
- package/dist/client/assets/index-uhXHk1ek.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as a,j as r}from"./vendor-react-SZ_qB27O.js";import{a as $,w as O,cV as tr,bc as sr,cL as ie,L as pe,aH as _r,cW as Ar,cX as Tr,cY as Or,C as Fr,aZ as nr,cZ as $r,V as zr,c_ as Hr,c2 as Ir,c4 as Br,c$ as Vr,p as He,X as Wr,aQ as qr,R as Xr}from"./index-CE7C_XsS.js";import{u as fe}from"./vendor-i18n-GF3RlKbq.js";import{S as ar}from"./shield-alert-_iY63ED4.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function Ie(e){const s=typeof e.source=="string"&&e.source.trim().length>0?e.source.trim():"root",n=s==="root"?".":s,t=e.name,v=typeof e.packagePath=="string"&&e.packagePath.trim().length>0?e.packagePath.trim():n,d=typeof e.confidence=="number"?e.confidence:1,b=s==="root"?"root":s,m=typeof e.packageName=="string"&&e.packageName.trim().length>0?e.packageName.trim():"project";return{name:e.name,command:e.command,scriptName:t,packagePath:v,confidence:d,cwd:n,source:s,workspaceName:typeof e.packageName=="string"?e.packageName:void 0,label:`${m} · ${t} (${b})`}}function te(e){const s=e.status,n=s==="starting"||s==="running"||s==="failed"||s==="stopped"?s:"stopped",t=typeof e.previewUrl=="string"?e.previewUrl:e.detectedUrl,v=typeof e.manualPreviewUrl=="string"?e.manualPreviewUrl:e.manualUrl;return{id:typeof e.id=="string"?e.id:"",name:typeof e.name=="string"&&e.name.length>0?e.name:"default",status:n,command:typeof e.command=="string"?e.command:"",scriptName:typeof e.scriptId=="string"?e.scriptId:"",cwd:typeof e.cwd=="string"?e.cwd:"",pid:e.pid,startedAt:e.startedAt,previewUrl:t,detectedUrl:typeof e.detectedUrl=="string"?e.detectedUrl:t,detectedPort:e.detectedPort,manualPreviewUrl:v,manualUrl:typeof e.manualUrl=="string"?e.manualUrl:v,logs:Array.isArray(e.logHistory)?e.logHistory:[],exitCode:e.exitCode}}function Jr(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:typeof e.line=="string"?e.line:"",stream:e.stream==="stderr"?"stderr":"stdout",timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e){const n=(Array.isArray(e.lines)?e.lines:[]).map((t,v)=>Jr(t,v+1));return{lines:n,totalLines:typeof e.totalLines=="number"&&Number.isFinite(e.totalLines)?e.totalLines:n.length}}function Yr(e,s){const n=typeof s.maxLines=="number"&&Number.isFinite(s.maxLines)?Math.max(1,Math.floor(s.maxLines)):100,t=typeof s.offset=="number"&&Number.isFinite(s.offset)?Math.max(0,Math.floor(s.offset)):0,v=typeof s.lastEventId=="number"&&Number.isFinite(s.lastEventId)?Math.max(0,Math.floor(s.lastEventId)):null,d=e.length,b=e.map((N,z)=>({id:z+1,text:N,stream:"stdout",timestamp:""}));if(v!==null)return{lines:b.filter(N=>N.id>v).slice(0,n),totalLines:d};const m=Math.max(d-t,0),k=Math.max(m-n,0);return{lines:b.slice(k,m),totalLines:d}}function Be(e){return Array.isArray(e)?e.map(Ie):(e.candidates??[]).map(Ie)}async function ir(e){try{const s=await $(O("/dev-server/candidates",e));return Be(s)}catch(s){if(s instanceof Error&&/\/dev-server\/candidates/.test(s.message)){const n=await $(O("/dev-server/detect",e));return Be(n)}throw s}}function he(e){return $(O("/dev-server/status",e)).then(te)}async function Ne(e={},s){const n=new URLSearchParams;typeof e.maxLines=="number"&&Number.isFinite(e.maxLines)&&n.set("maxLines",String(Math.max(1,Math.floor(e.maxLines)))),typeof e.offset=="number"&&Number.isFinite(e.offset)&&n.set("offset",String(Math.max(0,Math.floor(e.offset)))),typeof e.lastEventId=="number"&&Number.isFinite(e.lastEventId)&&n.set("lastEventId",String(Math.max(0,Math.floor(e.lastEventId))));const t=n.size>0?`?${n.toString()}`:"";try{const v=await $(O(`/dev-server/logs/history${t}`,s));return Kr(v)}catch(v){if(v instanceof Error&&/\/dev-server\/logs\/history/.test(v.message)){const d=await he(s);return Yr(d.logs,e)}throw v}}function or(e,s){const n=e.cwd??e.packagePath??".",t=e.scriptName;return $(O("/dev-server/start",s),{method:"POST",body:JSON.stringify({command:e.command,scriptName:t,scriptId:t,cwd:n,packagePath:e.packagePath})}).then(te)}function lr(e){return $(O("/dev-server/stop",e),{method:"POST"}).then(te)}function cr(e){return $(O("/dev-server/restart",e),{method:"POST"}).then(te)}async function dr(e,s){const n=typeof e=="string"?{url:e}:e;try{const t=await $(O("/dev-server/preview-url",s),{method:"POST",body:JSON.stringify(n)});return te(t)}catch(t){if(t instanceof Error&&/\/dev-server\/preview-url/.test(t.message)){const v=await $(O("/dev-server/preview-url",s),{method:"PUT",body:JSON.stringify(n)});return te(v)}throw t}}function Re(e){return tr(O("/dev-server/logs/stream",e))}async function Ue(e){try{return(await $(O("/devserver",e))).sessions??[]}catch{try{const s=await he(e);return[{config:{id:s.id??"default",name:s.name??"Dev Server",command:s.command??"",cwd:s.cwd??"."},status:s.status,runtime:s.pid?{pid:s.pid,startedAt:s.startedAt??new Date().toISOString(),exitCode:s.exitCode??void 0,previewUrl:s.previewUrl}:void 0,previewUrl:s.previewUrl??s.detectedUrl??void 0,logHistory:(s.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}]}catch{return[]}}}async function vr(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}`,s))}catch{try{const n=await he(s);return!e||e==="default"||e===n.id?{config:{id:n.id??"default",name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}:null}catch{return null}}}async function Ve(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/start`,s),{method:"POST"})}catch{const n=await or({command:""},s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function We(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/stop`,s),{method:"POST"})}catch{const n=await lr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function qe(e,s){try{return await $(O(`/devserver/${encodeURIComponent(e)}/restart`,s),{method:"POST"})}catch{const n=await cr(s);return{config:{id:n.id??e,name:n.name??"Dev Server",command:n.command??"",cwd:n.cwd??"."},status:n.status,runtime:n.pid?{pid:n.pid,startedAt:n.startedAt??new Date().toISOString(),exitCode:n.exitCode??void 0,previewUrl:n.previewUrl}:void 0,previewUrl:n.previewUrl??n.detectedUrl??void 0,logHistory:(n.logs??[]).map(t=>({timestamp:new Date().toISOString(),stream:t.startsWith("[stderr]")?"stderr":"stdout",text:t.replace(/^\[stderr\]\s*/,"")}))}}}async function Xe(e,s,n){try{const t=await $(O(`/devserver/${encodeURIComponent(e)}/preview`,n),{method:"POST",body:JSON.stringify({url:s})});return{url:t.url??null,source:t.source??null}}catch{const t=await dr({url:s},n);return{url:t.previewUrl??t.manualUrl??null,source:"manual"}}}async function ke(e){try{return(await $(O("/devserver/detect",e))).candidates??[]}catch{try{return(await ir(e)).map(n=>({name:n.name,command:n.command,cwd:n.cwd,scriptName:n.scriptName,packagePath:n.packagePath}))}catch{return[]}}}function Gr(e,s){return tr(O(`/devserver/${encodeURIComponent(e)}/logs/stream`,s))}const De=500,Qr=3e3;function q(e){return e instanceof Error?e.message:String(e)}function ur(e){return e.length<=De?e:e.slice(-De)}function Ce(e,s){return ur([...e,s])}function re(e){try{return JSON.parse(e)}catch{return null}}function ve(e){const s=e.text??"";return e.stream==="stderr"?`[stderr] ${s}`:s}function Zr(e){return e?.previewUrl??null}async function Je(e){return he(e)}async function Ke(e,s){return or(e,s)}async function et(e){return lr(e)}async function rt(e){return cr(e)}async function Ye(e){return ir(e)}function K(e){try{return e()}catch{return null}}function je(){return typeof K(()=>Ue)=="function"&&typeof K(()=>vr)=="function"}function Z(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(s=>({timestamp:new Date().toISOString(),stream:s.startsWith("[stderr]")?"stderr":"stdout",text:s.replace(/^\[stderr\]\s*/,"")}))}}function tt(e){const{t:s}=fe("app"),[n,t]=a.useState(null),[v,d]=a.useState([]),[b,m]=a.useState([]),[k,N]=a.useState([]),[z,L]=a.useState(!0),[j,h]=a.useState(null),c=a.useRef(0),[p,D]=a.useState(null),F=a.useCallback(o=>{if(t(o),o?.logHistory){const i=o.logHistory.slice(-De).map(ve);m(i)}},[]),E=a.useCallback(async()=>{const o=c.current;try{if(je())if(p){const i=await vr(p,e);if(c.current!==o)return;F(i)}else{const i=await Ue(e);if(c.current!==o)return;d(i),i.length>0&&(D(i[0].config.id),F(i[0]))}else{const i=await Je(e);if(c.current!==o)return;const g=Z(i);d([g]),F(g)}h(null)}catch(i){if(c.current!==o)return;h(q(i))}},[F,e,p]);a.useEffect(()=>{c.current+=1;const o=c.current;t(null),d([]),m([]),N([]),L(!0),h(null),D(null),(async()=>{try{const[g,u]=await Promise.allSettled([je()?Ue(e):Je(e).then(y=>[Z(y)]),typeof K(()=>ke)=="function"?ke(e):Ye(e).then(y=>y.map(U=>({name:U.name,command:U.command,cwd:U.cwd,scriptName:U.scriptName,packagePath:U.packagePath})))]);if(c.current!==o)return;let w=null;if(g.status==="fulfilled"){const y=g.value;if(d(y),y.length>0){const U=y[0];je()&&D(U.config.id),F(U)}}else w=q(g.reason);u.status==="fulfilled"&&N(u.value),w&&h(w)}catch(g){if(c.current!==o)return;h(q(g))}finally{c.current===o&&L(!1)}})()},[F,e]),a.useEffect(()=>{const o=p?Gr(p,e):typeof K(()=>Re)=="function"?Re(e):null;if(!o)return;const i=c.current,g=sr(o,{events:{history:u=>{if(c.current!==i)return;const w=re(u.data);if(w?.lines){const y=w.lines.map(ve);m(ur(y))}},log:u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:log":u=>{if(c.current!==i)return;const w=re(u.data);if(w){const y=typeof w.line=="string"?w.line:ve(w);m(U=>Ce(U,y))}},"dev-server:output":u=>{if(c.current!==i)return;const w=re(u.data);w?.line&&m(y=>Ce(y,w.line))},status:u=>{if(c.current!==i)return;const w=re(u.data),y=w?.status;y&&t(U=>U&&{...U,status:y,runtime:w.pid?{...U.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:U.runtime})},"dev-server:status":u=>{if(c.current!==i)return;const w=re(u.data);if(w?.status){const y=Z(w);t(y),d([y])}},stopped:()=>{c.current},failed:()=>{c.current}},onReconnect:()=>{c.current===i&&E()},onError:()=>{c.current===i&&h(u=>u??s("devserver.lostConnection","Lost log stream connection."))}});return()=>{g()}},[e,E,p]),a.useEffect(()=>{if(n?.status!=="running"&&n?.status!=="starting")return;const o=setInterval(()=>{E()},Qr);return()=>{clearInterval(o)}},[E,n?.status]);const _=a.useCallback(async(o,i)=>{c.current+=1;const g=c.current;try{let u;const w=typeof i=="string"&&i.length>0,y=n?.config?.cwd??".";if(!(w&&i!==y)&&p&&typeof K(()=>Ve)=="function")u=await Ve(p,e);else{const W=await Ke({command:o,cwd:i},e);u=Z(W)}if(c.current!==g)return;t(u),h(null)}catch(u){if(c.current!==g)return;throw h(q(u)),u}},[e,n?.config?.cwd,p]),R=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>We)=="function")i=await We(p,e);else{const g=await et(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),I=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;if(p&&typeof K(()=>qe)=="function")i=await qe(p,e);else{const g=await rt(e);i=Z(g)}if(c.current!==o)return;t(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e,p]),B=a.useCallback(async o=>{c.current+=1;const i=c.current;try{let g;if(p&&typeof K(()=>Xe)=="function")g=await Xe(p,o,e);else{const u=await dr({url:o},e);g={url:u.manualUrl??u.previewUrl??u.detectedUrl??null,source:u.manualUrl?"manual":"auto"}}if(c.current!==i)return;t(u=>u?{...u,previewUrl:g.url??void 0}:null),h(null)}catch(g){if(c.current!==i)return;throw h(q(g)),g}},[e,p]),H=a.useCallback(async()=>{c.current+=1;const o=c.current;try{let i;try{i=await ke(e)}catch{i=(await Ye(e)).map(u=>({name:u.name,command:u.command,cwd:u.cwd,scriptName:u.scriptName,packagePath:u.packagePath}))}if(c.current!==o)return;N(i),h(null)}catch(i){if(c.current!==o)return;throw h(q(i)),i}},[e]),P=a.useCallback(async(o,i)=>{if(typeof o!="string"&&!p)try{const w=o,y=await Ke({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),U=Z(y);t(U),d([U]),h(null);return}catch(w){throw h(q(w)),w}const g=typeof o=="string"?o:o.command,u=typeof o=="string"?i:o.cwd;await _(g,u)},[e,_,p]),x=a.useCallback(async()=>{await R()},[R]),f=a.useCallback(async()=>{await I()},[I]),A=a.useCallback(async o=>{await B(o)},[B]),T=a.useCallback(async()=>{await H()},[H]),X=a.useCallback(async()=>{await E()},[E]),C=Zr(n),S=n?{...n,pid:n.runtime?.pid}:null;return{session:n,sessions:v,logs:b,detectedCommands:k,previewUrl:C,isLoading:z,error:j,startServer:_,stopServer:R,restartServer:I,setPreviewUrl:B,detectCommands:H,refresh:E,candidates:k,serverState:S,loading:z,start:P,stop:x,restart:f,setManualUrl:A,detect:T,refreshStatus:X}}const Ge=500,Qe=100;function mr(e){return e.length>Ge?e.slice(-Ge):e}function pr(e){return e==="stderr"?"stderr":"stdout"}function ue(e){try{return JSON.parse(e.data)}catch{return null}}function me(e,s){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:s,text:typeof e.text=="string"?e.text:"",stream:pr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function st(e,s){return{id:s,text:e,stream:"stdout",timestamp:""}}function Le(e,s){if(s.length===0)return e;const n=[...e],t=new Set(e.map(v=>v.id));for(const v of s)t.has(v.id)||(t.add(v.id),n.push(v));return n.sort((v,d)=>v.id-d.id),mr(n)}function nt(e,s){const[n,t]=a.useState([]),[v,d]=a.useState(!1),[b,m]=a.useState(!1),[k,N]=a.useState(!1),[z,L]=a.useState(null),j=a.useRef(null),h=a.useRef(!1),c=a.useRef(0),p=a.useRef(0),D=a.useRef(e),F=a.useRef(s),E=a.useRef(0),_=a.useRef(1);(D.current!==e||F.current!==s)&&(D.current=e,F.current=s,c.current++,ie({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),h.current=!0,E.current=0,_.current=1,t([]),d(!1),m(!1),N(!1),L(null),j.current&&(j.current(),j.current=null)),a.useEffect(()=>{if(!s){j.current&&(j.current(),j.current=null);return}const P=c.current,x=++p.current;h.current=!1,d(!0);const f=(C,S)=>{const o=mr(C);t(o),L(S),N(S!==null?S>o.length:!1);const i=o.length>0?o[o.length-1].id:0;E.current=i,_.current=i+1},A=C=>{if(h.current||c.current!==P||!C||typeof C!="object")return;const S=C.lines;if(!Array.isArray(S))return;if(S.length>0&&typeof S[0]=="string"){const i=S.filter(g=>typeof g=="string").map((g,u)=>st(g,u+1));f(i,i.length);return}const o=S.filter(i=>!!i&&typeof i=="object").map((i,g)=>me(i,g+1));f(o,o.length)},T=C=>{if(h.current||c.current!==P)return;const S=typeof C.text=="string"?C.text:typeof C.line=="string"?C.line:null;if(!S)return;const o=_.current,i=typeof C.id=="number"&&Number.isFinite(C.id)?C.id:o,g={id:i,text:S,stream:pr(C.stream),timestamp:typeof C.timestamp=="string"?C.timestamp:""};E.current=Math.max(E.current,i),_.current=Math.max(_.current,i+1),t(u=>Le(u,[g])),L(u=>u===null?u:Math.max(u+1,g.id))};async function X(){try{const S=await Ne({maxLines:Qe},e);if(h.current||c.current!==P||p.current!==x)return;const o=S.lines.map((i,g)=>me(i,g+1));f(o,S.totalLines)}catch{if(h.current||c.current!==P||p.current!==x)return;f([],null)}finally{!h.current&&c.current===P&&p.current===x&&d(!1)}const C=Re(e);j.current=sr(C,{events:{"dev-server:log":S=>{const o=ue(S);o&&T(o)},log:S=>{const o=ue(S);o&&T(o)},history:S=>{const o=ue(S);A(o)},"dev-server:history":S=>{const o=ue(S);A(o)}},onReconnect:()=>{ie({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:E.current??null,sseChannel:C,reason:"history-replay"}),!(h.current||c.current!==P)&&Ne({lastEventId:E.current,maxLines:50},e).then(S=>{if(h.current||c.current!==P)return;const o=S.lines.map((i,g)=>me(i,_.current+g));if(o.length>0){const i=o[o.length-1].id;E.current=Math.max(E.current,i),_.current=Math.max(_.current,i+1)}t(i=>Le(i,o)),L(S.totalLines)}).catch(()=>{})}}),ie({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:C})}return X(),()=>{h.current=!0,j.current&&(j.current(),j.current=null)}},[s,e]);const I=a.useCallback(async()=>{if(!s||b)return;const P=c.current,x=n.length;m(!0);try{const f=await Ne({maxLines:Qe,offset:x},e);if(h.current||c.current!==P)return;const A=f.lines.map((T,X)=>me(T,X+1));t(T=>Le(A,T)),N(f.totalLines>x+A.length),L(f.totalLines)}catch{}finally{m(!1)}},[s,n.length,b,e]),B=a.useCallback(()=>{t([])},[]),H=j.current!==null&&!v&&!h.current;return{entries:n,loading:v,loadingMore:b,hasMore:k,total:z,loadMore:I,clear:B,logs:n,isStreaming:H,clearLogs:B}}const at="This preview appears to block iframe embedding. Open it in a new tab instead.",it="The preview URL could not be loaded. Verify the server is running and the URL is correct.",ot="Preview is taking longer than expected and may block iframe embedding.";function lt(e){return e==="blocked"?at:e==="error"?it:null}function ct(e,s={}){const{loadTimeoutMs:n=1e4,detectionMethod:t=null}=s,v=a.useRef(null),d=a.useRef(null),[b,m]=a.useState("unknown"),[k,N]=a.useState(null),[z]=a.useState(t),L=a.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=a.useCallback(R=>{m(R),N(lt(R))},[]),h=a.useCallback(()=>{m("blocked"),N(ot)},[]);a.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),N(null))}),()=>{R=!0,L()}},[L,e]),a.useEffect(()=>{if(b!=="loading"){L();return}const R=setTimeout(()=>{d.current=null,h()},n);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[L,b,n,h]);const c=a.useCallback(()=>{const R=v.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),p=a.useCallback(()=>{j("error")},[j]);a.useEffect(()=>{if(L(),!e){m("unknown"),N(null);return}m("unknown"),N(null)},[L]);const D=a.useCallback(()=>{L(),m("unknown"),N(null)},[L]),F=D,E=a.useMemo(()=>b==="embedded",[b]),_=a.useMemo(()=>b==="blocked"||b==="error",[b]);return{embedStatus:b,isEmbedded:E,isBlocked:_,blockReason:k,detectionMethod:z,iframeRef:v,resetEmbedStatus:D,setEmbedStatus:j,retry:F,embedContext:k,handleIframeLoad:c,handleIframeError:p}}const dt=/\x1b\[[0-9;]*m/g,vt=50;function ut(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=vt}function Pe(e){return e.replace(dt,"")}function mt(e){if(!e)return"";const s=new Date(e);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function pt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ft(e){if(e.stream==="stderr")return"error";const s=Pe(e.text).toLowerCase();return/\b(warn|warning)\b/.test(s)?"warn":/\b(error|fatal)\b/.test(s)?"error":"info"}function ht(e,s){if(!s)return e;const n=new RegExp(`(${pt(s)})`,"ig"),t=e.split(n),v=s.toLowerCase();return r.jsx(r.Fragment,{children:t.map((d,b)=>d.toLowerCase()===v?r.jsx("mark",{children:d},`${d}-${b}`):r.jsx("span",{children:d},`${d}-${b}`))})}function gt({entries:e,loading:s,loadingMore:n,hasMore:t,total:v,onLoadMore:d,isRunning:b}){const{t:m}=fe("app"),k=a.useRef(null),N=a.useRef(e.length),z=a.useRef(b),[L,j]=a.useState(!1),[h,c]=a.useState(!1),p=a.useRef(!1),[D,F]=a.useState(""),[E,_]=a.useState("all"),R=a.useMemo(()=>E==="all"?e:e.filter(f=>ft(f)===E),[e,E]),I=a.useMemo(()=>{const f=D.trim().toLowerCase();return f?R.filter(A=>Pe(A.text).toLowerCase().includes(f)):R},[R,D]),B=I.length,H=a.useCallback(f=>{p.current=f,c(f)},[]),P=a.useCallback(()=>{const f=k.current;f&&(f.scrollTop=f.scrollHeight,H(!1))},[H]);a.useEffect(()=>{const f=z.current,A=N.current,T=e.length>A;b&&(!f||!h&&T)&&P(),z.current=b,N.current=e.length},[e.length,b,h,P]);const x=a.useCallback(()=>{const f=k.current;f&&H(!ut(f))},[H]);return a.useEffect(()=>{s||e.length===0||!h&&b&&P()},[e,b,h,s,P]),a.useEffect(()=>{const f=k.current;if(!f||!b||typeof MutationObserver>"u")return;const A=new MutationObserver(()=>{p.current||P()});return A.observe(f,{childList:!0,characterData:!0,subtree:!0}),()=>A.disconnect()},[b,P]),s&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(pe,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${L?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[v!==null?`${e.length}/${v}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:E,onChange:f=>_(f.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(_r,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:D,onChange:f=>F(f.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),D.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(f=>!f),"data-testid":"devserver-log-fullscreen-toggle","aria-label":L?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:L?r.jsx(Ar,{size:14}):r.jsx(Tr,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[t&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:n,"data-testid":"devserver-log-load-more-button",children:n?r.jsxs(r.Fragment,{children:[r.jsx(pe,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:x,"data-testid":"devserver-log-content",children:[!s&&I.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),I.map(f=>{const A=Pe(f.text),T=mt(f.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[T&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:T}),f.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Or(ht(A,D.trim()))})]},f.id)})]}),h&&b&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[r.jsx(Fr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const wt="devserver-preview-iframe";function bt({url:e,embedStatus:s,onEmbedStatusChange:n,iframeRef:t,blockReason:v,onRetry:d,className:b=wt,embedContext:m}){const{t:k}=fe("app"),N=v??m??null,[z,L]=a.useState(0);a.useEffect(()=>{!e||s!=="unknown"||(L(p=>p+1),n("loading"))},[s,n,e]);const j=a.useCallback(()=>{const p=t.current;if(!p){n("embedded");return}try{if(p.contentWindow?.location?.href==="about:blank"&&p.src!=="about:blank"){n("blocked");return}}catch{}n("embedded")},[t,n]),h=a.useCallback(p=>{p.stopPropagation(),n("error")},[n]),c=a.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:b,title:"Dev server preview",onLoad:j,onError:h,onErrorCapture:h,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),s==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),s==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),s==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),N&&r.jsx("p",{className:"devserver-preview-blocked-context",children:N})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:c,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function xt(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const yt=480;function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function fr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const s=e.parentElement;return s?.classList.contains("right-dock__body")?s:null}function Nt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function kt(e){if(!e||St())return!1;const s=fr(e);return s?Nt(s)<=yt:!1}function Ct(e){const[s,n]=a.useState(!1);return a.useEffect(()=>{const t=e.current;if(!t){n(!1);return}const v=fr(t),d=()=>n(kt(t));if(d(),!v||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const b=new ResizeObserver(d);return b.observe(v),window.addEventListener("resize",d),()=>{b.disconnect(),window.removeEventListener("resize",d)}},[e]),s}let Ee=!1;function Ze(e){return e instanceof Error?e.message:String(e)}function hr(e){return e==="."?"root":e}function er(e){return e?e==="root"?".":e:null}function rr(e,s,n){return!s||e.scriptName!==s?!1:n?hr(e.cwd)===n:!0}function jt(e){return e.cwd==="."?"root":e.cwd}function Lt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function At({addToast:e,projectId:s,tasks:n}){const{t}=fe("app");a.useEffect(()=>(ie({view:"DevServerView",trigger:Ee?"route-active":"remount",projectId:s,replayAttempted:!1}),Ee=!1,()=>{Ee=!0,ie({view:"DevServerView",trigger:"route-inactive",projectId:s,replayAttempted:!1})}),[s]);const{session:v,detectedCommands:d,previewUrl:b,isLoading:m,error:k,startServer:N,stopServer:z,restartServer:L,setPreviewUrl:j,detectCommands:h,refresh:c}=tt(s),p=v?.status??"stopped",D=p==="running"||p==="starting",F=xt(t),E=F[p]??F.stopped,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,loadMore:P}=nt(s,!!s),x=b,f=v?.config?.cwd??null,A=a.useRef(null),T=Ct(A),[X,C]=a.useState(!0),[S,o]=a.useState(""),[i,g]=a.useState(""),[u,w]=a.useState(null),[y,U]=a.useState(null),[W,Me]=a.useState(null),Y=a.useMemo(()=>(n??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[n]),J=a.useMemo(()=>Y.find(l=>l.id===y)??null,[Y,y]);a.useEffect(()=>{y&&!Y.some(l=>l.id===y)&&U(null)},[Y,y]);const[se,gr]=a.useState("embedded"),[ne,ge]=a.useState(!1),_e=a.useRef(null),we=a.useRef(null),wr=se==="embedded"?x:null,{embedStatus:V,setEmbedStatus:br,resetEmbedStatus:oe,iframeRef:ee,isEmbedded:xr,isBlocked:be,blockReason:xe,retry:Ae}=ct(wr),[Te,G]=a.useState(!1),Oe=a.useRef(V);a.useEffect(()=>{const l=Oe.current!==V;be&&l&&G(!0),V==="embedded"&&G(!1),Oe.current=V},[V,be]),a.useEffect(()=>{G(!1)},[x]);const le=a.useMemo(()=>{if(!u)return null;const l=er(f);return d.find(M=>!(M.scriptName!==u||l&&M.cwd!==l||v?.config?.command&&M.command!==v.config.command))??d.find(M=>rr(M,u,f))??null},[d,v?.config?.command,u,f]);a.useEffect(()=>{typeof h=="function"&&h().catch(l=>{e(Ze(l),"error")})},[e,h]),a.useEffect(()=>{if(u){C(!1);return}C(!0)},[u]),a.useEffect(()=>{if(v?.status==="running"||v?.status==="starting"){v.config?.command?.trim().length>0&&o(v.config.command);return}if(le){o(le.command);return}d.length>0&&o(l=>l.trim().length>0?l:d[0]?.command??"")},[d,le,v?.config?.command,v?.status]),a.useEffect(()=>{g(x??"")},[x]);const ce=a.useCallback(()=>{ge(!1),window.requestAnimationFrame(()=>_e.current?.focus())},[]),yr=$r(ce);a.useEffect(()=>{if(!ne)return;we.current?.focus();const l=M=>{if(M.key==="Escape"){ce();return}if(M.key!=="Tab")return;const ae=Array.from(we.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(ze=>!ze.hasAttribute("disabled")&&ze.getAttribute("aria-hidden")!=="true"),Q=ae[0],Se=ae.at(-1);!Q||!Se||(M.shiftKey&&document.activeElement===Q?(M.preventDefault(),Se.focus()):!M.shiftKey&&document.activeElement===Se&&(M.preventDefault(),Q.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ce,ne]),a.useEffect(()=>{!T&&ne&&ge(!1)},[T,ne]);const ye=a.useCallback(()=>{x&&window.open(x,"_blank","noopener,noreferrer")},[x]),Fe=a.useCallback(()=>{G(!1),Ae()},[Ae]),Sr=a.useCallback(()=>{try{const l=ee.current;if(l?.contentWindow){l.contentWindow.location.reload(),G(!1),oe();return}}catch{}if(!(!x||!ee.current))try{const l=new URL(x);l.searchParams.set("_t",Date.now().toString()),ee.current.src=l.toString(),G(!1),oe()}catch{ee.current.src=x,G(!1),oe()}},[x,ee,oe]),de=a.useCallback(async(l,M,ae)=>{Me(l);try{await M(),e(ae,"success")}catch(Q){e(Ze(Q),"error")}finally{Me(null)}},[e]),Nr=a.useCallback(l=>{w(l.scriptName),C(!1),o(l.command),e(t("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),kr=a.useCallback(()=>{w(null),C(!0),e(t("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Cr=a.useCallback(l=>{D&&l&&l!==y&&e(t("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),U(l)},[e,D,y,t]),jr=()=>{const l=S.trim();if(l.length===0){e(t("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const M=er(f)??".",Q=J?.worktree??null??le?.cwd??M;de("start",()=>N(l,Q),t("devserver.toast.started","Dev server started."))},Lr=()=>{de("stop",z,t("devserver.toast.stopped","Dev server stopped."))},Er=()=>{de("restart",L,t("devserver.toast.restarted","Dev server restarted."))},Rr=()=>{const l=i.trim(),M=l.length>0?l:null;de("preview",()=>j(M),M?t("devserver.toast.previewUpdated","Preview URL updated."):t("devserver.toast.previewCleared","Preview URL override cleared."))},Ur=a.useCallback(()=>{k&&c()},[k,c]),Dr=p==="starting"||p==="running"||W!==null,Pr=p==="stopped"||W!==null,Mr=p==="stopped"||p==="starting"||W!==null,$e=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[t("devserver.auto","Auto"),x?` · ${x}`:t("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>gr(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:se==="embedded"?t("devserver.externalOnly","External only"):t("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.openInNewTab","Open in new tab"),onClick:ye,disabled:!x,"data-testid":"devserver-preview-open-tab",children:r.jsx(qr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:t("devserver.refreshPreview","Refresh preview"),onClick:Sr,disabled:!x,"data-testid":"devserver-preview-refresh",children:r.jsx(Xr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":V,"data-embedded":xr?"true":"false",children:[!x&&!D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.startDevServer","Start a dev server to see a live preview here.")}),!x&&D&&r.jsx("p",{className:"devserver-preview-empty",children:t("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),x&&se==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:t("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ye,"data-testid":"devserver-preview-external-open-tab",children:t("devserver.openInNewTab","Open in new tab")})]}),x&&se==="embedded"&&Te&&be&&r.jsxs("div",{className:V==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[V==="error"?r.jsx(nr,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ar,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:V==="error"?t("devserver.previewFailed","Preview failed"):t("devserver.previewBlocked","Preview blocked")}),xe&&r.jsx("p",{className:"devserver-preview-blocked-context",children:xe})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:t("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ye,"data-testid":"devserver-preview-fallback-open-tab",children:t("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Fe,"data-testid":"devserver-preview-fallback-retry",children:t("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),x&&se==="embedded"&&!Te&&r.jsx(bt,{url:x,embedStatus:V,onEmbedStatusChange:br,iframeRef:ee,blockReason:xe,onRetry:Fe})]})]});return r.jsxs("div",{ref:A,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":T?"true":"false",children:[r.jsx(zr,{icon:Hr,title:t("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${E.className}`,"data-testid":"dev-server-status-badge",children:E.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:jr,disabled:Dr,"data-testid":"dev-server-start-button",children:[r.jsx(Ir,{size:14}),r.jsx("span",{children:W==="start"?t("devserver.starting","Starting..."):t("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Lr,disabled:Pr,"data-testid":"dev-server-stop-button",children:[r.jsx(Br,{size:14}),r.jsx("span",{children:W==="stop"?t("devserver.stopping","Stopping..."):t("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Er,disabled:Mr,"data-testid":"dev-server-restart-button",children:[r.jsx(Vr,{size:14}),r.jsx("span",{children:W==="restart"?t("devserver.restarting","Restarting..."):t("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":t("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:t("devserver.loading","Loading...")})]}),m&&!v&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(pe,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:t("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ur,children:t("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:t("devserver.scriptSelection","Script Selection")}),u&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:u}),r.jsx("span",{className:"dev-server-candidate-source",children:f??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(!0),"data-testid":"dev-server-change-selection",children:t("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:kr,"data-testid":"dev-server-clear-selection",children:t("devserver.clear","Clear")})]}),X&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:t("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),X&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const M=rr(l,u,f);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${M?"dev-server-candidate--selected":""}`,onClick:()=>Nr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${hr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Lt(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:jt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:t("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:t("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>Cr(l.target.value.length>0?l.target.value:null),disabled:Y.length===0,"aria-label":t("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:t("devserver.projectRootNoTask","Project root (no task)")}),Y.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),Y.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:t("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),J&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:J.title?`${J.id} — ${J.title}`:J.id})}),r.jsx("p",{className:"dev-server-task-description",children:J.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:J.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:t("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:S,onChange:l=>o(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:p==="running"||p==="starting"})]}),(p==="running"||p==="starting")&&v&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:t("devserver.runningCommand","Running command")}),r.jsx("code",{children:v.config?.command??S})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:t("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:i,onChange:l=>g(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Rr,disabled:W==="preview","data-testid":"dev-server-set-preview",children:t("devserver.save","Save")})]}),x&&r.jsx("p",{className:"dev-server-preview-hint",children:t("devserver.autoDetected","Auto-detected: {{url}}",{url:x})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":t("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:t("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:t("devserver.lines","{{count}} lines",{count:H??_.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(gt,{entries:_,loading:R,loadingMore:I,hasMore:B,total:H,onLoadMore:P,isRunning:D})})]})}),T?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":t("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(He,{size:14}),r.jsx("span",{children:t("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:x??t("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:x||t("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:x?t("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):t("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:_e,onClick:()=>ge(!0),"data-testid":"devserver-preview-modal-open",children:t("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":t("devserver.previewLabel","Dev server preview"),children:$e()}),T&&ne&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...yr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:we,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:t("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ce,"aria-label":t("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx(Wr,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:$e()})]})})]})}export{At as DevServerView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{
|
|
1
|
+
import{r as n,j as r}from"./vendor-react-SZ_qB27O.js";import{a5 as z,a6 as D,a7 as S,a8 as f,g as j,a9 as T,E as B,p as A,P as L,L as K,h as N}from"./index-CE7C_XsS.js";import{u as R}from"./vendor-i18n-GF3RlKbq.js";import{F as U}from"./folder-open-CwWtrDh6.js";function M({value:b,onChange:h,placeholder:F,onInputKeyDown:g,nodeId:k,localNodeId:m,selectCreatedDirectory:x=!1}){const{t:i}=R("app"),[e,s]=n.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1,createFolderOpen:!1,createFolderError:null}),[p,u]=n.useState(""),d=n.useCallback(async(t,c=!1)=>{s(o=>({...o,loading:!0,error:null}));try{const o=await z(t,c,k,m);s(a=>({...a,loading:!1,currentPath:o.currentPath,parentPath:o.parentPath,entries:o.entries}))}catch(o){s(a=>({...a,loading:!1,error:o instanceof Error?o.message:"Failed to browse directory"}))}},[k,m]),C=n.useCallback(()=>{s(t=>t.isOpen?{...t,isOpen:!1}:{...t,isOpen:!0})},[]);n.useEffect(()=>{e.isOpen&&!e.loading&&!e.currentPath&&!e.error&&d(b||void 0,e.showHidden)},[e.isOpen,e.loading,e.currentPath,e.error,b,e.showHidden,d,k,m]);const y=n.useCallback(t=>{d(t,e.showHidden)},[d,e.showHidden]),H=n.useCallback(()=>{h(e.currentPath),s(t=>({...t,isOpen:!1}))},[e.currentPath,h]),E=n.useCallback(()=>{s(t=>{const c=!t.showHidden;return{...t,showHidden:c}})},[]);n.useEffect(()=>{e.isOpen&&e.currentPath&&d(e.currentPath,e.showHidden)},[e.showHidden,d]);const w=n.useCallback(()=>{s(t=>({...t,createFolderOpen:!t.createFolderOpen,createFolderError:null})),u("")},[]),P=n.useCallback(async()=>{if(!p.trim()||!e.currentPath)return;const t=p.trim();if(t.includes("/")||t.includes("\\")||t.includes("..")){s(a=>({...a,createFolderError:i("dirPicker.createFolderError","Folder name cannot contain path separators or '..'")}));return}const c=e.currentPath.includes("\\")?"\\":"/",o=e.currentPath.endsWith(c)?e.currentPath+t:e.currentPath+c+t;s(a=>({...a,loading:!0,createFolderError:null}));try{const a=await D(o);u(""),s(l=>({...l,createFolderOpen:!1})),x?(h(a.path),await d(a.path,e.showHidden),s(l=>l.error?{...l,isOpen:!1,error:null}:l)):await d(e.currentPath,e.showHidden)}catch(a){s(l=>({...l,loading:!1,createFolderError:a instanceof Error?a.message:"Failed to create folder"}))}},[p,e.currentPath,e.showHidden,d,h,x]),O=n.useCallback(t=>{t.key==="Enter"?(t.preventDefault(),P()):t.key==="Escape"&&(s(c=>({...c,createFolderOpen:!1,createFolderError:null})),u(""))},[P]),v=e.currentPath?S(e.currentPath):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"input directory-picker-input",value:b,onChange:t=>h(t.target.value),onKeyDown:g,placeholder:F||i("dirPicker.defaultPlaceholder","/path/to/your/project")}),r.jsxs("button",{type:"button",className:"btn btn-secondary btn-sm directory-picker-browse-btn",onClick:C,"aria-label":e.isOpen?i("dirPicker.closeBrowser","Close directory browser"):i("dirPicker.openBrowser","Browse directories"),children:[e.isOpen?r.jsx(U,{size:16}):r.jsx(f,{size:16}),r.jsx("span",{children:i("dirPicker.browse","Browse")})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":i("dirPicker.ariaLabel","Directory browser"),children:[r.jsx("div",{className:"directory-picker-breadcrumbs",children:v.map((t,c)=>r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[c>0&&r.jsx(j,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{type:"button",className:"directory-picker-breadcrumb",onClick:()=>y(t.path),title:t.path,children:t.label})]},t.path))}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-up-btn",onClick:()=>y(e.parentPath),"aria-label":i("dirPicker.parentDir","Go to parent directory"),title:i("dirPicker.parentDirTitle","Parent directory"),children:[r.jsx(T,{size:14}),r.jsx("span",{children:i("dirPicker.up","Up")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-hidden-toggle",onClick:E,"aria-label":e.showHidden?i("dirPicker.hideHiddenAria","Hide hidden directories"):i("dirPicker.showHiddenAria","Show hidden directories"),title:e.showHidden?i("dirPicker.hideHiddenTitle","Hide hidden"):i("dirPicker.showHiddenTitle","Show hidden"),children:[e.showHidden?r.jsx(B,{size:14}):r.jsx(A,{size:14}),r.jsx("span",{children:e.showHidden?i("dirPicker.hideHidden","Hide hidden"):i("dirPicker.showHidden","Show hidden")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm btn-secondary directory-picker-create-folder-toggle",onClick:w,"aria-label":i("dirPicker.createFolderAria","Create new folder"),title:i("dirPicker.createFolderTitle","Create folder"),children:[r.jsx(L,{size:14}),r.jsx("span",{children:i("dirPicker.createFolder","New folder")})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(K,{size:20,className:"animate-spin"}),r.jsx("span",{children:i("dirPicker.loading","Loading…")})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(N,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:i("dirPicker.noSubdirs","No subdirectories")}):e.entries.map(t=>r.jsxs("button",{type:"button",className:"directory-picker-entry",onClick:()=>y(t.path),role:"treeitem",title:t.path,children:[r.jsx(f,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:t.name}),t.hasChildren&&r.jsx(j,{size:14,className:"directory-picker-entry-arrow"})]},t.path))}),e.createFolderOpen&&r.jsxs("div",{className:"directory-picker-create-folder",children:[r.jsx("input",{type:"text",className:"input directory-picker-create-folder-input",value:p,onChange:t=>u(t.target.value),onKeyDown:O,placeholder:i("dirPicker.newFolderPlaceholder","Folder name"),autoFocus:!0}),r.jsxs("div",{className:"directory-picker-create-folder-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm btn-primary",onClick:P,disabled:!p.trim()||e.loading||!e.currentPath,children:i("dirPicker.createFolderConfirm","Create")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-secondary",onClick:w,children:i("dirPicker.cancel","Cancel")})]}),e.createFolderError&&r.jsxs("div",{className:"directory-picker-create-folder-error",children:[r.jsx(N,{size:14}),r.jsx("span",{children:e.createFolderError})]})]}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:H,children:i("dirPicker.select","Select")})]})]})]})}export{M as D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as n,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as qe,ap as Ue,aq as Rt,ar as Ht,as as zt,at as Ke,au as $t,av as Ot,aw as fe,ax as It,ay as _e,az as Bt,aA as qt,aB as Ut,aC as _t,aD as Ae,aE as Vt,aF as Ve,V as Qt,aG as ce,E as Wt,p as Gt,aH as Kt,X as Xt,R as Yt,aI as ke,A as Qe,v as We,aJ as Ge,j as De,r as Ee,aK as Jt,aL as Xe,aM as Zt,aN as es,aO as ts,aP as ss,z as ns,aQ as as,aR as cs}from"./index-CE7C_XsS.js";import{u as os}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function rs(a){const{projectId:r,searchQuery:g,includeProjectFiles:P=!0}=a??{},x=r?`${Rt.DOCUMENTS_PREFIX}${r}`:null,[t,i]=n.useState(()=>{if(!x)return[];const N=qe(x,{maxAgeMs:Ue});return Array.isArray(N)?N:[]}),[A,d]=n.useState([]),[k,b]=n.useState(()=>t.length===0),[u,C]=n.useState(null),m=n.useRef(null),f=n.useRef(t.length>0),p=n.useRef(null),{capture:D}=Ht(r,"useDocuments"),S=n.useCallback(async()=>{const N=D();m.current&&m.current.abort();const J=new AbortController;m.current=J;const $=!f.current;$&&b(!0),C(null);const Z=zt(g?{q:g}:void 0,r),U=P?Ke(r):Promise.resolve({files:[]}),[w,re]=await Promise.allSettled([Z,U]);if(J.signal.aborted||N.isStale())return;let O=null;if(w.status==="fulfilled"){if(i(w.value),x){const _=w.value.length>500?w.value.slice(0,500):w.value;$t(x,_,{maxBytes:5e5})}f.current=!0}else O=w.reason instanceof Error?w.reason.message:String(w.reason);if(re.status==="fulfilled"){const _=re.value.files,G=g?.trim().toLowerCase(),ie=G?_.filter(ee=>ee.name.toLowerCase().includes(G)||ee.path.toLowerCase().includes(G)):_;d(ie)}C(O),$&&b(!1)},[x,D,P,r,g]);return n.useEffect(()=>{if(d([]),!x){f.current=!1,i([]),b(!0);return}const N=qe(x,{maxAgeMs:Ue});Array.isArray(N)?(i(N),f.current=!0,b(!1)):(f.current=!1,i([]),b(!0))},[x]),n.useEffect(()=>(p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{S()},300),()=>{p.current&&clearTimeout(p.current)}),[S]),n.useEffect(()=>(S(),()=>{m.current&&m.current.abort()}),[]),{documents:t,projectFiles:A,loading:k,error:u,refresh:S}}function is(a,r){const[g,P]=n.useState([]),[x,t]=n.useState(!0),[i,A]=n.useState(null),d=n.useRef(null),k=n.useRef(!1),b=r?.showHidden??!1,u=n.useCallback(async C=>{d.current&&d.current.abort();const m=new AbortController;d.current=m;const f=!k.current;f&&t(!0),A(null);try{const p=await Ke(a,{showHidden:C?.showHidden??b});if(m.signal.aborted)return;P(p.files),k.current=!0}catch(p){if(m.signal.aborted)return;A(p instanceof Error?p.message:String(p))}finally{!m.signal.aborted&&f&&t(!1)}},[a,b]);return n.useEffect(()=>(k.current=!1,u({showHidden:b}),()=>{d.current&&d.current.abort()}),[u,b]),{files:g,loading:x,error:i,refresh:u}}const ls=768,ds={image:ss,doc:ce,pdf:ts,video:es,audio:Zt,other:Xe};function oe(a){return a?new Date(a).toLocaleString():""}function us(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function ms(a){return a==="done"?"status-dot status-dot--online":a==="archived"?"status-dot status-dot--offline":a==="todo"||a==="triage"?"status-dot status-dot--pending":"status-dot status-dot--connecting"}function Ye(a,r){switch(r){case"image":return a("documents.artifactCategoryImage","Image");case"doc":return a("documents.artifactCategoryDoc","Document");case"pdf":return a("documents.artifactCategoryPdf","PDF");case"video":return a("documents.artifactCategoryVideo","Video");case"audio":return a("documents.artifactCategoryAudioSingle","Audio");case"other":return a("documents.artifactCategoryOtherSingle","Other")}}function hs(a,r){return r?[a.title,a.description,a.taskId,a.taskTitle,a.mimeType,a.authorId].some(g=>g?.toLowerCase().includes(r)):!0}function fs(a){const r=a.mimeType?.toLowerCase().split(";",1)[0]??"";return!!a.content||a.type==="document"||r.startsWith("text/")||r==="application/json"||r==="application/xml"}function ks({artifact:a,projectId:r,content:g,loading:P,error:x,renderMarkdown:t,onToggleMarkdown:i,onOpenTask:A,t:d}){const[k,b]=n.useState(null),u=Ae(a),C=Ye(d,u),m=a.title||d("documents.untitledArtifact","Untitled artifact"),f=ns(a.id,r),p=u==="doc"&&fs(a);n.useEffect(()=>{b(null)},[a.id]);const D=k?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:k}):null,S=u==="image"?e.jsxs(e.Fragment,{children:[D,e.jsx("img",{className:"documents-task-artifact-media",src:f,alt:m,onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="video"?e.jsxs(e.Fragment,{children:[D,e.jsx("video",{className:"documents-task-artifact-media",controls:!0,src:f,"aria-label":d("documents.videoArtifactLabel","Video artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="audio"?e.jsxs(e.Fragment,{children:[D,e.jsx("audio",{className:"documents-task-artifact-audio",controls:!0,src:f,"aria-label":d("documents.audioArtifactLabel","Audio artifact: {{title}}",{title:m}),onError:()=>b(d("documents.artifactMediaFailed","Failed to load artifact preview."))})]}):u==="pdf"?e.jsxs("div",{className:"documents-task-artifact-pdf",children:[e.jsx("iframe",{title:d("documents.pdfArtifactTitle","PDF artifact: {{title}}",{title:m}),src:f}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer",children:[e.jsx(as,{size:14,"aria-hidden":"true"}),d("documents.openInNewTab","Open in new tab")]})]}):u==="doc"&&p?P?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:d("documents.loadingArtifactContent","Loading artifact content…")})}):x?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:x}):t?e.jsx("div",{className:"documents-content-markdown documents-task-artifact-doc-content",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:g??a.content??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text documents-task-artifact-doc-content",children:g??a.content??""}):e.jsxs("div",{className:"documents-task-artifact-download",children:[e.jsx(Xe,{size:24,"aria-hidden":"true"}),e.jsx("p",{children:a.description||d("documents.binaryArtifactFallback","This artifact cannot be previewed inline.")}),e.jsxs("a",{className:"btn btn-sm",href:f,target:"_blank",rel:"noreferrer","data-testid":"task-artifact-open-link",children:[e.jsx(cs,{size:14,"aria-hidden":"true"}),d("documents.openArtifact","Open artifact")]})]});return e.jsxs("div",{className:"documents-content-viewer documents-task-artifact-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[a.taskId," / ",m]}),u==="doc"&&p?e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:i,"aria-label":t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":t,title:t?d("documents.switchToPlainText","Switch to plain text"):d("documents.switchToMarkdown","Switch to markdown"),children:t?d("documents.markdown","Markdown"):d("documents.plain","Plain")}):null]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta documents-task-artifact-meta",children:[e.jsx("span",{children:C}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:a.authorId||d("documents.unknownAuthor","unknown")}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:oe(a.updatedAt)}),a.taskId?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("button",{className:"documents-task-artifact-open-task",onClick:()=>void A(a.taskId),children:d("documents.openTask","Open task")})]}):null]}),a.description?e.jsx("p",{className:"documents-task-artifact-description",children:a.description}):null,e.jsx("div",{className:`documents-task-artifact-preview documents-task-artifact-preview--${u}`,children:S})]})}function gs({projectId:a,addToast:r,onOpenDetail:g,onOpenArtifactTaskDetail:P,onSendSelectionToTask:x}){const{t}=os("app"),[i,A]=n.useState("artifacts"),d=Ot(),[k,b]=n.useState(""),[u,C]=n.useState(null),[m,f]=n.useState(null),[p,D]=n.useState(!1),[S,N]=n.useState(null),[J,$]=n.useState(!1),[Z,U]=n.useState(null),[w,re]=n.useState(!1),O=n.useRef(0),_=n.useRef(null),G=n.useRef(null),ie=n.useRef(null),ee=n.useRef(null),[K,Le]=n.useState(!1),[Je,Me]=n.useState(new Map),[Ze,E]=n.useState(null),[pe,T]=n.useState(""),[le,F]=n.useState(null),[V,y]=n.useState(null),[de,je]=n.useState(!1),[et,L]=n.useState(null),[tt,I]=n.useState(!1),[st,M]=n.useState(null),[nt,xe]=n.useState(!0),te=n.useRef(0),[be,Q]=n.useState(!1),[ue,B]=n.useState(""),[we,ve]=n.useState(!1),[me,Re]=n.useState(!1),at=fe(_,{locked:me}),ct=fe(G,{locked:me}),ot=fe(ie,{locked:me}),rt=fe(ee,{locked:me}),ge=K?at:ct,Ne=i==="tasks"?k.trim():"",it=i==="artifacts"?k.trim():"",{documents:se,loading:lt,error:dt,refresh:ne}=rs({projectId:a,searchQuery:Ne||void 0,includeProjectFiles:!1}),{files:W,loading:ut,error:mt,refresh:He}=is(a,{showHidden:p}),{artifacts:R,loading:ht,error:ft,refresh:Se}=It({projectId:a,searchQuery:it||void 0});n.useEffect(()=>{const s=()=>{re(window.innerWidth<=ls)};return s(),window.addEventListener("resize",s),()=>{window.removeEventListener("resize",s)}},[]),n.useEffect(()=>{A("artifacts"),C(null),f(null),D(!1),N(null),U(null),$(!1),Le(!1),Me(new Map),E(null),T(""),F(null),y(null),je(!1),L(null),I(!1),M(null),xe(!0),Q(!1),B(""),ve(!1)},[a]);const X=n.useMemo(()=>{const s=Ne.toLowerCase(),c=new Map;for(const o of se){const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.documents.push(o),c.set(o.taskId,j)}for(const o of R){if(!o.taskId||!hs(o,s))continue;const j=c.get(o.taskId)??{documents:[],artifacts:[]};j.artifacts.push(o),c.set(o.taskId,j)}return Array.from(c.entries()).map(([o,j])=>{const z=[...j.documents].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),q=[...j.artifacts].sort((v,ae)=>ae.updatedAt.localeCompare(v.updatedAt)),Pe=[z[0]?.updatedAt,q[0]?.updatedAt].filter(Boolean).sort().at(-1)??"",h=z.find(v=>v.taskTitle)?.taskTitle??q.find(v=>v.taskTitle)?.taskTitle;return{taskId:o,taskTitle:h,taskColumn:z.find(v=>v.taskColumn)?.taskColumn??q.find(v=>v.taskColumn)?.taskColumn,documents:z,artifacts:q,latestUpdated:Pe}}).filter(o=>o.documents.length>0||o.artifacts.length>0).sort((o,j)=>j.latestUpdated.localeCompare(o.latestUpdated))},[R,se,Ne]),l=n.useMemo(()=>m?.kind!=="document"?null:se.find(s=>s.id===m.id)??null,[se,m]),H=n.useMemo(()=>m?.kind!=="artifact"?null:R.find(s=>s.id===m.id)??null,[R,m]),he=l??H;n.useEffect(()=>{if(!m)return;X.some(c=>m.kind==="document"?c.documents.some(o=>o.id===m.id):c.artifacts.some(o=>o.id===m.id))||(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null))},[X,m]);const Ce=n.useMemo(()=>{const s=k.trim().toLowerCase();return s?W.filter(c=>{const o=c.path.toLowerCase(),j=c.name.toLowerCase();return o.includes(s)||j.includes(s)}):W},[W,k]);n.useEffect(()=>{if(!u)return;W.some(c=>c.path===u.path)||(C(null),N(null),U(null),$(!1))},[W,u]);const kt=n.useCallback(s=>{b(s.target.value)},[]),pt=n.useCallback(()=>{b("")},[]),ye=n.useCallback(s=>{A(s),s!=="tasks"&&(f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)),s!=="project"&&(Q(!1),B(""))},[]),jt=n.useCallback(async s=>{try{const c=await _e(s,a);g(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,g,r]),ze=n.useCallback(async s=>{try{const c=await _e(s,a);(P??g)(c)}catch{r(`Failed to open task ${s}`,"error")}},[a,P,g,r]),xt=n.useCallback(async s=>{C(s),$(!0),U(null),N(null),Q(!1),B("");const c=O.current+1;O.current=c;try{const o=await Bt("project",s.path,a);if(O.current!==c)return;N(o.content)}catch(o){if(O.current!==c)return;const j=o instanceof Error?o.message:`Failed to open ${s.path}`;U(j),r(j,"error")}finally{O.current===c&&$(!1)}},[a,r]),bt=n.useCallback(()=>{C(null),N(null),U(null),$(!1),Q(!1),B("")},[]),wt=n.useCallback(()=>{S!==null&&(B(S),Q(!0))},[S]),vt=n.useCallback(()=>{Q(!1),B("")},[]),gt=n.useCallback(async()=>{if(u){ve(!0);try{await qt("project",u.path,ue,a),N(ue),Q(!1),B(""),r(t("documents.projectFileSaved","File saved"),"success")}catch(s){r(s instanceof Error?s.message:String(s),"error")}finally{ve(!1)}}},[u,ue,a,r,t]),Nt=n.useCallback(s=>{f({kind:"document",id:s}),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),St=n.useCallback(s=>{f({kind:"artifact",id:s}),E(null),T(""),F(null),y(null),L(null),M(null),xe(!0)},[]),Ct=n.useCallback(()=>{f(null),E(null),T(""),F(null),y(null),L(null),I(!1),M(null)},[]),yt=n.useCallback(s=>{Me(c=>{const o=new Map(c),j=o.get(s)??!0;return o.set(s,!j),o})},[]),Tt=n.useCallback(()=>{l&&(T(l.content),E(l.id),F({revision:l.revision,contentHash:l.contentHash}),y(null))},[l]),Ft=n.useCallback(()=>{E(null),T(""),F(null),y(null)},[]),Pt=n.useCallback(()=>{V&&(F(V),y(null))},[V]),At=n.useCallback(async()=>{if(!(!l||!le||V)){je(!0);try{await Ut(l.taskId,l.key,pe,{expectedRevision:le.revision,expectedContentHash:le.contentHash},a),await ne(),E(null),T(""),F(null),y(null),r(t("documents.taskDocumentSaved","Document saved"),"success")}catch(s){if(typeof s=="object"&&s!==null&&"status"in s&&s.status===409)try{const c=await _t(l.taskId,l.key,a);await ne(),y({revision:c.revision,contentHash:c.contentHash}),r(t("documents.taskDocumentStale","This document changed since you opened it. Your draft is preserved; review the latest revision, then choose Rebase draft before saving."),"error")}catch(c){r(c instanceof Error?c.message:String(c),"error")}else r(s instanceof Error?s.message:String(s),"error")}finally{je(!1)}}},[l,pe,le,V,a,ne,r,t]);n.useEffect(()=>{if(!H||Ae(H)!=="doc"){L(null),I(!1),M(null);return}const s=te.current+1;te.current=s,I(!0),M(null),L(null),Vt(H.id,a).then(c=>{te.current===s&&L(c.content??H.content??"")}).catch(c=>{te.current===s&&M(c instanceof Error?c.message:String(c))}).finally(()=>{te.current===s&&I(!1)})},[a,H]);const $e=i==="project"?mt:i==="tasks"?dt:ft,Dt=n.useCallback(async()=>{if(i==="project"){await He();return}if(i==="tasks"){await ne();return}await Se()},[i,Se,He,ne]),Oe=i==="project"?Ce.length:i==="tasks"?X.length:R.length,Y=l?Je.get(l.id)??!0:!1,Te=Y?ot:rt,Fe=l!==null&&Ze===l.id,Et=i==="project"&&u&&!be&&x&&ge?e.jsx(Ve,{selectedText:ge.selectedText,anchorRect:ge.anchorRect,filePath:u.path,onSubmit:x,onOpenChange:Re}):null,Lt=i==="tasks"&&l&&!Fe&&x&&Te?e.jsx(Ve,{selectedText:Te.selectedText,anchorRect:Te.anchorRect,filePath:`${l.taskId}/${l.key}`,onSubmit:x,onOpenChange:Re}):null,Ie=i==="project"?t("documents.searchProjectFiles","Search project markdown files…"):i==="tasks"?t("documents.searchTaskDocuments","Search task documents…"):t("documents.searchArtifacts","Search artifacts…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsx(Qt,{icon:ce,title:t("documents.title","Artifacts"),actions:e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:Oe,plural:Oe!==1?"s":""})})}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":t("documents.sectionsLabel","Documents sections"),children:[e.jsxs("button",{className:`btn documents-tab${i==="artifacts"?" active":""}`,role:"tab","aria-selected":i==="artifacts","aria-label":t("documents.showArtifacts","Show artifacts"),onClick:()=>ye("artifacts"),children:[t("documents.artifactsTab","Artifacts"),e.jsx("span",{className:"documents-tab-count",children:R.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="project"?" active":""}`,role:"tab","aria-selected":i==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>ye("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:W.length})]}),e.jsxs("button",{className:`btn documents-tab${i==="tasks"?" active":""}`,role:"tab","aria-selected":i==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>ye("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:X.length})]})]}),i==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>D(s=>!s),"aria-pressed":p,"aria-label":p?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:p?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[p?e.jsx(Wt,{size:14}):e.jsx(Gt,{size:14}),p?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(Kt,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:Ie,value:k,onChange:kt,"aria-label":Ie}),k&&e.jsx("button",{className:"documents-search-clear",onClick:pt,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(Xt,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:$e?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:i==="project"?t("documents.projectFiles","project files"):i==="tasks"?t("documents.taskDocuments","task documents"):t("documents.artifacts","artifacts"),error:$e})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void Dt(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(Yt,{size:16}),t("documents.retry","Retry")]})]}):i==="project"?ut&&W.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingProjectFiles","Loading project markdown files…")})})}):Ce.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!u)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":t("documents.projectMarkdownFilesLabel","Project markdown files"),children:e.jsx("ul",{className:"markdown-file-list",children:Ce.map(s=>{const c=u?.path===s.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${c?" markdown-file-item--selected":""}`,onClick:()=>void xt(s),"aria-label":`Open ${s.path}`,"aria-current":c?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:s.name}),e.jsx("span",{className:"markdown-file-item-path",children:s.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[us(s.size)," · ",oe(s.mtime)]})]})},s.path)})})}),(!w||u)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.projectFilePreviewLabel","Project file content preview"),children:[w&&u&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:bt,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(Qe,{size:14}),t("documents.backToFiles","Back to files")]}),u?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:u.path}),e.jsx("div",{className:"documents-task-document-actions",children:be?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:vt,disabled:we,children:t("documents.cancelEdit","Cancel")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void gt(),disabled:we,children:we?t("documents.saving","Saving…"):t("documents.saveProjectFile","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>Le(s=>!s),"aria-label":K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":K,title:K?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:K?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:wt,disabled:J||Z!==null||S===null,"aria-label":t("documents.editProjectFile","Edit project file"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),J?e.jsx("p",{className:"documents-content-state",children:e.jsx(ke,{label:t("documents.loadingFileContent","Loading file content…")})}):Z?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:Z}):be?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.projectFileContentEditor","Project file content editor"),children:e.jsx(Ge,{content:ue,onChange:B,filePath:u.path,forceToolbarActionsVisible:!0})}):K?e.jsx("div",{ref:_,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:S??""})})}):e.jsx("pre",{ref:G,className:"document-card-content-text documents-content-viewer-text",children:S??""}),Et]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):i==="artifacts"?ht&&R.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingArtifacts","Loading artifacts…")})}):R.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchArtifacts",'No artifacts match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noArtifacts","No artifacts yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.artifactsCreatedBy","Agents register screenshots, wireframes, mockups, recordings, and documents here as they work on tasks.")})]})}):e.jsx(Jt,{artifacts:R,projectId:a,isMobile:w,addToast:r,onOpenTask:ze,onArtifactUpdated:()=>void Se()}):lt&&se.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:e.jsx(ke,{label:t("documents.loadingTaskDocuments","Loading task documents…")})})}):X.length===0?e.jsx("div",{className:"documents-view-empty",children:k.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:k.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(ce,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsxs("div",{className:`documents-project-layout documents-task-documents-layout${w?" documents-project-layout--mobile":""}`,children:[(!w||!he)&&e.jsx("aside",{className:"documents-view-sidebar documents-task-documents-sidebar","aria-label":t("documents.taskDocumentsListLabel","Task documents"),children:X.map(({taskId:s,taskTitle:c,taskColumn:o,documents:j,artifacts:z})=>{const q=o?d(o):null,Pe=o?ms(o):"status-dot";return e.jsxs("section",{className:"documents-task-sidebar-group","aria-labelledby":`documents-task-group-${s}`,children:[e.jsxs("div",{className:"documents-task-sidebar-group-header",children:[e.jsxs("div",{className:"documents-task-sidebar-title-wrap",children:[e.jsxs("h3",{id:`documents-task-group-${s}`,className:"documents-task-sidebar-title",children:[e.jsx("span",{className:"documents-group-task-id",children:s}),e.jsx("span",{className:"documents-group-task-title",children:c||t("documents.untitled","Untitled")})]}),q?e.jsxs("span",{className:"documents-group-status badge","aria-label":t("documents.taskStatusAria","Task status: {{status}}",{status:q}),children:[e.jsx("span",{className:Pe,"aria-hidden":"true"}),e.jsx("span",{children:q})]}):null]}),e.jsxs("div",{className:"documents-task-sidebar-actions",children:[e.jsx("span",{className:"documents-group-count",children:t("documents.taskOutputCount","{{docCount}} doc{{docPlural}} · {{artifactCount}} artifact{{artifactPlural}}",{docCount:j.length,docPlural:j.length!==1?"s":"",artifactCount:z.length,artifactPlural:z.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>void jt(s),"aria-label":t("documents.openTaskAria","Open task {{taskId}}: {{title}}",{taskId:s,title:c||t("documents.untitled","Untitled")}),children:t("documents.openTask","Open task")})]})]}),e.jsxs("ul",{className:"markdown-file-list documents-task-document-list",children:[j.map(h=>{const v=l?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item${v?" markdown-file-item--selected":""}`,onClick:()=>Nt(h.id),"aria-label":t("documents.openTaskDocument","Open {{taskId}} {{key}}",{taskId:h.taskId,key:h.key}),"aria-current":v?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:h.key}),e.jsxs("span",{className:"markdown-file-item-path",children:[h.taskId," · ",h.taskTitle||t("documents.untitled","Untitled")]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[t("documents.revisionShort","v{{revision}}",{revision:h.revision})," · ",h.author," · ",oe(h.updatedAt)]})]})},`document-${h.id}`)}),z.length>0?e.jsxs("li",{className:"documents-task-artifacts-subsection","aria-label":t("documents.taskArtifactsSubsection","Task artifacts"),children:[e.jsx("div",{className:"documents-task-artifacts-label",children:t("documents.taskArtifactsLabel","Artifacts")}),e.jsx("ul",{className:"markdown-file-list documents-task-artifact-list",children:z.map(h=>{const v=Ae(h),ae=ds[v],Mt=Ye(t,v),Be=H?.id===h.id;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item documents-task-document-item documents-task-artifact-item${Be?" markdown-file-item--selected":""}`,onClick:()=>St(h.id),"aria-label":t("documents.openTaskArtifact","Open {{taskId}} artifact {{title}}",{taskId:s,title:h.title||t("documents.untitledArtifact","Untitled artifact")}),"aria-current":Be?"true":void 0,children:[e.jsxs("span",{className:"documents-task-artifact-title-row",children:[e.jsx(ae,{size:14,"aria-hidden":"true"}),e.jsx("span",{className:"markdown-file-item-name",children:h.title||t("documents.untitledArtifact","Untitled artifact")})]}),e.jsxs("span",{className:"markdown-file-item-path",children:[Mt," · ",h.mimeType||h.type]}),e.jsxs("span",{className:"markdown-file-item-meta",children:[h.authorId||t("documents.unknownAuthor","unknown")," · ",oe(h.updatedAt)]})]})},`artifact-${h.id}`)})})]}):null]})]},s)})}),(!w||he)&&e.jsxs("section",{className:"documents-view-main","aria-label":t("documents.taskDocumentPreviewLabel","Task document content preview"),children:[w&&he&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:Ct,"aria-label":t("documents.backToTaskDocumentsList","Back to task documents list"),children:[e.jsx(Qe,{size:14}),t("documents.backToTaskDocuments","Back to documents")]}),he?H?e.jsx(ks,{artifact:H,projectId:a,content:et,loading:tt,error:st,renderMarkdown:nt,onToggleMarkdown:()=>xe(s=>!s),onOpenTask:ze,t}):l?e.jsxs("div",{className:"documents-content-viewer documents-task-document-viewer",children:[e.jsxs("div",{className:"documents-content-header documents-task-document-header",children:[e.jsxs("p",{className:"documents-file-path-header",children:[l.taskId," / ",l.key]}),e.jsx("div",{className:"documents-task-document-actions",children:Fe?e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm",onClick:Ft,disabled:de,children:t("documents.cancelEdit","Cancel")}),V&&e.jsx("button",{className:"btn btn-sm",onClick:Pt,disabled:de,children:t("documents.rebaseTaskDocument","Rebase draft")}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void At(),disabled:de||V!==null,children:de?t("documents.saving","Saving…"):t("documents.saveTaskDocument","Save")})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>yt(l.id),"aria-label":Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":Y,title:Y?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:Y?t("documents.markdown","Markdown"):t("documents.plain","Plain")}),e.jsxs("button",{className:"btn btn-sm",onClick:Tt,"aria-label":t("documents.editTaskDocument","Edit task document"),children:[e.jsx(We,{size:14,"aria-hidden":"true"}),t("documents.edit","Edit")]})]})})]}),e.jsxs("div",{className:"document-card-meta documents-task-document-meta",children:[e.jsx("span",{className:"document-card-author",children:l.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{children:t("documents.revisionShort","v{{revision}}",{revision:l.revision})}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:oe(l.updatedAt)})]}),Fe?e.jsx("div",{className:"documents-task-document-editor","aria-label":t("documents.taskDocumentContentEditor","Task document content editor"),children:e.jsx(Ge,{content:pe,onChange:T,filePath:l.key.includes(".")?l.key:`${l.key}.md`,forceToolbarActionsVisible:!0})}):Y?e.jsx("div",{ref:ie,className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(De,{remarkPlugins:[Ee],children:l.content})})}):e.jsx("pre",{ref:ee,className:"document-card-content-text documents-content-viewer-text",children:l.content}),Lt]}):null:e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectTaskDocument","Select a task document or artifact to view its content.")})})]})]})})]})}export{gs as DocumentsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{
|
|
1
|
+
import{r as l,j as e}from"./vendor-react-SZ_qB27O.js";import{ao as L,ap as P,aq as $,aS as G,aT as Q,au as O,aU as J,aV as Z,V as H,T as B,Y as ee,R as se,aI as ae,s as te,l as le,aQ as re}from"./index-CE7C_XsS.js";import{u as ne}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const ie=300,ce=15e3;function K(r){if(!r.trim())return;const a=Number(r);return Number.isFinite(a)?a:void 0}function k(...r){for(const a of r)if(Array.isArray(a))return a;return[]}function p(r){return typeof r=="object"&&r!==null?r:{}}function X(r){const a=p(r),m=p(a.taskSnapshot);return{id:String(a.id??a.evalId??""),runId:String(a.runId??a.batchId??""),taskId:String(a.taskId??m.taskId??""),taskTitle:String(m.title??a.taskTitle??a.title??"Untitled task"),createdAt:String(a.createdAt??a.timestamp??a.updatedAt??new Date(0).toISOString()),overallScore:typeof a.overallScore=="number"?a.overallScore:null,maxScore:typeof a.maxScore=="number"?a.maxScore:null,categoryScores:k(a.categoryScores,p(a.scores).categories)}}function oe(r){const a=p(r);return{...X(a),rationale:String(a.rationale??a.summary??""),evidence:k(a.evidence,p(a.details).evidence),followUps:k(a.followUps,p(a.recommendations).followUps)}}function de(r){const a=r?.projectId,m=a??"",t=`${$.EVALS_RUNS_PREFIX}${m}`,h=`${$.EVALS_RESULTS_PREFIX}${m}`,f=L(t,{maxAgeMs:P}),v=L(h,{maxAgeMs:P}),S=l.useRef(Array.isArray(f)&&f.length>0||Array.isArray(v)&&v.length>0),[o,g]=l.useState({q:"",runId:"",scoreMin:"",scoreMax:""}),[b,w]=l.useState(()=>Array.isArray(f)?f:[]),[d,M]=l.useState(()=>Array.isArray(v)?v:[]),[u,R]=l.useState(null),[F,A]=l.useState(null),[s,c]=l.useState(0),[y,j]=l.useState(!S.current),[W,q]=l.useState(null),C=l.useRef(0),z=l.useRef(a),T=l.useRef(u);T.current=u;const I=l.useCallback(async()=>{const n=++C.current;S.current||j(!0),q(null);try{const[i,x]=await Promise.all([G({q:o.q||void 0,runId:o.runId||void 0,scoreMin:K(o.scoreMin),scoreMax:K(o.scoreMax),limit:100,offset:0},a),Q(a)]);if(n!==C.current)return;const E=k(i.results,i.evals,i.items).map(X);M(E),O(h,E.length>500?E.slice(0,500):E,{maxBytes:5e5}),c(typeof i.count=="number"?i.count:E.length);const V=k(x.runs,x.items).map(U=>{const N=p(U),D=p(N.counts);return{id:String(N.id??""),createdAt:String(N.createdAt??""),completedAt:typeof N.completedAt=="string"?N.completedAt:void 0,status:String(N.status??"pending"),evaluatedTaskCount:typeof D.totalTasks=="number"?D.totalTasks:0}});w(V),O(t,V,{maxBytes:5e5}),S.current=!0,T.current&&!E.some(U=>U.id===T.current)&&(R(null),A(null))}catch(i){if(n!==C.current)return;q(i instanceof Error?i.message:"Failed to load evals")}finally{n===C.current&&j(!1)}},[o.q,o.runId,o.scoreMax,o.scoreMin,a,h,t]),_=l.useCallback(async n=>{const i=await J(n,a),x=i.result??i;A(oe(x))},[a]);l.useEffect(()=>{if(z.current===a)return;z.current=a;const n=L(t,{maxAgeMs:P}),i=L(h,{maxAgeMs:P}),x=Array.isArray(n)&&n.length>0||Array.isArray(i)&&i.length>0;w(Array.isArray(n)?n:[]),M(Array.isArray(i)?i:[]),j(!x),S.current=x},[a,h,t]),l.useEffect(()=>{const n=window.setTimeout(()=>{I()},ie);return()=>window.clearTimeout(n)},[I]),l.useEffect(()=>{if(!u){A(null);return}_(u)},[_,u]),l.useEffect(()=>{const n=window.setInterval(()=>{I(),u&&_(u)},ce);return()=>window.clearInterval(n)},[_,I,u]);const Y=l.useCallback(n=>{T.current=n,R(n)},[]);return{loading:y,error:W,results:d,count:s,runs:b,filters:o,setFilters:g,refresh:I,selectedEvalId:u,setSelectedEvalId:Y,selectedEval:F}}function ge({projectId:r,onOpenSettings:a,onOpenTaskDetail:m}){const{t}=ne("app"),{loading:h,error:f,results:v,runs:S,filters:o,setFilters:g,selectedEvalId:b,setSelectedEvalId:w,selectedEval:d,refresh:M}=de({projectId:r}),[u,R]=l.useState(!0);l.useEffect(()=>{let s=!1;return Z(r).then(c=>{if(s)return;const y=c.evalSettings?.enabled;R(y??!1)}).catch(()=>{s||R(!1)}),()=>{s=!0}},[r]);const F=v.length>0,A=l.useMemo(()=>v.find(s=>s.id===b)??null,[v,b]);return u?e.jsxs("section",{className:"evals-view","data-testid":"evals-view",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__body",children:[e.jsxs("div",{className:"evals-list card",children:[e.jsxs("div",{className:"evals-toolbar",children:[e.jsx("input",{className:"input",placeholder:t("evals.searchPlaceholder","Search task or rationale"),value:o.q,onChange:s=>g(c=>({...c,q:s.target.value}))}),e.jsxs("select",{className:"select",value:o.runId,onChange:s=>g(c=>({...c,runId:s.target.value})),children:[e.jsx("option",{value:"",children:t("evals.allRuns","All runs")}),S.map(s=>e.jsx("option",{value:s.id,children:s.id},s.id))]}),e.jsx("input",{className:"input",placeholder:t("evals.minScorePlaceholder","Min score"),value:o.scoreMin,onChange:s=>g(c=>({...c,scoreMin:s.target.value}))}),e.jsx("input",{className:"input",placeholder:t("evals.maxScorePlaceholder","Max score"),value:o.scoreMax,onChange:s=>g(c=>({...c,scoreMax:s.target.value}))}),e.jsx("button",{className:"btn btn-icon",type:"button",onClick:()=>void M(),"aria-label":t("evals.refreshAria","Refresh evals"),children:e.jsx(se,{size:16})})]}),h&&e.jsx("p",{className:"evals-state","data-testid":"evals-loading",children:e.jsx(ae,{label:t("evals.loading","Loading evals…")})}),f&&e.jsx("p",{className:"evals-state evals-state--error",children:f}),!h&&!f&&!F&&e.jsx("p",{className:"evals-state",children:t("evals.empty","No evals yet. Scheduled evals review tasks completed since the last run.")}),e.jsx("ul",{className:"evals-results","data-testid":"evals-results",children:v.map(s=>e.jsx("li",{children:e.jsxs("button",{className:`evals-result ${s.id===b?"evals-result--active":""}`,type:"button",onClick:()=>w(s.id),draggable:le(),onDragStart:c=>{te(c.dataTransfer,{kind:"eval-result",id:s.id,projectId:r})},children:[e.jsx("span",{className:"evals-result-title",children:s.taskTitle}),e.jsxs("span",{className:"evals-result-meta",children:[s.taskId," · ",s.runId," · ",s.overallScore??t("evals.naPlaceholder","n/a")]})]})},s.id))})]}),e.jsxs("div",{className:"evals-detail card","data-testid":"evals-detail",children:[!d&&e.jsx("p",{className:"evals-state",children:t("evals.selectPrompt","Select an evaluation to inspect scores, rationale, and evidence.")}),d&&e.jsxs(e.Fragment,{children:[e.jsx("h3",{className:"evals-detail-title",children:A?.taskTitle??d.taskTitle}),e.jsxs("p",{className:"evals-result-meta",children:[d.taskId," · ",d.runId]}),e.jsx("p",{className:"evals-score",children:t("evals.overallScore","Overall score: {{score}}",{score:d.overallScore??t("evals.naPlaceholder","n/a")})}),e.jsx("ul",{className:"evals-categories",children:d.categoryScores.map(s=>e.jsxs("li",{children:[s.category,": ",s.finalScore]},s.category))}),e.jsx("p",{className:"evals-rationale",children:d.rationale||t("evals.noRationale","No rationale recorded.")}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.evidenceHeading","Evidence")}),e.jsx("ul",{className:"evals-links",children:d.evidence.map((s,c)=>{const y=typeof s.metadata?.taskId=="string"?s.metadata.taskId:void 0,j=typeof s.metadata?.url=="string"?s.metadata.url:void 0;return e.jsx("li",{children:y?e.jsx("button",{type:"button",className:"btn",onClick:()=>m?.(y),children:s.ref}):j?e.jsxs("a",{href:j,target:"_blank",rel:"noreferrer",className:"evals-external-link",children:[s.ref,e.jsx(re,{size:14})]}):e.jsx("span",{children:s.ref})},`${s.ref}-${c}`)})})]}),e.jsxs("div",{children:[e.jsx("h4",{children:t("evals.suggestedFollowupsHeading","Suggested follow-up tasks")}),e.jsxs("ul",{className:"evals-follow-ups",children:[d.followUps.length===0&&e.jsx("li",{children:t("evals.noFollowups","None")}),d.followUps.map(s=>e.jsxs("li",{children:[e.jsx("strong",{children:s.title}),e.jsx("p",{children:s.rationale})]},s.suggestionId))]})]})]})]})]})]}):e.jsxs("section",{className:"evals-view","data-testid":"evals-disabled",children:[e.jsx(H,{icon:B,title:t("evals.title","Evals")}),e.jsxs("div",{className:"evals-view__empty",children:[e.jsx("h2",{className:"evals-title",children:t("evals.disabledTitle","Scheduled evals are disabled")}),e.jsx("p",{className:"evals-empty-copy",children:t("evals.enablePrompt","Enable Scheduled Evals to review scored tasks, evidence, and follow-up recommendations.")}),e.jsxs("button",{className:"btn btn-primary",type:"button",onClick:()=>a?.("scheduled-evals"),children:[e.jsx(ee,{size:16}),t("evals.openSettings","Open Scheduled Evals Settings")]})]})]})}export{ge as EvalsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s,j as n}from"./vendor-react-SZ_qB27O.js";import{
|
|
1
|
+
import{r as s,j as n}from"./vendor-react-SZ_qB27O.js";import{B as $,D as G,F as V,G as W,H as B,I as U}from"./index-CE7C_XsS.js";import{u as z}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";function en({isOpen:l,onClose:R,onUseDraft:M,projectId:x,existingAgents:P,mode:_="create",existingAgentConfig:L}){const{t:e}=z("app"),[m,d]=s.useState("initial"),[f,S]=s.useState(""),[c,k]=s.useState(null),[C,I]=s.useState(""),[w,A]=s.useState("answer"),[v,p]=s.useState(""),[t,H]=s.useState(null),[T,g]=s.useState(null),[E,y]=s.useState([]),b=_==="edit",o=s.useRef(l),N=s.useCallback(()=>{d("initial"),S(""),k(null),I(""),A("answer"),p(""),H(null),g(null),y([])},[]),D=s.useMemo(()=>$.map(a=>({id:a.id,label:a.name,description:a.description})),[]);s.useEffect(()=>{if(o.current=l,!c)return;const a=G(c,x,{onThinking:i=>{o.current&&y(F=>{const h=[...F],j=h[h.length-1];return j&&!j.question?(h[h.length-1]={...j,thinkingOutput:`${j.thinkingOutput??""}${i}`},h):[...h,{response:{},thinkingOutput:i}]})},onQuestion:i=>{o.current&&(I(i.question),A(i.id),d("question"))},onSummary:i=>{o.current&&(H(i),d("summary"))},onError:i=>{o.current&&(g(i),d("error"))}});return()=>{o.current=!1,a.close()}},[l,c,x]);const u=async()=>{o.current=!1;try{c&&await W(c,x)}catch{}finally{N(),R()}};if(s.useEffect(()=>{o.current=l,l||N()},[l,N]),!l)return null;const r=a=>a==null||a===""?n.jsx("em",{className:"experimental-agent-onboarding-modal__summary-empty",children:e("agents.onboarding.notSet","Not set")}):n.jsx("span",{children:a}),q=async()=>{d("loading"),g(null);try{const a=await B(f,{mode:_,existingAgentConfig:L,existingAgents:P.map(i=>({id:i.id,name:i.name,role:i.role})),templates:D},x);if(!o.current)return;k(a.sessionId)}catch(a){if(!o.current)return;g(a.message),d("error")}},Q=async()=>{if(c){d("loading"),g(null);try{const a={[w]:v};if(y(i=>[...i,{question:{id:w,type:"text",question:C},response:a}]),await U(c,a,x),!o.current)return;p("")}catch(a){if(!o.current)return;g(a.message),d("error")}}},O=async()=>{t&&(M(t),await u())};return n.jsx("div",{className:"modal-overlay open",role:"presentation",children:n.jsxs("div",{className:"modal modal-lg experimental-agent-onboarding-modal",role:"dialog","aria-modal":"true","aria-label":e("agents.onboarding.dialogLabel","AI Interview"),children:[n.jsxs("div",{className:"modal-header",children:[n.jsx("h3",{children:e("agents.onboarding.title","AI Interview")}),n.jsx("button",{className:"modal-close",onClick:()=>void u(),"aria-label":e("common.closeAriaLabel","Close"),children:"×"})]}),E.length>0&&n.jsx(V,{entries:E}),m==="initial"&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-intent",children:b?e("agents.onboarding.intentLabelEdit","What should this agent change or improve?"):e("agents.onboarding.intentLabelCreate","What should this new agent own?")}),n.jsx("textarea",{id:"agent-onboarding-intent",className:"input experimental-agent-onboarding-modal__textarea",value:f,onChange:a=>S(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:!f.trim(),onClick:()=>void q(),children:b?e("agents.onboarding.startInterview","Start interview"):e("agents.onboarding.startOnboarding","Start onboarding")})]})]}),(m==="loading"||m==="question")&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{htmlFor:"agent-onboarding-answer",children:C||e("agents.onboarding.thinking","Thinking...")}),n.jsx("textarea",{id:"agent-onboarding-answer",className:"input experimental-agent-onboarding-modal__textarea",value:v,onChange:a=>p(a.target.value)}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",disabled:m==="loading"||!v.trim(),onClick:()=>void Q(),children:e("agents.onboarding.continue","Continue")})]})]}),m==="summary"&&t&&n.jsxs("div",{className:"form-group",children:[n.jsx("label",{children:b?e("agents.onboarding.updatedDraftReady","Updated draft ready for review"):e("agents.onboarding.draftReady","Draft ready for review")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-intro",children:e("agents.onboarding.draftIntro","Review this generated draft. Nothing is applied until you confirm.")}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary card",children:[n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionIdentity","Identity")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldName","Name")}),n.jsx("dd",{children:r(t.name)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRole","Role")}),n.jsx("dd",{children:r(t.role)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTitle","Title")}),n.jsx("dd",{children:r(t.title)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldIcon","Icon")}),n.jsx("dd",{children:r(t.icon)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldReportsTo","Reports To")}),n.jsx("dd",{children:r(t.reportsTo)})]})]})]}),n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionConfiguration","Configuration")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldInlineInstructions","Inline Instructions")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.instructionsText)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSoul","Soul")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.soul)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldAgentMemory","Agent Memory")}),n.jsx("dd",{className:"experimental-agent-onboarding-modal__summary-block",children:r(t.memory)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldSkills","Skills")}),n.jsx("dd",{children:r(t.skills?.join(", "))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldThinkingLevel","Thinking Level")}),n.jsx("dd",{children:r(t.thinkingLevel)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldMaxTurns","Max Turns")}),n.jsx("dd",{children:r(t.maxTurns)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldTemplate","Template")}),n.jsx("dd",{children:r(t.templateId)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldPatternAgent","Pattern Agent")}),n.jsx("dd",{children:r(t.patternAgentId)})]})]})]}),(t.heartbeatProcedurePath||t.heartbeatIntervalMs||t.heartbeatEnabled!==void 0||t.modelHint||t.runtimeHint)&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRuntimeHints","Runtime Hints")}),n.jsxs("dl",{className:"experimental-agent-onboarding-modal__summary-list",children:[n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatPath","Heartbeat Procedure Path")}),n.jsx("dd",{children:r(t.heartbeatProcedurePath)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatInterval","Heartbeat Interval")}),n.jsx("dd",{children:r(t.heartbeatIntervalMs?`${t.heartbeatIntervalMs}ms`:void 0)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldHeartbeatEnabled","Heartbeat Enabled")}),n.jsx("dd",{children:r(t.heartbeatEnabled===void 0?void 0:t.heartbeatEnabled?e("agents.onboarding.yes","yes"):e("agents.onboarding.no","no"))})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldModelHint","Model Hint")}),n.jsx("dd",{children:r(t.modelHint)})]}),n.jsxs("div",{children:[n.jsx("dt",{children:e("agents.onboarding.fieldRuntimeHint","Runtime Hint")}),n.jsx("dd",{children:r(t.runtimeHint)})]})]})]}),t.rationale&&n.jsxs("div",{className:"experimental-agent-onboarding-modal__summary-section",children:[n.jsx("h4",{children:e("agents.onboarding.sectionRationale","Rationale")}),n.jsx("p",{className:"experimental-agent-onboarding-modal__summary-block",children:t.rationale})]})]}),n.jsxs("div",{className:"modal-actions",children:[n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.cancel","Cancel")}),n.jsx("button",{className:"btn btn-primary",onClick:()=>void O(),children:b?e("agents.onboarding.applyDraftSettings","Apply draft to settings form"):e("agents.onboarding.applyDraftAgent","Apply draft to agent form")})]})]}),m==="error"&&T&&n.jsxs("div",{className:"form-group",children:[n.jsx("div",{className:"form-error",children:T}),n.jsx("div",{className:"modal-actions",children:n.jsx("button",{className:"btn",onClick:()=>void u(),children:e("common.close","Close")})})]})]})})}export{en as ExperimentalAgentOnboardingModal};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as n,j as t}from"./vendor-react-SZ_qB27O.js";import{V as js,T as ws,P as Ns,S as Es,
|
|
1
|
+
import{r as n,j as t}from"./vendor-react-SZ_qB27O.js";import{V as js,T as ws,P as Ns,S as Es,j as Ss,r as $s,k as Ms,X as Cs,s as Ts,l as As,m as Gs,n as Ls}from"./index-CE7C_XsS.js";import{u as Ds}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const Ps=5,Fs=3,Rs=280;function h(d,m){if(!m)return d;const r=d.includes("?")?"&":"?";return`${d}${r}projectId=${encodeURIComponent(m)}`}function is(d){return!!(d&&typeof d=="object"&&"code"in d&&d.code==="ACTIVE_GOAL_LIMIT_EXCEEDED")}function Hs({initialGoals:d,anchorGoalId:m,projectId:r,onNavigateToMission:as}){const{t:a}=Ds("app"),[c,k]=n.useState(()=>d??[]),[ns,j]=n.useState(null),p=n.useRef(null),[w,L]=n.useState(d===void 0),[D,l]=n.useState(null),[os,P]=n.useState(!1),[v,F]=n.useState(""),[R,N]=n.useState(""),[U,u]=n.useState(null),[O,_]=n.useState(!1),[y,E]=n.useState(!1),[S,V]=n.useState(null),[q,$]=n.useState(""),[B,M]=n.useState(""),[H,f]=n.useState(null),[I,z]=n.useState(!1),[ls,rs]=n.useState(()=>new Set),[ds,cs]=n.useState([]),[x,C]=n.useState({}),[T,W]=n.useState({}),[A,K]=n.useState(null),[us,X]=n.useState(null);n.useEffect(()=>{if(d!==void 0)return;let s=!0;return(async()=>{try{L(!0),l(null);const i=await fetch(h("/api/goals",r));if(!i.ok)throw new Error(`Failed to load goals (${i.status})`);const o=await i.json();if(!s)return;k(Array.isArray(o.goals)?o.goals:[])}catch{if(!s)return;l(a("goals.loadError","Unable to load goals right now. Please try again."))}finally{s&&L(!1)}})(),()=>{s=!1}},[d,r]),n.useEffect(()=>{let s=!0;return(async()=>{try{const i=await fetch(h("/api/missions",r));if(!i.ok)throw new Error(`Failed to load missions (${i.status})`);const o=await i.json(),g=Array.isArray(o)?o:Array.isArray(o.missions)?o.missions:[];s&&cs(g.map(b=>({id:b.id,title:b.title,status:b.status})))}catch{s&&l(a("goals.missionsLoadError","Unable to load missions right now. Please try again."))}})(),()=>{s=!1}},[r,a]);const J=async s=>{const e=await fetch(h(`/api/goals/${encodeURIComponent(s)}/missions`,r));if(!e.ok)throw new Error(`Failed to load linked missions (${e.status})`);const i=await e.json();return Array.isArray(i.missions)?i.missions:[]};n.useEffect(()=>{let s=!0;return(async()=>{if(c.length===0){C({});return}try{const i=await Promise.all(c.map(async o=>[o.id,await J(o.id)]));s&&C(Object.fromEntries(i))}catch{s&&l(a("goals.linkedMissionsLoadError","Unable to load linked missions right now. Please try again."))}})(),()=>{s=!1}},[c,a]);const G=n.useMemo(()=>c.filter(s=>s.status==="active").length,[c]),gs=G>=Fs&&G<=Ps;n.useEffect(()=>{if(!m){j(null);return}const s=document.getElementById(`goal-card-${m}`);if(s)return j(m),typeof s.scrollIntoView=="function"&&s.scrollIntoView({behavior:"smooth",block:"center"}),p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{j(e=>e===m?null:e),p.current=null},1600),()=>{p.current&&(clearTimeout(p.current),p.current=null)}},[m,c]);function ms(){l(null),u(null),P(!0)}function hs(s){V(s.id),$(s.title),M(s.description??""),f(null)}function Q(){V(null),$(""),M(""),f(null)}function Y(){P(!1),F(""),N(""),u(null),E(!1)}async function ps(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{E(!0),u(null);const e=await Gs(s,r);N(e)}catch(e){u(Ls(e))}finally{E(!1)}}async function fs(){const s=v.trim();if(!s){u(a("goals.titleRequired","Title is required."));return}try{_(!0),u(null),l(null);const e=await fetch(h("/api/goals",r),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:R})});if(e.ok){const o=await e.json();k(g=>[...g,o]),Y();return}let i=null;try{i=await e.json()}catch{i=null}if(e.status===409&&is(i)){l(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}u(a("goals.createError","Unable to create goal right now. Please try again."))}catch{u(a("goals.createError","Unable to create goal right now. Please try again."))}finally{_(!1)}}async function bs(){if(!S)return;const s=q.trim();if(!s){f(a("goals.titleRequired","Title is required."));return}try{z(!0),f(null);const e=await fetch(h(`/api/goals/${S}`,r),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({title:s,description:B})});if(!e.ok)throw new Error(`Failed to update goal (${e.status})`);const i=await e.json();k(o=>o.map(g=>g.id===i.id?i:g)),Q()}catch{f(a("goals.saveError","Unable to save goal right now. Please try again."))}finally{z(!1)}}function ks(s){return s.length>Rs||s.includes(`
|
|
2
2
|
`)}function vs(s){rs(e=>{const i=new Set(e);return i.has(s)?i.delete(s):i.add(s),i})}function Z(s){const e=new Set((x[s]??[]).map(i=>i.id));return ds.filter(i=>!e.has(i.id))}async function ss(s){const e=await J(s);C(i=>({...i,[s]:e})),W(i=>({...i,[s]:""}))}async function ys(s){const e=T[s];if(e)try{K(s),l(null);const i=await fetch(h(`/api/missions/${encodeURIComponent(e)}/goals/${encodeURIComponent(s)}`,r),{method:"POST"});if(!i.ok)throw new Error(`Failed to link mission (${i.status})`);await ss(s)}catch{l(a("goals.linkMissionError","Unable to link mission right now. Please try again."))}finally{K(null)}}async function xs(s,e){try{X(`${s}:${e}`),l(null);const i=await fetch(h(`/api/missions/${encodeURIComponent(e)}/goals/${encodeURIComponent(s)}`,r),{method:"DELETE"});if(!i.ok)throw new Error(`Failed to unlink mission (${i.status})`);await ss(s)}catch{l(a("goals.unlinkMissionError","Unable to unlink mission right now. Please try again."))}finally{X(null)}}async function ts(s){const e=s.status==="active"?`/api/goals/${s.id}/archive`:`/api/goals/${s.id}/unarchive`;try{l(null);const i=await fetch(h(e,r),{method:"POST"});if(i.ok){const g=await i.json();k(b=>b.map(es=>es.id===g.id?g:es));return}let o=null;try{o=await i.json()}catch{o=null}if(i.status===409&&is(o)){l(a("goals.capError","Cannot activate more than 5 goals. Resolve an active goal before activating another."));return}l(a("goals.updateError","Unable to update goal status right now. Please try again."))}catch{l(a("goals.updateError","Unable to update goal status right now. Please try again."))}}return t.jsxs("section",{className:"goals-view","data-testid":"goals-view",children:[t.jsx(js,{icon:ws,title:a("goals.title","Goals"),actions:t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"goals-count","data-testid":"goals-active-count",children:a("goals.activeCount","{{count}} active goals",{count:G})}),t.jsxs("button",{type:"button",className:"btn btn-primary goals-add-button",onClick:ms,"data-testid":"goals-add-button",children:[t.jsx(Ns,{size:18,"aria-hidden":"true"}),a("goals.addGoal","Add Goal")]})]})}),t.jsxs("div",{className:"goals-view__content",children:[os?t.jsxs("div",{className:"card goals-form","data-testid":"goals-form",children:[t.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-title",children:a("goals.labelTitle","Title")}),t.jsx("input",{id:"goals-form-title",className:"input",type:"text",value:v,maxLength:200,onChange:s=>F(s.target.value),"data-testid":"goals-form-title"}),t.jsxs("div",{className:"goals-form-label-row",children:[t.jsx("label",{className:"goals-form-label",htmlFor:"goals-form-description",children:a("goals.labelDescription","Description")}),t.jsxs("button",{type:"button",className:"btn goals-form-draft-button",onClick:()=>void ps(),disabled:!v.trim()||y,"data-testid":"goals-form-draft-ai",children:[t.jsx(Es,{"aria-hidden":"true"}),y?a("goals.drafting","Drafting…"):a("goals.draftWithAi","Draft with AI")]})]}),t.jsx("textarea",{id:"goals-form-description",className:"input",value:R,maxLength:5e3,onChange:s=>N(s.target.value),"data-testid":"goals-form-description"}),U?t.jsx("p",{className:"form-error goals-error",role:"alert",children:U}):null,t.jsxs("div",{className:"goals-form-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void fs(),disabled:O||y,"data-testid":"goals-form-submit",children:a("actions.save","Save")}),t.jsx("button",{type:"button",className:"btn",onClick:Y,disabled:O||y,"data-testid":"goals-form-cancel",children:a("actions.cancel","Cancel")})]})]}):null,gs?t.jsx("p",{className:"goals-warning",role:"status",children:a("goals.capWarning","Approaching the 5-active goal cap. Keep active goals focused.")}):null,D?t.jsx("p",{className:"form-error goals-error",role:"alert","data-testid":"goals-error",children:D}):null,w?t.jsx("p",{className:"goals-loading",role:"status","data-testid":"goals-loading",children:a("goals.loading","Loading goals…")}):null,!w&&c.length===0?t.jsx("div",{className:"goals-empty card","data-testid":"goals-empty-state",children:a("goals.emptyState","No goals yet. Add one to begin tracking strategic outcomes.")}):null,!w&&c.length>0?t.jsx("div",{className:"goals-list","data-testid":"goals-list",children:c.map(s=>t.jsxs("article",{id:`goal-card-${s.id}`,className:`card goals-card ${s.status==="archived"?"goals-card-archived":""} ${ns===s.id?"goals-card--anchored":""}`.trim(),"data-testid":`goal-card-${s.id}`,draggable:As(),onDragStart:e=>{Ts(e.dataTransfer,{kind:"goal",id:s.id,projectId:r})},children:[S===s.id?t.jsxs("div",{className:"goals-card-main goals-card-edit",children:[t.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-title-${s.id}`,children:a("goals.labelTitle","Title")}),t.jsx("input",{id:`goal-edit-title-${s.id}`,className:"input",type:"text",value:q,maxLength:200,onChange:e=>$(e.target.value),"data-testid":`goal-edit-title-${s.id}`}),t.jsx("label",{className:"goals-form-label",htmlFor:`goal-edit-description-${s.id}`,children:a("goals.labelDescription","Description")}),t.jsx("textarea",{id:`goal-edit-description-${s.id}`,className:"input",value:B,maxLength:5e3,onChange:e=>M(e.target.value),"data-testid":`goal-edit-description-${s.id}`}),H?t.jsx("p",{className:"form-error goals-error",role:"alert",children:H}):null,t.jsxs("div",{className:"goals-card-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void bs(),disabled:I,"data-testid":`goal-edit-save-${s.id}`,children:a("actions.save","Save")}),t.jsx("button",{type:"button",className:"btn",onClick:Q,disabled:I,"data-testid":`goal-edit-cancel-${s.id}`,children:a("actions.cancel","Cancel")})]})]}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"goals-card-main",children:[t.jsx("h3",{className:"goals-card-title",children:s.title}),s.description?(()=>{const e=ks(s.description),i=ls.has(s.id);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:`markdown-body goals-card-description ${e&&!i?"goals-card-description-collapsed":""}`.trim(),children:t.jsx(Ss,{remarkPlugins:[$s],children:s.description})}),e?t.jsx("button",{type:"button",className:"btn goals-card-description-toggle","aria-expanded":i,"data-testid":`goal-description-toggle-${s.id}`,onClick:()=>vs(s.id),children:i?a("actions.showLess","Show less"):a("actions.showMore","Show more")}):null]})})():null,t.jsxs("p",{className:"goals-card-status",children:[a("goals.status","Status"),": ",s.status]})]}),t.jsxs("div",{className:"goals-card-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:()=>hs(s),"data-testid":`goal-edit-${s.id}`,children:a("actions.edit","Edit")}),s.status==="active"?t.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void ts(s),"data-testid":`goal-archive-${s.id}`,children:a("goals.archive","Archive")}):t.jsx("button",{type:"button",className:"btn goals-activate-button",onClick:()=>void ts(s),"data-testid":`goal-unarchive-${s.id}`,children:a("goals.unarchive","Unarchive")})]})]}),t.jsxs("section",{className:"goals-linked-missions","aria-label":a("goals.linkedMissions","Linked missions"),children:[t.jsxs("div",{className:"goals-linked-missions-header",children:[t.jsx("h4",{className:"goals-linked-missions-title",children:a("goals.linkedMissionsTitle","Linked Missions")}),t.jsx("span",{className:"goals-linked-missions-count",children:a("goals.linkedMissionsCount",{count:x[s.id]?.length??0,defaultValue_one:"{{count}} linked",defaultValue_other:"{{count}} linked"})})]}),t.jsxs("div",{className:"goals-linked-missions-controls",children:[t.jsxs("select",{className:"input goals-linked-missions-picker","data-testid":`goal-mission-picker-${s.id}`,value:T[s.id]??"",onChange:e=>W(i=>({...i,[s.id]:e.target.value})),"aria-label":a("goals.missionPicker","Mission to link"),disabled:A===s.id||Z(s.id).length===0,children:[t.jsx("option",{value:"",children:a("goals.selectMission","Select a mission")}),Z(s.id).map(e=>t.jsx("option",{value:e.id,children:e.title},e.id))]}),t.jsxs("button",{type:"button",className:"btn btn-primary goals-linked-missions-link-button","data-testid":`goal-mission-link-button-${s.id}`,disabled:!T[s.id]||A===s.id,onClick:()=>void ys(s.id),children:[t.jsx(Ms,{size:16,"aria-hidden":"true"}),A===s.id?a("goals.linkingMission","Linking…"):a("goals.linkMission","Link mission")]})]}),(x[s.id]?.length??0)>0?t.jsx("div",{className:"goals-linked-missions-list",children:(x[s.id]??[]).map(e=>t.jsxs("div",{className:"goals-linked-mission-chip","data-testid":`goal-linked-mission-chip-${e.id}`,children:[t.jsx("button",{type:"button",className:"btn goals-linked-mission-link",onClick:()=>as?.(e.id),children:e.title}),t.jsx("span",{className:"goals-linked-mission-status",children:e.status}),t.jsx("button",{type:"button",className:"btn-icon goals-linked-mission-unlink","data-testid":`goal-linked-mission-unlink-${e.id}`,"aria-label":a("goals.unlinkMission","Unlink mission"),disabled:us===`${s.id}:${e.id}`,onClick:()=>void xs(s.id,e.id),children:t.jsx(Cs,{size:16,"aria-hidden":"true"})})]},e.id))}):t.jsx("p",{className:"goals-linked-missions-empty",children:a("goals.noLinkedMissions","No linked missions.")})]})]},s.id))}):null]})]})}export{Hs as GoalsView};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{c as ze,
|
|
1
|
+
import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{c as ze,ao as ce,ap as we,aq as Ce,bx as je,by as Ye,au as Me,bz as Qe,bA as Je,bB as Ze,bC as es,bD as ss,bE as ts,bF as Ie,bG as is,bH as ns,bI as Ae,V as as,S as A,bJ as rs,X as Ne,bK as fe,R as N,Y as cs,bL as ls,am as _e,h as le,bM as Ee,bu as os,P as De,aQ as hs,a_ as Pe,bN as gs,s as ds,l as us}from"./index-CE7C_XsS.js";import{u as $e}from"./vendor-i18n-GF3RlKbq.js";import{U as Fe}from"./users-CGszBY2v.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -8,4 +8,4 @@ import{r as c,j as e}from"./vendor-react-SZ_qB27O.js";import{c as ze,an as ce,ao
|
|
|
8
8
|
*
|
|
9
9
|
* This source code is licensed under the ISC license.
|
|
10
10
|
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const vs=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],bs=ze("chart-line",vs),me=["architecture","quality","workflow","performance","reliability","security","ux","testability","documentation","dependency","features","competitive_analysis","research","trends","other"],Re={quality:"Quality",performance:"Performance",architecture:"Architecture",security:"Security",reliability:"Reliability",ux:"User Experience",testability:"Testability",documentation:"Documentation",dependency:"Dependencies",workflow:"Workflow",other:"Other",features:"Features",competitive_analysis:"Competitive Analysis",research:"Research",trends:"Trends"};function ys(g){const{t:d}=Ue("app"),$=g??"",k=`${Ce.INSIGHTS_PREFIX}${$}`,S=`${Ce.INSIGHT_LATEST_RUN_PREFIX}${$}`,s=ce(k,{maxAgeMs:we}),W=ce(S,{maxAgeMs:je}),E=c.useRef(Array.isArray(s)&&s.length>0),G=c.useCallback(a=>d(`insights.category.${a}`,Re[a]??a),[d]),[v,x]=c.useState(()=>Array.isArray(s)?s:[]),[T,Y]=c.useState(()=>me.map(a=>({category:a,label:Re[a]??a,items:[],isLoading:!1,error:null}))),[q,L]=c.useState(!(Array.isArray(s)&&s.length>0)),[J,H]=c.useState(null),[Q,z]=c.useState(W??null),[Z,B]=c.useState(!1),[ee,F]=c.useState(null),[se,_]=c.useState(new Map),[te,C]=c.useState(new Map),[u,w]=c.useState(new Map),[m,D]=c.useState(new Map),[O,j]=c.useState(!1),R=c.useCallback(async()=>{E.current||L(!0),H(null);try{const t=(await qe({status:void 0,limit:1e3},g)).insights.filter(l=>l.status!=="dismissed");x(t),Me(k,t.length>500?t.slice(0,500):t,{maxBytes:5e5});const r=await Je(g);r.runs.length>0&&(z(r.runs[0]),Me(S,r.runs[0],{maxBytes:5e5})),E.current=!0}catch(a){const t=a instanceof Error?a.message:"Failed to fetch insights";H(t)}finally{L(!1)}},[k,S,g]),y=c.useCallback(()=>{j(a=>!a)},[]),ie=c.useCallback(async(a,t,r)=>{B(!0),F(null);try{const l=await Qe("manual",void 0,g,a,t,r);z(l),l.status==="completed"?await R():l.status==="failed"&&l.error&&F(l.error)}catch(l){if(l instanceof Ze&&l.status===409&&l.details?.code==="ACTIVE_RUN_CONFLICT"){const ne=typeof l.details.activeRunId=="string"?l.details.activeRunId:null;if(ne)try{const de=await es(ne,g);z(de)}catch{}throw F("Insight generation is already running"),l}const f=l instanceof Error?l.message:"Failed to generate insights";throw F(f),l}finally{B(!1)}},[g,R]),X=c.useCallback(async a=>{_(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await ss(a,g),x(t=>t.filter(r=>r.id!==a)),_(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to dismiss insight";throw _(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),oe=c.useCallback(async a=>{C(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{const t=await ts(a,g);return await Ie(a,g),x(r=>r.map(l=>l.id===a?{...l,status:"archived",updatedAt:new Date().toISOString()}:l)),C(r=>{const l=new Map(r);return l.set(a,{running:!1,error:null}),l}),{title:t.suggestedTitle,description:t.suggestedDescription}}catch(t){const r=t instanceof Error?t.message:"Failed to create task";throw C(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]);c.useEffect(()=>{const a=new Map;for(const t of me)a.set(t,[]);for(const t of v){if(!O&&t.status==="archived")continue;const r=a.get(t.category)??[];a.set(t.category,[...r,t])}Y(me.map(t=>({category:t,label:G(t),items:a.get(t)??[],isLoading:!1,error:null})))},[v,O,G]);const he=c.useCallback(async a=>{w(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await Ie(a,g),x(t=>t.map(r=>r.id===a?{...r,status:"archived",updatedAt:new Date().toISOString()}:r)),w(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to archive insight";throw w(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),ge=c.useCallback(async a=>{D(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await is(a,g),x(t=>t.map(r=>r.id===a?{...r,status:"confirmed",updatedAt:new Date().toISOString()}:r)),D(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to unarchive insight";throw D(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),b=c.useMemo(()=>T.reduce((a,t)=>a+t.items.length,0),[T]),K=c.useMemo(()=>0,[]),p=c.useMemo(()=>v.filter(a=>a.status==="archived").length,[v]);return c.useEffect(()=>{const a=ce(k,{maxAgeMs:we}),t=ce(S,{maxAgeMs:je}),r=Array.isArray(a)&&a.length>0;x(Array.isArray(a)?a:[]),z(t??null),L(!r),E.current=r},[k,S]),c.useEffect(()=>{R()},[R]),{sections:T,loading:q,error:J,latestRun:Q,isRunInFlight:Z,runError:ee,refresh:R,runInsights:ie,dismiss:X,createTask:oe,archive:he,unarchive:ge,toggleShowArchived:y,dismissStates:se,createTaskStates:te,archiveStates:u,unarchiveStates:m,totalCount:b,dismissedCount:K,archivedCount:p,showArchived:O}}const $e=["Backlog health:","Backlog pressure detected","Stale paused todo","Backlog health: dependency-blocked todos"];function Te(g){return $e.some(d=>g.title.startsWith(d))}const Le={architecture:fs,quality:_e,workflow:Pe,performance:Ee,reliability:N,security:le,ux:Fe,testability:fe,documentation:hs,dependency:De,features:os,competitive_analysis:Fe,research:bs,trends:Ee,other:A};function Ms({projectId:g,addToast:d,onClose:$,onCreateTask:k,models:S}){const{t:s}=Ue("app"),{sections:W,loading:E,error:G,latestRun:v,isRunInFlight:x,runError:T,refresh:Y,runInsights:q,dismiss:L,createTask:J,archive:H=async()=>{},unarchive:Q=async()=>{},toggleShowArchived:z=()=>{},dismissStates:Z,createTaskStates:B,archiveStates:ee=new Map,unarchiveStates:F=new Map,totalCount:se,archivedCount:_=0,showArchived:te=!1}=ys(g),[C,u]=c.useState(null),[w,m]=c.useState("info"),[D,O]=c.useState(!1),[j,R]=c.useState(!1),[y,ie]=c.useState(()=>localStorage.getItem("fusion-insight-model")??""),[X,oe]=c.useState(()=>localStorage.getItem("fusion-insight-thinking")??""),[he,ge]=c.useState([]),[b,K]=c.useState([]),[p,a]=c.useState([]),[t,r]=c.useState();c.useEffect(()=>{S||ns().then(i=>{ge(i.models),K(i.favoriteProviders),a(i.favoriteModels),r(i.resolvedPlanningProvider);const n=localStorage.getItem("fusion-insight-model");n&&(i.models.some(h=>`${h.provider}/${h.id}`===n)||(localStorage.removeItem("fusion-insight-model"),ie("")))}).catch(()=>{})},[S]);const l=S??he,f=c.useMemo(()=>b.length>0?b:t?[t]:[],[b,t]),ne=c.useCallback(async i=>{const o=b.includes(i)?b.filter(h=>h!==i):[i,...b];K(o);try{await Ae({favoriteProviders:o,favoriteModels:p})}catch{K(b)}},[b,p]),de=c.useCallback(async i=>{const o=p.includes(i)?p.filter(h=>h!==i):[i,...p];a(o);try{await Ae({favoriteProviders:b,favoriteModels:o})}catch{a(p)}},[p,b]),Ge=c.useCallback(i=>{ie(i),i?localStorage.setItem("fusion-insight-model",i):localStorage.removeItem("fusion-insight-model")},[]),He=c.useCallback(i=>{oe(i),i?localStorage.setItem("fusion-insight-thinking",i):localStorage.removeItem("fusion-insight-thinking")},[]),V=c.useMemo(()=>W.filter(i=>i.items.length>0),[W]),ve=c.useMemo(()=>V.reduce((i,n)=>i+n.items.filter(Te).length,0),[V]),M=c.useMemo(()=>j?V.map(i=>({...i,items:i.items.filter(Te)})).filter(i=>i.items.length>0):V,[V,j]),[P,ue]=c.useState(null);c.useEffect(()=>{if(M.length===0){P!==null&&ue(null);return}P&&M.some(n=>n.category===P&&n.items.length>0)||ue(M[0].category)},[M,P]);const I=c.useMemo(()=>M.find(i=>i.category===P)??M[0],[M,P]);c.useEffect(()=>{if(C){const i=setTimeout(()=>u(null),5e3);return()=>clearTimeout(i)}},[C]);const be=c.useCallback(async()=>{try{u(s("insights.generatingInsights","Generating insights...")),m("info");let i,n;if(y){const o=y.indexOf("/");if(o!==-1){const h=y.slice(0,o),ae=y.slice(o+1);h&&ae&&(i=h,n=ae)}}await q(i,n,X||void 0),u(s("insights.generationStarted","Insight generation started")),m("success"),d(s("insights.generationStarted","Insight generation started"),"success")}catch(i){const n=i instanceof Error?i.message:s("insights.failedToStart","Failed to start generation");if(n==="Insight generation is already running"){u(s("insights.alreadyRunning","Insight generation is already running. Showing the active run.")),m("info"),d(s("insights.alreadyRunningShort","Insight generation is already running"),"info");return}u(n),m("error"),d(n,"error")}},[q,d,y,X,s]),Be=c.useCallback(async(i,n)=>{try{u(s("insights.dismissing",'Dismissing "{{title}}"...',{title:n})),m("info"),await L(i),u(s("insights.dismissed",'Dismissed "{{title}}"',{title:n})),m("success"),d(s("insights.dismissedMsg","Insight dismissed: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToDismiss","Failed to dismiss insight");u(h),m("error"),d(h,"error")}},[L,d,s]),Oe=c.useCallback(async(i,n)=>{try{u(s("insights.archiving",'Archiving "{{title}}"...',{title:n})),m("info"),await H(i),u(s("insights.archived",'Archived "{{title}}"',{title:n})),m("success"),d(s("insights.archivedMsg","Insight archived: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToArchive","Failed to archive insight");u(h),m("error"),d(h,"error")}},[H,d,s]),Xe=c.useCallback(async(i,n)=>{try{u(s("insights.unarchiving",'Unarchiving "{{title}}"...',{title:n})),m("info"),await Q(i),u(s("insights.unarchived",'Unarchived "{{title}}"',{title:n})),m("success"),d(s("insights.unarchivedMsg","Insight unarchived: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToUnarchive","Failed to unarchive insight");u(h),m("error"),d(h,"error")}},[Q,d,s]),Ke=c.useCallback(async(i,n)=>{try{if(u(s("insights.creatingTask",'Creating task from "{{title}}"...',{title:n})),m("info"),!k)throw new Error(s("insights.taskCreationUnavailable","Task creation is unavailable in this view"));const o=await J(i);if(!o)throw new Error(s("insights.failedToPreparePayload","Failed to prepare task payload from insight"));await k({insightId:i,title:o.title,description:o.description}),u(s("insights.taskCreated",'Task created from "{{title}}"',{title:n})),m("success"),d(s("insights.taskCreatedMsg","Task created: {{title}}",{title:o.title}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToCreateTask","Failed to create task");u(h),m("error"),d(h,"error")}},[J,k,d,s]),Ve=i=>{const n=Le[i.category]??A,o=I?.category===i.category;return e.jsx("li",{children:e.jsxs("button",{type:"button",className:`insights-category-item${o?" insights-category-item--active":""}`,onClick:()=>ue(i.category),"aria-current":o?"true":void 0,"data-testid":`insights-category-${i.category}`,children:[e.jsx(n,{size:16,className:"insights-category-icon"}),e.jsx("span",{className:"insights-category-label",children:i.label}),e.jsx("span",{className:"insights-category-count",children:i.items.length})]})},i.category)},We=()=>{if(!I)return null;const i=Le[I.category]??A;return e.jsxs("section",{className:"insights-section","data-testid":`insights-section-${I.category}`,children:[e.jsx("div",{className:"insights-section-header",children:e.jsxs("div",{className:"insights-section-title",children:[e.jsx(i,{size:18,className:"insights-section-icon"}),e.jsx("h3",{children:I.label}),e.jsx("span",{className:"insights-section-count",children:I.items.length})]})}),e.jsx("div",{className:"insights-section-content",children:e.jsx("ul",{className:"insights-list",children:I.items.map(n=>{const o=Z.get(n.id),h=B.get(n.id),ae=ee.get(n.id),Ye=F.get(n.id),ye=o?.running??!1,xe=h?.running??!1,pe=ae?.running??!1,ke=Ye?.running??!1,Se=n.status==="archived",re=I.items.some(U=>Z.get(U.id)?.running||B.get(U.id)?.running||ee.get(U.id)?.running||F.get(U.id)?.running);return e.jsxs("li",{className:`insight-item${Se?" insight-item--archived":""}`,"data-insight-id":n.id,draggable:us(),onDragStart:U=>{ds(U.dataTransfer,{kind:"research-finding",id:n.id,projectId:g})},children:[e.jsxs("div",{className:"insight-item-header",children:[e.jsx("h4",{className:"insight-item-title",children:n.title}),e.jsxs("div",{className:"insight-item-actions",children:[Se?e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Xe(n.id,n.title),disabled:ke||re,title:s("insights.unarchiveTitle","Unarchive this insight"),"aria-label":s("insights.unarchiveLabel","Unarchive this insight"),"data-testid":`unarchive-${n.id}`,children:ke?e.jsx(N,{size:16,className:"spin"}):e.jsx(gs,{size:16})}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Ke(n.id,n.title),disabled:xe||re,title:s("insights.createTaskTitle","Create task from this insight"),"aria-label":s("insights.createTaskLabel","Create task from this insight"),"data-testid":`create-task-${n.id}`,children:xe?e.jsx(N,{size:16,className:"spin"}):e.jsx(De,{size:16})}),e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Oe(n.id,n.title),disabled:pe||re,title:s("insights.archiveTitle","Archive this insight"),"aria-label":s("insights.archiveLabel","Archive this insight"),"data-testid":`archive-${n.id}`,children:pe?e.jsx(N,{size:16,className:"spin"}):e.jsx(fe,{size:16})})]}),e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Be(n.id,n.title),disabled:ye||re,title:s("insights.dismissTitle","Dismiss this insight"),"aria-label":s("insights.dismissLabel","Dismiss this insight"),"data-testid":`dismiss-${n.id}`,children:ye?e.jsx(N,{size:16,className:"spin"}):e.jsx(Ne,{size:16})})]})]}),n.content&&e.jsx("p",{className:"insight-item-content",children:n.content}),e.jsxs("div",{className:"insight-item-meta",children:[e.jsx("span",{className:`insight-item-status insight-item-status--${n.status}`,children:n.status}),n.createdAt&&e.jsxs("span",{className:"insight-item-date",children:[e.jsx(Pe,{size:12}),new Date(n.createdAt).toLocaleDateString()]})]})]},n.id)})})})]})};return e.jsxs("div",{className:"insights-view","data-testid":"insights-view",children:[e.jsx(as,{icon:A,title:s("insights.title","Insights"),actions:e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"insights-view-count",children:[se," ",s("common.total","total")]}),ve>0&&e.jsxs("button",{className:`btn btn-sm insights-backlog-health-toggle${j?" btn-icon--active":""}`,onClick:()=>R(i=>!i),"aria-pressed":j,"aria-label":j?s("insights.showAllInsights","Show all insights"):s("insights.showBacklogHealth","Show only backlog health insights"),"data-testid":"toggle-backlog-health",title:$e.join(", "),children:[e.jsx(rs,{size:14}),j?s("insights.allInsights","All Insights"):s("insights.backlogHealth","Backlog")," ",e.jsxs("span",{children:["(",ve,")"]})]}),$&&e.jsx("button",{className:"btn btn-sm insights-view-close",onClick:$,"aria-label":s("actions.closeInsightsView","Close insights view"),title:s("actions.close","Close"),children:e.jsx(Ne,{size:16})}),_>0&&e.jsxs("button",{className:"btn btn-sm insights-show-archived-toggle",onClick:z,"aria-label":te?s("insights.hideArchived","Hide archived insights"):s("insights.showArchived","Show archived insights"),"data-testid":"toggle-archived-insights",children:[e.jsx(fe,{size:14}),te?s("insights.hideArchivedLabel","Archived"):s("insights.showArchivedLabel","Archived ({{count}})",{count:_})]}),e.jsx("button",{className:"btn btn-icon btn-sm insights-refresh-btn",onClick:()=>void Y(),disabled:E,"aria-label":s("actions.refreshInsights","Refresh insights"),title:s("actions.refreshInsights","Refresh insights"),"data-testid":"refresh-insights",children:e.jsx(N,{size:14,className:E?"spin":""})}),e.jsxs("button",{className:"btn btn-sm insights-model-toggle",onClick:()=>O(i=>!i),"aria-label":s("insights.configureModel","Configure insight generation model"),"aria-expanded":D,"data-testid":"toggle-model-config",title:y?s("insights.modelConfigured","Model: {{model}}",{model:y}):s("insights.configureModelTitle","Configure model"),children:[e.jsx(cs,{size:14}),y&&e.jsx("span",{className:"insights-model-indicator"})]}),e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void be(),disabled:x,"aria-label":s("insights.generateInsights","Generate new insights"),"data-testid":"run-insights",children:x?e.jsxs(e.Fragment,{children:[e.jsx(N,{size:14,className:"spin"}),s("insights.generating","Generating...")]}):e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14}),s("insights.generateInsightsBtn","Generate Insights")]})})]})}),D&&e.jsxs("div",{className:"insights-model-config","data-testid":"model-config",children:[e.jsx("label",{htmlFor:"insight-model-select",className:"insights-model-label",children:s("insights.model","Model")}),e.jsx(ls,{models:l,value:y,onChange:Ge,placeholder:s("insights.usePlanningDefault","Use planning default"),label:s("insights.generationModel","Insight generation model"),disabled:x,id:"insight-model-select",favoriteProviders:f,favoriteModels:p,onToggleFavorite:ne,onToggleModelFavorite:de,showThinkingLevel:!0,thinkingLevel:X,onThinkingLevelChange:He,defaultThinkingLevel:"off"})]}),e.jsx("div",{className:"insights-status-region","aria-live":"polite","data-testid":"insights-status",children:C&&e.jsxs("div",{className:`insights-status-message insights-status-message--${w}`,role:w==="error"?"alert":void 0,children:[w==="success"&&e.jsx(_e,{size:16}),w==="error"&&e.jsx(le,{size:16}),w==="info"&&e.jsx(A,{size:16}),e.jsx("span",{children:C})]})}),T&&e.jsxs("div",{className:"insights-error-callout",role:"alert","data-testid":"run-error",children:[e.jsx(le,{size:16}),e.jsx("span",{children:T})]}),v&&e.jsx("div",{className:"insights-run-info","data-testid":"latest-run",children:e.jsxs("span",{className:"insights-run-status",children:[s("insights.latestRun","Latest run:")," ",v.status,v.status==="completed"&&e.jsxs(e.Fragment,{children:[" — ",s("insights.runCompleted","{{created}} created, {{updated}} updated",{created:v.insightsCreated,updated:v.insightsUpdated})]}),v.status==="failed"&&v.error&&e.jsxs(e.Fragment,{children:[" — ",v.error]})]})}),E?e.jsxs("div",{className:"insights-loading","data-testid":"insights-loading",children:[e.jsx(N,{size:24,className:"spin"}),e.jsx("p",{children:s("insights.loading","Loading insights...")})]}):G?e.jsxs("div",{className:"insights-error","data-testid":"insights-error",children:[e.jsx(le,{size:24}),e.jsx("p",{children:G}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void Y(),children:s("actions.retry","Retry")})]}):se===0?e.jsxs("div",{className:"insights-empty","data-testid":"insights-empty",children:[e.jsx(A,{size:48}),e.jsx("h3",{children:s("insights.noInsightsYet","No insights yet")}),e.jsx("p",{children:s("insights.generateDescription","Generate insights to get AI-powered recommendations for your project.")}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void be(),children:[e.jsx(A,{size:14}),s("insights.generateFirst","Generate First Insights")]})]}):e.jsxs("div",{className:"insights-body",children:[e.jsx("aside",{className:"insights-sidebar","aria-label":s("insights.categoriesLabel","Insight categories"),children:e.jsx("ul",{className:"insights-category-list",children:M.map(Ve)})}),e.jsx("div",{className:"insights-detail",children:We()})]})]})}export{Ms as InsightsView};
|
|
11
|
+
*/const vs=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]],bs=ze("chart-line",vs),me=["architecture","quality","workflow","performance","reliability","security","ux","testability","documentation","dependency","features","competitive_analysis","research","trends","other"],Re={quality:"Quality",performance:"Performance",architecture:"Architecture",security:"Security",reliability:"Reliability",ux:"User Experience",testability:"Testability",documentation:"Documentation",dependency:"Dependencies",workflow:"Workflow",other:"Other",features:"Features",competitive_analysis:"Competitive Analysis",research:"Research",trends:"Trends"};function ys(g){const{t:d}=$e("app"),G=g??"",k=`${Ce.INSIGHTS_PREFIX}${G}`,S=`${Ce.INSIGHT_LATEST_RUN_PREFIX}${G}`,s=ce(k,{maxAgeMs:we}),V=ce(S,{maxAgeMs:je}),E=c.useRef(Array.isArray(s)&&s.length>0),U=c.useCallback(a=>d(`insights.category.${a}`,Re[a]??a),[d]),[v,x]=c.useState(()=>Array.isArray(s)?s:[]),[T,W]=c.useState(()=>me.map(a=>({category:a,label:Re[a]??a,items:[],isLoading:!1,error:null}))),[Y,L]=c.useState(!(Array.isArray(s)&&s.length>0)),[Q,H]=c.useState(null),[J,z]=c.useState(V??null),[Z,B]=c.useState(!1),[ee,F]=c.useState(null),[se,_]=c.useState(new Map),[te,C]=c.useState(new Map),[u,w]=c.useState(new Map),[m,D]=c.useState(new Map),[O,j]=c.useState(!1),R=c.useCallback(async()=>{E.current||L(!0),H(null);try{const t=(await Ye({status:void 0,limit:1e3},g)).insights.filter(l=>l.status!=="dismissed");x(t),Me(k,t.length>500?t.slice(0,500):t,{maxBytes:5e5});const r=await Qe(g);r.runs.length>0&&(z(r.runs[0]),Me(S,r.runs[0],{maxBytes:5e5})),E.current=!0}catch(a){const t=a instanceof Error?a.message:"Failed to fetch insights";H(t)}finally{L(!1)}},[k,S,g]),y=c.useCallback(()=>{j(a=>!a)},[]),ie=c.useCallback(async(a,t,r)=>{B(!0),F(null);try{const l=await Je("manual",void 0,g,a,t,r);z(l),l.status==="completed"?await R():l.status==="failed"&&l.error&&F(l.error)}catch(l){if(l instanceof Ze&&l.status===409&&l.details?.code==="ACTIVE_RUN_CONFLICT"){const ne=typeof l.details.activeRunId=="string"?l.details.activeRunId:null;if(ne)try{const de=await es(ne,g);z(de)}catch{}throw F("Insight generation is already running"),l}const f=l instanceof Error?l.message:"Failed to generate insights";throw F(f),l}finally{B(!1)}},[g,R]),X=c.useCallback(async a=>{_(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await ss(a,g),x(t=>t.filter(r=>r.id!==a)),_(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to dismiss insight";throw _(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),oe=c.useCallback(async a=>{C(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{const t=await ts(a,g);return await Ie(a,g),x(r=>r.map(l=>l.id===a?{...l,status:"archived",updatedAt:new Date().toISOString()}:l)),C(r=>{const l=new Map(r);return l.set(a,{running:!1,error:null}),l}),{title:t.suggestedTitle,description:t.suggestedDescription}}catch(t){const r=t instanceof Error?t.message:"Failed to create task";throw C(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]);c.useEffect(()=>{const a=new Map;for(const t of me)a.set(t,[]);for(const t of v){if(!O&&t.status==="archived")continue;const r=a.get(t.category)??[];a.set(t.category,[...r,t])}W(me.map(t=>({category:t,label:U(t),items:a.get(t)??[],isLoading:!1,error:null})))},[v,O,U]);const he=c.useCallback(async a=>{w(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await Ie(a,g),x(t=>t.map(r=>r.id===a?{...r,status:"archived",updatedAt:new Date().toISOString()}:r)),w(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to archive insight";throw w(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),ge=c.useCallback(async a=>{D(t=>{const r=new Map(t);return r.set(a,{running:!0,error:null}),r});try{await is(a,g),x(t=>t.map(r=>r.id===a?{...r,status:"confirmed",updatedAt:new Date().toISOString()}:r)),D(t=>{const r=new Map(t);return r.set(a,{running:!1,error:null}),r})}catch(t){const r=t instanceof Error?t.message:"Failed to unarchive insight";throw D(l=>{const f=new Map(l);return f.set(a,{running:!1,error:r}),f}),t}},[g]),b=c.useMemo(()=>T.reduce((a,t)=>a+t.items.length,0),[T]),q=c.useMemo(()=>0,[]),p=c.useMemo(()=>v.filter(a=>a.status==="archived").length,[v]);return c.useEffect(()=>{const a=ce(k,{maxAgeMs:we}),t=ce(S,{maxAgeMs:je}),r=Array.isArray(a)&&a.length>0;x(Array.isArray(a)?a:[]),z(t??null),L(!r),E.current=r},[k,S]),c.useEffect(()=>{R()},[R]),{sections:T,loading:Y,error:Q,latestRun:J,isRunInFlight:Z,runError:ee,refresh:R,runInsights:ie,dismiss:X,createTask:oe,archive:he,unarchive:ge,toggleShowArchived:y,dismissStates:se,createTaskStates:te,archiveStates:u,unarchiveStates:m,totalCount:b,dismissedCount:q,archivedCount:p,showArchived:O}}const Ge=["Backlog health:","Backlog pressure detected","Stale paused todo","Backlog health: dependency-blocked todos"];function Te(g){return Ge.some(d=>g.title.startsWith(d))}const Le={architecture:fs,quality:_e,workflow:Pe,performance:Ee,reliability:N,security:le,ux:Fe,testability:fe,documentation:hs,dependency:De,features:os,competitive_analysis:Fe,research:bs,trends:Ee,other:A};function Ms({projectId:g,addToast:d,onClose:G,onCreateTask:k,models:S}){const{t:s}=$e("app"),{sections:V,loading:E,error:U,latestRun:v,isRunInFlight:x,runError:T,refresh:W,runInsights:Y,dismiss:L,createTask:Q,archive:H=async()=>{},unarchive:J=async()=>{},toggleShowArchived:z=()=>{},dismissStates:Z,createTaskStates:B,archiveStates:ee=new Map,unarchiveStates:F=new Map,totalCount:se,archivedCount:_=0,showArchived:te=!1}=ys(g),[C,u]=c.useState(null),[w,m]=c.useState("info"),[D,O]=c.useState(!1),[j,R]=c.useState(!1),[y,ie]=c.useState(()=>localStorage.getItem("fusion-insight-model")??""),[X,oe]=c.useState(()=>localStorage.getItem("fusion-insight-thinking")??""),[he,ge]=c.useState([]),[b,q]=c.useState([]),[p,a]=c.useState([]),[t,r]=c.useState();c.useEffect(()=>{S||ns().then(i=>{ge(i.models),q(i.favoriteProviders),a(i.favoriteModels),r(i.resolvedPlanningProvider);const n=localStorage.getItem("fusion-insight-model");n&&(i.models.some(h=>`${h.provider}/${h.id}`===n)||(localStorage.removeItem("fusion-insight-model"),ie("")))}).catch(()=>{})},[S]);const l=S??he,f=c.useMemo(()=>b.length>0?b:t?[t]:[],[b,t]),ne=c.useCallback(async i=>{const o=b.includes(i)?b.filter(h=>h!==i):[i,...b];q(o);try{await Ae({favoriteProviders:o,favoriteModels:p})}catch{q(b)}},[b,p]),de=c.useCallback(async i=>{const o=p.includes(i)?p.filter(h=>h!==i):[i,...p];a(o);try{await Ae({favoriteProviders:b,favoriteModels:o})}catch{a(p)}},[p,b]),Ue=c.useCallback(i=>{ie(i),i?localStorage.setItem("fusion-insight-model",i):localStorage.removeItem("fusion-insight-model")},[]),He=c.useCallback(i=>{oe(i),i?localStorage.setItem("fusion-insight-thinking",i):localStorage.removeItem("fusion-insight-thinking")},[]),K=c.useMemo(()=>V.filter(i=>i.items.length>0),[V]),ve=c.useMemo(()=>K.reduce((i,n)=>i+n.items.filter(Te).length,0),[K]),M=c.useMemo(()=>j?K.map(i=>({...i,items:i.items.filter(Te)})).filter(i=>i.items.length>0):K,[K,j]),[P,ue]=c.useState(null);c.useEffect(()=>{if(M.length===0){P!==null&&ue(null);return}P&&M.some(n=>n.category===P&&n.items.length>0)||ue(M[0].category)},[M,P]);const I=c.useMemo(()=>M.find(i=>i.category===P)??M[0],[M,P]);c.useEffect(()=>{if(C){const i=setTimeout(()=>u(null),5e3);return()=>clearTimeout(i)}},[C]);const be=c.useCallback(async()=>{try{u(s("insights.generatingInsights","Generating insights...")),m("info");let i,n;if(y){const o=y.indexOf("/");if(o!==-1){const h=y.slice(0,o),ae=y.slice(o+1);h&&ae&&(i=h,n=ae)}}await Y(i,n,X||void 0),u(s("insights.generationStarted","Insight generation started")),m("success"),d(s("insights.generationStarted","Insight generation started"),"success")}catch(i){const n=i instanceof Error?i.message:s("insights.failedToStart","Failed to start generation");if(n==="Insight generation is already running"){u(s("insights.alreadyRunning","Insight generation is already running. Showing the active run.")),m("info"),d(s("insights.alreadyRunningShort","Insight generation is already running"),"info");return}u(n),m("error"),d(n,"error")}},[Y,d,y,X,s]),Be=c.useCallback(async(i,n)=>{try{u(s("insights.dismissing",'Dismissing "{{title}}"...',{title:n})),m("info"),await L(i),u(s("insights.dismissed",'Dismissed "{{title}}"',{title:n})),m("success"),d(s("insights.dismissedMsg","Insight dismissed: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToDismiss","Failed to dismiss insight");u(h),m("error"),d(h,"error")}},[L,d,s]),Oe=c.useCallback(async(i,n)=>{try{u(s("insights.archiving",'Archiving "{{title}}"...',{title:n})),m("info"),await H(i),u(s("insights.archived",'Archived "{{title}}"',{title:n})),m("success"),d(s("insights.archivedMsg","Insight archived: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToArchive","Failed to archive insight");u(h),m("error"),d(h,"error")}},[H,d,s]),Xe=c.useCallback(async(i,n)=>{try{u(s("insights.unarchiving",'Unarchiving "{{title}}"...',{title:n})),m("info"),await J(i),u(s("insights.unarchived",'Unarchived "{{title}}"',{title:n})),m("success"),d(s("insights.unarchivedMsg","Insight unarchived: {{title}}",{title:n}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToUnarchive","Failed to unarchive insight");u(h),m("error"),d(h,"error")}},[J,d,s]),qe=c.useCallback(async(i,n)=>{try{if(u(s("insights.creatingTask",'Creating task from "{{title}}"...',{title:n})),m("info"),!k)throw new Error(s("insights.taskCreationUnavailable","Task creation is unavailable in this view"));const o=await Q(i);if(!o)throw new Error(s("insights.failedToPreparePayload","Failed to prepare task payload from insight"));await k({insightId:i,title:o.title,description:o.description}),u(s("insights.taskCreated",'Task created from "{{title}}"',{title:n})),m("success"),d(s("insights.taskCreatedMsg","Task created: {{title}}",{title:o.title}),"success")}catch(o){const h=o instanceof Error?o.message:s("insights.failedToCreateTask","Failed to create task");u(h),m("error"),d(h,"error")}},[Q,k,d,s]),Ke=i=>{const n=Le[i.category]??A,o=I?.category===i.category;return e.jsx("li",{children:e.jsxs("button",{type:"button",className:`insights-category-item${o?" insights-category-item--active":""}`,onClick:()=>ue(i.category),"aria-current":o?"true":void 0,"data-testid":`insights-category-${i.category}`,children:[e.jsx(n,{size:16,className:"insights-category-icon"}),e.jsx("span",{className:"insights-category-label",children:i.label}),e.jsx("span",{className:"insights-category-count",children:i.items.length})]})},i.category)},Ve=()=>{if(!I)return null;const i=Le[I.category]??A;return e.jsxs("section",{className:"insights-section","data-testid":`insights-section-${I.category}`,children:[e.jsx("div",{className:"insights-section-header",children:e.jsxs("div",{className:"insights-section-title",children:[e.jsx(i,{size:18,className:"insights-section-icon"}),e.jsx("h3",{children:I.label}),e.jsx("span",{className:"insights-section-count",children:I.items.length})]})}),e.jsx("div",{className:"insights-section-content",children:e.jsx("ul",{className:"insights-list",children:I.items.map(n=>{const o=Z.get(n.id),h=B.get(n.id),ae=ee.get(n.id),We=F.get(n.id),ye=o?.running??!1,xe=h?.running??!1,pe=ae?.running??!1,ke=We?.running??!1,Se=n.status==="archived",re=I.items.some($=>Z.get($.id)?.running||B.get($.id)?.running||ee.get($.id)?.running||F.get($.id)?.running);return e.jsxs("li",{className:`insight-item${Se?" insight-item--archived":""}`,"data-insight-id":n.id,draggable:us(),onDragStart:$=>{ds($.dataTransfer,{kind:"research-finding",id:n.id,projectId:g})},children:[e.jsxs("div",{className:"insight-item-header",children:[e.jsx("h4",{className:"insight-item-title",children:n.title}),e.jsxs("div",{className:"insight-item-actions",children:[Se?e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Xe(n.id,n.title),disabled:ke||re,title:s("insights.unarchiveTitle","Unarchive this insight"),"aria-label":s("insights.unarchiveLabel","Unarchive this insight"),"data-testid":`unarchive-${n.id}`,children:ke?e.jsx(N,{size:16,className:"spin"}):e.jsx(gs,{size:16})}):e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void qe(n.id,n.title),disabled:xe||re,title:s("insights.createTaskTitle","Create task from this insight"),"aria-label":s("insights.createTaskLabel","Create task from this insight"),"data-testid":`create-task-${n.id}`,children:xe?e.jsx(N,{size:16,className:"spin"}):e.jsx(De,{size:16})}),e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Oe(n.id,n.title),disabled:pe||re,title:s("insights.archiveTitle","Archive this insight"),"aria-label":s("insights.archiveLabel","Archive this insight"),"data-testid":`archive-${n.id}`,children:pe?e.jsx(N,{size:16,className:"spin"}):e.jsx(fe,{size:16})})]}),e.jsx("button",{className:"insight-item-action-btn",onClick:()=>void Be(n.id,n.title),disabled:ye||re,title:s("insights.dismissTitle","Dismiss this insight"),"aria-label":s("insights.dismissLabel","Dismiss this insight"),"data-testid":`dismiss-${n.id}`,children:ye?e.jsx(N,{size:16,className:"spin"}):e.jsx(Ne,{size:16})})]})]}),n.content&&e.jsx("p",{className:"insight-item-content",children:n.content}),e.jsxs("div",{className:"insight-item-meta",children:[e.jsx("span",{className:`insight-item-status insight-item-status--${n.status}`,children:n.status}),n.createdAt&&e.jsxs("span",{className:"insight-item-date",children:[e.jsx(Pe,{size:12}),new Date(n.createdAt).toLocaleDateString()]})]})]},n.id)})})})]})};return e.jsxs("div",{className:"insights-view","data-testid":"insights-view",children:[e.jsx(as,{icon:A,title:s("insights.title","Insights"),actions:e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"insights-view-count",children:[se," ",s("common.total","total")]}),ve>0&&e.jsxs("button",{className:`btn btn-sm insights-backlog-health-toggle${j?" btn-icon--active":""}`,onClick:()=>R(i=>!i),"aria-pressed":j,"aria-label":j?s("insights.showAllInsights","Show all insights"):s("insights.showBacklogHealth","Show only backlog health insights"),"data-testid":"toggle-backlog-health",title:Ge.join(", "),children:[e.jsx(rs,{size:14}),j?s("insights.allInsights","All Insights"):s("insights.backlogHealth","Backlog")," ",e.jsxs("span",{children:["(",ve,")"]})]}),G&&e.jsx("button",{className:"btn btn-sm insights-view-close",onClick:G,"aria-label":s("actions.closeInsightsView","Close insights view"),title:s("actions.close","Close"),children:e.jsx(Ne,{size:16})}),_>0&&e.jsxs("button",{className:"btn btn-sm insights-show-archived-toggle",onClick:z,"aria-label":te?s("insights.hideArchived","Hide archived insights"):s("insights.showArchived","Show archived insights"),"data-testid":"toggle-archived-insights",children:[e.jsx(fe,{size:14}),te?s("insights.hideArchivedLabel","Archived"):s("insights.showArchivedLabel","Archived ({{count}})",{count:_})]}),e.jsx("button",{className:"btn btn-icon btn-sm insights-refresh-btn",onClick:()=>void W(),disabled:E,"aria-label":s("actions.refreshInsights","Refresh insights"),title:s("actions.refreshInsights","Refresh insights"),"data-testid":"refresh-insights",children:e.jsx(N,{size:14,className:E?"spin":""})}),e.jsxs("button",{className:"btn btn-sm insights-model-toggle",onClick:()=>O(i=>!i),"aria-label":s("insights.configureModel","Configure insight generation model"),"aria-expanded":D,"data-testid":"toggle-model-config",title:y?s("insights.modelConfigured","Model: {{model}}",{model:y}):s("insights.configureModelTitle","Configure model"),children:[e.jsx(cs,{size:14}),y&&e.jsx("span",{className:"insights-model-indicator"})]}),e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void be(),disabled:x,"aria-label":s("insights.generateInsights","Generate new insights"),"data-testid":"run-insights",children:x?e.jsxs(e.Fragment,{children:[e.jsx(N,{size:14,className:"spin"}),s("insights.generating","Generating...")]}):e.jsxs(e.Fragment,{children:[e.jsx(A,{size:14}),s("insights.generateInsightsBtn","Generate Insights")]})})]})}),D&&e.jsxs("div",{className:"insights-model-config","data-testid":"model-config",children:[e.jsx("label",{htmlFor:"insight-model-select",className:"insights-model-label",children:s("insights.model","Model")}),e.jsx(ls,{models:l,value:y,onChange:Ue,placeholder:s("insights.usePlanningDefault","Use planning default"),label:s("insights.generationModel","Insight generation model"),disabled:x,id:"insight-model-select",favoriteProviders:f,favoriteModels:p,onToggleFavorite:ne,onToggleModelFavorite:de,showThinkingLevel:!0,thinkingLevel:X,onThinkingLevelChange:He,defaultThinkingLevel:"off"})]}),e.jsx("div",{className:"insights-status-region","aria-live":"polite","data-testid":"insights-status",children:C&&e.jsxs("div",{className:`insights-status-message insights-status-message--${w}`,role:w==="error"?"alert":void 0,children:[w==="success"&&e.jsx(_e,{size:16}),w==="error"&&e.jsx(le,{size:16}),w==="info"&&e.jsx(A,{size:16}),e.jsx("span",{children:C})]})}),T&&e.jsxs("div",{className:"insights-error-callout",role:"alert","data-testid":"run-error",children:[e.jsx(le,{size:16}),e.jsx("span",{children:T})]}),v&&e.jsx("div",{className:"insights-run-info","data-testid":"latest-run",children:e.jsxs("span",{className:"insights-run-status",children:[s("insights.latestRun","Latest run:")," ",v.status,v.status==="completed"&&e.jsxs(e.Fragment,{children:[" — ",s("insights.runCompleted","{{created}} created, {{updated}} updated",{created:v.insightsCreated,updated:v.insightsUpdated})]}),v.status==="failed"&&v.error&&e.jsxs(e.Fragment,{children:[" — ",v.error]})]})}),E?e.jsxs("div",{className:"insights-loading","data-testid":"insights-loading",children:[e.jsx(N,{size:24,className:"spin"}),e.jsx("p",{children:s("insights.loading","Loading insights...")})]}):U?e.jsxs("div",{className:"insights-error","data-testid":"insights-error",children:[e.jsx(le,{size:24}),e.jsx("p",{children:U}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void W(),children:s("actions.retry","Retry")})]}):se===0?e.jsxs("div",{className:"insights-empty","data-testid":"insights-empty",children:[e.jsx(A,{size:48}),e.jsx("h3",{children:s("insights.noInsightsYet","No insights yet")}),e.jsx("p",{children:s("insights.generateDescription","Generate insights to get AI-powered recommendations for your project.")}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void be(),children:[e.jsx(A,{size:14}),s("insights.generateFirst","Generate First Insights")]})]}):e.jsxs("div",{className:"insights-body",children:[e.jsx("aside",{className:"insights-sidebar","aria-label":s("insights.categoriesLabel","Insight categories"),children:e.jsx("ul",{className:"insights-category-list",children:M.map(Ke)})}),e.jsx("div",{className:"insights-detail",children:Ve()})]})]})}export{Ms as InsightsView};
|