@winspan/claude-forge 8.54.3 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +649 -33
- package/README.md +155 -17
- package/dist/catalogs/agents.json +72 -0
- package/dist/catalogs/skills.json +194 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +669 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +10 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +50 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +66 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +897 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +0 -12
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +14 -128
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +3 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +14 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +20 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +765 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +395 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/governance/global-inject.d.ts +60 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +129 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +14 -3
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +158 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +570 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +362 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +502 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +112 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +390 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +131 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +187 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +28 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +62 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +106 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +202 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +117 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +471 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +16 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +39 -8
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +50 -7
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +302 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +351 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +1 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +21 -6
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +253 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +425 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +474 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1213 -18
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/storage/workflow-recommendations.d.ts +124 -0
- package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
- package/dist/core/storage/workflow-recommendations.js +274 -0
- package/dist/core/storage/workflow-recommendations.js.map +1 -0
- package/dist/core/types.d.ts +112 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +92 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +166 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +41 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +114 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +137 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +49 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +261 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +585 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +35 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +157 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +36 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +135 -48
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +471 -43
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +692 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +170 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +203 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +487 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +123 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/experience-extractor.d.ts +67 -0
- package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
- package/dist/daemon/services/experience-extractor.js +323 -0
- package/dist/daemon/services/experience-extractor.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +455 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +111 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +140 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +219 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +481 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/services/violation-reporter.d.ts +130 -0
- package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
- package/dist/daemon/services/violation-reporter.js +339 -0
- package/dist/daemon/services/violation-reporter.js.map +1 -0
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
- package/dist/daemon/templates/agents/coder.md +105 -0
- package/dist/daemon/templates/agents/decision-maker.md +460 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
- package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
- package/dist/daemon/templates/agents/patch-applier.md +144 -0
- package/dist/daemon/templates/agents/planner.md +165 -0
- package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
- package/dist/daemon/templates/agents/skill-distiller.md +113 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
- package/dist/daemon/templates/agents/verify-agent.md +136 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +24 -10
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +937 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +73 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +93 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +228 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +404 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +105 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +341 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +91 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +408 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +288 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +222 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.js +115 -0
- package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +491 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-creator.md +178 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
- package/dist/skills/distilled/distilled-executing-plans.md +113 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
- package/dist/skills/keyword-score.d.ts +29 -0
- package/dist/skills/keyword-score.d.ts.map +1 -0
- package/dist/skills/keyword-score.js +54 -0
- package/dist/skills/keyword-score.js.map +1 -0
- package/dist/skills/registry.d.ts +64 -20
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +102 -105
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/skill-invoke.d.ts +1 -1
- package/dist/skills/tools/skill-invoke.js +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +24 -0
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +783 -2
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +16 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +661 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +37 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +149 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +6 -1
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +9 -1
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +102 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +274 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +355 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +111 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +125 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +308 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
- package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +14 -3
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-performance-optimization.md +0 -30
- package/dist/skills/official/official-pr-review.md +0 -35
- package/dist/skills/official/official-release-checklist.md +0 -30
- package/dist/skills/official/official-security-hardening.md +0 -32
- package/dist/skills/official/official-spec-driven-design.md +0 -31
- package/dist/skills/official/planning-with-files.md +0 -241
- package/dist/skills/official/ui-ux-pro-max.md +0 -105
- package/dist/skills/official/webapp-testing.md +0 -96
- package/dist/skills/official-skills.d.ts +0 -26
- package/dist/skills/official-skills.d.ts.map +0 -1
- package/dist/skills/official-skills.js +0 -73
- package/dist/skills/official-skills.js.map +0 -1
- package/dist/skills/semantic-matcher.d.ts +0 -60
- package/dist/skills/semantic-matcher.d.ts.map +0 -1
- package/dist/skills/semantic-matcher.js +0 -192
- package/dist/skills/semantic-matcher.js.map +0 -1
- package/dist/skills/upgrade-engine.d.ts +0 -93
- package/dist/skills/upgrade-engine.d.ts.map +0 -1
- package/dist/skills/upgrade-engine.js +0 -447
- package/dist/skills/upgrade-engine.js.map +0 -1
- package/dist/skills/upgrade-prompt.d.ts +0 -20
- package/dist/skills/upgrade-prompt.d.ts.map +0 -1
- package/dist/skills/upgrade-prompt.js +0 -75
- package/dist/skills/upgrade-prompt.js.map +0 -1
- package/dist/web/routes/ai.d.ts +0 -10
- package/dist/web/routes/ai.d.ts.map +0 -1
- package/dist/web/routes/ai.js +0 -186
- package/dist/web/routes/ai.js.map +0 -1
- package/dist/web/routes/token-usage.d.ts +0 -7
- package/dist/web/routes/token-usage.d.ts.map +0 -1
- package/dist/web/routes/token-usage.js +0 -18
- package/dist/web/routes/token-usage.js.map +0 -1
- package/dist/web/ssrf-guard.d.ts +0 -35
- package/dist/web/ssrf-guard.d.ts.map +0 -1
- package/dist/web/ssrf-guard.js +0 -93
- package/dist/web/ssrf-guard.js.map +0 -1
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
- package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
- package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
- package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
- package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
- package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
- package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
- package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
- package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
- package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
- package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
- package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
- package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
- package/dist/web/static/assets/index-CBX47X8l.js +0 -3
- package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
- package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
- package/dist/web/static/assets/query-C99w429o.js +0 -2
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":["ROUTE_META","resolveRouteMeta","pathname","clean","stripTrailingSlash","p","KEY","detect","saved","apply","current","subs","getTheme","setTheme","cb","subscribeTheme","useTheme","setT","useState","useEffect","DEBOUNCE_MS","PER_ENTITY_LIMIT","fetchJson","url","res","runAll","q","trimmed","encoded","sessRes","taskRes","kbRes","GlobalSearch","onNavigate","navigate","useNavigate","query","setQuery","results","setResults","loading","setLoading","timer","useRef","seqRef","seq","r","goToBestEntity","useCallback","counts","best","acc","c","target","totalHits","groups","useMemo","s","t","k","jsxs","jsx","Input","IconSearch","Spin","Empty","g","Typography","Tag","it","e","NotificationPanel","onClose","vio","vLoading","useQuery","ins","iLoading","vCount","iCount","Tabs","Skeleton","v","parseUTC","timestamp","normalizeTimestamp","parseTimestamp","ts","pad2","n","formatLocalDisplay","opts","d","yyyy","mm","dd","hh","min","base","withSec","suffix","formatRelative","diff","mins","hours","formatAge","ms","STATUS_CONFIG","DaemonBadge","data","status","_a","cfg","heartbeatAgeMs","_b","pid","_c","tooltipContent","Tooltip","pickStatus","DoctorBadge","Sider","Header","Content","ArcoLayout","MenuItem","Menu","NAV_ITEMS","IconDashboard","IconList","IconBook","IconBranch","IconExclamationCircle","IconSettings","deriveMenuKey","Layout","location","useLocation","collapsed","setCollapsed","theme","menuSelectedKey","handleMenuClick","key","breadcrumbs","meta","toggleTheme","searchOpen","setSearchOpen","notifOpen","setNotifOpen","notifBadge","vRes","iRes","i","hasUnread","item","Space","IconMenuUnfold","IconMenuFold","Popover","Badge","IconNotification","IconMoon","IconSun","Avatar","IconUser","Breadcrumb","Outlet","mergeSearch","to","currentSearch","path","toQuery","merged","LegacyRedirect","Navigate","ParamRedirect","param","tpl","params","useParams","HealthHomePage","lazy","TasksHubPage","ContextInsightsPage","SkillContentPage","AgentContentPage","ViolationsPage","SettingsPage","DaemonHealthPage","DiagnosticsPage","DecisionsPage","NotFound","PageFallback","App","Routes","Route","Suspense","ToastContext","createContext","nextId","ToastProvider","children","toasts","setToasts","remove","id","prev","show","type","message","value","msg","ToastItem","toast","icons","CheckCircle","XCircle","AlertCircle","Info","borderColors","clsx","X","ConfirmContext","useConfirm","ctx","useContext","ConfirmProvider","state","setState","confirm","options","resolve","handleClose","result","variant","iconColor","btnColor","AlertTriangle","queryClient","QueryClient","ReactDOM","React","QueryClientProvider","ConfigProvider","zhCN","BrowserRouter"],"ignoreList":[],"sources":["../../src/lib/breadcrumb-map.ts","../../src/lib/theme.ts","../../src/components/GlobalSearch.tsx","../../src/components/NotificationPanel.tsx","../../src/utils/time.ts","../../src/components/DaemonBadge.tsx","../../src/components/DoctorBadge.tsx","../../src/components/Layout.tsx","../../src/lib/legacy-redirect.tsx","../../src/App.tsx","../../src/components/Toast.tsx","../../src/components/Confirm.tsx","../../src/main.tsx"],"sourcesContent":["/**\n * Path → breadcrumb segments map.\n *\n * v4 IA (Step 1): 6 top-level routes (/health /tasks /context /violations\n * /tuning /settings) — 按\"用户问句\"命名 (spec §2)。所有 v3/v2 legacy\n * routes (/dashboard /pipeline /resources /sessions /tasks/:id /events\n * /knowledge /skills /reports /insights/*) 在 App.tsx 是\n * <LegacyRedirect> 条目,不需要 breadcrumb。\n * /ai-config 老路径在 sub-spec D R-C (spec 0902) 永久下线,落 NotFound。\n *\n * The breadcrumb is kept minimal — view / tab / section disambiguation\n * is shown by the page itself (Tabs, filters) rather than by the\n * breadcrumb chain.\n */\n\nexport interface BreadcrumbItem {\n label: string;\n /** When present, the segment is a link; otherwise it's a plain text leaf. */\n path?: string;\n}\n\nexport interface RouteMeta {\n /** Tab label shown in the multi-tab bar. */\n tabLabel: string;\n /** Crumbs for non-dynamic routes. Dynamic routes resolve dynamically. */\n breadcrumbs: BreadcrumbItem[];\n}\n\nexport const ROUTE_META: Record<string, RouteMeta> = {\n '/health': {\n tabLabel: '整体健康度',\n breadcrumbs: [{ label: '整体健康度' }],\n },\n '/tasks': {\n tabLabel: '我的任务',\n breadcrumbs: [{ label: '我的任务' }],\n },\n '/context': {\n tabLabel: 'AI 在拿什么',\n breadcrumbs: [{ label: 'AI 在拿什么' }],\n },\n '/decisions': {\n tabLabel: '决策',\n breadcrumbs: [{ label: '决策' }],\n },\n '/violations': {\n tabLabel: '出问题了',\n breadcrumbs: [{ label: '出问题了' }],\n },\n '/tuning': {\n tabLabel: '调优',\n breadcrumbs: [{ label: '调优' }],\n },\n '/settings': {\n tabLabel: '设置',\n breadcrumbs: [{ label: '设置' }],\n },\n '/diagnostics': {\n tabLabel: '诊断',\n breadcrumbs: [{ label: '诊断' }],\n },\n '/daemon-health': {\n tabLabel: 'Daemon 健康',\n breadcrumbs: [{ label: 'Daemon 健康' }],\n },\n};\n\n/**\n * Resolve breadcrumb + label for an arbitrary pathname. Returns null when\n * unknown so callers can fall back to a default (\"整体健康度\"). v4 has no\n * dynamic detail routes — DetailDrawer lives in the query string and\n * does not need its own breadcrumb.\n */\nexport function resolveRouteMeta(pathname: string): RouteMeta | null {\n const clean = stripTrailingSlash(pathname);\n return ROUTE_META[clean] ?? null;\n}\n\n/** Set of every concrete top-level pathname known to the router. */\nexport const KNOWN_ROUTES: ReadonlySet<string> = new Set(Object.keys(ROUTE_META));\n\n/**\n * Validator for arbitrary path keys. Kept for backward compatibility with\n * any external caller (previously used by the removed TabStore).\n */\nexport function isKnownRoute(key: string): boolean {\n const path = key.split('?')[0];\n const clean = stripTrailingSlash(path);\n return KNOWN_ROUTES.has(clean);\n}\n\nfunction stripTrailingSlash(p: string): string {\n return p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p;\n}\n","/**\n * Theme module — light / dark with localStorage persistence.\n *\n * Detection order on first read:\n * 1. localStorage `claude-forge:theme` (if `light` or `dark`)\n * 2. window.matchMedia('(prefers-color-scheme: dark)')\n * 3. fallback `light`\n *\n * Apply mechanism: Arco's dark mode uses `body[arco-theme='dark']`. We set or\n * remove that attribute; no ConfigProvider change required.\n *\n * Subscribers (e.g. Layout's toggle button) get notified via `subscribeTheme`.\n */\n\nimport { useEffect, useState } from 'react'\n\nexport type Theme = 'light' | 'dark'\n\nconst KEY = 'claude-forge:theme'\n\nfunction detect(): Theme {\n try {\n const saved = localStorage.getItem(KEY)\n if (saved === 'light' || saved === 'dark') return saved\n } catch {\n // localStorage may throw in restricted environments — ignore.\n }\n try {\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n }\n } catch {\n // ignore\n }\n return 'light'\n}\n\nfunction apply(t: Theme): void {\n if (typeof document === 'undefined') return\n if (t === 'dark') {\n document.body.setAttribute('arco-theme', 'dark')\n } else {\n document.body.removeAttribute('arco-theme')\n }\n}\n\nlet current: Theme = detect()\nconst subs = new Set<(t: Theme) => void>()\n\n// Apply on module import so we don't flash the wrong theme.\napply(current)\n\nexport function getTheme(): Theme {\n return current\n}\n\nexport function setTheme(t: Theme): void {\n if (t === current) return\n current = t\n try {\n localStorage.setItem(KEY, t)\n } catch {\n // ignore\n }\n apply(t)\n subs.forEach((cb) => cb(t))\n}\n\nexport function toggleTheme(): Theme {\n const next: Theme = current === 'light' ? 'dark' : 'light'\n setTheme(next)\n return next\n}\n\nexport function subscribeTheme(cb: (t: Theme) => void): () => void {\n subs.add(cb)\n return () => {\n subs.delete(cb)\n }\n}\n\n/** React hook — returns [theme, setTheme]. */\nexport function useTheme(): [Theme, (t: Theme) => void] {\n const [t, setT] = useState<Theme>(getTheme)\n useEffect(() => subscribeTheme(setT), [])\n return [t, setTheme]\n}\n","/**\n * GlobalSearch — topbar Popover that fans out to 3 endpoints in parallel.\n *\n * Entities scanned (v4 + spec 3 partial revert):\n * - Sessions → /api/sessions?search= → land on /tasks?session=…\n * - Tasks → /api/tasks?search= → land on /tasks?task=…\n * - Knowledge → /api/knowledge/query?q=&… → land on /context?tab=kb&page=…\n *\n * v4 cleanup (C-1): removed the \"Events\" group entirely (no events landing\n * page in v4; the old /events route was a LegacyRedirect stub).\n *\n * Spec 3 partial revert (2026-05-27): the Knowledge group was deleted in the\n * original Option B cut and restored here after user feedback (/context page\n * + /api/knowledge route both came back).\n *\n * Behaviour:\n * - Debounce 250ms before firing the queries (Promise.allSettled — partial\n * failures don't block the rest).\n * - Enter jumps to the entity list page with the most matches, carrying\n * `?q=` (TasksHub) or `?tab=kb` (Context).\n * - Clicking a result row jumps to that entity's detail (or list w/ filter).\n * - ESC / external click closes the Popover (handled by Arco Popover).\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport Input from '@arco-design/web-react/es/Input'\nimport Spin from '@arco-design/web-react/es/Spin'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport { IconSearch } from '@arco-design/web-react/icon'\n\ninterface SessionHit {\n session_id: string\n first_prompt: string\n}\ninterface TaskHit {\n id: string\n title?: string\n first_prompt?: string\n}\ninterface KbHit {\n page: { name: string; title?: string }\n score?: number\n}\n\ninterface AllResults {\n sessions: SessionHit[]\n tasks: TaskHit[]\n kb: KbHit[]\n}\n\nconst DEBOUNCE_MS = 250\nconst PER_ENTITY_LIMIT = 5\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`${url} → ${res.status}`)\n return res.json() as Promise<T>\n}\n\nasync function runAll(q: string): Promise<AllResults> {\n const trimmed = q.trim().slice(0, 200)\n if (!trimmed) {\n return { sessions: [], tasks: [], kb: [] }\n }\n const encoded = encodeURIComponent(trimmed)\n const [sessRes, taskRes, kbRes] = await Promise.allSettled([\n fetchJson<SessionHit[]>(`/api/sessions?search=${encoded}&limit=${PER_ENTITY_LIMIT}`),\n fetchJson<{ tasks: TaskHit[] }>(`/api/tasks?search=${encoded}&limit=${PER_ENTITY_LIMIT}`),\n fetchJson<{ pages: KbHit[] }>(`/api/knowledge/query?q=${encoded}&strategy=keyword&max=${PER_ENTITY_LIMIT}`),\n ])\n return {\n sessions: sessRes.status === 'fulfilled' ? sessRes.value : [],\n tasks: taskRes.status === 'fulfilled' ? (taskRes.value.tasks ?? []) : [],\n kb: kbRes.status === 'fulfilled' ? (kbRes.value.pages ?? []) : [],\n }\n}\n\ninterface GlobalSearchProps {\n /** Called after the user navigates somewhere — Layout uses this to close\n * the Popover. */\n onNavigate?: () => void\n}\n\nexport default function GlobalSearch({ onNavigate }: GlobalSearchProps) {\n const navigate = useNavigate()\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<AllResults | null>(null)\n const [loading, setLoading] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const seqRef = useRef(0)\n\n useEffect(() => {\n if (timer.current) clearTimeout(timer.current)\n const q = query.trim()\n if (!q) {\n setResults(null)\n setLoading(false)\n return\n }\n setLoading(true)\n const seq = ++seqRef.current\n timer.current = setTimeout(async () => {\n const r = await runAll(q)\n if (seq !== seqRef.current) return // stale\n setResults(r)\n setLoading(false)\n }, DEBOUNCE_MS)\n return () => {\n if (timer.current) clearTimeout(timer.current)\n }\n }, [query])\n\n const goToBestEntity = useCallback(() => {\n if (!results) return\n // v4 (C-1): sessions/tasks both land at TasksHub (?q= is the search param\n // TasksHubPage reads, not ?search=). KB lands at the Context KB tab.\n const counts: Array<{ key: keyof AllResults; path: string; n: number }> = [\n { key: 'sessions', path: '/tasks', n: results.sessions.length },\n { key: 'tasks', path: '/tasks', n: results.tasks.length },\n { key: 'kb', path: '/context?tab=kb', n: results.kb.length },\n ]\n const best = counts.reduce((acc, c) => (c.n > acc.n ? c : acc), counts[0])\n if (best.n === 0) return\n const q = encodeURIComponent(query.trim())\n // Append ?q= to TasksHub; KB path already has its own query.\n const target = best.path.includes('?')\n ? `${best.path}&q=${q}`\n : `${best.path}?q=${q}`\n navigate(target)\n onNavigate?.()\n }, [results, query, navigate, onNavigate])\n\n const totalHits =\n (results?.sessions.length ?? 0) +\n (results?.tasks.length ?? 0) +\n (results?.kb.length ?? 0)\n\n const groups = useMemo(() => {\n if (!results) return []\n // v4 (C-1): all row clicks land directly on v4 routes — no /sessions/:id\n // → ParamRedirect → /tasks?session=… double-hop.\n return [\n {\n label: '会话',\n path: '/tasks',\n items: results.sessions.map((s) => ({\n key: `s-${s.session_id}`,\n label: s.first_prompt || `(${s.session_id.slice(0, 8)})`,\n onClick: () => {\n navigate(`/tasks?session=${encodeURIComponent(s.session_id)}`)\n onNavigate?.()\n },\n })),\n },\n {\n label: '任务',\n path: '/tasks',\n items: results.tasks.map((t) => ({\n key: `t-${t.id}`,\n label: t.title || t.first_prompt || `(任务 ${t.id.slice(0, 8)})`,\n onClick: () => {\n navigate(`/tasks?task=${encodeURIComponent(t.id)}`)\n onNavigate?.()\n },\n })),\n },\n {\n label: '知识库',\n path: '/context?tab=kb',\n items: results.kb.map((k) => ({\n key: `k-${k.page.name}`,\n label: k.page.title || k.page.name,\n onClick: () => {\n // ContextInsightsPage may consume ?page= for deep-scroll into a\n // specific KB page; for now landing on the KB tab is enough.\n navigate(`/context?tab=kb&page=${encodeURIComponent(k.page.name)}`)\n onNavigate?.()\n },\n })),\n },\n ]\n }, [results, navigate, onNavigate])\n\n return (\n <div style={{ width: 360, maxHeight: 480, overflowY: 'auto' }}>\n <Input.Search\n autoFocus\n value={query}\n onChange={setQuery}\n onPressEnter={goToBestEntity}\n placeholder=\"搜索 sessions / tasks / 知识库...\"\n allowClear\n prefix={<IconSearch />}\n style={{ width: '100%' }}\n />\n <div style={{ marginTop: 12 }}>\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '24px 0' }}>\n <Spin size={20} />\n </div>\n ) : !results ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 输入关键词后回车跳转到结果最多的页面。\n </Typography.Text>\n ) : totalHits === 0 ? (\n <Empty description=\"无匹配结果\" imgSrc=\"\" style={{ padding: '12px 0' }} />\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {groups.map((g) =>\n g.items.length === 0 ? null : (\n <div key={g.label}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n marginBottom: 4,\n }}\n >\n <Typography.Text style={{ fontSize: 11, color: 'var(--color-text-3)' }}>\n {g.label}\n </Typography.Text>\n <Tag size=\"small\" color=\"gray\">{g.items.length}</Tag>\n </div>\n <ul style={{ listStyle: 'none', padding: 0, margin: 0 }}>\n {g.items.map((it) => (\n <li\n key={it.key}\n onClick={it.onClick}\n style={{\n padding: '6px 8px',\n fontSize: 12,\n color: 'var(--color-text-1)',\n cursor: 'pointer',\n borderRadius: 4,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--color-fill-2)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n }}\n >\n {it.label}\n </li>\n ))}\n </ul>\n </div>\n ),\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * NotificationPanel — topbar bell Popover content.\n *\n * Two tabs:\n * - 违规 → /api/violations?days=7&limit=10\n * - 反模式 → /api/insights?days=7 (severity = critical | warn | info)\n *\n * v1 doesn't track read-state — the red dot is purely a function of \"any\n * violations or any critical/warn anti-patterns in the past 7 days\".\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useNavigate } from 'react-router-dom'\nimport Tabs from '@arco-design/web-react/es/Tabs'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\n\ninterface ApiViolation {\n timestamp: string\n summary: string\n signal: 'routing_disobeyed' | 'user_keyword'\n detectedKeyword: string | null\n expectedAgent: string | null\n relativeTime: string\n}\ninterface ViolationsResponse {\n count: number\n violations: ApiViolation[]\n}\n\ninterface AntiPattern {\n id: string\n type: string\n severity: 'critical' | 'warn' | 'info'\n title: string\n description: string\n detectedAt: string\n sessionId?: string\n}\ninterface InsightsResponse {\n summary: { total: number; critical: number; warn: number; info: number }\n patterns: AntiPattern[]\n}\n\ninterface NotificationPanelProps {\n onClose?: () => void\n}\n\nexport default function NotificationPanel({ onClose }: NotificationPanelProps) {\n const navigate = useNavigate()\n\n const { data: vio, isLoading: vLoading } = useQuery({\n queryKey: ['notifications-violations'],\n queryFn: async (): Promise<ViolationsResponse> => {\n const res = await fetch('/api/violations?days=7&limit=10')\n if (!res.ok) throw new Error('Failed')\n return res.json()\n },\n refetchOnMount: 'always',\n })\n\n const { data: ins, isLoading: iLoading } = useQuery({\n queryKey: ['notifications-insights'],\n queryFn: async (): Promise<InsightsResponse> => {\n const res = await fetch('/api/insights?days=7')\n if (!res.ok) throw new Error('Failed')\n return res.json()\n },\n refetchOnMount: 'always',\n })\n\n const vCount = vio?.count ?? 0\n const iCount = (ins?.summary.critical ?? 0) + (ins?.summary.warn ?? 0)\n\n return (\n <div style={{ width: 360, maxHeight: 480, overflowY: 'auto' }}>\n <Tabs defaultActiveTab=\"violations\" size=\"mini\">\n <Tabs.TabPane key=\"violations\" title={`违规${vCount > 0 ? ` (${vCount})` : ''}`}>\n {vLoading ? (\n <Skeleton text={{ rows: 3 }} animation />\n ) : !vio || vio.count === 0 ? (\n <Empty description=\"近 7 天无违规\" imgSrc=\"\" style={{ padding: '12px 0' }} />\n ) : (\n <ul style={{ listStyle: 'none', padding: 0, margin: 0 }}>\n {vio.violations.map((v) => (\n <li\n key={v.timestamp + v.summary.slice(0, 16)}\n style={{\n padding: '8px 4px',\n borderBottom: '1px solid var(--color-border-2)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <Tag size=\"small\" color={v.signal === 'user_keyword' ? 'red' : 'orange'}>\n {v.signal === 'user_keyword' ? '关键词' : '路由'}\n </Tag>\n <span style={{ fontSize: 11, color: 'var(--color-text-3)' }}>{v.relativeTime}</span>\n </div>\n <div\n style={{\n fontSize: 12,\n color: 'var(--color-text-1)',\n marginTop: 4,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={v.summary}\n >\n {v.summary.slice(0, 60)}\n {v.summary.length > 60 ? '…' : ''}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Tabs.TabPane>\n <Tabs.TabPane key=\"insights\" title={`反模式${iCount > 0 ? ` (${iCount})` : ''}`}>\n {iLoading ? (\n <Skeleton text={{ rows: 3 }} animation />\n ) : !ins || ins.patterns.length === 0 ? (\n <Empty description=\"近 7 天无反模式\" imgSrc=\"\" style={{ padding: '12px 0' }} />\n ) : (\n <ul style={{ listStyle: 'none', padding: 0, margin: 0 }}>\n {ins.patterns.slice(0, 10).map((p) => (\n <li\n key={p.id}\n style={{\n padding: '8px 4px',\n borderBottom: '1px solid var(--color-border-2)',\n cursor: p.sessionId ? 'pointer' : 'default',\n }}\n onClick={() => {\n if (p.sessionId) {\n // v4 (C-2): direct to /tasks?session=… avoids\n // /sessions/:id → ParamRedirect double-hop.\n navigate(`/tasks?session=${encodeURIComponent(p.sessionId)}`)\n onClose?.()\n }\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <Tag\n size=\"small\"\n color={\n p.severity === 'critical' ? 'red' : p.severity === 'warn' ? 'orange' : 'gray'\n }\n >\n {p.severity}\n </Tag>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>\n {p.title}\n </Typography.Text>\n </div>\n <div\n style={{\n fontSize: 11,\n color: 'var(--color-text-3)',\n marginTop: 4,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={p.description}\n >\n {p.description}\n </div>\n </li>\n ))}\n </ul>\n )}\n </Tabs.TabPane>\n </Tabs>\n </div>\n )\n}\n","/**\n * SQLite stores ISO timestamps without 'Z' suffix.\n * JS `new Date()` treats such strings as local time, causing an offset.\n * This helper ensures the timestamp is always parsed as UTC.\n *\n * @deprecated Use parseTimestamp() for new code.\n */\nexport function parseUTC(timestamp: string | null | undefined): Date {\n if (!timestamp) return new Date(0);\n const s = timestamp.trim();\n if (s.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(s)) {\n return new Date(s);\n }\n return new Date(s + 'Z');\n}\n\n// ─── Mirrored from src/core/utils/time.ts (spec 1635) ─────────────────────\n// Browser-compatible: no process.env, no Node-only APIs.\n\n/**\n * 归一化时间戳,确保带 Z 后缀\n */\nfunction normalizeTimestamp(timestamp: string): string {\n if (!timestamp) return new Date().toISOString();\n return timestamp.endsWith('Z') ? timestamp : timestamp + 'Z';\n}\n\n/**\n * 将\"可能 naive 的 UTC ISO 串\"安全转换为 Date 实例。\n * string 入参走 normalizeTimestamp 补 Z;number 入参直通 new Date(n)(毫秒值)。\n * 非法输入返回 epoch(不抛错)。\n *\n * 例:'2026-05-27T08:24:13.123' (naive UTC) → Date 表示 16:24 local (UTC+8)\n */\nexport function parseTimestamp(ts: string | number): Date {\n if (typeof ts === 'number') {\n return new Date(ts);\n }\n try {\n return new Date(normalizeTimestamp(ts));\n } catch {\n return new Date(0);\n }\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/**\n * 格式化为本地时区显示,默认 `2026-05-27 16:24 CST`。\n * opts.includeSeconds: 输出 `2026-05-27 16:24:13 CST`\n * opts.dateOnly: 输出 `2026-05-27`\n * opts.tzSuffix: 默认 'CST';传 '' 跳过后缀\n * 非法输入返回 '—'。\n */\nexport function formatLocalDisplay(\n ts: string | number,\n opts?: { includeSeconds?: boolean; dateOnly?: boolean; tzSuffix?: string },\n): string {\n try {\n const d = parseTimestamp(ts);\n if (isNaN(d.getTime())) return '—';\n const yyyy = d.getFullYear();\n const mm = pad2(d.getMonth() + 1);\n const dd = pad2(d.getDate());\n if (opts?.dateOnly) return `${yyyy}-${mm}-${dd}`;\n const hh = pad2(d.getHours());\n const min = pad2(d.getMinutes());\n const base = `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n const withSec = opts?.includeSeconds ? `:${pad2(d.getSeconds())}` : '';\n const suffix = opts?.tzSuffix !== undefined ? opts.tzSuffix : 'CST';\n return suffix ? `${base}${withSec} ${suffix}` : `${base}${withSec}`;\n } catch {\n return '—';\n }\n}\n\n/**\n * 格式化为 UTC 显示,`2026-05-27 08:24 UTC`。\n * opts.includeSeconds: 加 `:13`\n * opts.dateOnly: 仅 `2026-05-27`(UTC 日期)\n * 非法输入返回 '—'。\n */\nexport function formatUTCDisplay(\n ts: string | number,\n opts?: { includeSeconds?: boolean; dateOnly?: boolean },\n): string {\n try {\n const d = parseTimestamp(ts);\n if (isNaN(d.getTime())) return '—';\n const yyyy = d.getUTCFullYear();\n const mm = pad2(d.getUTCMonth() + 1);\n const dd = pad2(d.getUTCDate());\n if (opts?.dateOnly) return `${yyyy}-${mm}-${dd}`;\n const hh = pad2(d.getUTCHours());\n const min = pad2(d.getUTCMinutes());\n const base = `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n const withSec = opts?.includeSeconds ? `:${pad2(d.getUTCSeconds())}` : '';\n return `${base}${withSec} UTC`;\n } catch {\n return '—';\n }\n}\n\n/**\n * 相对时间:`刚刚` / `5 分钟前` / `2 小时前` / `3 天前`。\n * 非法或未来时间返回 '刚刚'。\n */\nexport function formatRelative(ts: string | number): string {\n try {\n const d = parseTimestamp(ts);\n if (isNaN(d.getTime())) return '—';\n const diff = Date.now() - d.getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return '刚刚';\n if (mins < 60) return `${mins} 分钟前`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours} 小时前`;\n return `${Math.floor(hours / 24)} 天前`;\n } catch {\n return '—';\n }\n}\n\n/**\n * 本地日期串(用于文件名),`2026-05-27`(本地时区)。\n * 省略参数时使用 Date.now()。\n */\nexport function formatLocalDateForFilename(ts?: string | number): string {\n const d = ts !== undefined ? parseTimestamp(ts) : new Date();\n if (isNaN(d.getTime())) return formatLocalDateForFilename();\n const yyyy = d.getFullYear();\n const mm = pad2(d.getMonth() + 1);\n const dd = pad2(d.getDate());\n return `${yyyy}-${mm}-${dd}`;\n}\n","/**\n * DaemonBadge — top-bar indicator for daemon liveness.\n *\n * Polls /api/health every 30s and renders a small colored dot + label:\n * green = ALIVE (heartbeat fresh)\n * orange = STALE (heartbeat > 3min ago but PID still alive)\n * red = DEAD (no PID or heartbeat absent)\n *\n * Clicking the badge navigates to /daemon-health.\n *\n * Spec: docs/design/2026-05-28/0843-daemon-watchdog-spec.md §5 Commit 3 Q4\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useNavigate } from 'react-router-dom'\nimport { Tooltip } from '@arco-design/web-react'\nimport { formatRelative } from '../utils/time'\n\ninterface HealthResponse {\n daemon: {\n status: 'alive' | 'stale' | 'dead'\n pid: number | null\n heartbeat_age_ms: number | null\n started_at: number | null\n version: string | null\n }\n}\n\nfunction formatAge(ms: number | null): string {\n if (ms == null) return 'no heartbeat'\n // Convert age-in-ms to a past timestamp, then format relative\n return formatRelative(Date.now() - ms)\n}\n\nconst STATUS_CONFIG = {\n alive: {\n color: '#00b42a', // green\n label: 'Daemon ALIVE',\n dotStyle: { background: '#00b42a' },\n },\n stale: {\n color: '#ff7d00', // orange\n label: 'Daemon STALE',\n dotStyle: { background: '#ff7d00' },\n },\n dead: {\n color: '#f53f3f', // red\n label: 'Daemon DEAD',\n dotStyle: { background: '#f53f3f' },\n },\n} as const\n\nexport default function DaemonBadge() {\n const navigate = useNavigate()\n\n const { data } = useQuery<HealthResponse>({\n queryKey: ['daemon-health'],\n queryFn: async () => {\n const res = await fetch('/api/health')\n if (!res.ok) throw new Error('health check failed')\n return res.json()\n },\n refetchInterval: 30_000,\n retry: false,\n staleTime: 15_000,\n })\n\n const status = data?.daemon?.status ?? 'dead'\n const cfg = STATUS_CONFIG[status]\n const heartbeatAgeMs = data?.daemon?.heartbeat_age_ms ?? null\n const pid = data?.daemon?.pid\n\n const tooltipContent = [\n `Status: ${status.toUpperCase()}`,\n pid != null ? `PID: ${pid}` : 'PID: not running',\n `Heartbeat: ${formatAge(heartbeatAgeMs)}`,\n ].join('\\n')\n\n return (\n <Tooltip\n content={<span style={{ whiteSpace: 'pre-line' }}>{tooltipContent}</span>}\n position=\"bottom\"\n >\n <button\n onClick={() => navigate('/daemon-health')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: 6,\n color: 'var(--color-text-2)',\n fontSize: 12,\n }}\n aria-label={`daemon-badge-${status}`}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n display: 'inline-block',\n ...cfg.dotStyle,\n ...(status === 'alive'\n ? {\n boxShadow: `0 0 0 2px ${cfg.color}33`,\n animation: 'daemon-pulse 2s infinite',\n }\n : {}),\n }}\n />\n <span style={{ color: cfg.color, fontWeight: 500 }}>{status.toUpperCase()}</span>\n </button>\n </Tooltip>\n )\n}\n","/**\n * DoctorBadge — top-bar indicator for `cf doctor` aggregate health.\n *\n * Polls /api/diagnostics every 60s. Colors:\n * green = all checks pass (or only skip)\n * orange = some warn but no fail\n * red = at least one fail\n *\n * Clicking the badge navigates to /diagnostics.\n *\n * Spec: docs/design/2026-06-01/1030-cf-doctor-diagnostic-spec.md\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useNavigate } from 'react-router-dom'\nimport { Tooltip } from '@arco-design/web-react'\n\ninterface DiagnosticsResponse {\n summary: {\n pass: number\n warn: number\n fail: number\n skip: number\n fixable: number\n }\n checks: Array<{ id: number; name: string; status: string }>\n generated_at: string\n}\n\ntype BadgeStatus = 'pass' | 'warn' | 'fail' | 'unknown'\n\nfunction pickStatus(d: DiagnosticsResponse | undefined): BadgeStatus {\n if (!d) return 'unknown'\n if (d.summary.fail > 0) return 'fail'\n if (d.summary.warn > 0) return 'warn'\n return 'pass'\n}\n\nconst STATUS_CONFIG: Record<BadgeStatus, { color: string; label: string }> = {\n pass: { color: '#00b42a', label: 'Doctor OK' },\n warn: { color: '#ff7d00', label: 'Doctor WARN' },\n fail: { color: '#f53f3f', label: 'Doctor FAIL' },\n unknown: { color: '#86909c', label: 'Doctor ?' },\n}\n\nexport default function DoctorBadge() {\n const navigate = useNavigate()\n const { data } = useQuery<DiagnosticsResponse>({\n queryKey: ['diagnostics-badge'],\n queryFn: async () => {\n const res = await fetch('/api/diagnostics')\n if (!res.ok) throw new Error('diagnostics failed')\n return res.json()\n },\n refetchInterval: 60_000,\n retry: false,\n staleTime: 30_000,\n })\n\n const status = pickStatus(data)\n const cfg = STATUS_CONFIG[status]\n\n const tooltipContent = data\n ? [\n `PASS=${data.summary.pass}`,\n `WARN=${data.summary.warn}`,\n `FAIL=${data.summary.fail}`,\n `SKIP=${data.summary.skip}`,\n data.summary.fixable > 0 ? `${data.summary.fixable} fixable` : '',\n ]\n .filter(Boolean)\n .join(' · ')\n : 'Loading diagnostics…'\n\n return (\n <Tooltip content={tooltipContent} position=\"bottom\">\n <button\n onClick={() => navigate('/diagnostics')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n padding: '4px 8px',\n borderRadius: 6,\n color: 'var(--color-text-2)',\n fontSize: 12,\n }}\n aria-label={`doctor-badge-${status}`}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n display: 'inline-block',\n background: cfg.color,\n }}\n />\n <span style={{ color: cfg.color, fontWeight: 500 }}>{cfg.label}</span>\n </button>\n </Tooltip>\n )\n}\n","/**\n * Top-level Arco Layout for claude-forge web.\n *\n * Implements PR3-arco-1 + post-arco-2 cleanup:\n * - <Layout.Sider> with 220↔64 collapse + sectioned <Menu>\n * - <Layout.Header> with brand chip + search + topbar icons + avatar\n * - <Layout.Content> renders <Breadcrumb> + active page <Outlet>\n *\n * Multi-tab UI has been removed (user decision: sidebar-only navigation).\n * Breadcrumb is kept as an independent component driven by breadcrumb-map.\n */\n\nimport { Outlet, useLocation, useNavigate } from 'react-router-dom'\nimport { useCallback, useMemo, useState } from 'react'\nimport {\n Layout as ArcoLayout,\n Menu,\n Breadcrumb,\n Input,\n Space,\n Avatar,\n Tooltip,\n Popover,\n Badge,\n} from '@arco-design/web-react'\nimport { useQuery } from '@tanstack/react-query'\nimport {\n IconBook,\n IconSettings,\n IconSearch,\n IconNotification,\n IconSun,\n IconMoon,\n IconMenuFold,\n IconMenuUnfold,\n IconUser,\n IconDashboard,\n IconList,\n IconExclamationCircle,\n IconBranch,\n} from '@arco-design/web-react/icon'\n\nimport {\n resolveRouteMeta,\n ROUTE_META,\n} from '../lib/breadcrumb-map'\nimport { useTheme } from '../lib/theme'\nimport GlobalSearch from './GlobalSearch'\nimport NotificationPanel from './NotificationPanel'\nimport DaemonBadge from './DaemonBadge'\nimport DoctorBadge from './DoctorBadge'\n\nconst { Sider, Header, Content } = ArcoLayout\nconst MenuItem = Menu.Item\n\nconst PIN_DASHBOARD_KEY = '/health'\n\n// --- sidebar nav model -------------------------------------------------------\n\ninterface NavItem {\n key: string\n label: string\n icon: React.ReactNode\n}\n\n/**\n * v4 IA + spec 3 partial revert (2026-05-27): 一级 nav 5 项(用户反馈砍掉的\n * 5 page 里 4 page 实际日常需要 — /context, /context/skill, /context/agent,\n * /settings 全部恢复 active)。\n *\n * 仍然隐藏:/tuning(obeyed-ratio 在 HealthHomePage \"C4 主线程听劝率\" 卡片\n * 已可见,无独立入口)。\n *\n * Revert /tuning recipe 见 docs/implementation/2026-05-27/1404-spec3-*-changelog.md § 5.\n */\nconst NAV_ITEMS: NavItem[] = [\n { key: '/health', label: '整体健康度', icon: <IconDashboard /> },\n { key: '/tasks', label: '我的任务', icon: <IconList /> },\n { key: '/context', label: 'AI 在拿什么', icon: <IconBook /> },\n { key: '/decisions', label: '决策', icon: <IconBranch /> },\n { key: '/violations', label: '出问题了', icon: <IconExclamationCircle /> },\n { key: '/settings', label: '设置', icon: <IconSettings /> },\n]\n\n// --- helpers -----------------------------------------------------------------\n\n/** Match the sidebar Menu's selectedKey for a given pathname (v4 IA + spec 3 partial revert). */\nfunction deriveMenuKey(pathname: string): string {\n const clean = pathname.replace(/\\/$/, '') || '/health'\n if (clean === '/health' || clean.startsWith('/health/')) return '/health'\n if (clean === '/tasks' || clean.startsWith('/tasks/')) return '/tasks'\n if (clean === '/context' || clean.startsWith('/context/')) return '/context'\n if (clean === '/decisions' || clean.startsWith('/decisions/')) return '/decisions'\n if (clean === '/violations' || clean.startsWith('/violations/')) return '/violations'\n if (clean === '/settings' || clean.startsWith('/settings/')) return '/settings'\n // Fallback for transient legacy paths before redirect kicks in (e.g. while\n // /tuning LegacyRedirect is mid-flight to /health).\n return '/health'\n}\n\n// --- component ---------------------------------------------------------------\n\nexport default function Layout() {\n const location = useLocation()\n const navigate = useNavigate()\n const [collapsed, setCollapsed] = useState(false)\n const [theme, setTheme] = useTheme()\n\n // --- menu handlers ---------------------------------------------------------\n\n const menuSelectedKey = useMemo(\n () => deriveMenuKey(location.pathname),\n [location.pathname],\n )\n\n const handleMenuClick = useCallback(\n (key: string) => {\n if (key !== location.pathname) navigate(key)\n },\n [location.pathname, navigate],\n )\n\n // --- breadcrumb ------------------------------------------------------------\n\n const breadcrumbs = useMemo(() => {\n const meta = resolveRouteMeta(location.pathname)\n return meta?.breadcrumbs ?? [{ label: '整体健康度' }]\n }, [location.pathname])\n\n // --- theme toggle (wired in PR3-arco-4, persisted via lib/theme) -----------\n\n const toggleTheme = useCallback(() => {\n setTheme(theme === 'light' ? 'dark' : 'light')\n }, [theme, setTheme])\n\n // --- topbar search + notifications (PR3-arco-4) ---------------------------\n\n const [searchOpen, setSearchOpen] = useState(false)\n const [notifOpen, setNotifOpen] = useState(false)\n\n // Red dot: any violation OR any critical/warn anti-pattern in past 7d.\n const { data: notifBadge } = useQuery({\n queryKey: ['notifications-badge'],\n queryFn: async (): Promise<{ hasUnread: boolean }> => {\n try {\n const [vRes, iRes] = await Promise.all([\n fetch('/api/violations?days=7&limit=1'),\n fetch('/api/insights?days=7'),\n ])\n const v = vRes.ok ? await vRes.json() : { count: 0 }\n const i = iRes.ok ? await iRes.json() : { summary: { critical: 0, warn: 0 } }\n return {\n hasUnread:\n (v.count ?? 0) > 0 ||\n (i.summary?.critical ?? 0) + (i.summary?.warn ?? 0) > 0,\n }\n } catch {\n return { hasUnread: false }\n }\n },\n refetchInterval: 60000,\n })\n const hasUnread = notifBadge?.hasUnread ?? false\n\n // --- render ----------------------------------------------------------------\n\n return (\n <ArcoLayout style={{ minHeight: '100vh' }}>\n <Sider\n collapsed={collapsed}\n collapsible\n collapsedWidth={64}\n width={220}\n trigger={null}\n breakpoint=\"lg\"\n style={{\n background: 'var(--color-bg-2)',\n borderRight: '1px solid var(--color-border)',\n }}\n >\n <div\n style={{\n height: 64,\n display: 'flex',\n alignItems: 'center',\n justifyContent: collapsed ? 'center' : 'flex-start',\n padding: collapsed ? 0 : '0 20px',\n borderBottom: '1px solid var(--color-border-2)',\n gap: 10,\n }}\n >\n <span className=\"cf-brand-chip\">CF</span>\n {!collapsed && (\n <span style={{ fontSize: 14, fontWeight: 600, color: 'var(--color-text-1)' }}>\n Claude Forge\n </span>\n )}\n </div>\n\n <Menu\n selectedKeys={[menuSelectedKey]}\n mode=\"vertical\"\n onClickMenuItem={handleMenuClick}\n style={{ width: '100%', border: 'none', background: 'transparent' }}\n >\n {NAV_ITEMS.map((item) => (\n <MenuItem key={item.key}>\n {item.icon}\n {item.label}\n </MenuItem>\n ))}\n </Menu>\n\n {!collapsed && (\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n padding: '12px 16px',\n borderTop: '1px solid var(--color-border-2)',\n fontSize: 11,\n color: 'var(--color-text-3)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>claude-forge</span>\n <span style={{ fontFamily: 'monospace' }}>v{__APP_VERSION__}</span>\n </div>\n )}\n </Sider>\n\n <ArcoLayout>\n <Header\n style={{\n height: 60,\n background: 'var(--color-bg-2)',\n borderBottom: '1px solid var(--color-border)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n }}\n >\n <Space size={12}>\n <Tooltip content={collapsed ? '展开侧栏' : '收起侧栏'}>\n <button\n onClick={() => setCollapsed((c) => !c)}\n style={{\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--color-text-2)',\n padding: 6,\n display: 'inline-flex',\n alignItems: 'center',\n }}\n aria-label=\"toggle-sider\"\n >\n {collapsed ? <IconMenuUnfold /> : <IconMenuFold />}\n </button>\n </Tooltip>\n <Popover\n trigger=\"click\"\n position=\"bl\"\n popupVisible={searchOpen}\n onVisibleChange={setSearchOpen}\n content={\n <GlobalSearch onNavigate={() => setSearchOpen(false)} />\n }\n >\n <Input.Search\n placeholder=\"搜索 sessions / tasks / 知识库...\"\n style={{ width: 280 }}\n allowClear\n readOnly\n prefix={<IconSearch />}\n onClick={() => setSearchOpen(true)}\n />\n </Popover>\n </Space>\n\n <Space size={16}>\n {/* Daemon health badge (watchdog spec 0843) */}\n <DaemonBadge />\n {/* Doctor diagnostic badge (spec 1a41b43a) */}\n <DoctorBadge />\n <Popover\n trigger=\"click\"\n position=\"br\"\n popupVisible={notifOpen}\n onVisibleChange={setNotifOpen}\n content={\n <NotificationPanel onClose={() => setNotifOpen(false)} />\n }\n >\n <Tooltip content=\"通知\">\n <button\n style={{\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--color-text-2)',\n padding: 6,\n display: 'inline-flex',\n alignItems: 'center',\n }}\n aria-label=\"notifications\"\n >\n <Badge dot={hasUnread} count={0} offset={[-2, 2]}>\n <IconNotification />\n </Badge>\n </button>\n </Tooltip>\n </Popover>\n <Tooltip content={theme === 'light' ? '切换深色主题' : '切换浅色主题'}>\n <button\n onClick={toggleTheme}\n style={{\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n color: 'var(--color-text-2)',\n padding: 6,\n display: 'inline-flex',\n alignItems: 'center',\n }}\n aria-label=\"toggle-theme\"\n >\n {theme === 'light' ? <IconMoon /> : <IconSun />}\n </button>\n </Tooltip>\n <Avatar\n size={32}\n style={{ background: 'linear-gradient(135deg,#165DFF,#722ED1)' }}\n >\n <IconUser />\n </Avatar>\n </Space>\n </Header>\n\n <Content\n style={{\n padding: 0,\n background: 'var(--color-bg-2)',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 'calc(100vh - 60px)',\n }}\n >\n <div style={{ padding: '12px 20px 0' }}>\n <Breadcrumb>\n {breadcrumbs.map((c, i) =>\n c.path ? (\n <Breadcrumb.Item key={`${c.label}-${i}`}>\n <a\n onClick={(e) => {\n e.preventDefault()\n if (c.path) navigate(c.path)\n }}\n href={c.path}\n style={{ color: 'var(--color-text-2)' }}\n >\n {c.label}\n </a>\n </Breadcrumb.Item>\n ) : (\n <Breadcrumb.Item key={`${c.label}-${i}`}>{c.label}</Breadcrumb.Item>\n ),\n )}\n </Breadcrumb>\n </div>\n\n <div style={{ padding: '16px 20px 24px', flex: 1 }}>\n <Outlet />\n </div>\n </Content>\n </ArcoLayout>\n </ArcoLayout>\n )\n}\n\n// Surface the known-routes set for tests / dev tools.\nexport { ROUTE_META, PIN_DASHBOARD_KEY }\n","/**\n * Legacy URL redirect React components — Phase E UI refactor (Step 8).\n *\n * Pure data + resolver live in `legacy-redirect-map.ts` (re-exported here\n * for backward-compat). These components are mounted by App.tsx routes.\n *\n * - <LegacyRedirect to=\".../?q=...\" /> plain redirect (no params)\n * - <ParamRedirect base=\"...\" param=\"...\" /> reads :param from URL and\n * forwards it as a query value\n *\n * Both use react-router-dom <Navigate replace> so the browser back button\n * does not loop on the old URL. The redirect entries are kept for 30 days\n * (spec § 3); cleanup tracked as a follow-up task.\n */\nimport { Navigate, useLocation, useParams } from 'react-router-dom'\n\nexport {\n LEGACY_REDIRECTS,\n resolveLegacyRedirect,\n type LegacyRedirectEntry,\n} from './legacy-redirect-map'\n\n/**\n * Merge two query strings. Keys present in `target` win over `current`\n * (so explicit redirect params override original ones), but any extra\n * params from `current` (e.g. `?session_id=xxx`) are preserved.\n */\nfunction mergeSearch(to: string, currentSearch: string): string {\n const [path, toQuery = ''] = to.split('?')\n const merged = new URLSearchParams(toQuery)\n const current = new URLSearchParams(currentSearch || '')\n for (const [k, v] of current.entries()) {\n if (!merged.has(k)) merged.set(k, v)\n }\n const q = merged.toString()\n return q ? `${path}?${q}` : path\n}\n\nexport function LegacyRedirect({ to }: { to: string }) {\n const location = useLocation()\n const target = mergeSearch(to, location.search)\n return <Navigate to={target} replace />\n}\n\n/**\n * Reads URL param `param` (e.g. `:id` or `:taskId`) and substitutes it\n * into the `tpl` query value. Template uses `{}` placeholder. Any\n * additional query string on the incoming URL is preserved (P2 fix).\n *\n * Example:\n * <ParamRedirect base=\"/pipeline\" param=\"id\" tpl=\"?view=session&session={}\" />\n * /sessions/abc123 → /pipeline?view=session&session=abc123\n * /sessions/abc123?foo=bar → /pipeline?view=session&session=abc123&foo=bar\n */\nexport function ParamRedirect({\n base,\n param,\n tpl,\n}: {\n base: string\n param: string\n tpl: string\n}) {\n const params = useParams<Record<string, string>>()\n const location = useLocation()\n const v = params[param] ?? ''\n const query = tpl.replace('{}', encodeURIComponent(v))\n const target = mergeSearch(`${base}${query}`, location.search)\n return <Navigate to={target} replace />\n}\n","import { lazy, Suspense } from 'react'\nimport { Routes, Route, Navigate } from 'react-router-dom'\nimport Layout from './components/Layout'\nimport { LegacyRedirect, ParamRedirect } from './lib/legacy-redirect'\n\n// v4 IA + spec 3 partial revert (2026-05-27): 7 active pages (3 keeper +\n// 4 restored after user feedback). Only /tuning stays hidden.\n// /health (默认) → HealthHomePage (整体健康度) — obeyed-ratio KPI ROW 3\n// /tasks → TasksHubPage (我的任务)\n// /context → ContextInsightsPage (AI 在拿什么 / 知识库入口)\n// /context/skill/:id → SkillContentPage (Skill 详情)\n// /context/agent/:name → AgentContentPage (Agent 详情)\n// /violations → ViolationsPage (出问题了)\n// /settings → SettingsPage (AI 设置)\n//\n// Still hidden (revert recipe in docs/implementation/2026-05-27/1404-spec3-*-changelog.md):\n// /tuning — obeyed-ratio 详情在 /health → \"C4 主线程听劝率\" 已可见\n//\n// 老 URL (v2: /sessions /tasks/:id /events /knowledge /skills /insights/*;\n// v3: /dashboard /pipeline /resources) 全部 LegacyRedirect 到 keeper page.\n// /ai-config 老路径在 sub-spec D R-C (spec 0902) 被永久删除(AI 配置面下线),\n// 不再 redirect — 现在落到 catch-all NotFound。\nconst HealthHomePage = lazy(() => import('./pages/HealthHomePage'))\nconst TasksHubPage = lazy(() => import('./pages/TasksHubPage'))\nconst ContextInsightsPage = lazy(() => import('./pages/ContextInsightsPage'))\nconst SkillContentPage = lazy(() => import('./pages/SkillContentPage'))\nconst AgentContentPage = lazy(() => import('./pages/AgentContentPage'))\nconst ViolationsPage = lazy(() => import('./pages/ViolationsPage'))\nconst SettingsPage = lazy(() => import('./pages/SettingsPage'))\nconst DaemonHealthPage = lazy(() => import('./pages/DaemonHealthPage'))\nconst DiagnosticsPage = lazy(() => import('./pages/DiagnosticsPage'))\nconst DecisionsPage = lazy(() => import('./pages/DecisionsPage'))\nconst NotFound = lazy(() => import('./components/NotFound'))\n\nfunction PageFallback() {\n return (\n <div className=\"flex items-center justify-center h-full py-16\">\n <div className=\"flex items-center gap-3 text-sm text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 border-t-blue-500 rounded-full animate-spin\" />\n 加载中...\n </div>\n </div>\n )\n}\n\nexport default function App() {\n return (\n <Routes>\n <Route path=\"/\" element={<Layout />}>\n {/* index → /health (v4 default) */}\n <Route index element={<Navigate to=\"/health\" replace />} />\n\n {/* === v4 active routes (3 keeper + 4 restored, spec 3 partial revert) === */}\n <Route\n path=\"health\"\n element={\n <Suspense fallback={<PageFallback />}>\n <HealthHomePage />\n </Suspense>\n }\n />\n <Route\n path=\"tasks\"\n element={\n <Suspense fallback={<PageFallback />}>\n <TasksHubPage />\n </Suspense>\n }\n />\n <Route\n path=\"context\"\n element={\n <Suspense fallback={<PageFallback />}>\n <ContextInsightsPage />\n </Suspense>\n }\n />\n {/* Skill / Agent content viewer (full-page fallback from drawer) */}\n <Route\n path=\"context/skill/:id\"\n element={\n <Suspense fallback={<PageFallback />}>\n <SkillContentPage />\n </Suspense>\n }\n />\n <Route\n path=\"context/agent/:name\"\n element={\n <Suspense fallback={<PageFallback />}>\n <AgentContentPage />\n </Suspense>\n }\n />\n <Route\n path=\"violations\"\n element={\n <Suspense fallback={<PageFallback />}>\n <ViolationsPage />\n </Suspense>\n }\n />\n <Route\n path=\"settings\"\n element={\n <Suspense fallback={<PageFallback />}>\n <SettingsPage />\n </Suspense>\n }\n />\n\n {/* === watchdog spec 0843: /daemon-health placeholder page === */}\n <Route\n path=\"daemon-health\"\n element={\n <Suspense fallback={<PageFallback />}>\n <DaemonHealthPage />\n </Suspense>\n }\n />\n\n {/* === spec 1a41b43a (2026-06-01): cf doctor /diagnostics page === */}\n <Route\n path=\"diagnostics\"\n element={\n <Suspense fallback={<PageFallback />}>\n <DiagnosticsPage />\n </Suspense>\n }\n />\n\n {/* === spec 1527 Commit 4: decision pipeline /decisions page === */}\n <Route\n path=\"decisions\"\n element={\n <Suspense fallback={<PageFallback />}>\n <DecisionsPage />\n </Suspense>\n }\n />\n\n {/* === spec 3 still-hidden page (only /tuning now) ===\n obeyed-ratio 在 HealthHomePage 已可见, /tuning revert recipe 见 changelog § 5. */}\n <Route path=\"tuning\" element={<LegacyRedirect to=\"/health\" />} />\n\n {/* === v3 legacy redirects === */}\n <Route path=\"dashboard\" element={<LegacyRedirect to=\"/health\" />} />\n <Route path=\"pipeline\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route path=\"resources\" element={<LegacyRedirect to=\"/context\" />} />\n\n {/* === v2 legacy redirects === */}\n <Route path=\"sessions\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route\n path=\"sessions/:id\"\n element={<ParamRedirect base=\"/tasks\" param=\"id\" tpl=\"?session={}\" />}\n />\n <Route\n path=\"tasks/:taskId\"\n element={<ParamRedirect base=\"/tasks\" param=\"taskId\" tpl=\"?task={}\" />}\n />\n <Route path=\"events\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route path=\"insights/pipeline\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route path=\"insights/timeline\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route path=\"insights/agent-board\" element={<LegacyRedirect to=\"/tasks\" />} />\n <Route path=\"insights/tuning\" element={<LegacyRedirect to=\"/health\" />} />\n <Route path=\"reports\" element={<LegacyRedirect to=\"/health\" />} />\n <Route path=\"knowledge\" element={<LegacyRedirect to=\"/context?tab=kb\" />} />\n <Route path=\"skills\" element={<LegacyRedirect to=\"/context?tab=skills\" />} />\n {/* /ai-config 永久下线 (sub-spec D R-C, spec 0902) — 不再 redirect,\n 落到 catch-all NotFound 给老链接 holder 明确反馈。 */}\n\n {/* === v4 catch-all 404 (C-3) === */}\n <Route\n path=\"*\"\n element={\n <Suspense fallback={<PageFallback />}>\n <NotFound />\n </Suspense>\n }\n />\n </Route>\n </Routes>\n )\n}\n","import { createContext, useContext, useState, useCallback, ReactNode } from 'react'\nimport { CheckCircle, XCircle, AlertCircle, Info, X } from 'lucide-react'\nimport clsx from 'clsx'\n\ntype ToastType = 'success' | 'error' | 'warning' | 'info'\n\ninterface Toast {\n id: number\n type: ToastType\n message: string\n}\n\ninterface ToastContextValue {\n show: (type: ToastType, message: string) => void\n success: (message: string) => void\n error: (message: string) => void\n warning: (message: string) => void\n info: (message: string) => void\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nexport function useToast() {\n const ctx = useContext(ToastContext)\n if (!ctx) throw new Error('useToast must be used within ToastProvider')\n return ctx\n}\n\nlet nextId = 1\n\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const remove = useCallback((id: number) => {\n setToasts(prev => prev.filter(t => t.id !== id))\n }, [])\n\n const show = useCallback((type: ToastType, message: string) => {\n const id = nextId++\n setToasts(prev => [...prev, { id, type, message }])\n setTimeout(() => remove(id), 4000)\n }, [remove])\n\n const value: ToastContextValue = {\n show,\n success: (msg) => show('success', msg),\n error: (msg) => show('error', msg),\n warning: (msg) => show('warning', msg),\n info: (msg) => show('info', msg),\n }\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <div className=\"fixed top-4 right-4 z-[9999] space-y-2 max-w-md\">\n {toasts.map(t => (\n <ToastItem key={t.id} toast={t} onClose={() => remove(t.id)} />\n ))}\n </div>\n </ToastContext.Provider>\n )\n}\n\nfunction ToastItem({ toast, onClose }: { toast: Toast; onClose: () => void }) {\n const icons = {\n success: <CheckCircle className=\"h-5 w-5 text-green-500\" />,\n error: <XCircle className=\"h-5 w-5 text-red-500\" />,\n warning: <AlertCircle className=\"h-5 w-5 text-yellow-500\" />,\n info: <Info className=\"h-5 w-5 text-blue-500\" />,\n }\n const borderColors = {\n success: 'border-green-200',\n error: 'border-red-200',\n warning: 'border-yellow-200',\n info: 'border-blue-200',\n }\n\n return (\n <div\n className={clsx(\n 'bg-white shadow-lg rounded-lg border px-4 py-3 flex items-start gap-3 animate-in slide-in-from-right',\n borderColors[toast.type]\n )}\n >\n {icons[toast.type]}\n <div className=\"flex-1 text-sm text-gray-800\">{toast.message}</div>\n <button onClick={onClose} className=\"text-gray-400 hover:text-gray-600\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )\n}\n","import { createContext, useContext, useState, useCallback, ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\n\ninterface ConfirmOptions {\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n variant?: 'danger' | 'warning' | 'info'\n}\n\ninterface ConfirmContextValue {\n confirm: (options: ConfirmOptions) => Promise<boolean>\n}\n\nconst ConfirmContext = createContext<ConfirmContextValue | null>(null)\n\nexport function useConfirm() {\n const ctx = useContext(ConfirmContext)\n if (!ctx) throw new Error('useConfirm must be used within ConfirmProvider')\n return ctx.confirm\n}\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n open: boolean\n options: ConfirmOptions | null\n resolve: ((value: boolean) => void) | null\n }>({ open: false, options: null, resolve: null })\n\n const confirm = useCallback((options: ConfirmOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n setState({ open: true, options, resolve })\n })\n }, [])\n\n const handleClose = (result: boolean) => {\n if (state.resolve) state.resolve(result)\n setState({ open: false, options: null, resolve: null })\n }\n\n const variant = state.options?.variant || 'danger'\n const iconColor = {\n danger: 'text-red-600',\n warning: 'text-yellow-600',\n info: 'text-blue-600',\n }[variant]\n const btnColor = {\n danger: 'bg-red-600 hover:bg-red-700',\n warning: 'bg-yellow-600 hover:bg-yellow-700',\n info: 'bg-indigo-600 hover:bg-indigo-700',\n }[variant]\n\n return (\n <ConfirmContext.Provider value={{ confirm }}>\n {children}\n {state.open && state.options && (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black bg-opacity-50\"\n onClick={() => handleClose(false)}\n />\n <div className=\"relative bg-white rounded-lg shadow-xl max-w-md w-full mx-4 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className={`flex-shrink-0 ${iconColor}`}>\n <AlertTriangle className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">\n {state.options.title}\n </h3>\n <p className=\"text-sm text-gray-600 whitespace-pre-wrap\">\n {state.options.message}\n </p>\n </div>\n </div>\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={() => handleClose(false)}\n className=\"px-4 py-2 text-sm text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50\"\n >\n {state.options.cancelText || '取消'}\n </button>\n <button\n onClick={() => handleClose(true)}\n className={`px-4 py-2 text-sm text-white rounded ${btnColor}`}\n >\n {state.options.confirmText || '确定'}\n </button>\n </div>\n </div>\n </div>\n )}\n </ConfirmContext.Provider>\n )\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { BrowserRouter } from 'react-router-dom'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ConfigProvider } from '@arco-design/web-react'\nimport zhCN from '@arco-design/web-react/es/locale/zh-CN'\nimport App from './App'\nimport { ToastProvider } from './components/Toast'\nimport { ConfirmProvider } from './components/Confirm'\n\n// Apply theme attribute to <body> before first paint to avoid light/dark flash.\nimport './lib/theme'\n\n// Style load order matters — see ./index.css header.\nimport '@arco-design/web-react/dist/css/arco.css'\nimport './styles/arco-override.css'\nimport './styles/arco-tweaks.css'\nimport './index.css'\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n retry: 1,\n // Perf: cache-first for route switches. 60s staleTime means revisiting\n // /health or /tasks within a minute reuses cached data (0ms backend wait).\n // 5min gcTime keeps inactive query cache around for navigation patterns.\n staleTime: 60_000,\n gcTime: 5 * 60_000,\n },\n },\n})\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <QueryClientProvider client={queryClient}>\n <ConfigProvider locale={zhCN}>\n <ToastProvider>\n <ConfirmProvider>\n <BrowserRouter>\n <App />\n </BrowserRouter>\n </ConfirmProvider>\n </ToastProvider>\n </ConfigProvider>\n </QueryClientProvider>\n </React.StrictMode>,\n)\n"],"file":"assets/index-BIYnq1Dx.js"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import{r as n}from"./react-vendor-tkvCrao7.js";/**
|
|
2
|
+
* @license lucide-react v0.379.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const h=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),i=(...t)=>t.filter((a,r,o)=>!!a&&o.indexOf(a)===r).join(" ");/**
|
|
7
|
+
* @license lucide-react v0.379.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/var m={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
|
12
|
+
* @license lucide-react v0.379.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const u=n.forwardRef(({color:t="currentColor",size:a=24,strokeWidth:r=2,absoluteStrokeWidth:o,className:c="",children:l,iconNode:s,...y},k)=>n.createElement("svg",{ref:k,...m,width:a,height:a,stroke:t,strokeWidth:o?Number(r)*24/Number(a):r,className:i("lucide",c),...y},[...s.map(([p,d])=>n.createElement(p,d)),...Array.isArray(l)?l:[l]]));/**
|
|
17
|
+
* @license lucide-react v0.379.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const e=(t,a)=>{const r=n.forwardRef(({className:o,...c},l)=>n.createElement(u,{ref:l,iconNode:a,className:i(`lucide-${h(t)}`,o),...c}));return r.displayName=`${t}`,r};/**
|
|
22
|
+
* @license lucide-react v0.379.0 - ISC
|
|
23
|
+
*
|
|
24
|
+
* This source code is licensed under the ISC license.
|
|
25
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
+
*/const f=e("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/**
|
|
27
|
+
* @license lucide-react v0.379.0 - ISC
|
|
28
|
+
*
|
|
29
|
+
* This source code is licensed under the ISC license.
|
|
30
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
31
|
+
*/const g=e("CircleCheckBig",[["path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14",key:"g774vq"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/**
|
|
32
|
+
* @license lucide-react v0.379.0 - ISC
|
|
33
|
+
*
|
|
34
|
+
* This source code is licensed under the ISC license.
|
|
35
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
36
|
+
*/const C=e("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/**
|
|
37
|
+
* @license lucide-react v0.379.0 - ISC
|
|
38
|
+
*
|
|
39
|
+
* This source code is licensed under the ISC license.
|
|
40
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
41
|
+
*/const M=e("FilePen",[["path",{d:"M12 22h6a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v10",key:"x7tsz2"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10.4 12.6a2 2 0 1 1 3 3L8 21l-4 1 1-4Z",key:"o3xyfb"}]]);/**
|
|
42
|
+
* @license lucide-react v0.379.0 - ISC
|
|
43
|
+
*
|
|
44
|
+
* This source code is licensed under the ISC license.
|
|
45
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
46
|
+
*/const b=e("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/**
|
|
47
|
+
* @license lucide-react v0.379.0 - ISC
|
|
48
|
+
*
|
|
49
|
+
* This source code is licensed under the ISC license.
|
|
50
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
51
|
+
*/const v=e("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/**
|
|
52
|
+
* @license lucide-react v0.379.0 - ISC
|
|
53
|
+
*
|
|
54
|
+
* This source code is licensed under the ISC license.
|
|
55
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
56
|
+
*/const w=e("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/**
|
|
57
|
+
* @license lucide-react v0.379.0 - ISC
|
|
58
|
+
*
|
|
59
|
+
* This source code is licensed under the ISC license.
|
|
60
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
61
|
+
*/const q=e("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/**
|
|
62
|
+
* @license lucide-react v0.379.0 - ISC
|
|
63
|
+
*
|
|
64
|
+
* This source code is licensed under the ISC license.
|
|
65
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
66
|
+
*/const z=e("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/**
|
|
67
|
+
* @license lucide-react v0.379.0 - ISC
|
|
68
|
+
*
|
|
69
|
+
* This source code is licensed under the ISC license.
|
|
70
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
71
|
+
*/const A=e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);export{f as C,M as F,b as G,v as I,w as M,z as T,A as X,C as a,g as b,q as c};
|
|
72
|
+
//# sourceMappingURL=lucide-CnlPQoG8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucide-CnlPQoG8.js","sources":["../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../node_modules/lucide-react/dist/esm/Icon.js","../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../../node_modules/lucide-react/dist/esm/icons/circle-x.js","../../node_modules/lucide-react/dist/esm/icons/file-pen.js","../../node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/info.js","../../node_modules/lucide-react/dist/esm/icons/message-square.js","../../node_modules/lucide-react/dist/esm/icons/terminal.js","../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../node_modules/lucide-react/dist/esm/icons/x.js"],"sourcesContent":["/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleAlert = createLucideIcon(\"CircleAlert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M22 11.08V12a10 10 0 1 1-5.93-9.14\", key: \"g774vq\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FilePen = createLucideIcon(\"FilePen\", [\n [\"path\", { d: \"M12 22h6a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v10\", key: \"x7tsz2\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10.4 12.6a2 2 0 1 1 3 3L8 21l-4 1 1-4Z\", key: \"o3xyfb\" }]\n]);\n\nexport { FilePen as default };\n//# sourceMappingURL=file-pen.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitCommitHorizontal = createLucideIcon(\"GitCommitHorizontal\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"line\", { x1: \"3\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1dyftd\" }],\n [\"line\", { x1: \"15\", x2: \"21\", y1: \"12\", y2: \"12\", key: \"oup4p8\" }]\n]);\n\nexport { GitCommitHorizontal as default };\n//# sourceMappingURL=git-commit-horizontal.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MessageSquare = createLucideIcon(\"MessageSquare\", [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }]\n]);\n\nexport { MessageSquare as default };\n//# sourceMappingURL=message-square.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Terminal = createLucideIcon(\"Terminal\", [\n [\"polyline\", { points: \"4 17 10 11 4 5\", key: \"akl6gq\" }],\n [\"line\", { x1: \"12\", x2: \"20\", y1: \"19\", y2: \"19\", key: \"q2wloq\" }]\n]);\n\nexport { Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TriangleAlert = createLucideIcon(\"TriangleAlert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n"],"names":["toKebabCase","string","mergeClasses","classes","className","index","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","CircleAlert","CircleCheckBig","CircleX","FilePen","GitCommitHorizontal","Info","MessageSquare","Terminal","TriangleAlert","X"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as o}from"./react-vendor-tkvCrao7.js";import{b as s}from"./arco-Bhi3a6Qp.js";const r={success:"#52c41a",partial:"#faad14",failed:"#f5222d",abandoned:"#86909c"},e={success:"green",partial:"orange",failed:"red",abandoned:"gray"},i={success:"成功",partial:"部分",failed:"失败",abandoned:"放弃"},n={success:"✅ 成功",partial:"⚠️ 部分",failed:"❌ 失败",abandoned:"🛑 放弃"};function d(a){return a&&a in r?r[a]:"var(--color-border-2)"}function O({value:a}){return!a||!(a in n)?null:o.jsx(s,{color:e[a],size:"small",children:n[a]})}export{i as O,r as a,O as b,d as o};
|
|
2
|
+
//# sourceMappingURL=outcome-DUn1NjlC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-DUn1NjlC.js","sources":["../../src/utils/outcome.tsx"],"sourcesContent":["/**\n * Outcome palette + label + tag — single source of truth.\n *\n * Canonical pick (2026-05-26): Arco Design semantic palette\n * success: #52c41a (green)\n * partial: #faad14 (orange)\n * failed: #f5222d (red)\n * abandoned: #86909c (gray)\n *\n * Drift history:\n * - HealthHomePage and OutcomeDonutChart already use the Arco palette.\n * - TasksHubPage was the outlier (Material Design palette: #ff9800 / #f44336 /\n * #9e9e9e). After this consolidation, all 3 sites use the Arco palette and\n * share this file.\n *\n * Why Arco palette wins:\n * 1. 2-of-3 prior usages already used it.\n * 2. HealthHomePage (most recently updated, 2026-05-26) used it.\n * 3. Arco is the project's UI lib — semantic colors map cleanly to <Tag color=\"green\"> etc.\n *\n * The Arco <Tag> `color` prop takes a semantic name string (\"green\", \"orange\",\n * \"red\", \"gray\"), NOT a hex string. So OUTCOME_TAG_COLOR holds the semantic\n * names for <Tag>; OUTCOME_COLOR holds hex for recharts / border styling.\n */\n\nimport type { ReactElement } from 'react'\nimport Tag from '@arco-design/web-react/es/Tag'\n\nexport type OutcomeKey = 'success' | 'partial' | 'failed' | 'abandoned'\n\n/** Hex colors — for recharts, border styling, inline `style`. */\nexport const OUTCOME_COLOR: Record<OutcomeKey, string> = {\n success: '#52c41a',\n partial: '#faad14',\n failed: '#f5222d',\n abandoned: '#86909c',\n}\n\n/** Arco <Tag color=\"...\"> semantic names. */\nexport const OUTCOME_TAG_COLOR: Record<OutcomeKey, string> = {\n success: 'green',\n partial: 'orange',\n failed: 'red',\n abandoned: 'gray',\n}\n\n/** Chinese display labels. */\nexport const OUTCOME_LABEL: Record<OutcomeKey, string> = {\n success: '成功',\n partial: '部分',\n failed: '失败',\n abandoned: '放弃',\n}\n\n/** Emoji-prefixed labels (used by TasksHub's inline tag). */\nexport const OUTCOME_LABEL_EMOJI: Record<OutcomeKey, string> = {\n success: '✅ 成功',\n partial: '⚠️ 部分',\n failed: '❌ 失败',\n abandoned: '🛑 放弃',\n}\n\n/**\n * Hex border color for outcome — returns CSS var fallback for unknown/null.\n * Used by TasksHubPage's task-card left border.\n */\nexport function outcomeBorderColor(outcome: OutcomeKey | null | undefined): string {\n if (outcome && outcome in OUTCOME_COLOR) return OUTCOME_COLOR[outcome]\n return 'var(--color-border-2)'\n}\n\n/**\n * Small Arco-tag wrapper for outcome display.\n *\n * Returns `null` when value is null/undefined/unknown so call sites can\n * short-circuit fallback rendering (`<OutcomeTag value={x} /> || <fallback>`).\n */\nexport function OutcomeTag({ value }: { value: OutcomeKey | null | undefined }): ReactElement | null {\n if (!value || !(value in OUTCOME_LABEL_EMOJI)) return null\n return (\n <Tag color={OUTCOME_TAG_COLOR[value]} size=\"small\">\n {OUTCOME_LABEL_EMOJI[value]}\n </Tag>\n )\n}\n"],"names":["OUTCOME_COLOR","OUTCOME_TAG_COLOR","OUTCOME_LABEL","OUTCOME_LABEL_EMOJI","outcomeBorderColor","outcome","OutcomeTag","value","jsx","Tag"],"mappings":"sFA+BO,MAAMA,EAA4C,CACvD,QAAS,UACT,QAAS,UACT,OAAQ,UACR,UAAW,SACb,EAGaC,EAAgD,CAC3D,QAAS,QACT,QAAS,SACT,OAAQ,MACR,UAAW,MACb,EAGaC,EAA4C,CACvD,QAAS,KACT,QAAS,KACT,OAAQ,KACR,UAAW,IACb,EAGaC,EAAkD,CAC7D,QAAS,OACT,QAAS,QACT,OAAQ,OACR,UAAW,OACb,EAMO,SAASC,EAAmBC,EAAgD,CACjF,OAAIA,GAAWA,KAAWL,EAAsBA,EAAcK,CAAO,EAC9D,uBACT,CAQO,SAASC,EAAW,CAAE,MAAAC,GAAwE,CACnG,MAAI,CAACA,GAAS,EAAEA,KAASJ,GAA6B,KAEpDK,EAAAA,IAACC,EAAA,CAAI,MAAOR,EAAkBM,CAAK,EAAG,KAAK,QACxC,SAAAJ,EAAoBI,CAAK,CAAA,CAC5B,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var Ce=e=>{throw TypeError(e)};var te=(e,t,s)=>t.has(e)||Ce("Cannot "+s);var r=(e,t,s)=>(te(e,t,"read from private field"),s?s.call(e):t.get(e)),c=(e,t,s)=>t.has(e)?Ce("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),o=(e,t,s,i)=>(te(e,t,"write to private field"),i?i.call(e,s):t.set(e,s),s),f=(e,t,s)=>(te(e,t,"access private method"),s);var $t=(e,t,s,i)=>({set _(n){o(e,t,n,s)},get _(){return r(e,t,i)}});import{r as x,j as is}from"./react-vendor-tkvCrao7.js";var qt=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},yt,it,Pt,xe,rs=(xe=class extends qt{constructor(){super();c(this,yt);c(this,it);c(this,Pt);o(this,Pt,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){r(this,it)||this.setEventListener(r(this,Pt))}onUnsubscribe(){var t;this.hasListeners()||((t=r(this,it))==null||t.call(this),o(this,it,void 0))}setEventListener(t){var s;o(this,Pt,t),(s=r(this,it))==null||s.call(this),o(this,it,t(i=>{typeof i=="boolean"?this.setFocused(i):this.onFocus()}))}setFocused(t){r(this,yt)!==t&&(o(this,yt,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof r(this,yt)=="boolean"?r(this,yt):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},yt=new WeakMap,it=new WeakMap,Pt=new WeakMap,xe),me=new rs,ns={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},rt,pe,Ae,as=(Ae=class{constructor(){c(this,rt,ns);c(this,pe,!1)}setTimeoutProvider(e){o(this,rt,e)}setTimeout(e,t){return r(this,rt).setTimeout(e,t)}clearTimeout(e){r(this,rt).clearTimeout(e)}setInterval(e,t){return r(this,rt).setInterval(e,t)}clearInterval(e){r(this,rt).clearInterval(e)}},rt=new WeakMap,pe=new WeakMap,Ae),ft=new as;function os(e){setTimeout(e,0)}var us=typeof window>"u"||"Deno"in globalThis;function q(){}function hs(e,t){return typeof e=="function"?e(t):e}function ee(e){return typeof e=="number"&&e>=0&&e!==1/0}function Ge(e,t){return Math.max(e+(t||0)-Date.now(),0)}function dt(e,t){return typeof e=="function"?e(t):e}function H(e,t){return typeof e=="function"?e(t):e}function Oe(e,t){const{type:s="all",exact:i,fetchStatus:n,predicate:a,queryKey:h,stale:u}=e;if(h){if(i){if(t.queryHash!==ve(h,t.options))return!1}else if(!_t(t.queryKey,h))return!1}if(s!=="all"){const p=t.isActive();if(s==="active"&&!p||s==="inactive"&&p)return!1}return!(typeof u=="boolean"&&t.isStale()!==u||n&&n!==t.state.fetchStatus||a&&!a(t))}function Pe(e,t){const{exact:s,status:i,predicate:n,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(s){if(Ot(t.options.mutationKey)!==Ot(a))return!1}else if(!_t(t.options.mutationKey,a))return!1}return!(i&&t.state.status!==i||n&&!n(t))}function ve(e,t){return((t==null?void 0:t.queryKeyHashFn)||Ot)(e)}function Ot(e){return JSON.stringify(e,(t,s)=>se(s)?Object.keys(s).sort().reduce((i,n)=>(i[n]=s[n],i),{}):s)}function _t(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>_t(e[s],t[s])):!1}var cs=Object.prototype.hasOwnProperty;function Be(e,t,s=0){if(e===t)return e;if(s>500)return t;const i=Re(e)&&Re(t);if(!i&&!(se(e)&&se(t)))return t;const a=(i?e:Object.keys(e)).length,h=i?t:Object.keys(t),u=h.length,p=i?new Array(u):{};let m=0;for(let v=0;v<u;v++){const y=i?v:h[v],g=e[y],d=t[y];if(g===d){p[y]=g,(i?v<a:cs.call(e,y))&&m++;continue}if(g===null||d===null||typeof g!="object"||typeof d!="object"){p[y]=d;continue}const F=Be(g,d,s+1);p[y]=F,F===g&&m++}return a===u&&m===a?e:p}function Xt(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(e[s]!==t[s])return!1;return!0}function Re(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function se(e){if(!Fe(e))return!1;const t=e.constructor;if(t===void 0)return!0;const s=t.prototype;return!(!Fe(s)||!s.hasOwnProperty("isPrototypeOf")||Object.getPrototypeOf(e)!==Object.prototype)}function Fe(e){return Object.prototype.toString.call(e)==="[object Object]"}function ls(e){return new Promise(t=>{ft.setTimeout(t,e)})}function ie(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?Be(e,t):t}function Hs(e){return e}function ds(e,t,s=0){const i=[...e,t];return s&&i.length>s?i.slice(1):i}function fs(e,t,s=0){const i=[t,...e];return s&&i.length>s?i.slice(0,-1):i}var be=Symbol();function ze(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===be?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ge(e,t){return typeof e=="function"?e(...t):!!e}function ys(e,t,s){let i=!1,n;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(n??(n=t()),i||(i=!0,n.aborted?s():n.addEventListener("abort",s,{once:!0})),n)}),e}var kt=(()=>{let e=()=>us;return{isServer(){return e()},setIsServer(t){e=t}}})();function re(){let e,t;const s=new Promise((n,a)=>{e=n,t=a});s.status="pending",s.catch(()=>{});function i(n){Object.assign(s,n),delete s.resolve,delete s.reject}return s.resolve=n=>{i({status:"fulfilled",value:n}),e(n)},s.reject=n=>{i({status:"rejected",reason:n}),t(n)},s}var ps=os;function ms(){let e=[],t=0,s=u=>{u()},i=u=>{u()},n=ps;const a=u=>{t?e.push(u):n(()=>{s(u)})},h=()=>{const u=e;e=[],u.length&&n(()=>{i(()=>{u.forEach(p=>{s(p)})})})};return{batch:u=>{let p;t++;try{p=u()}finally{t--,t||h()}return p},batchCalls:u=>(...p)=>{a(()=>{u(...p)})},schedule:a,setNotifyFunction:u=>{s=u},setBatchNotifyFunction:u=>{i=u},setScheduler:u=>{n=u}}}var M=ms(),Rt,nt,Ft,je,vs=(je=class extends qt{constructor(){super();c(this,Rt,!0);c(this,nt);c(this,Ft);o(this,Ft,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t(!0),i=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",i,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",i)}}})}onSubscribe(){r(this,nt)||this.setEventListener(r(this,Ft))}onUnsubscribe(){var t;this.hasListeners()||((t=r(this,nt))==null||t.call(this),o(this,nt,void 0))}setEventListener(t){var s;o(this,Ft,t),(s=r(this,nt))==null||s.call(this),o(this,nt,t(this.setOnline.bind(this)))}setOnline(t){r(this,Rt)!==t&&(o(this,Rt,t),this.listeners.forEach(i=>{i(t)}))}isOnline(){return r(this,Rt)}},Rt=new WeakMap,nt=new WeakMap,Ft=new WeakMap,je),Yt=new vs;function bs(e){return Math.min(1e3*2**e,3e4)}function Ve(e){return(e??"online")==="online"?Yt.isOnline():!0}var ne=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function We(e){let t=!1,s=0,i;const n=re(),a=()=>n.status!=="pending",h=S=>{var w;if(!a()){const P=new ne(S);g(P),(w=e.onCancel)==null||w.call(e,P)}},u=()=>{t=!0},p=()=>{t=!1},m=()=>me.isFocused()&&(e.networkMode==="always"||Yt.isOnline())&&e.canRun(),v=()=>Ve(e.networkMode)&&e.canRun(),y=S=>{a()||(i==null||i(),n.resolve(S))},g=S=>{a()||(i==null||i(),n.reject(S))},d=()=>new Promise(S=>{var w;i=P=>{(a()||m())&&S(P)},(w=e.onPause)==null||w.call(e)}).then(()=>{var S;i=void 0,a()||(S=e.onContinue)==null||S.call(e)}),F=()=>{if(a())return;let S;const w=s===0?e.initialPromise:void 0;try{S=w??e.fn()}catch(P){S=Promise.reject(P)}Promise.resolve(S).then(y).catch(P=>{var K;if(a())return;const Q=e.retry??(kt.isServer()?0:3),R=e.retryDelay??bs,l=typeof R=="function"?R(s,P):R,I=Q===!0||typeof Q=="number"&&s<Q||typeof Q=="function"&&Q(s,P);if(t||!I){g(P);return}s++,(K=e.onFail)==null||K.call(e,s,P),ls(l).then(()=>m()?void 0:d()).then(()=>{t?g(P):F()})})};return{promise:n,status:()=>n.status,cancel:h,continue:()=>(i==null||i(),n),cancelRetry:u,continueRetry:p,canStart:v,start:()=>(v()?F():d().then(F),n)}}var pt,Ue,$e=(Ue=class{constructor(){c(this,pt)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),ee(this.gcTime)&&o(this,pt,ft.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(kt.isServer()?1/0:5*60*1e3))}clearGcTimeout(){r(this,pt)!==void 0&&(ft.clearTimeout(r(this,pt)),o(this,pt,void 0))}},pt=new WeakMap,Ue);function gs(e){return{onFetch:(t,s)=>{var v,y,g,d,F;const i=t.options,n=(g=(y=(v=t.fetchOptions)==null?void 0:v.meta)==null?void 0:y.fetchMore)==null?void 0:g.direction,a=((d=t.state.data)==null?void 0:d.pages)||[],h=((F=t.state.data)==null?void 0:F.pageParams)||[];let u={pages:[],pageParams:[]},p=0;const m=async()=>{let S=!1;const w=R=>{ys(R,()=>t.signal,()=>S=!0)},P=ze(t.options,t.fetchOptions),Q=async(R,l,I)=>{if(S)return Promise.reject(t.signal.reason);if(l==null&&R.pages.length)return Promise.resolve(R);const tt=(()=>{const et={client:t.client,queryKey:t.queryKey,pageParam:l,direction:I?"backward":"forward",meta:t.options.meta};return w(et),et})(),O=await P(tt),{maxPages:T}=t.options,j=I?fs:ds;return{pages:j(R.pages,O,T),pageParams:j(R.pageParams,l,T)}};if(n&&a.length){const R=n==="backward",l=R?Ss:Ee,I={pages:a,pageParams:h},K=l(i,I);u=await Q(I,K,R)}else{const R=e??a.length;do{const l=p===0?h[0]??i.initialPageParam:Ee(i,u);if(p>0&&l==null)break;u=await Q(u,l),p++}while(p<R)}return u};t.options.persister?t.fetchFn=()=>{var S,w;return(w=(S=t.options).persister)==null?void 0:w.call(S,m,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=m}}}function Ee(e,{pages:t,pageParams:s}){const i=t.length-1;return t.length>0?e.getNextPageParam(t[i],t,s[i],s):void 0}function Ss(e,{pages:t,pageParams:s}){var i;return t.length>0?(i=e.getPreviousPageParam)==null?void 0:i.call(e,t[0],t,s[0],s):void 0}var Et,mt,Mt,N,vt,D,Lt,bt,L,Je,W,qe,ws=(qe=class extends $e{constructor(t){super();c(this,L);c(this,Et);c(this,mt);c(this,Mt);c(this,N);c(this,vt);c(this,D);c(this,Lt);c(this,bt);o(this,bt,!1),o(this,Lt,t.defaultOptions),this.setOptions(t.options),this.observers=[],o(this,vt,t.client),o(this,N,r(this,vt).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,o(this,mt,Qe(this.options)),this.state=t.state??r(this,mt),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return r(this,Et)}get promise(){var t;return(t=r(this,D))==null?void 0:t.promise}setOptions(t){if(this.options={...r(this,Lt),...t},t!=null&&t._type&&o(this,Et,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Qe(this.options);s.data!==void 0&&(this.setState(Me(s.data,s.dataUpdatedAt)),o(this,mt,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&r(this,N).remove(this)}setData(t,s){const i=ie(this.state.data,t,this.options);return f(this,L,W).call(this,{data:i,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),i}setState(t){f(this,L,W).call(this,{type:"setState",state:t})}cancel(t){var i,n;const s=(i=r(this,D))==null?void 0:i.promise;return(n=r(this,D))==null||n.cancel(t),s?s.then(q).catch(q):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return r(this,mt)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>H(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===be||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>dt(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!Ge(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(i=>i.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=r(this,D))==null||s.continue()}onOnline(){var s;const t=this.observers.find(i=>i.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=r(this,D))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),r(this,N).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(r(this,D)&&(r(this,bt)||f(this,L,Je).call(this)?r(this,D).cancel({revert:!0}):r(this,D).cancelRetry()),this.scheduleGc()),r(this,N).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||f(this,L,W).call(this,{type:"invalidate"})}async fetch(t,s){var m,v,y,g,d,F,S,w,P,Q,R;if(this.state.fetchStatus!=="idle"&&((m=r(this,D))==null?void 0:m.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(r(this,D))return r(this,D).continueRetry(),r(this,D).promise}if(t&&this.setOptions(t),!this.options.queryFn){const l=this.observers.find(I=>I.options.queryFn);l&&this.setOptions(l.options)}const i=new AbortController,n=l=>{Object.defineProperty(l,"signal",{enumerable:!0,get:()=>(o(this,bt,!0),i.signal)})},a=()=>{const l=ze(this.options,s),K=(()=>{const tt={client:r(this,vt),queryKey:this.queryKey,meta:this.meta};return n(tt),tt})();return o(this,bt,!1),this.options.persister?this.options.persister(l,K,this):l(K)},u=(()=>{const l={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:r(this,vt),state:this.state,fetchFn:a};return n(l),l})(),p=r(this,Et)==="infinite"?gs(this.options.pages):this.options.behavior;p==null||p.onFetch(u,this),o(this,Mt,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((v=u.fetchOptions)==null?void 0:v.meta))&&f(this,L,W).call(this,{type:"fetch",meta:(y=u.fetchOptions)==null?void 0:y.meta}),o(this,D,We({initialPromise:s==null?void 0:s.initialPromise,fn:u.fetchFn,onCancel:l=>{l instanceof ne&&l.revert&&this.setState({...r(this,Mt),fetchStatus:"idle"}),i.abort()},onFail:(l,I)=>{f(this,L,W).call(this,{type:"failed",failureCount:l,error:I})},onPause:()=>{f(this,L,W).call(this,{type:"pause"})},onContinue:()=>{f(this,L,W).call(this,{type:"continue"})},retry:u.options.retry,retryDelay:u.options.retryDelay,networkMode:u.options.networkMode,canRun:()=>!0}));try{const l=await r(this,D).start();if(l===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(l),(d=(g=r(this,N).config).onSuccess)==null||d.call(g,l,this),(S=(F=r(this,N).config).onSettled)==null||S.call(F,l,this.state.error,this),l}catch(l){if(l instanceof ne){if(l.silent)return r(this,D).promise;if(l.revert){if(this.state.data===void 0)throw l;return this.state.data}}throw f(this,L,W).call(this,{type:"error",error:l}),(P=(w=r(this,N).config).onError)==null||P.call(w,l,this),(R=(Q=r(this,N).config).onSettled)==null||R.call(Q,this.state.data,l,this),l}finally{this.scheduleGc()}}},Et=new WeakMap,mt=new WeakMap,Mt=new WeakMap,N=new WeakMap,vt=new WeakMap,D=new WeakMap,Lt=new WeakMap,bt=new WeakMap,L=new WeakSet,Je=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},W=function(t){const s=i=>{switch(t.type){case"failed":return{...i,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...i,fetchStatus:"paused"};case"continue":return{...i,fetchStatus:"fetching"};case"fetch":return{...i,...Ze(i.data,this.options),fetchMeta:t.meta??null};case"success":const n={...i,...Me(t.data,t.dataUpdatedAt),dataUpdateCount:i.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return o(this,Mt,t.manual?n:void 0),n;case"error":const a=t.error;return{...i,error:a,errorUpdateCount:i.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:i.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...i,isInvalidated:!0};case"setState":return{...i,...t.state}}};this.state=s(this.state),M.batch(()=>{this.observers.forEach(i=>{i.onQueryUpdate()}),r(this,N).notify({query:this,type:"updated",action:t})})},qe);function Ze(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ve(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Me(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Qe(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,i=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?i??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var _,b,Ht,U,gt,Qt,$,at,Nt,It,Tt,St,wt,ot,Dt,C,Kt,ae,oe,ue,he,ce,le,de,Xe,Ke,Cs=(Ke=class extends qt{constructor(t,s){super();c(this,C);c(this,_);c(this,b);c(this,Ht);c(this,U);c(this,gt);c(this,Qt);c(this,$);c(this,at);c(this,Nt);c(this,It);c(this,Tt);c(this,St);c(this,wt);c(this,ot);c(this,Dt,new Set);this.options=s,o(this,_,t),o(this,at,null),o(this,$,re()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(r(this,b).addObserver(this),Ie(r(this,b),this.options)?f(this,C,Kt).call(this):this.updateResult(),f(this,C,he).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return fe(r(this,b),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return fe(r(this,b),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,f(this,C,ce).call(this),f(this,C,le).call(this),r(this,b).removeObserver(this)}setOptions(t){const s=this.options,i=r(this,b);if(this.options=r(this,_).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof H(this.options.enabled,r(this,b))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");f(this,C,de).call(this),r(this,b).setOptions(this.options),s._defaulted&&!Xt(this.options,s)&&r(this,_).getQueryCache().notify({type:"observerOptionsUpdated",query:r(this,b),observer:this});const n=this.hasListeners();n&&Te(r(this,b),i,this.options,s)&&f(this,C,Kt).call(this),this.updateResult(),n&&(r(this,b)!==i||H(this.options.enabled,r(this,b))!==H(s.enabled,r(this,b))||dt(this.options.staleTime,r(this,b))!==dt(s.staleTime,r(this,b)))&&f(this,C,ae).call(this);const a=f(this,C,oe).call(this);n&&(r(this,b)!==i||H(this.options.enabled,r(this,b))!==H(s.enabled,r(this,b))||a!==r(this,ot))&&f(this,C,ue).call(this,a)}getOptimisticResult(t){const s=r(this,_).getQueryCache().build(r(this,_),t),i=this.createResult(s,t);return Ps(this,i)&&(o(this,U,i),o(this,Qt,this.options),o(this,gt,r(this,b).state)),i}getCurrentResult(){return r(this,U)}trackResult(t,s){return new Proxy(t,{get:(i,n)=>(this.trackProp(n),s==null||s(n),n==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&r(this,$).status==="pending"&&r(this,$).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(i,n))})}trackProp(t){r(this,Dt).add(t)}getCurrentQuery(){return r(this,b)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=r(this,_).defaultQueryOptions(t),i=r(this,_).getQueryCache().build(r(this,_),s);return i.fetch().then(()=>this.createResult(i,s))}fetch(t){return f(this,C,Kt).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),r(this,U)))}createResult(t,s){var T;const i=r(this,b),n=this.options,a=r(this,U),h=r(this,gt),u=r(this,Qt),m=t!==i?t.state:r(this,Ht),{state:v}=t;let y={...v},g=!1,d;if(s._optimisticResults){const j=this.hasListeners(),et=!j&&Ie(t,s),zt=j&&Te(t,i,s,n);(et||zt)&&(y={...y,...Ze(v.data,t.options)}),s._optimisticResults==="isRestoring"&&(y.fetchStatus="idle")}let{error:F,errorUpdatedAt:S,status:w}=y;d=y.data;let P=!1;if(s.placeholderData!==void 0&&d===void 0&&w==="pending"){let j;a!=null&&a.isPlaceholderData&&s.placeholderData===(u==null?void 0:u.placeholderData)?(j=a.data,P=!0):j=typeof s.placeholderData=="function"?s.placeholderData((T=r(this,Tt))==null?void 0:T.state.data,r(this,Tt)):s.placeholderData,j!==void 0&&(w="success",d=ie(a==null?void 0:a.data,j,s),g=!0)}if(s.select&&d!==void 0&&!P)if(a&&d===(h==null?void 0:h.data)&&s.select===r(this,Nt))d=r(this,It);else try{o(this,Nt,s.select),d=s.select(d),d=ie(a==null?void 0:a.data,d,s),o(this,It,d),o(this,at,null)}catch(j){o(this,at,j)}r(this,at)&&(F=r(this,at),d=r(this,It),S=Date.now(),w="error");const Q=y.fetchStatus==="fetching",R=w==="pending",l=w==="error",I=R&&Q,K=d!==void 0,O={status:w,fetchStatus:y.fetchStatus,isPending:R,isSuccess:w==="success",isError:l,isInitialLoading:I,isLoading:I,data:d,dataUpdatedAt:y.dataUpdatedAt,error:F,errorUpdatedAt:S,failureCount:y.fetchFailureCount,failureReason:y.fetchFailureReason,errorUpdateCount:y.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:y.dataUpdateCount>m.dataUpdateCount||y.errorUpdateCount>m.errorUpdateCount,isFetching:Q,isRefetching:Q&&!R,isLoadingError:l&&!K,isPaused:y.fetchStatus==="paused",isPlaceholderData:g,isRefetchError:l&&K,isStale:Se(t,s),refetch:this.refetch,promise:r(this,$),isEnabled:H(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const j=O.data!==void 0,et=O.status==="error"&&!j,zt=Wt=>{et?Wt.reject(O.error):j&&Wt.resolve(O.data)},we=()=>{const Wt=o(this,$,O.promise=re());zt(Wt)},Vt=r(this,$);switch(Vt.status){case"pending":t.queryHash===i.queryHash&&zt(Vt);break;case"fulfilled":(et||O.data!==Vt.value)&&we();break;case"rejected":(!et||O.error!==Vt.reason)&&we();break}}return O}updateResult(){const t=r(this,U),s=this.createResult(r(this,b),this.options);if(o(this,gt,r(this,b).state),o(this,Qt,this.options),r(this,gt).data!==void 0&&o(this,Tt,r(this,b)),Xt(s,t))return;o(this,U,s);const i=()=>{if(!t)return!0;const{notifyOnChangeProps:n}=this.options,a=typeof n=="function"?n():n;if(a==="all"||!a&&!r(this,Dt).size)return!0;const h=new Set(a??r(this,Dt));return this.options.throwOnError&&h.add("error"),Object.keys(r(this,U)).some(u=>{const p=u;return r(this,U)[p]!==t[p]&&h.has(p)})};f(this,C,Xe).call(this,{listeners:i()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&f(this,C,he).call(this)}},_=new WeakMap,b=new WeakMap,Ht=new WeakMap,U=new WeakMap,gt=new WeakMap,Qt=new WeakMap,$=new WeakMap,at=new WeakMap,Nt=new WeakMap,It=new WeakMap,Tt=new WeakMap,St=new WeakMap,wt=new WeakMap,ot=new WeakMap,Dt=new WeakMap,C=new WeakSet,Kt=function(t){f(this,C,de).call(this);let s=r(this,b).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(q)),s},ae=function(){f(this,C,ce).call(this);const t=dt(this.options.staleTime,r(this,b));if(kt.isServer()||r(this,U).isStale||!ee(t))return;const i=Ge(r(this,U).dataUpdatedAt,t)+1;o(this,St,ft.setTimeout(()=>{r(this,U).isStale||this.updateResult()},i))},oe=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(r(this,b)):this.options.refetchInterval)??!1},ue=function(t){f(this,C,le).call(this),o(this,ot,t),!(kt.isServer()||H(this.options.enabled,r(this,b))===!1||!ee(r(this,ot))||r(this,ot)===0)&&o(this,wt,ft.setInterval(()=>{(this.options.refetchIntervalInBackground||me.isFocused())&&f(this,C,Kt).call(this)},r(this,ot)))},he=function(){f(this,C,ae).call(this),f(this,C,ue).call(this,f(this,C,oe).call(this))},ce=function(){r(this,St)!==void 0&&(ft.clearTimeout(r(this,St)),o(this,St,void 0))},le=function(){r(this,wt)!==void 0&&(ft.clearInterval(r(this,wt)),o(this,wt,void 0))},de=function(){const t=r(this,_).getQueryCache().build(r(this,_),this.options);if(t===r(this,b))return;const s=r(this,b);o(this,b,t),o(this,Ht,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},Xe=function(t){M.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(r(this,U))}),r(this,_).getQueryCache().notify({query:r(this,b),type:"observerResultsUpdated"})})},Ke);function Os(e,t){return H(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&H(t.retryOnMount,e)===!1)}function Ie(e,t){return Os(e,t)||e.state.data!==void 0&&fe(e,t,t.refetchOnMount)}function fe(e,t,s){if(H(t.enabled,e)!==!1&&dt(t.staleTime,e)!=="static"){const i=typeof s=="function"?s(e):s;return i==="always"||i!==!1&&Se(e,t)}return!1}function Te(e,t,s,i){return(e!==t||H(i.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&Se(e,s)}function Se(e,t){return H(t.enabled,e)!==!1&&e.isStaleByTime(dt(t.staleTime,e))}function Ps(e,t){return!Xt(e.getCurrentResult(),t)}var Gt,B,A,Ct,z,st,_e,Rs=(_e=class extends $e{constructor(t){super();c(this,z);c(this,Gt);c(this,B);c(this,A);c(this,Ct);o(this,Gt,t.client),this.mutationId=t.mutationId,o(this,A,t.mutationCache),o(this,B,[]),this.state=t.state||Ye(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){r(this,B).includes(t)||(r(this,B).push(t),this.clearGcTimeout(),r(this,A).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){o(this,B,r(this,B).filter(s=>s!==t)),this.scheduleGc(),r(this,A).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){r(this,B).length||(this.state.status==="pending"?this.scheduleGc():r(this,A).remove(this))}continue(){var t;return((t=r(this,Ct))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var h,u,p,m,v,y,g,d,F,S,w,P,Q,R,l,I,K,tt;const s=()=>{f(this,z,st).call(this,{type:"continue"})},i={client:r(this,Gt),meta:this.options.meta,mutationKey:this.options.mutationKey};o(this,Ct,We({fn:()=>this.options.mutationFn?this.options.mutationFn(t,i):Promise.reject(new Error("No mutationFn found")),onFail:(O,T)=>{f(this,z,st).call(this,{type:"failed",failureCount:O,error:T})},onPause:()=>{f(this,z,st).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>r(this,A).canRun(this)}));const n=this.state.status==="pending",a=!r(this,Ct).canStart();try{if(n)s();else{f(this,z,st).call(this,{type:"pending",variables:t,isPaused:a}),r(this,A).config.onMutate&&await r(this,A).config.onMutate(t,this,i);const T=await((u=(h=this.options).onMutate)==null?void 0:u.call(h,t,i));T!==this.state.context&&f(this,z,st).call(this,{type:"pending",context:T,variables:t,isPaused:a})}const O=await r(this,Ct).start();return await((m=(p=r(this,A).config).onSuccess)==null?void 0:m.call(p,O,t,this.state.context,this,i)),await((y=(v=this.options).onSuccess)==null?void 0:y.call(v,O,t,this.state.context,i)),await((d=(g=r(this,A).config).onSettled)==null?void 0:d.call(g,O,null,this.state.variables,this.state.context,this,i)),await((S=(F=this.options).onSettled)==null?void 0:S.call(F,O,null,t,this.state.context,i)),f(this,z,st).call(this,{type:"success",data:O}),O}catch(O){try{await((P=(w=r(this,A).config).onError)==null?void 0:P.call(w,O,t,this.state.context,this,i))}catch(T){Promise.reject(T)}try{await((R=(Q=this.options).onError)==null?void 0:R.call(Q,O,t,this.state.context,i))}catch(T){Promise.reject(T)}try{await((I=(l=r(this,A).config).onSettled)==null?void 0:I.call(l,void 0,O,this.state.variables,this.state.context,this,i))}catch(T){Promise.reject(T)}try{await((tt=(K=this.options).onSettled)==null?void 0:tt.call(K,void 0,O,t,this.state.context,i))}catch(T){Promise.reject(T)}throw f(this,z,st).call(this,{type:"error",error:O}),O}finally{r(this,A).runNext(this)}}},Gt=new WeakMap,B=new WeakMap,A=new WeakMap,Ct=new WeakMap,z=new WeakSet,st=function(t){const s=i=>{switch(t.type){case"failed":return{...i,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...i,isPaused:!0};case"continue":return{...i,isPaused:!1};case"pending":return{...i,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...i,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...i,data:void 0,error:t.error,failureCount:i.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),M.batch(()=>{r(this,B).forEach(i=>{i.onMutationUpdate(t)}),r(this,A).notify({mutation:this,type:"updated",action:t})})},_e);function Ye(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var J,G,Bt,ke,Fs=(ke=class extends qt{constructor(t={}){super();c(this,J);c(this,G);c(this,Bt);this.config=t,o(this,J,new Set),o(this,G,new Map),o(this,Bt,0)}build(t,s,i){const n=new Rs({client:t,mutationCache:this,mutationId:++$t(this,Bt)._,options:t.defaultMutationOptions(s),state:i});return this.add(n),n}add(t){r(this,J).add(t);const s=Jt(t);if(typeof s=="string"){const i=r(this,G).get(s);i?i.push(t):r(this,G).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(r(this,J).delete(t)){const s=Jt(t);if(typeof s=="string"){const i=r(this,G).get(s);if(i)if(i.length>1){const n=i.indexOf(t);n!==-1&&i.splice(n,1)}else i[0]===t&&r(this,G).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=Jt(t);if(typeof s=="string"){const i=r(this,G).get(s),n=i==null?void 0:i.find(a=>a.state.status==="pending");return!n||n===t}else return!0}runNext(t){var i;const s=Jt(t);if(typeof s=="string"){const n=(i=r(this,G).get(s))==null?void 0:i.find(a=>a!==t&&a.state.isPaused);return(n==null?void 0:n.continue())??Promise.resolve()}else return Promise.resolve()}clear(){M.batch(()=>{r(this,J).forEach(t=>{this.notify({type:"removed",mutation:t})}),r(this,J).clear(),r(this,G).clear()})}getAll(){return Array.from(r(this,J))}find(t){const s={exact:!0,...t};return this.getAll().find(i=>Pe(s,i))}findAll(t={}){return this.getAll().filter(s=>Pe(t,s))}notify(t){M.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return M.batch(()=>Promise.all(t.map(s=>s.continue().catch(q))))}},J=new WeakMap,G=new WeakMap,Bt=new WeakMap,ke);function Jt(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Z,ut,k,X,Y,Zt,ye,Le,Es=(Le=class extends qt{constructor(t,s){super();c(this,Y);c(this,Z);c(this,ut);c(this,k);c(this,X);o(this,Z,t),this.setOptions(s),this.bindMethods(),f(this,Y,Zt).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){var i;const s=this.options;this.options=r(this,Z).defaultMutationOptions(t),Xt(this.options,s)||r(this,Z).getMutationCache().notify({type:"observerOptionsUpdated",mutation:r(this,k),observer:this}),s!=null&&s.mutationKey&&this.options.mutationKey&&Ot(s.mutationKey)!==Ot(this.options.mutationKey)?this.reset():((i=r(this,k))==null?void 0:i.state.status)==="pending"&&r(this,k).setOptions(this.options)}onUnsubscribe(){var t;this.hasListeners()||(t=r(this,k))==null||t.removeObserver(this)}onMutationUpdate(t){f(this,Y,Zt).call(this),f(this,Y,ye).call(this,t)}getCurrentResult(){return r(this,ut)}reset(){var t;(t=r(this,k))==null||t.removeObserver(this),o(this,k,void 0),f(this,Y,Zt).call(this),f(this,Y,ye).call(this)}mutate(t,s){var i;return o(this,X,s),(i=r(this,k))==null||i.removeObserver(this),o(this,k,r(this,Z).getMutationCache().build(r(this,Z),this.options)),r(this,k).addObserver(this),r(this,k).execute(t)}},Z=new WeakMap,ut=new WeakMap,k=new WeakMap,X=new WeakMap,Y=new WeakSet,Zt=function(){var s;const t=((s=r(this,k))==null?void 0:s.state)??Ye();o(this,ut,{...t,isPending:t.status==="pending",isSuccess:t.status==="success",isError:t.status==="error",isIdle:t.status==="idle",mutate:this.mutate,reset:this.reset})},ye=function(t){M.batch(()=>{var s,i,n,a,h,u,p,m;if(r(this,X)&&this.hasListeners()){const v=r(this,ut).variables,y=r(this,ut).context,g={client:r(this,Z),meta:this.options.meta,mutationKey:this.options.mutationKey};if((t==null?void 0:t.type)==="success"){try{(i=(s=r(this,X)).onSuccess)==null||i.call(s,t.data,v,y,g)}catch(d){Promise.reject(d)}try{(a=(n=r(this,X)).onSettled)==null||a.call(n,t.data,null,v,y,g)}catch(d){Promise.reject(d)}}else if((t==null?void 0:t.type)==="error"){try{(u=(h=r(this,X)).onError)==null||u.call(h,t.error,v,y,g)}catch(d){Promise.reject(d)}try{(m=(p=r(this,X)).onSettled)==null||m.call(p,void 0,t.error,v,y,g)}catch(d){Promise.reject(d)}}}this.listeners.forEach(v=>{v(r(this,ut))})})},Le),V,He,Ms=(He=class extends qt{constructor(t={}){super();c(this,V);this.config=t,o(this,V,new Map)}build(t,s,i){const n=s.queryKey,a=s.queryHash??ve(n,s);let h=this.get(a);return h||(h=new ws({client:t,queryKey:n,queryHash:a,options:t.defaultQueryOptions(s),state:i,defaultOptions:t.getQueryDefaults(n)}),this.add(h)),h}add(t){r(this,V).has(t.queryHash)||(r(this,V).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=r(this,V).get(t.queryHash);s&&(t.destroy(),s===t&&r(this,V).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){M.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return r(this,V).get(t)}getAll(){return[...r(this,V).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(i=>Oe(s,i))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(i=>Oe(t,i)):s}notify(t){M.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){M.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){M.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},V=new WeakMap,He),E,ht,ct,xt,At,lt,jt,Ut,Ne,Ns=(Ne=class{constructor(e={}){c(this,E);c(this,ht);c(this,ct);c(this,xt);c(this,At);c(this,lt);c(this,jt);c(this,Ut);o(this,E,e.queryCache||new Ms),o(this,ht,e.mutationCache||new Fs),o(this,ct,e.defaultOptions||{}),o(this,xt,new Map),o(this,At,new Map),o(this,lt,0)}mount(){$t(this,lt)._++,r(this,lt)===1&&(o(this,jt,me.subscribe(async e=>{e&&(await this.resumePausedMutations(),r(this,E).onFocus())})),o(this,Ut,Yt.subscribe(async e=>{e&&(await this.resumePausedMutations(),r(this,E).onOnline())})))}unmount(){var e,t;$t(this,lt)._--,r(this,lt)===0&&((e=r(this,jt))==null||e.call(this),o(this,jt,void 0),(t=r(this,Ut))==null||t.call(this),o(this,Ut,void 0))}isFetching(e){return r(this,E).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return r(this,ht).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=r(this,E).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=r(this,E).build(this,t),i=s.state.data;return i===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(dt(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(i))}getQueriesData(e){return r(this,E).findAll(e).map(({queryKey:t,state:s})=>{const i=s.data;return[t,i]})}setQueryData(e,t,s){const i=this.defaultQueryOptions({queryKey:e}),n=r(this,E).get(i.queryHash),a=n==null?void 0:n.state.data,h=hs(t,a);if(h!==void 0)return r(this,E).build(this,i).setData(h,{...s,manual:!0})}setQueriesData(e,t,s){return M.batch(()=>r(this,E).findAll(e).map(({queryKey:i})=>[i,this.setQueryData(i,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=r(this,E).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=r(this,E);M.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=r(this,E);return M.batch(()=>(s.findAll(e).forEach(i=>{i.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},i=M.batch(()=>r(this,E).findAll(e).map(n=>n.cancel(s)));return Promise.all(i).then(q).catch(q)}invalidateQueries(e,t={}){return M.batch(()=>(r(this,E).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},i=M.batch(()=>r(this,E).findAll(e).filter(n=>!n.isDisabled()&&!n.isStatic()).map(n=>{let a=n.fetch(void 0,s);return s.throwOnError||(a=a.catch(q)),n.state.fetchStatus==="paused"?Promise.resolve():a}));return Promise.all(i).then(q)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=r(this,E).build(this,t);return s.isStaleByTime(dt(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(q).catch(q)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(q).catch(q)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Yt.isOnline()?r(this,ht).resumePausedMutations():Promise.resolve()}getQueryCache(){return r(this,E)}getMutationCache(){return r(this,ht)}getDefaultOptions(){return r(this,ct)}setDefaultOptions(e){o(this,ct,e)}setQueryDefaults(e,t){r(this,xt).set(Ot(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...r(this,xt).values()],s={};return t.forEach(i=>{_t(e,i.queryKey)&&Object.assign(s,i.defaultOptions)}),s}setMutationDefaults(e,t){r(this,At).set(Ot(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...r(this,At).values()],s={};return t.forEach(i=>{_t(e,i.mutationKey)&&Object.assign(s,i.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...r(this,ct).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=ve(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===be&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...r(this,ct).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){r(this,E).clear(),r(this,ht).clear()}},E=new WeakMap,ht=new WeakMap,ct=new WeakMap,xt=new WeakMap,At=new WeakMap,lt=new WeakMap,jt=new WeakMap,Ut=new WeakMap,Ne),ts=x.createContext(void 0),es=e=>{const t=x.useContext(ts);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Gs=({client:e,children:t})=>(x.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),is.jsx(ts.Provider,{value:e,children:t})),ss=x.createContext(!1),Qs=()=>x.useContext(ss);ss.Provider;function Is(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var Ts=x.createContext(Is()),Ds=()=>x.useContext(Ts),xs=(e,t,s)=>{const i=s!=null&&s.state.error&&typeof e.throwOnError=="function"?ge(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||i)&&(t.isReset()||(e.retryOnMount=!1))},As=e=>{x.useEffect(()=>{e.clearReset()},[e])},js=({result:e,errorResetBoundary:t,throwOnError:s,query:i,suspense:n})=>e.isError&&!t.isReset()&&!e.isFetching&&i&&(n&&e.data===void 0||ge(s,[e.error,i])),Us=e=>{if(e.suspense){const s=n=>n==="static"?n:Math.max(n??1e3,1e3),i=e.staleTime;e.staleTime=typeof i=="function"?(...n)=>s(i(...n)):s(i),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},qs=(e,t)=>e.isLoading&&e.isFetching&&!t,Ks=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,De=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function _s(e,t,s){var g,d,F,S;const i=Qs(),n=Ds(),a=es(),h=a.defaultQueryOptions(e);(d=(g=a.getDefaultOptions().queries)==null?void 0:g._experimental_beforeQuery)==null||d.call(g,h);const u=a.getQueryCache().get(h.queryHash);h._optimisticResults=i?"isRestoring":"optimistic",Us(h),xs(h,n,u),As(n);const p=!a.getQueryCache().get(h.queryHash),[m]=x.useState(()=>new t(a,h)),v=m.getOptimisticResult(h),y=!i&&e.subscribed!==!1;if(x.useSyncExternalStore(x.useCallback(w=>{const P=y?m.subscribe(M.batchCalls(w)):q;return m.updateResult(),P},[m,y]),()=>m.getCurrentResult(),()=>m.getCurrentResult()),x.useEffect(()=>{m.setOptions(h)},[h,m]),Ks(h,v))throw De(h,m,n);if(js({result:v,errorResetBoundary:n,throwOnError:h.throwOnError,query:u,suspense:h.suspense}))throw v.error;if((S=(F=a.getDefaultOptions().queries)==null?void 0:F._experimental_afterQuery)==null||S.call(F,h,v),h.experimental_prefetchInRender&&!kt.isServer()&&qs(v,i)){const w=p?De(h,m,n):u==null?void 0:u.promise;w==null||w.catch(q).finally(()=>{m.updateResult()})}return h.notifyOnChangeProps?v:m.trackResult(v)}function Bs(e,t){return _s(e,Cs)}function zs(e,t){const s=es(),[i]=x.useState(()=>new Es(s,e));x.useEffect(()=>{i.setOptions(e)},[i,e]);const n=x.useSyncExternalStore(x.useCallback(h=>i.subscribe(M.batchCalls(h)),[i]),()=>i.getCurrentResult(),()=>i.getCurrentResult()),a=x.useCallback((h,u)=>{i.mutate(h,u).catch(q)},[i]);if(n.error&&ge(i.options.throwOnError,[n.error]))throw n.error;return{...n,mutate:a,mutateAsync:n.mutate}}export{Ns as Q,Gs as a,es as b,zs as c,Hs as k,Bs as u};
|
|
2
|
+
//# sourceMappingURL=query-S6X1S7K9.js.map
|