gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.8b8d129d7
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/README.md +93 -18
- package/dist/cli.js +20 -9
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +110 -37
- package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -1
- package/dist/resources/extensions/gsd/auto/phases.js +97 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +102 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
- package/dist/resources/extensions/gsd/auto.js +98 -54
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +8 -3
- package/dist/resources/extensions/gsd/git-service.js +138 -10
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
- package/dist/resources/extensions/gsd/preferences.js +2 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +14 -4
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/resources/skills/forensics/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/package.json +4 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +13 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -27
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +108 -27
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +111 -38
- package/src/resources/extensions/gsd/auto/orchestrator.ts +12 -1
- package/src/resources/extensions/gsd/auto/phases.ts +115 -49
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +124 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
- package/src/resources/extensions/gsd/auto.ts +91 -42
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +7 -3
- package/src/resources/extensions/gsd/git-service.ts +166 -11
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-types.ts +33 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +15 -4
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +174 -8
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +128 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +51 -18
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/skills/forensics/SKILL.md +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → _kljR-_Miq_YV1IW0wpRO}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// GSD-2 + Visual Brief page contract
|
|
2
|
+
|
|
3
|
+
import type { VisualBriefMode } from "./prompts.js";
|
|
4
|
+
|
|
5
|
+
export interface VisualBriefModeProfile {
|
|
6
|
+
goal: string;
|
|
7
|
+
evidenceSteps: readonly string[];
|
|
8
|
+
sections: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const VISUAL_BRIEF_PAGE_RULES: readonly string[] = [
|
|
12
|
+
"Use Mermaid for topology-heavy diagrams when it improves readability.",
|
|
13
|
+
"Use semantic HTML tables for comparisons, audits, matrices, status reports, and dense lists.",
|
|
14
|
+
"Use CSS grid/card layouts when text-heavy module details matter more than edge routing.",
|
|
15
|
+
"For 15+ entities, use a small overview diagram plus detailed cards instead of one crowded diagram.",
|
|
16
|
+
"Include accessible headings, readable contrast, responsive tables, and no horizontal body overflow.",
|
|
17
|
+
"Include source references for factual claims, file relationships, commands, and inferred behavior.",
|
|
18
|
+
"Keep the design distinctive and appropriate to the content; avoid generic purple/blue gradient styling.",
|
|
19
|
+
"CDN libraries are acceptable for Mermaid or charts, but the page must still show useful written context if a CDN fails.",
|
|
20
|
+
"Do not include provider-specific claims, branding, or assumptions.",
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
export function getVisualBriefModeProfile(mode: VisualBriefMode, slides: boolean): VisualBriefModeProfile {
|
|
24
|
+
if (slides || mode === "slides") {
|
|
25
|
+
return {
|
|
26
|
+
goal: "Turn the subject into a concise, visually paced deck that someone can present or skim quickly.",
|
|
27
|
+
evidenceSteps: [
|
|
28
|
+
"Identify the intended audience and the main decision or understanding the deck should support.",
|
|
29
|
+
"Read the relevant files, diffs, docs, or command output before making factual claims.",
|
|
30
|
+
"Extract the smallest set of concepts, risks, and examples needed for a clear narrative.",
|
|
31
|
+
],
|
|
32
|
+
sections: [
|
|
33
|
+
"Title slide with the subject and one-line takeaway",
|
|
34
|
+
"Problem or context slide",
|
|
35
|
+
"System or concept diagram slide",
|
|
36
|
+
"Key evidence slide",
|
|
37
|
+
"Risks, tradeoffs, or unknowns slide",
|
|
38
|
+
"Recommended next steps slide",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
switch (mode) {
|
|
44
|
+
case "plan":
|
|
45
|
+
return {
|
|
46
|
+
goal: "Create a visual implementation plan that is detailed enough to guide coding without pretending uncertain facts are verified.",
|
|
47
|
+
evidenceSteps: [
|
|
48
|
+
"Read the relevant exports, immediate callers, tests, docs, and shared utilities.",
|
|
49
|
+
"Identify the likely file changes, existing conventions, edge cases, and test requirements.",
|
|
50
|
+
"Mark any assumption that cannot be verified from the repository.",
|
|
51
|
+
],
|
|
52
|
+
sections: [
|
|
53
|
+
"Feature summary and scope boundaries",
|
|
54
|
+
"Before/after workflow comparison",
|
|
55
|
+
"Architecture or state-flow diagram",
|
|
56
|
+
"Files to change with precise responsibilities",
|
|
57
|
+
"API, command, or data-shape changes",
|
|
58
|
+
"Edge cases and failure behavior",
|
|
59
|
+
"Test plan with success and failure paths",
|
|
60
|
+
"Open questions and assumptions",
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
case "diff":
|
|
64
|
+
return {
|
|
65
|
+
goal: "Review the current changes visually so risk, intent, and affected areas are easy to scan.",
|
|
66
|
+
evidenceSteps: [
|
|
67
|
+
"Inspect git status plus staged and unstaged diffs.",
|
|
68
|
+
"Read changed files where needed to understand behavior, not just line changes.",
|
|
69
|
+
"Separate confirmed findings from questions or residual risk.",
|
|
70
|
+
],
|
|
71
|
+
sections: [
|
|
72
|
+
"Change map by file and subsystem",
|
|
73
|
+
"Intent summary inferred from the diff",
|
|
74
|
+
"Risk heatmap",
|
|
75
|
+
"Behavior changes and compatibility notes",
|
|
76
|
+
"Test coverage matrix",
|
|
77
|
+
"Actionable findings and open questions",
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
case "recap":
|
|
81
|
+
return {
|
|
82
|
+
goal: "Create a context-switching snapshot that helps someone regain the project mental model quickly.",
|
|
83
|
+
evidenceSteps: [
|
|
84
|
+
"Read the current project docs, recent git status, relevant plans, and high-signal source files.",
|
|
85
|
+
"Identify active work, stable architecture, uncertain areas, and likely next actions.",
|
|
86
|
+
"Prefer concrete file references and verified facts over broad summaries.",
|
|
87
|
+
],
|
|
88
|
+
sections: [
|
|
89
|
+
"Current project state",
|
|
90
|
+
"Architecture map",
|
|
91
|
+
"Active work and changed files",
|
|
92
|
+
"Important decisions and constraints",
|
|
93
|
+
"Risks or unresolved questions",
|
|
94
|
+
"Recommended next actions",
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
case "table":
|
|
98
|
+
return {
|
|
99
|
+
goal: "Turn dense structured information into an accessible visual table that is easier to compare than terminal output.",
|
|
100
|
+
evidenceSteps: [
|
|
101
|
+
"Identify the row and column meanings before choosing table structure.",
|
|
102
|
+
"Verify each cell from source material, command output, or code when possible.",
|
|
103
|
+
"Use status labels and short notes so the table remains scannable.",
|
|
104
|
+
],
|
|
105
|
+
sections: [
|
|
106
|
+
"Short summary of what is being compared",
|
|
107
|
+
"Primary responsive table with sticky header",
|
|
108
|
+
"Legend for statuses or scoring",
|
|
109
|
+
"Notable patterns, outliers, and caveats",
|
|
110
|
+
"Source references",
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
case "diagram":
|
|
114
|
+
return {
|
|
115
|
+
goal: "Explain the subject visually with a diagram plus enough context to make the diagram trustworthy.",
|
|
116
|
+
evidenceSteps: [
|
|
117
|
+
"Read relevant files, docs, or command output before drawing relationships.",
|
|
118
|
+
"Choose the right diagram type: flowchart, sequence, state, ER/schema, C4-style, timeline, or dashboard.",
|
|
119
|
+
"Keep complex diagrams readable by splitting overview and details.",
|
|
120
|
+
],
|
|
121
|
+
sections: [
|
|
122
|
+
"One-line takeaway",
|
|
123
|
+
"Primary diagram with readable labels",
|
|
124
|
+
"Component or step details",
|
|
125
|
+
"Data/control flow notes",
|
|
126
|
+
"Assumptions, limitations, and source references",
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
default:
|
|
130
|
+
throw new Error(`Unknown visual brief mode: ${mode as string}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function formatPageRules(rules: readonly string[] = VISUAL_BRIEF_PAGE_RULES): string {
|
|
135
|
+
return rules.map((rule) => ` - ${rule}`).join("\n");
|
|
136
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// GSD-2 + Visual Brief prompt construction
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
createVisualBriefArtifactPolicy,
|
|
5
|
+
formatArtifactPolicy,
|
|
6
|
+
} from "./artifact-policy.js";
|
|
7
|
+
import {
|
|
8
|
+
formatPageRules,
|
|
9
|
+
getVisualBriefModeProfile,
|
|
10
|
+
} from "./page-contract.js";
|
|
11
|
+
import { renderHtmlShellTemplate } from "../shared/html-shell.js";
|
|
12
|
+
|
|
13
|
+
export type VisualBriefMode = "diagram" | "plan" | "diff" | "recap" | "table" | "slides";
|
|
14
|
+
|
|
15
|
+
export interface VisualBriefRequest {
|
|
16
|
+
mode: VisualBriefMode;
|
|
17
|
+
subject: string;
|
|
18
|
+
slides: boolean;
|
|
19
|
+
rawArgs: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface VisualBriefModeInfo {
|
|
23
|
+
mode: VisualBriefMode;
|
|
24
|
+
aliases: readonly string[];
|
|
25
|
+
description: string;
|
|
26
|
+
defaultSubject?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const VISUAL_BRIEF_MODES: readonly VisualBriefModeInfo[] = [
|
|
30
|
+
{
|
|
31
|
+
mode: "diagram",
|
|
32
|
+
aliases: ["diagram", "flow", "architecture", "arch", "web-diagram"],
|
|
33
|
+
description: "Generate a visual system, architecture, flow, state, or data diagram",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
mode: "plan",
|
|
37
|
+
aliases: ["plan", "visual-plan", "implementation-plan"],
|
|
38
|
+
description: "Generate a visual implementation plan with risks, files, edge cases, and tests",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
mode: "diff",
|
|
42
|
+
aliases: ["diff", "review", "diff-review", "changes"],
|
|
43
|
+
description: "Generate a visual review of staged and unstaged changes",
|
|
44
|
+
defaultSubject: "the current staged and unstaged repository changes",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
mode: "recap",
|
|
48
|
+
aliases: ["recap", "project-recap", "summary"],
|
|
49
|
+
description: "Generate a visual project recap for context switching",
|
|
50
|
+
defaultSubject: "the current project",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
mode: "table",
|
|
54
|
+
aliases: ["table", "comparison", "matrix", "audit"],
|
|
55
|
+
description: "Render a dense comparison, audit, or status report as a readable HTML table",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
mode: "slides",
|
|
59
|
+
aliases: ["slides", "deck", "slide-deck"],
|
|
60
|
+
description: "Generate a visual slide deck",
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
export const VISUAL_BRIEF_USAGE =
|
|
65
|
+
"Usage: /gsd brief <diagram|plan|diff|recap|table|slides> [topic] [--slides]";
|
|
66
|
+
|
|
67
|
+
const VISUAL_BRIEF_KIND: Record<VisualBriefMode, string> = {
|
|
68
|
+
diff: "Diff Brief",
|
|
69
|
+
recap: "Project Recap",
|
|
70
|
+
plan: "Implementation Plan",
|
|
71
|
+
diagram: "Diagram",
|
|
72
|
+
table: "Comparison",
|
|
73
|
+
slides: "Slide Deck",
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export function parseVisualBriefArgs(args: string): VisualBriefRequest | null {
|
|
77
|
+
const rawArgs = args.trim();
|
|
78
|
+
if (!rawArgs) return null;
|
|
79
|
+
|
|
80
|
+
const tokens = rawArgs.split(/\s+/).filter(Boolean);
|
|
81
|
+
const slidesFlag = tokens.includes("--slides");
|
|
82
|
+
const contentTokens = tokens.filter((token) => token !== "--slides");
|
|
83
|
+
if (contentTokens.length === 0) return null;
|
|
84
|
+
|
|
85
|
+
const firstToken = normalizeToken(contentTokens[0] ?? "");
|
|
86
|
+
const modeInfo = findMode(firstToken);
|
|
87
|
+
const mode = modeInfo?.mode ?? "diagram";
|
|
88
|
+
const subjectTokens = modeInfo ? contentTokens.slice(1) : contentTokens;
|
|
89
|
+
const subject = subjectTokens.join(" ").trim() || modeInfo?.defaultSubject;
|
|
90
|
+
|
|
91
|
+
if (!subject) return null;
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
mode,
|
|
95
|
+
subject,
|
|
96
|
+
slides: slidesFlag || mode === "slides",
|
|
97
|
+
rawArgs,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface VisualBriefPromptOptions {
|
|
102
|
+
outputDir: string;
|
|
103
|
+
/** GSD version rendered in the shell header/footer. Falls back to "0.0.0" when not provided. */
|
|
104
|
+
version?: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function buildVisualBriefPrompt(
|
|
108
|
+
request: VisualBriefRequest,
|
|
109
|
+
options: VisualBriefPromptOptions,
|
|
110
|
+
): string {
|
|
111
|
+
const profile = getVisualBriefModeProfile(request.mode, request.slides);
|
|
112
|
+
const artifactPolicy = createVisualBriefArtifactPolicy(options.outputDir);
|
|
113
|
+
const outputFormat = request.slides ? "slide deck" : "scrollable explanation page";
|
|
114
|
+
const version = options.version?.trim() || undefined;
|
|
115
|
+
const shell = renderHtmlShellTemplate({
|
|
116
|
+
title: request.subject,
|
|
117
|
+
documentTitle: `GSD ${VISUAL_BRIEF_KIND[request.mode]} - ${request.subject}`,
|
|
118
|
+
subtitle: "Visual brief",
|
|
119
|
+
kind: VISUAL_BRIEF_KIND[request.mode],
|
|
120
|
+
version,
|
|
121
|
+
mainPlaceholder: "{{MAIN_HTML}}",
|
|
122
|
+
footerNote: request.subject,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
return `Create a visual brief as a single HTML file.
|
|
126
|
+
|
|
127
|
+
## Request
|
|
128
|
+
|
|
129
|
+
- Mode: ${request.mode}
|
|
130
|
+
- Subject: ${request.subject}
|
|
131
|
+
- Output format: ${outputFormat}
|
|
132
|
+
- Output directory: ${options.outputDir}
|
|
133
|
+
|
|
134
|
+
## Goal
|
|
135
|
+
|
|
136
|
+
${profile.goal}
|
|
137
|
+
|
|
138
|
+
## Required workflow
|
|
139
|
+
|
|
140
|
+
1. Gather evidence before writing the page.
|
|
141
|
+
${profile.evidenceSteps.map((step) => ` - ${step}`).join("\n")}
|
|
142
|
+
2. Build the visual structure from the evidence.
|
|
143
|
+
${formatPageRules()}
|
|
144
|
+
3. Write the HTML file.
|
|
145
|
+
${formatArtifactPolicy(artifactPolicy).split("\n").map((line) => ` ${line}`).join("\n")}
|
|
146
|
+
|
|
147
|
+
## Required HTML shell
|
|
148
|
+
|
|
149
|
+
Use this scaffold verbatim. Replace {{MAIN_HTML}} with the authored <main> contents and {{GENERATED_AT}} with the current ISO timestamp. Do not add new <style> blocks or replace the header, footer, CSS, or script. The <h1> is the subject only; the kind chip is the only visual carrier of artifact type.
|
|
150
|
+
|
|
151
|
+
\`\`\`html
|
|
152
|
+
${shell}
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
Author only section-level content for {{MAIN_HTML}}. Use the shell utility classes where they fit: .kv-grid, .tbl, .card-row, .card, .callout-info, .callout-warn, .callout-ok, .dot-active, .dot-complete, .dot-pending.
|
|
156
|
+
|
|
157
|
+
## Page sections
|
|
158
|
+
|
|
159
|
+
${profile.sections.map((section) => `- ${section}`).join("\n")}
|
|
160
|
+
|
|
161
|
+
## Final response
|
|
162
|
+
|
|
163
|
+
Keep the chat response short: state the output file path, whether the browser opened, and any uncertainty discovered during evidence gathering.`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function getVisualBriefCompletions(prefix: string): Array<{ value: string; label: string; description: string }> {
|
|
167
|
+
const firstPart = prefix.trim().split(/\s+/)[0] ?? "";
|
|
168
|
+
return VISUAL_BRIEF_MODES
|
|
169
|
+
.filter((mode) => mode.mode.startsWith(firstPart) || mode.aliases.some((alias) => alias.startsWith(firstPart)))
|
|
170
|
+
.map((mode) => ({
|
|
171
|
+
value: mode.mode,
|
|
172
|
+
label: mode.mode,
|
|
173
|
+
description: mode.description,
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function findMode(token: string): VisualBriefModeInfo | undefined {
|
|
178
|
+
return VISUAL_BRIEF_MODES.find((mode) => mode.aliases.includes(token));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function normalizeToken(token: string): string {
|
|
182
|
+
return token.trim().toLowerCase();
|
|
183
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// GSD-2 + Visual Brief command tests
|
|
2
|
+
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { readManifest } from "@gsd/pi-coding-agent";
|
|
8
|
+
import {
|
|
9
|
+
createVisualBriefArtifactPolicy,
|
|
10
|
+
formatArtifactPolicy,
|
|
11
|
+
getVisualBriefOutputDir,
|
|
12
|
+
} from "../artifact-policy.ts";
|
|
13
|
+
import {
|
|
14
|
+
getVisualBriefModeProfile,
|
|
15
|
+
VISUAL_BRIEF_PAGE_RULES,
|
|
16
|
+
} from "../page-contract.ts";
|
|
17
|
+
import {
|
|
18
|
+
buildVisualBriefPrompt,
|
|
19
|
+
getVisualBriefCompletions,
|
|
20
|
+
parseVisualBriefArgs,
|
|
21
|
+
VISUAL_BRIEF_MODES,
|
|
22
|
+
VISUAL_BRIEF_USAGE,
|
|
23
|
+
} from "../prompts.ts";
|
|
24
|
+
|
|
25
|
+
test("keeps Visual Brief command surface under /gsd brief", () => {
|
|
26
|
+
const manifest = readManifest(fileURLToPath(new URL("..", import.meta.url)));
|
|
27
|
+
|
|
28
|
+
assert.equal(manifest?.id, "visual-brief");
|
|
29
|
+
assert.equal(manifest?.provides?.commands, undefined);
|
|
30
|
+
assert.match(VISUAL_BRIEF_USAGE, /^Usage: \/gsd brief/);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("parses explicit modes and slide output", () => {
|
|
34
|
+
const request = parseVisualBriefArgs("plan --slides browser tools verification flow");
|
|
35
|
+
|
|
36
|
+
assert.deepEqual(request, {
|
|
37
|
+
mode: "plan",
|
|
38
|
+
subject: "browser tools verification flow",
|
|
39
|
+
slides: true,
|
|
40
|
+
rawArgs: "plan --slides browser tools verification flow",
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("defaults freeform input to diagram mode", () => {
|
|
45
|
+
const request = parseVisualBriefArgs("authentication sequence");
|
|
46
|
+
|
|
47
|
+
assert.equal(request?.mode, "diagram");
|
|
48
|
+
assert.equal(request?.subject, "authentication sequence");
|
|
49
|
+
assert.equal(request?.slides, false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("parses supported aliases without registering command aliases", () => {
|
|
53
|
+
const review = parseVisualBriefArgs("review release branch changes");
|
|
54
|
+
const deck = parseVisualBriefArgs("deck launch recap");
|
|
55
|
+
|
|
56
|
+
assert.equal(review?.mode, "diff");
|
|
57
|
+
assert.equal(review?.subject, "release branch changes");
|
|
58
|
+
assert.equal(deck?.mode, "slides");
|
|
59
|
+
assert.equal(deck?.slides, true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("rejects flag-only input as usage", () => {
|
|
63
|
+
assert.equal(parseVisualBriefArgs("--slides"), null);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("uses current changes as the diff subject when none is provided", () => {
|
|
67
|
+
const request = parseVisualBriefArgs("diff");
|
|
68
|
+
|
|
69
|
+
assert.equal(request?.mode, "diff");
|
|
70
|
+
assert.equal(request?.subject, "the current staged and unstaged repository changes");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("builds a provider-neutral prompt with output instructions", () => {
|
|
74
|
+
const request = parseVisualBriefArgs("table release readiness matrix");
|
|
75
|
+
assert.ok(request, "request should parse");
|
|
76
|
+
|
|
77
|
+
const prompt = buildVisualBriefPrompt(request, { outputDir: "/tmp/gsd-diagrams" });
|
|
78
|
+
|
|
79
|
+
assert.match(prompt, /Mode: table/);
|
|
80
|
+
assert.match(prompt, /Subject: release readiness matrix/);
|
|
81
|
+
assert.match(prompt, /Output directory: \/tmp\/gsd-diagrams/);
|
|
82
|
+
assert.match(prompt, /Do not include provider-specific claims/);
|
|
83
|
+
assert.match(prompt, /Use semantic HTML tables/);
|
|
84
|
+
assert.match(prompt, /Use a descriptive kebab-case filename/);
|
|
85
|
+
assert.match(prompt, /one self-contained responsive HTML file/);
|
|
86
|
+
assert.match(prompt, /macOS: open/);
|
|
87
|
+
assert.match(prompt, /absolute file path/);
|
|
88
|
+
assert.ok(prompt.indexOf("Gather evidence before writing the page") < prompt.indexOf("Write the HTML file"));
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("generated prompts require the shared GSD HTML shell", () => {
|
|
92
|
+
const request = parseVisualBriefArgs("diff");
|
|
93
|
+
assert.ok(request, "diff request should parse");
|
|
94
|
+
|
|
95
|
+
const prompt = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief" });
|
|
96
|
+
|
|
97
|
+
assert.match(prompt, /## Required HTML shell/);
|
|
98
|
+
assert.match(prompt, /<span class="logo">GSD<\/span>/);
|
|
99
|
+
assert.match(prompt, /<span class="kind-chip">Diff Brief<\/span>/);
|
|
100
|
+
assert.match(prompt, /{{MAIN_HTML}}/);
|
|
101
|
+
assert.match(prompt, /{{GENERATED_AT}}/);
|
|
102
|
+
assert.match(prompt, /Do not add new <style> blocks/);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("returns first-argument completions for visual brief modes", () => {
|
|
106
|
+
const completions = getVisualBriefCompletions("di");
|
|
107
|
+
|
|
108
|
+
assert.ok(
|
|
109
|
+
completions.some((completion) => completion.value === "diagram"),
|
|
110
|
+
"diagram should be suggested for a matching prefix",
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const allCompletions = getVisualBriefCompletions("");
|
|
114
|
+
for (const mode of VISUAL_BRIEF_MODES) {
|
|
115
|
+
assert.ok(
|
|
116
|
+
allCompletions.some((completion) => completion.value === mode.mode),
|
|
117
|
+
`${mode.mode} should be suggested without a prefix`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("generated prompts include page contract rules and sections for every mode", () => {
|
|
123
|
+
for (const mode of VISUAL_BRIEF_MODES) {
|
|
124
|
+
const request = parseVisualBriefArgs(`${mode.mode} scoped subject`);
|
|
125
|
+
assert.ok(request, `${mode.mode} request should parse`);
|
|
126
|
+
|
|
127
|
+
const prompt = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief" });
|
|
128
|
+
const profile = getVisualBriefModeProfile(request.mode, request.slides);
|
|
129
|
+
|
|
130
|
+
for (const rule of VISUAL_BRIEF_PAGE_RULES) {
|
|
131
|
+
assert.match(prompt, new RegExp(escapeRegExp(rule)), `${mode.mode} prompt should include page rule: ${rule}`);
|
|
132
|
+
}
|
|
133
|
+
for (const step of profile.evidenceSteps) {
|
|
134
|
+
assert.match(prompt, new RegExp(escapeRegExp(step)), `${mode.mode} prompt should include evidence step: ${step}`);
|
|
135
|
+
}
|
|
136
|
+
for (const section of profile.sections) {
|
|
137
|
+
assert.match(prompt, new RegExp(escapeRegExp(section)), `${mode.mode} prompt should include section: ${section}`);
|
|
138
|
+
}
|
|
139
|
+
assert.doesNotMatch(prompt, /\/gsd visualize/);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("diff prompt requires change evidence and review sections", () => {
|
|
144
|
+
const request = parseVisualBriefArgs("diff");
|
|
145
|
+
assert.ok(request, "diff request should parse");
|
|
146
|
+
const prompt = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief" });
|
|
147
|
+
const profile = getVisualBriefModeProfile("diff", false);
|
|
148
|
+
|
|
149
|
+
assert.ok(VISUAL_BRIEF_PAGE_RULES.includes("Include accessible headings, readable contrast, responsive tables, and no horizontal body overflow."));
|
|
150
|
+
assert.ok(
|
|
151
|
+
profile.sections.includes("Test coverage matrix"),
|
|
152
|
+
"diff review should include test coverage matrix section",
|
|
153
|
+
);
|
|
154
|
+
assert.ok(
|
|
155
|
+
profile.evidenceSteps.includes("Inspect git status plus staged and unstaged diffs."),
|
|
156
|
+
"diff review should require inspecting repository changes before claims",
|
|
157
|
+
);
|
|
158
|
+
assert.match(prompt, /Inspect git status plus staged and unstaged diffs/);
|
|
159
|
+
assert.match(prompt, /Change map by file and subsystem/);
|
|
160
|
+
assert.match(prompt, /Risk heatmap/);
|
|
161
|
+
assert.match(prompt, /Behavior changes and compatibility notes/);
|
|
162
|
+
assert.match(prompt, /Test coverage matrix/);
|
|
163
|
+
assert.match(prompt, /Actionable findings and open questions/);
|
|
164
|
+
assert.match(prompt, /Separate confirmed findings from questions or residual risk/);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("artifact policy formats output directory and opener guidance", () => {
|
|
168
|
+
const policy = createVisualBriefArtifactPolicy("/tmp/visual-brief");
|
|
169
|
+
const text = formatArtifactPolicy(policy);
|
|
170
|
+
|
|
171
|
+
assert.match(text, /\/tmp\/visual-brief/);
|
|
172
|
+
assert.match(text, /kebab-case filename/);
|
|
173
|
+
assert.match(text, /self-contained responsive HTML file/);
|
|
174
|
+
assert.match(text, /macOS: open/);
|
|
175
|
+
assert.match(text, /Linux: xdg-open/);
|
|
176
|
+
assert.match(text, /Windows: cmd \/c start/);
|
|
177
|
+
assert.match(text, /absolute file path/);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("artifact output directory is under the configured GSD agent directory", () => {
|
|
181
|
+
assert.equal(getVisualBriefOutputDir("/tmp/gsd-agent-test"), join("/tmp/gsd-agent-test", "diagrams"));
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("prompt embeds the GSD version in the shell when provided", () => {
|
|
185
|
+
const request = parseVisualBriefArgs("diff release branch changes");
|
|
186
|
+
assert.ok(request, "request should parse");
|
|
187
|
+
|
|
188
|
+
const prompt = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief", version: "9.9.9" });
|
|
189
|
+
assert.match(prompt, /v9\.9\.9/);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("prompt omits the version chip when version is missing or blank", () => {
|
|
193
|
+
const request = parseVisualBriefArgs("diff release branch changes");
|
|
194
|
+
assert.ok(request, "request should parse");
|
|
195
|
+
|
|
196
|
+
const blank = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief", version: " " });
|
|
197
|
+
assert.doesNotMatch(blank, /class="version"/);
|
|
198
|
+
|
|
199
|
+
const missing = buildVisualBriefPrompt(request, { outputDir: "/tmp/visual-brief" });
|
|
200
|
+
assert.doesNotMatch(missing, /class="version"/);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("getVisualBriefModeProfile throws on an unknown mode", () => {
|
|
204
|
+
assert.throws(
|
|
205
|
+
() => getVisualBriefModeProfile("not-a-real-mode" as unknown as Parameters<typeof getVisualBriefModeProfile>[0], false),
|
|
206
|
+
/Unknown visual brief mode: not-a-real-mode/,
|
|
207
|
+
);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
function escapeRegExp(value: string): string {
|
|
211
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
212
|
+
}
|
|
@@ -11,7 +11,7 @@ Turn scattered GSD runtime artifacts into one coherent cause chain. The delivera
|
|
|
11
11
|
GSD persists a lot of runtime evidence under `.gsd/`:
|
|
12
12
|
|
|
13
13
|
- `activity/{seq}-{unitType}-{unitId}.jsonl` — full tool-call and message stream per unit
|
|
14
|
-
- `journal/YYYY-MM-DD.jsonl` — iteration-level events (dispatch-match
|
|
14
|
+
- `journal/YYYY-MM-DD.jsonl` — iteration-level events. Orchestrator path emits `orchestrator-*` events (`orchestrator-dispatch-match`, `orchestrator-guard-block`, `orchestrator-terminal`, etc.); legacy loop events (`dispatch-match`, `stuck-detected`, `guard-block`, `unit-start/end`, `terminal`) can still appear on non-orchestrator paths.
|
|
15
15
|
- `metrics.json` — token/cost ledger; duplicate `type/id` entries indicate a stuck loop
|
|
16
16
|
- `auto.lock` — JSON snapshot of the currently-owning PID; stale lock = crash mid-unit
|
|
17
17
|
- `forensics/` — saved prior reports
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
exports.id=5822,exports.ids=[5822],exports.modules={8696:(a,b,c)=>{"use strict";c.d(b,{D:()=>j,N:()=>k});var d=c(67484),e=(a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}},f=["light","dark"],g="(prefers-color-scheme: dark)",h=d.createContext(void 0),i={setTheme:a=>{},themes:[]},j=()=>{var a;return null!=(a=d.useContext(h))?a:i},k=a=>d.useContext(h)?d.createElement(d.Fragment,null,a.children):d.createElement(m,{...a}),l=["light","dark"],m=({forcedTheme:a,disableTransitionOnChange:b=!1,enableSystem:c=!0,enableColorScheme:e=!0,storageKey:i="theme",themes:j=l,defaultTheme:k=c?"system":"light",attribute:m="data-theme",value:r,children:s,nonce:t,scriptProps:u})=>{let[v,w]=d.useState(()=>o(i,k)),[x,y]=d.useState(()=>"system"===v?q():v),z=r?Object.values(r):j,A=d.useCallback(a=>{let d=a;if(!d)return;"system"===a&&c&&(d=q());let g=r?r[d]:d,h=b?p(t):null,i=document.documentElement,j=a=>{"class"===a?(i.classList.remove(...z),g&&i.classList.add(g)):a.startsWith("data-")&&(g?i.setAttribute(a,g):i.removeAttribute(a))};if(Array.isArray(m)?m.forEach(j):j(m),e){let a=f.includes(k)?k:null,b=f.includes(d)?d:a;i.style.colorScheme=b}null==h||h()},[t]),B=d.useCallback(a=>{let b="function"==typeof a?a(v):a;w(b);try{localStorage.setItem(i,b)}catch(a){}},[v]),C=d.useCallback(b=>{y(q(b)),"system"===v&&c&&!a&&A("system")},[v,a]);d.useEffect(()=>{let a=window.matchMedia(g);return a.addListener(C),C(a),()=>a.removeListener(C)},[C]),d.useEffect(()=>{let a=a=>{a.key===i&&(a.newValue?w(a.newValue):B(k))};return window.addEventListener("storage",a),()=>window.removeEventListener("storage",a)},[B]),d.useEffect(()=>{A(null!=a?a:v)},[a,v]);let D=d.useMemo(()=>({theme:v,setTheme:B,forcedTheme:a,resolvedTheme:"system"===v?x:v,themes:c?[...j,"system"]:j,systemTheme:c?x:void 0}),[v,B,a,x,c,j]);return d.createElement(h.Provider,{value:D},d.createElement(n,{forcedTheme:a,storageKey:i,attribute:m,enableSystem:c,enableColorScheme:e,defaultTheme:k,value:r,themes:j,nonce:t,scriptProps:u}),s)},n=d.memo(({forcedTheme:a,storageKey:b,attribute:c,enableSystem:f,enableColorScheme:g,defaultTheme:h,value:i,themes:j,nonce:k,scriptProps:l})=>{let m=JSON.stringify([c,b,h,a,j,i,f,g]).slice(1,-1);return d.createElement("script",{...l,suppressHydrationWarning:!0,nonce:k,dangerouslySetInnerHTML:{__html:`(${e.toString()})(${m})`}})}),o=(a,b)=>{},p=a=>{let b=document.createElement("style");return a&&b.setAttribute("nonce",a),b.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),document.head.appendChild(b),()=>{window.getComputedStyle(document.body),setTimeout(()=>{document.head.removeChild(b)},1)}},q=a=>(a||(a=window.matchMedia(g)),a.matches?"dark":"light")},55091:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return f}});let d=c(5735),e=c(22675);function f(){return(0,d.jsx)(e.HTTPAccessErrorFallback,{status:404,message:"This page could not be found."})}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},65163:a=>{a.exports={style:{fontFamily:"'Geist Mono', 'Geist Mono Fallback'",fontStyle:"normal"},className:"__className_9a8899",variable:"__variable_9a8899"}},90707:(a,b,c)=>{"use strict";c.d(b,{l$:()=>s});var d=c(67484),e=c(74429),f=Array(12).fill(0),g=({visible:a,className:b})=>d.createElement("div",{className:["sonner-loading-wrapper",b].filter(Boolean).join(" "),"data-visible":a},d.createElement("div",{className:"sonner-spinner"},f.map((a,b)=>d.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${b}`})))),h=d.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},d.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),i=d.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},d.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),j=d.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},d.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),k=d.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},d.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),l=d.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},d.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),d.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),m=1,n=new class{constructor(){this.subscribe=a=>(this.subscribers.push(a),()=>{let b=this.subscribers.indexOf(a);this.subscribers.splice(b,1)}),this.publish=a=>{this.subscribers.forEach(b=>b(a))},this.addToast=a=>{this.publish(a),this.toasts=[...this.toasts,a]},this.create=a=>{var b;let{message:c,...d}=a,e="number"==typeof(null==a?void 0:a.id)||(null==(b=a.id)?void 0:b.length)>0?a.id:m++,f=this.toasts.find(a=>a.id===e),g=void 0===a.dismissible||a.dismissible;return this.dismissedToasts.has(e)&&this.dismissedToasts.delete(e),f?this.toasts=this.toasts.map(b=>b.id===e?(this.publish({...b,...a,id:e,title:c}),{...b,...a,id:e,dismissible:g,title:c}):b):this.addToast({title:c,...d,dismissible:g,id:e}),e},this.dismiss=a=>(this.dismissedToasts.add(a),a||this.toasts.forEach(a=>{this.subscribers.forEach(b=>b({id:a.id,dismiss:!0}))}),this.subscribers.forEach(b=>b({id:a,dismiss:!0})),a),this.message=(a,b)=>this.create({...b,message:a}),this.error=(a,b)=>this.create({...b,message:a,type:"error"}),this.success=(a,b)=>this.create({...b,type:"success",message:a}),this.info=(a,b)=>this.create({...b,type:"info",message:a}),this.warning=(a,b)=>this.create({...b,type:"warning",message:a}),this.loading=(a,b)=>this.create({...b,type:"loading",message:a}),this.promise=(a,b)=>{let c;if(!b)return;void 0!==b.loading&&(c=this.create({...b,promise:a,type:"loading",message:b.loading,description:"function"!=typeof b.description?b.description:void 0}));let e=a instanceof Promise?a:a(),f=void 0!==c,g,h=e.then(async a=>{if(g=["resolve",a],d.isValidElement(a))f=!1,this.create({id:c,type:"default",message:a});else if(o(a)&&!a.ok){f=!1;let d="function"==typeof b.error?await b.error(`HTTP error! status: ${a.status}`):b.error,e="function"==typeof b.description?await b.description(`HTTP error! status: ${a.status}`):b.description;this.create({id:c,type:"error",message:d,description:e})}else if(void 0!==b.success){f=!1;let d="function"==typeof b.success?await b.success(a):b.success,e="function"==typeof b.description?await b.description(a):b.description;this.create({id:c,type:"success",message:d,description:e})}}).catch(async a=>{if(g=["reject",a],void 0!==b.error){f=!1;let d="function"==typeof b.error?await b.error(a):b.error,e="function"==typeof b.description?await b.description(a):b.description;this.create({id:c,type:"error",message:d,description:e})}}).finally(()=>{var a;f&&(this.dismiss(c),c=void 0),null==(a=b.finally)||a.call(b)}),i=()=>new Promise((a,b)=>h.then(()=>"reject"===g[0]?b(g[1]):a(g[1])).catch(b));return"string"!=typeof c&&"number"!=typeof c?{unwrap:i}:Object.assign(c,{unwrap:i})},this.custom=(a,b)=>{let c=(null==b?void 0:b.id)||m++;return this.create({jsx:a(c),id:c,...b}),c},this.getActiveToasts=()=>this.toasts.filter(a=>!this.dismissedToasts.has(a.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},o=a=>a&&"object"==typeof a&&"ok"in a&&"boolean"==typeof a.ok&&"status"in a&&"number"==typeof a.status;function p(a){return void 0!==a.label}function q(...a){return a.filter(Boolean).join(" ")}Object.assign((a,b)=>{let c=(null==b?void 0:b.id)||m++;return n.addToast({title:a,...b,id:c}),c},{success:n.success,info:n.info,warning:n.warning,error:n.error,custom:n.custom,message:n.message,promise:n.promise,dismiss:n.dismiss,loading:n.loading},{getHistory:()=>n.toasts,getToasts:()=>n.getActiveToasts()}),!function(a,{insertAt:b}={}){if(!a||"u"<typeof document)return;let c=document.head||document.getElementsByTagName("head")[0],d=document.createElement("style");d.type="text/css","top"===b&&c.firstChild?c.insertBefore(d,c.firstChild):c.appendChild(d),d.styleSheet?d.styleSheet.cssText=a:d.appendChild(document.createTextNode(a))}(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}
|
|
2
|
-
`);var r=a=>{var b,c,e,f,m,n,o,r,s,t,u,v,w,x;let{invert:y,toast:z,unstyled:A,interacting:B,setHeights:C,visibleToasts:D,heights:E,index:F,toasts:G,expanded:H,removeToast:I,defaultRichColors:J,closeButton:K,style:L,cancelButtonStyle:M,actionButtonStyle:N,className:O="",descriptionClassName:P="",duration:Q,position:R,gap:S,loadingIcon:T,expandByDefault:U,classNames:V,icons:W,closeButtonAriaLabel:X="Close toast",pauseWhenPageIsHidden:Y}=a,[Z,$]=d.useState(null),[_,aa]=d.useState(null),[ab,ac]=d.useState(!1),[ad,ae]=d.useState(!1),[af,ag]=d.useState(!1),[ah,ai]=d.useState(!1),[aj,ak]=d.useState(!1),[al,am]=d.useState(0),[an,ao]=d.useState(0),ap=d.useRef(z.duration||Q||4e3),aq=d.useRef(null),ar=d.useRef(null),as=0===F,at=F+1<=D,au=z.type,av=!1!==z.dismissible,aw=z.className||"",ax=z.descriptionClassName||"",ay=d.useMemo(()=>E.findIndex(a=>a.toastId===z.id)||0,[E,z.id]),az=d.useMemo(()=>{var a;return null!=(a=z.closeButton)?a:K},[z.closeButton,K]),aA=d.useMemo(()=>z.duration||Q||4e3,[z.duration,Q]),aB=d.useRef(0),aC=d.useRef(0),aD=d.useRef(0),aE=d.useRef(null),[aF,aG]=R.split("-"),aH=d.useMemo(()=>E.reduce((a,b,c)=>c>=ay?a:a+b.height,0),[E,ay]),aI=(()=>{let[a,b]=d.useState(document.hidden);return d.useEffect(()=>{let a=()=>{b(document.hidden)};return document.addEventListener("visibilitychange",a),()=>window.removeEventListener("visibilitychange",a)},[]),a})(),aJ=z.invert||y,aK="loading"===au;aC.current=d.useMemo(()=>ay*S+aH,[ay,aH]),d.useEffect(()=>{ap.current=aA},[aA]),d.useEffect(()=>{ac(!0)},[]),d.useEffect(()=>{let a=ar.current;if(a){let b=a.getBoundingClientRect().height;return ao(b),C(a=>[{toastId:z.id,height:b,position:z.position},...a]),()=>C(a=>a.filter(a=>a.toastId!==z.id))}},[C,z.id]),d.useLayoutEffect(()=>{if(!ab)return;let a=ar.current,b=a.style.height;a.style.height="auto";let c=a.getBoundingClientRect().height;a.style.height=b,ao(c),C(a=>a.find(a=>a.toastId===z.id)?a.map(a=>a.toastId===z.id?{...a,height:c}:a):[{toastId:z.id,height:c,position:z.position},...a])},[ab,z.title,z.description,C,z.id]);let aL=d.useCallback(()=>{ae(!0),am(aC.current),C(a=>a.filter(a=>a.toastId!==z.id)),setTimeout(()=>{I(z)},200)},[z,I,C,aC]);return d.useEffect(()=>{let a;if((!z.promise||"loading"!==au)&&z.duration!==1/0&&"loading"!==z.type)return H||B||Y&&aI?(()=>{if(aD.current<aB.current){let a=new Date().getTime()-aB.current;ap.current=ap.current-a}aD.current=new Date().getTime()})():ap.current!==1/0&&(aB.current=new Date().getTime(),a=setTimeout(()=>{var a;null==(a=z.onAutoClose)||a.call(z,z),aL()},ap.current)),()=>clearTimeout(a)},[H,B,z,au,Y,aI,aL]),d.useEffect(()=>{z.delete&&aL()},[aL,z.delete]),d.createElement("li",{tabIndex:0,ref:ar,className:q(O,aw,null==V?void 0:V.toast,null==(b=null==z?void 0:z.classNames)?void 0:b.toast,null==V?void 0:V.default,null==V?void 0:V[au],null==(c=null==z?void 0:z.classNames)?void 0:c[au]),"data-sonner-toast":"","data-rich-colors":null!=(e=z.richColors)?e:J,"data-styled":!(z.jsx||z.unstyled||A),"data-mounted":ab,"data-promise":!!z.promise,"data-swiped":aj,"data-removed":ad,"data-visible":at,"data-y-position":aF,"data-x-position":aG,"data-index":F,"data-front":as,"data-swiping":af,"data-dismissible":av,"data-type":au,"data-invert":aJ,"data-swipe-out":ah,"data-swipe-direction":_,"data-expanded":!!(H||U&&ab),style:{"--index":F,"--toasts-before":F,"--z-index":G.length-F,"--offset":`${ad?al:aC.current}px`,"--initial-height":U?"auto":`${an}px`,...L,...z.style},onDragEnd:()=>{ag(!1),$(null),aE.current=null},onPointerDown:a=>{aK||!av||(aq.current=new Date,am(aC.current),a.target.setPointerCapture(a.pointerId),"BUTTON"!==a.target.tagName&&(ag(!0),aE.current={x:a.clientX,y:a.clientY}))},onPointerUp:()=>{var a,b,c,d;if(ah||!av)return;aE.current=null;let e=Number((null==(a=ar.current)?void 0:a.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),f=Number((null==(b=ar.current)?void 0:b.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),g=new Date().getTime()-(null==(c=aq.current)?void 0:c.getTime()),h="x"===Z?e:f,i=Math.abs(h)/g;if(Math.abs(h)>=20||i>.11){am(aC.current),null==(d=z.onDismiss)||d.call(z,z),aa("x"===Z?e>0?"right":"left":f>0?"down":"up"),aL(),ai(!0),ak(!1);return}ag(!1),$(null)},onPointerMove:b=>{var c,d,e,f;if(!aE.current||!av||(null==(c=window.getSelection())?void 0:c.toString().length)>0)return;let g=b.clientY-aE.current.y,h=b.clientX-aE.current.x,i=null!=(d=a.swipeDirections)?d:function(a){let[b,c]=a.split("-"),d=[];return b&&d.push(b),c&&d.push(c),d}(R);!Z&&(Math.abs(h)>1||Math.abs(g)>1)&&$(Math.abs(h)>Math.abs(g)?"x":"y");let j={x:0,y:0};"y"===Z?(i.includes("top")||i.includes("bottom"))&&(i.includes("top")&&g<0||i.includes("bottom")&&g>0)&&(j.y=g):"x"===Z&&(i.includes("left")||i.includes("right"))&&(i.includes("left")&&h<0||i.includes("right")&&h>0)&&(j.x=h),(Math.abs(j.x)>0||Math.abs(j.y)>0)&&ak(!0),null==(e=ar.current)||e.style.setProperty("--swipe-amount-x",`${j.x}px`),null==(f=ar.current)||f.style.setProperty("--swipe-amount-y",`${j.y}px`)}},az&&!z.jsx?d.createElement("button",{"aria-label":X,"data-disabled":aK,"data-close-button":!0,onClick:aK||!av?()=>{}:()=>{var a;aL(),null==(a=z.onDismiss)||a.call(z,z)},className:q(null==V?void 0:V.closeButton,null==(f=null==z?void 0:z.classNames)?void 0:f.closeButton)},null!=(m=null==W?void 0:W.close)?m:l):null,z.jsx||(0,d.isValidElement)(z.title)?z.jsx?z.jsx:"function"==typeof z.title?z.title():z.title:d.createElement(d.Fragment,null,au||z.icon||z.promise?d.createElement("div",{"data-icon":"",className:q(null==V?void 0:V.icon,null==(n=null==z?void 0:z.classNames)?void 0:n.icon)},z.promise||"loading"===z.type&&!z.icon?z.icon||(null!=W&&W.loading?d.createElement("div",{className:q(null==V?void 0:V.loader,null==(v=null==z?void 0:z.classNames)?void 0:v.loader,"sonner-loader"),"data-visible":"loading"===au},W.loading):T?d.createElement("div",{className:q(null==V?void 0:V.loader,null==(w=null==z?void 0:z.classNames)?void 0:w.loader,"sonner-loader"),"data-visible":"loading"===au},T):d.createElement(g,{className:q(null==V?void 0:V.loader,null==(x=null==z?void 0:z.classNames)?void 0:x.loader),visible:"loading"===au})):null,"loading"!==z.type?z.icon||(null==W?void 0:W[au])||(a=>{switch(a){case"success":return h;case"info":return j;case"warning":return i;case"error":return k;default:return null}})(au):null):null,d.createElement("div",{"data-content":"",className:q(null==V?void 0:V.content,null==(o=null==z?void 0:z.classNames)?void 0:o.content)},d.createElement("div",{"data-title":"",className:q(null==V?void 0:V.title,null==(r=null==z?void 0:z.classNames)?void 0:r.title)},"function"==typeof z.title?z.title():z.title),z.description?d.createElement("div",{"data-description":"",className:q(P,ax,null==V?void 0:V.description,null==(s=null==z?void 0:z.classNames)?void 0:s.description)},"function"==typeof z.description?z.description():z.description):null),(0,d.isValidElement)(z.cancel)?z.cancel:z.cancel&&p(z.cancel)?d.createElement("button",{"data-button":!0,"data-cancel":!0,style:z.cancelButtonStyle||M,onClick:a=>{var b,c;p(z.cancel)&&av&&(null==(c=(b=z.cancel).onClick)||c.call(b,a),aL())},className:q(null==V?void 0:V.cancelButton,null==(t=null==z?void 0:z.classNames)?void 0:t.cancelButton)},z.cancel.label):null,(0,d.isValidElement)(z.action)?z.action:z.action&&p(z.action)?d.createElement("button",{"data-button":!0,"data-action":!0,style:z.actionButtonStyle||N,onClick:a=>{var b,c;p(z.action)&&(null==(c=(b=z.action).onClick)||c.call(b,a),a.defaultPrevented||aL())},className:q(null==V?void 0:V.actionButton,null==(u=null==z?void 0:z.classNames)?void 0:u.actionButton)},z.action.label):null))},s=(0,d.forwardRef)(function(a,b){let{invert:c,position:f="bottom-right",hotkey:g=["altKey","KeyT"],expand:h,closeButton:i,className:j,offset:k,mobileOffset:l,theme:m="light",richColors:o,duration:p,style:q,visibleToasts:s=3,toastOptions:t,dir:u="ltr",gap:v=14,loadingIcon:w,icons:x,containerAriaLabel:y="Notifications",pauseWhenPageIsHidden:z}=a,[A,B]=d.useState([]),C=d.useMemo(()=>Array.from(new Set([f].concat(A.filter(a=>a.position).map(a=>a.position)))),[A,f]),[D,E]=d.useState([]),[F,G]=d.useState(!1),[H,I]=d.useState(!1),[J,K]=d.useState("system"!==m?m:"light"),L=d.useRef(null),M=g.join("+").replace(/Key/g,"").replace(/Digit/g,""),N=d.useRef(null),O=d.useRef(!1),P=d.useCallback(a=>{B(b=>{var c;return null!=(c=b.find(b=>b.id===a.id))&&c.delete||n.dismiss(a.id),b.filter(({id:b})=>b!==a.id)})},[]);return d.useEffect(()=>n.subscribe(a=>{a.dismiss?B(b=>b.map(b=>b.id===a.id?{...b,delete:!0}:b)):setTimeout(()=>{e.flushSync(()=>{B(b=>{let c=b.findIndex(b=>b.id===a.id);return -1!==c?[...b.slice(0,c),{...b[c],...a},...b.slice(c+1)]:[a,...b]})})})}),[]),d.useEffect(()=>{"system"!==m?K(m):"system"===m&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?K("dark"):K("light"))},[m]),d.useEffect(()=>{A.length<=1&&G(!1)},[A]),d.useEffect(()=>{let a=a=>{var b,c;g.every(b=>a[b]||a.code===b)&&(G(!0),null==(b=L.current)||b.focus()),"Escape"===a.code&&(document.activeElement===L.current||null!=(c=L.current)&&c.contains(document.activeElement))&&G(!1)};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[g]),d.useEffect(()=>{if(L.current)return()=>{N.current&&(N.current.focus({preventScroll:!0}),N.current=null,O.current=!1)}},[L.current]),d.createElement("section",{ref:b,"aria-label":`${y} ${M}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},C.map((b,e)=>{var f;let g,[m,n]=b.split("-");return A.length?d.createElement("ol",{key:b,dir:"auto"===u?"ltr":u,tabIndex:-1,ref:L,className:j,"data-sonner-toaster":!0,"data-theme":J,"data-y-position":m,"data-lifted":F&&A.length>1&&!h,"data-x-position":n,style:{"--front-toast-height":`${(null==(f=D[0])?void 0:f.height)||0}px`,"--width":"356px","--gap":`${v}px`,...q,...(g={},[k,l].forEach((a,b)=>{let c=1===b,d=c?"--mobile-offset":"--offset",e=c?"16px":"32px";function f(a){["top","right","bottom","left"].forEach(b=>{g[`${d}-${b}`]="number"==typeof a?`${a}px`:a})}"number"==typeof a||"string"==typeof a?f(a):"object"==typeof a?["top","right","bottom","left"].forEach(b=>{void 0===a[b]?g[`${d}-${b}`]=e:g[`${d}-${b}`]="number"==typeof a[b]?`${a[b]}px`:a[b]}):f(e)}),g)},onBlur:a=>{O.current&&!a.currentTarget.contains(a.relatedTarget)&&(O.current=!1,N.current&&(N.current.focus({preventScroll:!0}),N.current=null))},onFocus:a=>{a.target instanceof HTMLElement&&"false"===a.target.dataset.dismissible||O.current||(O.current=!0,N.current=a.relatedTarget)},onMouseEnter:()=>G(!0),onMouseMove:()=>G(!0),onMouseLeave:()=>{H||G(!1)},onDragEnd:()=>G(!1),onPointerDown:a=>{a.target instanceof HTMLElement&&"false"===a.target.dataset.dismissible||I(!0)},onPointerUp:()=>I(!1)},A.filter(a=>!a.position&&0===e||a.position===b).map((e,f)=>{var g,j;return d.createElement(r,{key:e.id,icons:x,index:f,toast:e,defaultRichColors:o,duration:null!=(g=null==t?void 0:t.duration)?g:p,className:null==t?void 0:t.className,descriptionClassName:null==t?void 0:t.descriptionClassName,invert:c,visibleToasts:s,closeButton:null!=(j=null==t?void 0:t.closeButton)?j:i,interacting:H,position:b,style:null==t?void 0:t.style,unstyled:null==t?void 0:t.unstyled,classNames:null==t?void 0:t.classNames,cancelButtonStyle:null==t?void 0:t.cancelButtonStyle,actionButtonStyle:null==t?void 0:t.actionButtonStyle,removeToast:P,toasts:A.filter(a=>a.position==e.position),heights:D.filter(a=>a.position==e.position),setHeights:E,expandByDefault:h,gap:v,loadingIcon:w,expanded:F,pauseWhenPageIsHidden:z,swipeDirections:a.swipeDirections})})):null}))})},94487:a=>{a.exports={style:{fontFamily:"'Geist', 'Geist Fallback'",fontStyle:"normal"},className:"__className_188709",variable:"__variable_188709"}}};
|