@agentwhy/cli 0.0.0-dev
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/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +181 -0
- package/THIRD_PARTY_NOTICES.md +31 -0
- package/dist/adapter/claude-code/contract/assumptions.js +208 -0
- package/dist/adapter/claude-code/contract/denials.js +15 -0
- package/dist/adapter/claude-code/contract/entry-points.js +15 -0
- package/dist/adapter/claude-code/contract/fields.js +73 -0
- package/dist/adapter/claude-code/contract/hooks.js +96 -0
- package/dist/adapter/claude-code/contract/identifiers.js +15 -0
- package/dist/adapter/claude-code/contract/layout.js +29 -0
- package/dist/adapter/claude-code/contract/line-types.js +26 -0
- package/dist/adapter/claude-code/contract/projects.js +23 -0
- package/dist/adapter/claude-code/contract/recognition.js +14 -0
- package/dist/adapter/claude-code/contract/session-title.js +20 -0
- package/dist/adapter/claude-code/contract/settings.js +27 -0
- package/dist/adapter/claude-code/contract/task-notifications.js +33 -0
- package/dist/adapter/claude-code/contract/tools.js +37 -0
- package/dist/adapter/claude-code/contract/version.js +51 -0
- package/dist/adapter/claude-code/discovery/claude-code-project-catalogue.js +129 -0
- package/dist/adapter/claude-code/discovery/claude-code-recognition.js +46 -0
- package/dist/adapter/claude-code/discovery/claude-code-session-catalogue.js +100 -0
- package/dist/adapter/claude-code/discovery/claude-code-session-discovery.js +61 -0
- package/dist/adapter/claude-code/discovery/claude-code-session-titles.js +28 -0
- package/dist/adapter/claude-code/discovery/discovered-session.js +1 -0
- package/dist/adapter/claude-code/discovery/session-entries.js +41 -0
- package/dist/adapter/claude-code/discovery/transcript-tail.js +81 -0
- package/dist/adapter/claude-code/events/claude-code-session-source.js +197 -0
- package/dist/adapter/claude-code/events/delegation-index.js +15 -0
- package/dist/adapter/claude-code/events/transcript-scan.js +179 -0
- package/dist/adapter/claude-code/hooks/hook-output.js +42 -0
- package/dist/adapter/claude-code/hooks/pre-tool-use-input.js +23 -0
- package/dist/adapter/claude-code/hooks/stop-input.js +25 -0
- package/dist/adapter/claude-code/hooks/subagent-stop-input.js +26 -0
- package/dist/adapter/claude-code/policy/deny-rules.js +46 -0
- package/dist/adapter/claude-code/probe/claude-code-probe.js +86 -0
- package/dist/adapter/claude-code/probe/collectors/agent-tool-input-key-collector.js +24 -0
- package/dist/adapter/claude-code/probe/collectors/denial-kind-collector.js +20 -0
- package/dist/adapter/claude-code/probe/collectors/denied-call-collector.js +11 -0
- package/dist/adapter/claude-code/probe/collectors/identifier-collector.js +19 -0
- package/dist/adapter/claude-code/probe/collectors/line-collector.js +1 -0
- package/dist/adapter/claude-code/probe/collectors/line-type-collector.js +29 -0
- package/dist/adapter/claude-code/probe/collectors/sidechain-collector.js +20 -0
- package/dist/adapter/claude-code/probe/collectors/task-notification-collector.js +51 -0
- package/dist/adapter/claude-code/probe/collectors/tool-result-reference-collector.js +31 -0
- package/dist/adapter/claude-code/probe/collectors/tool-use-collector.js +24 -0
- package/dist/adapter/claude-code/probe/collectors/tool-version-collector.js +14 -0
- package/dist/adapter/claude-code/probe/collectors/top-level-key-collector.js +14 -0
- package/dist/adapter/claude-code/probe/collectors/unknown-line-type-key-collector.js +24 -0
- package/dist/adapter/claude-code/probe/collectors/working-directory-collector.js +28 -0
- package/dist/adapter/claude-code/probe/doctor-report.js +1 -0
- package/dist/adapter/claude-code/probe/meta-tally.js +42 -0
- package/dist/adapter/claude-code/probe/session-probe.js +1 -0
- package/dist/adapter/claude-code/probe/session-tally.js +41 -0
- package/dist/adapter/claude-code/probe/transcript-line.js +30 -0
- package/dist/adapter/claude-code/probe/transcript-tally.js +74 -0
- package/dist/adapter/claude-code/settings/deny-entries.js +65 -0
- package/dist/adapter/claude-code/settings/hook-entries.js +303 -0
- package/dist/adapter/codex/contract/actions.js +69 -0
- package/dist/adapter/codex/contract/assumptions.js +55 -0
- package/dist/adapter/codex/contract/capabilities.js +24 -0
- package/dist/adapter/codex/contract/delegations.js +30 -0
- package/dist/adapter/codex/contract/deliveries.js +25 -0
- package/dist/adapter/codex/contract/envelope.js +33 -0
- package/dist/adapter/codex/contract/hook-refusals.js +14 -0
- package/dist/adapter/codex/contract/hooks.js +46 -0
- package/dist/adapter/codex/contract/messages.js +47 -0
- package/dist/adapter/codex/contract/permissions.js +27 -0
- package/dist/adapter/codex/contract/reviews.js +13 -0
- package/dist/adapter/codex/contract/session.js +31 -0
- package/dist/adapter/codex/contract/turns.js +23 -0
- package/dist/adapter/codex/contract/version.js +15 -0
- package/dist/adapter/codex/discovery/codex-conversations.js +44 -0
- package/dist/adapter/codex/discovery/codex-project-catalogue.js +49 -0
- package/dist/adapter/codex/discovery/codex-recognition.js +20 -0
- package/dist/adapter/codex/discovery/codex-session-catalogue.js +28 -0
- package/dist/adapter/codex/discovery/codex-session-discovery.js +115 -0
- package/dist/adapter/codex/discovery/codex-session-index.js +21 -0
- package/dist/adapter/codex/discovery/codex-session-titles.js +135 -0
- package/dist/adapter/codex/discovery/session-header.js +86 -0
- package/dist/adapter/codex/discovery/session-owners.js +11 -0
- package/dist/adapter/codex/discovery/session-roots.js +49 -0
- package/dist/adapter/codex/events/action-items.js +138 -0
- package/dist/adapter/codex/events/capability-records.js +26 -0
- package/dist/adapter/codex/events/codex-session-source.js +121 -0
- package/dist/adapter/codex/events/hook-refusals.js +27 -0
- package/dist/adapter/codex/events/rollout-scan.js +614 -0
- package/dist/adapter/codex/events/turn-permissions.js +60 -0
- package/dist/adapter/codex/hooks/pre-tool-use-input.js +24 -0
- package/dist/adapter/codex/hooks/stop-refusals.js +57 -0
- package/dist/adapter/codex/probe/codex-doctor-report.js +1 -0
- package/dist/adapter/codex/probe/codex-probe.js +268 -0
- package/dist/adapter/codex/settings/codex-hooks.js +83 -0
- package/dist/cli/cli-command.js +1 -0
- package/dist/cli/command-router.js +42 -0
- package/dist/cli/commands/check-cli-command.js +128 -0
- package/dist/cli/commands/codex-stop-cli-command.js +27 -0
- package/dist/cli/commands/doctor-arguments.js +32 -0
- package/dist/cli/commands/doctor-cli-command.js +31 -0
- package/dist/cli/commands/doctor-usage.js +14 -0
- package/dist/cli/commands/init-cli-command.js +123 -0
- package/dist/cli/commands/menu-cli-command.js +58 -0
- package/dist/cli/commands/notify-cli-command.js +158 -0
- package/dist/cli/commands/refuse-cli-command.js +79 -0
- package/dist/cli/commands/report-arguments.js +62 -0
- package/dist/cli/commands/report-cli-command.js +36 -0
- package/dist/cli/commands/report-usage.js +41 -0
- package/dist/cli/commands/sessions-cli-command.js +184 -0
- package/dist/cli/commands/start-cli-command.js +83 -0
- package/dist/cli/commands/watch-cli-command.js +142 -0
- package/dist/cli/exit-codes.js +13 -0
- package/dist/cli/project-switches.js +46 -0
- package/dist/cli.js +80 -0
- package/dist/composition-root.js +411 -0
- package/dist/core/access/command-line.js +454 -0
- package/dist/core/access/listing.js +58 -0
- package/dist/core/access/path-shape.js +59 -0
- package/dist/core/access/path-tokens.js +37 -0
- package/dist/core/access/protected-access.js +310 -0
- package/dist/core/access/protected-values.js +102 -0
- package/dist/core/access/recorded-effect.js +67 -0
- package/dist/core/access/returns.js +173 -0
- package/dist/core/access/search-output.js +34 -0
- package/dist/core/access/search-reach.js +268 -0
- package/dist/core/access/uses.js +143 -0
- package/dist/core/access/words-before.js +52 -0
- package/dist/core/agent.js +1 -0
- package/dist/core/capability.js +11 -0
- package/dist/core/combined-project-catalogue.js +36 -0
- package/dist/core/combined-session-catalogue.js +25 -0
- package/dist/core/completeness.js +10 -0
- package/dist/core/context.js +1 -0
- package/dist/core/correlation/correlate.js +329 -0
- package/dist/core/delegation.js +1 -0
- package/dist/core/detector/prompt-signals.js +78 -0
- package/dist/core/entry-point.js +1 -0
- package/dist/core/event.js +1 -0
- package/dist/core/evidence.js +9 -0
- package/dist/core/late-message.js +32 -0
- package/dist/core/message.js +1 -0
- package/dist/core/nearest-project.js +28 -0
- package/dist/core/policy/default-policy.js +32 -0
- package/dist/core/policy/glob.js +56 -0
- package/dist/core/policy/parse-policy.js +70 -0
- package/dist/core/policy/policy.js +20 -0
- package/dist/core/policy/resolve-policy.js +16 -0
- package/dist/core/project-catalogue.js +1 -0
- package/dist/core/project-root.js +133 -0
- package/dist/core/provider-titles.js +10 -0
- package/dist/core/redaction/entropy.js +46 -0
- package/dist/core/redaction/redacted.js +4 -0
- package/dist/core/redaction/redactor.js +339 -0
- package/dist/core/redaction/secret-patterns.js +22 -0
- package/dist/core/redaction/value-shapes.js +81 -0
- package/dist/core/redaction/value-trace.js +110 -0
- package/dist/core/review.js +1 -0
- package/dist/core/session-catalogue.js +19 -0
- package/dist/core/session-filter.js +42 -0
- package/dist/core/session-format.js +27 -0
- package/dist/core/session-model.js +1 -0
- package/dist/core/session-reader.js +22 -0
- package/dist/core/session-records.js +1 -0
- package/dist/core/session-source.js +1 -0
- package/dist/core/session-titles.js +21 -0
- package/dist/core/turn.js +1 -0
- package/dist/doctor/codex-doctor.js +14 -0
- package/dist/doctor/doctor-use-case.js +1 -0
- package/dist/doctor/format-selecting-doctor.js +28 -0
- package/dist/doctor/render/attention/attention-rule.js +1 -0
- package/dist/doctor/render/attention/doctor-attention-rules.js +28 -0
- package/dist/doctor/render/attention/rules/damaged-meta-files-rule.js +8 -0
- package/dist/doctor/render/attention/rules/damaged-transcripts-rule.js +9 -0
- package/dist/doctor/render/attention/rules/incomplete-subagent-pairs-rule.js +6 -0
- package/dist/doctor/render/attention/rules/missing-main-transcript-rule.js +5 -0
- package/dist/doctor/render/attention/rules/missing-spilled-results-rule.js +6 -0
- package/dist/doctor/render/attention/rules/multiple-working-directories-rule.js +15 -0
- package/dist/doctor/render/attention/rules/unknown-denial-kinds-rule.js +5 -0
- package/dist/doctor/render/attention/rules/unknown-line-types-rule.js +6 -0
- package/dist/doctor/render/attention/rules/unrecognised-entries-rule.js +6 -0
- package/dist/doctor/render/attention/rules/unusable-directories-rule.js +12 -0
- package/dist/doctor/render/attention/transcript-scopes.js +6 -0
- package/dist/doctor/render/codex-text-doctor-renderer.js +97 -0
- package/dist/doctor/render/doctor-renderers.js +1 -0
- package/dist/doctor/render/json-doctor-renderer.js +7 -0
- package/dist/doctor/render/output-format.js +1 -0
- package/dist/doctor/render/text-doctor-renderer.js +124 -0
- package/dist/doctor/session-doctor.js +16 -0
- package/dist/infrastructure/clack-asker.js +24 -0
- package/dist/infrastructure/clack-chooser.js +40 -0
- package/dist/infrastructure/clack-multi-chooser.js +31 -0
- package/dist/infrastructure/file-alert-store.js +120 -0
- package/dist/infrastructure/file-checked-store.js +55 -0
- package/dist/infrastructure/file-mark-store.js +67 -0
- package/dist/infrastructure/file-onboarding-store.js +93 -0
- package/dist/infrastructure/folder-window.js +26 -0
- package/dist/infrastructure/node-agentwhy-invocation.js +99 -0
- package/dist/infrastructure/node-browser.js +40 -0
- package/dist/infrastructure/node-file-system.js +111 -0
- package/dist/infrastructure/node-local-server.js +115 -0
- package/dist/infrastructure/node-text-input.js +26 -0
- package/dist/infrastructure/os-notifier.js +21 -0
- package/dist/infrastructure/osascript-folder-chooser.js +53 -0
- package/dist/infrastructure/powershell-folder-chooser.js +78 -0
- package/dist/infrastructure/real-directory.js +18 -0
- package/dist/infrastructure/stream-printer.js +11 -0
- package/dist/infrastructure/terminal-banner.js +19 -0
- package/dist/ports/agentwhy-invocation.js +1 -0
- package/dist/ports/alert-store.js +1 -0
- package/dist/ports/asker.js +1 -0
- package/dist/ports/browser.js +1 -0
- package/dist/ports/checked-store.js +1 -0
- package/dist/ports/chooser.js +1 -0
- package/dist/ports/directory-reader.js +1 -0
- package/dist/ports/file-access-error.js +11 -0
- package/dist/ports/file-reader.js +1 -0
- package/dist/ports/file-tail-reader.js +1 -0
- package/dist/ports/file-writer.js +1 -0
- package/dist/ports/folder-chooser.js +1 -0
- package/dist/ports/local-server.js +1 -0
- package/dist/ports/mark-store.js +10 -0
- package/dist/ports/multi-chooser.js +1 -0
- package/dist/ports/notifier.js +1 -0
- package/dist/ports/onboarding-store.js +1 -0
- package/dist/ports/printer.js +1 -0
- package/dist/ports/text-input.js +1 -0
- package/dist/refuse/command-reach.js +135 -0
- package/dist/refuse/command-refusal.js +88 -0
- package/dist/refuse/render/codex-stop-words.js +21 -0
- package/dist/refuse/render/refusal-words.js +34 -0
- package/dist/report/build-report.js +1037 -0
- package/dist/report/check/actions-digest.js +73 -0
- package/dist/report/check/check-lines.js +83 -0
- package/dist/report/check/mark-request.js +90 -0
- package/dist/report/check/marks.js +84 -0
- package/dist/report/check/render/text-digest-renderer.js +332 -0
- package/dist/report/check/session-actions.js +90 -0
- package/dist/report/check/session-check.js +91 -0
- package/dist/report/choose-policy.js +61 -0
- package/dist/report/flow-reads.js +18 -0
- package/dist/report/private-files/tell-lists.js +84 -0
- package/dist/report/project-rules.js +33 -0
- package/dist/report/render/home-relative.js +18 -0
- package/dist/report/render/html-head.js +26 -0
- package/dist/report/render/html-report-components.js +48 -0
- package/dist/report/render/html-report-styles.js +500 -0
- package/dist/report/render/html-sidebar.js +42 -0
- package/dist/report/render/path-tail.js +14 -0
- package/dist/report/render/report-copy.js +1177 -0
- package/dist/report/render/report-page/advanced-view.js +167 -0
- package/dist/report/render/report-page/file-story.js +114 -0
- package/dist/report/render/report-page/files-view.js +381 -0
- package/dist/report/render/report-page/files.js +77 -0
- package/dist/report/render/report-page/fix-wizard-script.js +269 -0
- package/dist/report/render/report-page/fix-wizard.js +310 -0
- package/dist/report/render/report-page/helpers-view.js +383 -0
- package/dist/report/render/report-page/helpers.js +51 -0
- package/dist/report/render/report-page/item-names.js +63 -0
- package/dist/report/render/report-page/protect-patterns.js +13 -0
- package/dist/report/render/report-page/providers.js +208 -0
- package/dist/report/render/report-page/record-view.js +367 -0
- package/dist/report/render/report-page/report-page-renderer.js +129 -0
- package/dist/report/render/report-page/report-views.js +31 -0
- package/dist/report/render/report-page/story-window.js +356 -0
- package/dist/report/render/report-page/times.js +25 -0
- package/dist/report/render/report-page/to-do-view.js +299 -0
- package/dist/report/render/report-page/to-do.js +152 -0
- package/dist/report/render/report-page.js +1 -0
- package/dist/report/render/session-view.js +250 -0
- package/dist/report/render/text-report-renderer.js +981 -0
- package/dist/report/render/ui/add-file-popup.js +122 -0
- package/dist/report/render/ui/app-sidebar.js +78 -0
- package/dist/report/render/ui/ask-panel.js +80 -0
- package/dist/report/render/ui/avatar.js +19 -0
- package/dist/report/render/ui/backdrop.js +29 -0
- package/dist/report/render/ui/brand-mark.js +4 -0
- package/dist/report/render/ui/button.js +67 -0
- package/dist/report/render/ui/callout.js +20 -0
- package/dist/report/render/ui/chat-example.js +17 -0
- package/dist/report/render/ui/checklist.js +50 -0
- package/dist/report/render/ui/confirm-dialog.js +34 -0
- package/dist/report/render/ui/data-table.js +49 -0
- package/dist/report/render/ui/drawer.js +25 -0
- package/dist/report/render/ui/file-chip.js +37 -0
- package/dist/report/render/ui/fold-line.js +22 -0
- package/dist/report/render/ui/guide-card.js +25 -0
- package/dist/report/render/ui/hero.js +37 -0
- package/dist/report/render/ui/labelled-select.js +10 -0
- package/dist/report/render/ui/live-script.js +222 -0
- package/dist/report/render/ui/local-date.js +58 -0
- package/dist/report/render/ui/mode-icon.js +6 -0
- package/dist/report/render/ui/page-shell.js +101 -0
- package/dist/report/render/ui/pill-tabs.js +47 -0
- package/dist/report/render/ui/popup.js +77 -0
- package/dist/report/render/ui/progress.js +35 -0
- package/dist/report/render/ui/project-list.js +284 -0
- package/dist/report/render/ui/scope-choice.js +19 -0
- package/dist/report/render/ui/stats.js +21 -0
- package/dist/report/render/ui/status-icon.js +30 -0
- package/dist/report/render/ui/status-look.js +21 -0
- package/dist/report/render/ui/switch.js +11 -0
- package/dist/report/render/ui/tag.js +19 -0
- package/dist/report/render/ui/task-list.js +56 -0
- package/dist/report/render/ui/tokens.js +46 -0
- package/dist/report/render/ui/update-notice.js +146 -0
- package/dist/report/render/ui/words/app-words.js +163 -0
- package/dist/report/render/ui/words/conversations-words.js +457 -0
- package/dist/report/render/ui/words/month-words.js +59 -0
- package/dist/report/render/ui/words/onboarding-words.js +446 -0
- package/dist/report/render/ui/words/projects-words.js +217 -0
- package/dist/report/render/ui/words/report-words.js +2099 -0
- package/dist/report/render/ui/words/settings-words.js +611 -0
- package/dist/report/render/ui/words/to-fix-words.js +287 -0
- package/dist/report/report-model.js +2 -0
- package/dist/report/report-use-case.js +1 -0
- package/dist/report/rule-names.js +20 -0
- package/dist/report/session-report.js +163 -0
- package/dist/report/start/app-nav.js +37 -0
- package/dist/report/start/conversations/calendar-view.js +104 -0
- package/dist/report/start/conversations/conversation-columns.js +187 -0
- package/dist/report/start/conversations/conversations-renderer.js +54 -0
- package/dist/report/start/conversations/empty-week.js +120 -0
- package/dist/report/start/conversations/files-window.js +166 -0
- package/dist/report/start/conversations/period-section.js +280 -0
- package/dist/report/start/conversations/periods-script.js +440 -0
- package/dist/report/start/conversations/periods.js +110 -0
- package/dist/report/start/conversations/week-view.js +30 -0
- package/dist/report/start/conversations/weeks.js +17 -0
- package/dist/report/start/month/month-renderer.js +50 -0
- package/dist/report/start/month/month-view.js +135 -0
- package/dist/report/start/month/months.js +17 -0
- package/dist/report/start/onboarding/done.js +171 -0
- package/dist/report/start/onboarding/finish-onboarding.js +93 -0
- package/dist/report/start/onboarding/intro.js +100 -0
- package/dist/report/start/onboarding/onboarding-changes.js +40 -0
- package/dist/report/start/onboarding/onboarding-renderer.js +195 -0
- package/dist/report/start/onboarding/onboarding-script.js +400 -0
- package/dist/report/start/onboarding/onboarding-view.js +98 -0
- package/dist/report/start/onboarding/project-step.js +210 -0
- package/dist/report/start/onboarding/steps.js +239 -0
- package/dist/report/start/onboarding/welcome.js +66 -0
- package/dist/report/start/page-notice.js +10 -0
- package/dist/report/start/projects/index-projects.js +43 -0
- package/dist/report/start/projects/moved-page.js +82 -0
- package/dist/report/start/projects/project-switch.js +138 -0
- package/dist/report/start/projects/projects-window.js +67 -0
- package/dist/report/start/projects/temporary-space.js +18 -0
- package/dist/report/start/render/air-datepicker-vendor.js +27 -0
- package/dist/report/start/render/session-status.js +41 -0
- package/dist/report/start/render/start-words.js +84 -0
- package/dist/report/start/repository.js +28 -0
- package/dist/report/start/serve/index-handler.js +372 -0
- package/dist/report/start/serve/onboarding-request.js +50 -0
- package/dist/report/start/serve/settings-request.js +1 -0
- package/dist/report/start/serve/settings-setup.js +193 -0
- package/dist/report/start/session-index.js +1 -0
- package/dist/report/start/session-start.js +974 -0
- package/dist/report/start/settings/alerts-tab.js +104 -0
- package/dist/report/start/settings/files-tab.js +169 -0
- package/dist/report/start/settings/general-tab.js +71 -0
- package/dist/report/start/settings/settings-renderer.js +254 -0
- package/dist/report/start/settings/settings-script.js +161 -0
- package/dist/report/start/settings/settings-view.js +240 -0
- package/dist/report/start/settings/settings-windows.js +334 -0
- package/dist/report/start/settings-files.js +43 -0
- package/dist/report/start/to-fix/done-list.js +45 -0
- package/dist/report/start/to-fix/file-window.js +110 -0
- package/dist/report/start/to-fix/to-fix-list.js +70 -0
- package/dist/report/start/to-fix/to-fix-renderer.js +237 -0
- package/dist/report/start/to-fix/to-fix-script.js +94 -0
- package/dist/report/start/to-fix/to-fix-view.js +124 -0
- package/dist/report/watch/agent-alert.js +72 -0
- package/dist/report/watch/notice-choices.js +35 -0
- package/dist/report/watch/notice-settings.js +65 -0
- package/dist/report/watch/preferences.js +100 -0
- package/dist/report/watch/render/instruction-words.js +54 -0
- package/dist/report/watch/render/notice-words.js +182 -0
- package/dist/report/watch/subagent-watch.js +345 -0
- package/dist/report/watch/watch-notice.js +1 -0
- package/dist/setup/behind.js +18 -0
- package/dist/setup/codex-mirror.js +171 -0
- package/dist/setup/not-a-project.js +19 -0
- package/dist/setup/project-setup.js +644 -0
- package/dist/setup/protected-patterns.js +30 -0
- package/dist/shared/colour.js +23 -0
- package/dist/shared/compare.js +4 -0
- package/dist/shared/content-version.js +13 -0
- package/dist/shared/counter.js +11 -0
- package/dist/shared/file-stamp.js +4 -0
- package/dist/shared/json.js +13 -0
- package/dist/shared/label.js +13 -0
- package/dist/shared/package-name.js +6 -0
- package/dist/shared/plain-invocation.js +44 -0
- package/dist/shared/plain-version.js +21 -0
- package/dist/shared/printable.js +25 -0
- package/dist/shared/renderer.js +1 -0
- package/dist/shared/sentence.js +20 -0
- package/dist/shared/terminal-logo.js +41 -0
- package/dist/shared/text-table.js +15 -0
- package/dist/shared/wrap.js +29 -0
- package/package.json +70 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The session report, wearing the sessions observatory's clothes: a fixed sidebar, a topbar that says where you
|
|
3
|
+
* are, the verdict as a heading rather than a banner, and one workbench of two panels — the two views of the
|
|
4
|
+
* session on the left, what is selected on the right.
|
|
5
|
+
*
|
|
6
|
+
* Ported from `.ai/mocks/report-clean.html`, rule for rule. What is here and not in the mock is what the mock has
|
|
7
|
+
* nothing to say about: the language machinery, what a page without a script shows, the evidence tables and the
|
|
8
|
+
* dialogs. The sessions index imports this file as its base, so the tokens, the reset and the shared components
|
|
9
|
+
* stay general; anything that belongs to the report alone is written under `.rpt`.
|
|
10
|
+
*/
|
|
11
|
+
export const HTML_REPORT_STYLE = String.raw `
|
|
12
|
+
:root{color-scheme:dark;--side:225px;
|
|
13
|
+
/* Measured rather than chosen by eye: the surfaces are lifted a step apart, the lines sit where a line can be
|
|
14
|
+
seen, and the text colours moved only as far as the larger surfaces need. The page, its panels and its lines
|
|
15
|
+
are neutral, which leaves the four signal colours as the only hues on the page. */
|
|
16
|
+
--bg:#0d0e11;--panel:#151619;--raise:#1d1e23;--raise-2:#26272e;--canvas:#15161a;
|
|
17
|
+
--hair:#3b3c44;--hair-2:#43444d;--hair-3:#585a66;
|
|
18
|
+
/* text 16.8:1, muted 7.98:1, quiet 6.42:1 against the page; the four signals 8.7:1 and up. */
|
|
19
|
+
--text:#f0efed;--muted:#a6a6ae;--quiet:#94949e;
|
|
20
|
+
--ember:#ff997f;--brass:#e5bc71;--moss:#7dceb0;--indigo:#b0a3fa;
|
|
21
|
+
/* The mock's own token names, aliased onto this page's, so its rules port without being rewritten. */
|
|
22
|
+
--accent:var(--ember);--border:var(--hair);--dim:var(--quiet);--violet:var(--indigo);--amber:var(--brass);--green:var(--moss);
|
|
23
|
+
--sans:ui-sans-serif,-apple-system,"Segoe UI",Inter,system-ui,sans-serif;
|
|
24
|
+
--mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace}
|
|
25
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
26
|
+
body{background:var(--bg);color:var(--text);font:15px/1.6 var(--sans);-webkit-font-smoothing:antialiased}
|
|
27
|
+
a{color:var(--indigo);text-underline-offset:3px}
|
|
28
|
+
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer;touch-action:manipulation}
|
|
29
|
+
:focus-visible{outline:2px solid var(--indigo);outline-offset:2px;border-radius:6px}
|
|
30
|
+
code{font-family:var(--mono);font-size:.86em;font-variant-numeric:tabular-nums;background:rgba(255,255,255,.07);border-radius:5px;padding:.1em .38em;word-break:break-word}
|
|
31
|
+
h1,h2,h3,h4{text-wrap:balance;font-weight:600}
|
|
32
|
+
[hidden]{display:none!important}
|
|
33
|
+
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
|
|
34
|
+
.skip{position:fixed;left:20px;top:-100px;z-index:100;background:var(--ember);color:#171014;padding:12px;border-radius:8px;text-decoration:none}
|
|
35
|
+
.skip:focus{top:12px}
|
|
36
|
+
:root:not(.interactive) .js-only{display:none!important}
|
|
37
|
+
.interactive .nojs-only{display:none!important}
|
|
38
|
+
.i18n,.i18n-block{display:none}
|
|
39
|
+
:root[data-lang="en"] .i18n[lang="en"],:root[data-lang="pl"] .i18n[lang="pl"],:root[data-lang="de"] .i18n[lang="de"]{display:inline}
|
|
40
|
+
:root[data-lang="en"] .i18n-block[lang="en"],:root[data-lang="pl"] .i18n-block[lang="pl"],:root[data-lang="de"] .i18n-block[lang="de"]{display:block}
|
|
41
|
+
.lang{height:28px;padding:0 6px;border:0;border-radius:8px;background:var(--raise);color:var(--text);font:500 12.5px var(--sans);box-shadow:inset 0 0 0 1px var(--hair-2)}
|
|
42
|
+
.lang:hover{box-shadow:inset 0 0 0 1px var(--hair-3)}
|
|
43
|
+
.muted,.empty-note,.neutral-outcome{color:var(--muted)}
|
|
44
|
+
|
|
45
|
+
/* ── one dot vocabulary, one set of signal colours ── */
|
|
46
|
+
.dot{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.24);flex:none;display:block}
|
|
47
|
+
.dot.value{background:var(--ember)}
|
|
48
|
+
.dot:is(.hit,.secret,.named){background:var(--brass)}
|
|
49
|
+
.dot.block{background:var(--moss)}
|
|
50
|
+
.dot.clean{background:#5f5d68}
|
|
51
|
+
.dot:is(.unknown,.gap){background:none;box-shadow:inset 0 0 0 1.5px var(--brass)}
|
|
52
|
+
|
|
53
|
+
/* "Not established" is drawn, not only written (§7.5): what is already drawn with a line is drawn with a dashed
|
|
54
|
+
one. One rule for every such element stood here, setting border-style and nothing else, and a style with no
|
|
55
|
+
width of its own is the browser's own 3px in the colour of the text on all four sides, so every element that
|
|
56
|
+
draws no box of its own (a section, a step of the evidence, a row of the list) wore a white dashed one. */
|
|
57
|
+
.rpt .steps>li.chain.unknown{border-left-style:dashed}
|
|
58
|
+
.rpt .listview tbody tr.chain.unknown td{border-bottom-style:dashed;border-bottom-color:rgba(229,188,113,.35)}
|
|
59
|
+
/* A section whose record has gaps is the one of these that has no line to dash, so it is given the box the mark
|
|
60
|
+
asks for: the brass of the unknown, at the weight every other dashed edge on the page is drawn at. */
|
|
61
|
+
.rpt .sect.chain.unknown{border:1px dashed rgba(229,188,113,.38);border-radius:12px;padding:15px 17px}
|
|
62
|
+
.rpt .sect.chain.unknown>h3{margin-top:0}
|
|
63
|
+
|
|
64
|
+
/* ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
65
|
+
The report page. Everything below is scoped to .rpt, because the sessions index loads this file as its base
|
|
66
|
+
and draws the same room with its own measurements.
|
|
67
|
+
══════════════════════════════════════════════════════════════════════════════════════════════════════════ */
|
|
68
|
+
.rpt svg.icon{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
|
|
69
|
+
.rpt .ambient{position:fixed;inset:0 0 0 var(--side);pointer-events:none;z-index:-1;background:radial-gradient(ellipse 70% 42% at 55% 0%,rgba(173,77,59,.08),transparent 85%),radial-gradient(ellipse 50% 50% at 100% 60%,rgba(121,97,180,.03),transparent 90%)}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
/* ══════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
73
|
+
The column, for both pages that have one. It used to be written twice - once here under .rpt and once in the
|
|
74
|
+
index's own stylesheet - which is how the sessions list and the report came to carry the same column at two
|
|
75
|
+
widths, with two different wordmarks. One block, unscoped, and --side is the only place the width is written.
|
|
76
|
+
══════════════════════════════════════════════════════════════════════════════════════════════════════════ */
|
|
77
|
+
/* Every rule below names the column it belongs to. Without that, a page's own reset reaches into the component:
|
|
78
|
+
the index's .idx p{margin:0} is more specific than a bare .nav-label, so the label's space under it
|
|
79
|
+
collapsed there and held on the report - the same column, spaced two different ways. */
|
|
80
|
+
.sidebar{position:fixed;inset:0 auto 0 0;width:var(--side);display:flex;flex-direction:column;background:rgba(16,17,20,.93);border-right:1px solid #29292e;padding:30px 16px 20px;overflow-y:auto;z-index:10}
|
|
81
|
+
.sidebar .brand{display:flex;align-items:center;gap:9px;padding:0 12px;font-size:23px;font-weight:650;letter-spacing:-1.2px;color:var(--text);text-decoration:none}
|
|
82
|
+
.sidebar .brand-name em{font-style:normal;color:var(--ember)}
|
|
83
|
+
.sidebar .brand-mark{width:32px;height:32px;flex-shrink:0;color:var(--ember)}
|
|
84
|
+
.sidebar .workspace{margin:32px 4px 26px;padding:12px 12px 11px;background:#1a1b20;border:1px solid var(--hair);border-radius:9px;min-width:0}
|
|
85
|
+
.sidebar .workspace-meta{display:flex;align-items:center;gap:8px;margin-bottom:9px}
|
|
86
|
+
.sidebar .workspace-icon{width:24px;height:24px;flex:none;display:grid;place-items:center;border:1px solid #424047;border-radius:6px;color:#c3b8e4;background:#302a3b}
|
|
87
|
+
.sidebar .workspace-icon .icon,.sidebar .workspace-icon svg{width:14px;height:14px}
|
|
88
|
+
/* The two lines wrap rather than end in an ellipsis: this text grows by a third between the languages the page
|
|
89
|
+
ships with, and the German of it was being cut at every width the column has ever had. */
|
|
90
|
+
.sidebar .workspace b{display:block;font-weight:550;font-size:13px;line-height:1.35;overflow-wrap:break-word}
|
|
91
|
+
.sidebar .workspace small{color:var(--muted);font-size:11px;line-height:1.4;min-width:0;overflow-wrap:break-word}
|
|
92
|
+
.sidebar .nav-label{color:var(--quiet);font:10px var(--mono);letter-spacing:1.6px;margin:0 14px 22px;text-transform:uppercase}
|
|
93
|
+
.sidebar .nav{display:grid;gap:4px}
|
|
94
|
+
.sidebar .nav-item{display:flex;align-items:center;gap:12px;min-height:46px;padding:10px 14px;border-radius:8px;color:var(--muted);font-size:13px;text-decoration:none;cursor:pointer}
|
|
95
|
+
.sidebar .nav-item:hover{background:#202125;color:var(--text)}
|
|
96
|
+
.sidebar .nav-item .icon,.sidebar .nav-item svg{width:19px;height:19px;flex:none}
|
|
97
|
+
.sidebar .nav-name{min-width:0}
|
|
98
|
+
.sidebar .nav-count{margin-left:auto;font:11px var(--mono);border-radius:4px;padding:1px 6px;background:rgba(255,255,255,.035);color:#b3adb6}
|
|
99
|
+
.sidebar .nav-item[aria-current="page"],.sidebar .nav-item.active{color:var(--ember);background:linear-gradient(90deg,rgba(168,84,60,.15),rgba(168,84,60,.06));box-shadow:inset 0 0 0 1px rgba(168,97,73,.22)}
|
|
100
|
+
.sidebar .nav-item[aria-current="page"] .nav-count,.sidebar .nav-item.active .nav-count{background:rgba(227,138,106,.09);color:#e9a68f}
|
|
101
|
+
.sidebar-bottom{margin-top:auto}
|
|
102
|
+
.sidebar .local-note{border-top:1px solid #2b2c30;padding:20px 12px 2px;margin-top:20px;font-size:12px;color:var(--muted)}
|
|
103
|
+
.sidebar .local-note .dot{display:inline-block;width:7px;height:7px;background:var(--moss);box-shadow:0 0 8px rgba(125,206,176,.27);margin-right:7px}
|
|
104
|
+
.sidebar .local-note small{display:block;color:var(--quiet);margin:7px 0 0 14px;font-size:11px}
|
|
105
|
+
/* Below this the column is not a column: the mark and the way around sit on a line at the top of the page and
|
|
106
|
+
scroll with it, which is the only size where a fixed column is not worth its width. */
|
|
107
|
+
@media (max-width:580px){
|
|
108
|
+
.sidebar{position:static;width:auto;flex-direction:row;align-items:center;gap:12px;height:auto;padding:12px 16px 0;border-right:0;background:none;overflow:visible}
|
|
109
|
+
.workspace,.sidebar-bottom,.nav-label{display:none}
|
|
110
|
+
.sidebar>.nav{display:flex;gap:8px;margin-left:auto}
|
|
111
|
+
.sidebar>.nav .nav-item{min-height:44px;padding:8px 12px;border:1px solid var(--hair);border-radius:9px}
|
|
112
|
+
.sidebar>.nav .nav-count{display:none}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* ── shell ── */
|
|
116
|
+
.rpt .shell{margin-left:var(--side)}
|
|
117
|
+
.rpt .topbar{min-height:70px;padding:10px 0;margin:0 28px;display:flex;align-items:center;justify-content:space-between;gap:20px;border-bottom:1px solid rgba(255,255,255,.04);font-size:12px;color:var(--muted)}
|
|
118
|
+
.rpt .breadcrumb{display:flex;gap:10px;align-items:center;flex-wrap:nowrap;min-width:0;overflow:hidden}
|
|
119
|
+
.rpt .breadcrumb>a,.rpt .breadcrumb>.slash,.rpt .breadcrumb>.session-id{flex-shrink:0}
|
|
120
|
+
.rpt .breadcrumb a{display:inline-flex;align-items:center;gap:7px;padding:10px 0;color:var(--muted);text-decoration:none}
|
|
121
|
+
.rpt .breadcrumb a .icon{width:15px;height:15px}
|
|
122
|
+
.rpt .breadcrumb a:hover{color:var(--text)}
|
|
123
|
+
.rpt .breadcrumb b{color:#d9d6d5;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
124
|
+
.rpt .slash{color:#62606b}
|
|
125
|
+
.rpt .session-id{font:11px var(--mono);color:var(--quiet);border:1px solid #33333a;border-radius:5px;padding:3px 7px;white-space:nowrap}
|
|
126
|
+
.rpt .top-actions{display:flex;align-items:center;gap:16px;flex-shrink:0}
|
|
127
|
+
.rpt .policy-label{font:10px var(--mono);letter-spacing:1px;border:1px solid #414047;padding:5px 8px;border-radius:5px;color:#bcb8c3;text-decoration:none;white-space:nowrap}
|
|
128
|
+
.rpt .policy-label:hover{border-color:var(--ember);color:var(--ember)}
|
|
129
|
+
.rpt .scope-btn{display:flex;align-items:center;gap:8px;min-height:44px;font-size:12px;color:var(--muted);text-decoration:none}
|
|
130
|
+
.rpt .scope-btn:hover{color:var(--text)}
|
|
131
|
+
.rpt .scope-btn .icon{width:15px;height:15px;color:var(--quiet)}
|
|
132
|
+
.rpt .scope-btn .dot{width:7px;height:7px}
|
|
133
|
+
.rpt .scope-btn.complete .dot{background:var(--moss)}
|
|
134
|
+
.rpt .scope-btn.partial .dot{background:var(--brass)}
|
|
135
|
+
.rpt .main{padding:16px 28px 44px;max-width:1900px}
|
|
136
|
+
|
|
137
|
+
/* ── the verdict: a heading, not a banner. A bordered box this wide leaves a void across the middle of a large
|
|
138
|
+
screen and its frame argues with the panel below it, so the severity is carried by one icon and one coloured
|
|
139
|
+
phrase. Everything under it — the graph, the list — is what a person came here to use. ── */
|
|
140
|
+
.rpt .verdict{max-width:104ch;margin:4px 0 18px}
|
|
141
|
+
.rpt .verdict h1{display:flex;align-items:center;gap:11px;font-size:clamp(17px,1.35vw,21px);font-weight:620;letter-spacing:-.5px;line-height:1.3}
|
|
142
|
+
.rpt .verdict h1 .warn{width:18px;height:18px;flex:none;color:var(--ember)}
|
|
143
|
+
.rpt .verdict h1 em{font-style:normal;color:var(--ember)}
|
|
144
|
+
.rpt .lead{display:flex;flex-wrap:wrap;align-items:baseline;margin-top:7px;padding-left:29px;font-size:13px;color:var(--muted);line-height:1.5}
|
|
145
|
+
.rpt .lead-next{color:#e6dcdb;font-weight:400}
|
|
146
|
+
.rpt .lead:has(.verdict-stats) .lead-next{padding-right:13px;margin-right:13px;border-right:1px solid rgba(255,255,255,.08)}
|
|
147
|
+
.rpt .verdict-stats{display:inline-flex;flex-wrap:wrap;align-items:baseline}
|
|
148
|
+
.rpt .verdict-stats>span{padding-right:13px;margin-right:13px;border-right:1px solid rgba(255,255,255,.08)}
|
|
149
|
+
.rpt .verdict-stats>span:last-child{padding-right:0;margin-right:0;border-right:0}
|
|
150
|
+
.rpt .verdict-stats .num{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
|
|
151
|
+
.rpt .verdict-stats .num.warm{color:var(--brass)}
|
|
152
|
+
.rpt .lead-more{margin-top:5px}
|
|
153
|
+
.rpt .tier-legend{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:12px;padding-left:29px;list-style:none;font-size:13px;color:var(--muted)}
|
|
154
|
+
|
|
155
|
+
/* ── panel, toolbar ── */
|
|
156
|
+
.rpt .panel{background:linear-gradient(145deg,rgba(29,29,32,.96),rgba(19,20,22,.96));border:1px solid #343439;border-radius:13px;box-shadow:0 10px 25px rgba(0,0,0,.13),inset 0 1px rgba(255,255,255,.015);overflow:hidden}
|
|
157
|
+
.rpt .views{min-width:0}
|
|
158
|
+
.rpt .workbench{display:grid;grid-template-columns:minmax(0,1fr) 400px;gap:16px;align-items:start}
|
|
159
|
+
.rpt .panel-head{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:17px 22px;border-bottom:1px solid rgba(255,255,255,.04)}
|
|
160
|
+
.rpt .panel-head h2{font-size:15px;font-weight:550;letter-spacing:-.2px}
|
|
161
|
+
.rpt .panel-head p{font-size:12px;color:var(--muted);margin-top:3px}
|
|
162
|
+
.rpt .seg{display:flex;padding:3px;border:1px solid var(--hair);border-radius:9px;background:#101114;flex-shrink:0}
|
|
163
|
+
.rpt .seg button{display:flex;align-items:center;justify-content:center;gap:7px;min-height:38px;min-width:74px;padding:0 13px;border-radius:6px;font-size:12px;color:var(--muted)}
|
|
164
|
+
.rpt .seg button[aria-pressed="true"]{background:#2c2d33;color:var(--text);box-shadow:0 1px 3px rgba(0,0,0,.25)}
|
|
165
|
+
.rpt .seg-ico{width:15px;height:15px;flex:none}
|
|
166
|
+
/* Two views of one thing: the table is what the markup shows, because it is the one that works with no script.
|
|
167
|
+
Where a script runs, the switch decides, and the diagram becomes the view the panel opens on. */
|
|
168
|
+
.rpt .graphview{min-width:0}
|
|
169
|
+
.interactive .rpt .panel[data-view="graph"] .listview{display:none}
|
|
170
|
+
.interactive .rpt .panel[data-view="list"] .graphview{display:none}
|
|
171
|
+
.rpt .filters{display:flex;align-items:center;gap:8px 20px;flex-wrap:wrap;padding:9px 22px;border-bottom:1px solid rgba(255,255,255,.03);font-size:12px;color:var(--muted)}
|
|
172
|
+
.rpt .filters-label{color:var(--quiet);font:10px var(--mono);letter-spacing:1.2px;text-transform:uppercase}
|
|
173
|
+
.rpt .tier{--c:#9b9ba3;display:flex;align-items:center;gap:8px;min-height:44px;font-size:12px;color:var(--muted);transition:color .15s}
|
|
174
|
+
.rpt .tier:hover{color:var(--text)}
|
|
175
|
+
.rpt .tier .box{display:grid;place-items:center;width:15px;height:15px;flex:none;border-radius:4px;box-shadow:inset 0 0 0 1px var(--hair-3)}
|
|
176
|
+
.rpt .tier .box svg{width:11px;height:11px;fill:none;stroke:#171014;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:0}
|
|
177
|
+
.rpt .tier[aria-pressed="true"]{color:var(--text)}
|
|
178
|
+
.rpt .tier[aria-pressed="true"] .box{background:var(--c);box-shadow:none}
|
|
179
|
+
.rpt .tier[aria-pressed="true"] .box svg{opacity:1}
|
|
180
|
+
.rpt .tier b{font:11px var(--mono);font-weight:400;color:var(--text);background:rgba(255,255,255,.045);border-radius:4px;padding:2px 6px}
|
|
181
|
+
.rpt .t-value{--c:var(--ember)}
|
|
182
|
+
.rpt .t-hit,.rpt .t-secret,.rpt .t-named,.rpt .t-unknown{--c:var(--brass)}
|
|
183
|
+
.rpt .t-block{--c:var(--moss)}
|
|
184
|
+
|
|
185
|
+
/* ── list view: the observatory's table, with this session's columns ── */
|
|
186
|
+
.table-scroll{overflow-x:auto;max-width:100%;min-width:0;scrollbar-width:thin;scrollbar-color:#48484f transparent}
|
|
187
|
+
.rpt .listview table{border-collapse:collapse;width:100%;text-align:left}
|
|
188
|
+
.rpt .listview th{font-size:10px;letter-spacing:.5px;color:var(--quiet);font-weight:500;padding:11px 18px;border-top:0;border-bottom:1px solid #2c2c32;white-space:nowrap;text-transform:uppercase}
|
|
189
|
+
.rpt .listview td,.rpt .listview tbody th{padding:0;border-top:0;border-bottom:1px solid rgba(255,255,255,.03);font-size:13px;vertical-align:middle}
|
|
190
|
+
.rpt .listview td{padding:14px 18px;white-space:nowrap}
|
|
191
|
+
.rpt .listview tbody tr:last-child td,.rpt .listview tbody tr:last-child th{border-bottom:0}
|
|
192
|
+
.rpt .listview tbody tr{cursor:pointer}
|
|
193
|
+
.rpt .listview tbody tr:hover{background:rgba(255,255,255,.02)}
|
|
194
|
+
.rpt .listview tbody th{position:relative;white-space:nowrap;min-width:150px;font-weight:600;font-size:14px;text-transform:none;letter-spacing:0;color:var(--text)}
|
|
195
|
+
.rpt .listview tbody th a{display:flex;align-items:center;gap:9px;width:100%;padding:14px 18px;min-height:52px;text-align:left;font-weight:inherit;font-size:inherit;color:var(--text);text-decoration:none}
|
|
196
|
+
.rpt .listview tbody th{overflow:visible}
|
|
197
|
+
.rpt .listview tr[data-tier] th::before{content:"";position:absolute;left:0;top:14px;bottom:14px;width:2px;border-radius:3px;background:#45454d}
|
|
198
|
+
.rpt .listview tr[data-tier="value"] th::before{background:var(--ember)}
|
|
199
|
+
.rpt .listview tr:is([data-tier="hit"],[data-tier="secret"],[data-tier="named"],[data-tier="unknown"],[data-tier="gap"]) th::before{background:var(--brass)}
|
|
200
|
+
.rpt .listview tr[data-tier="block"] th::before{background:var(--moss)}
|
|
201
|
+
.rpt .listview tr[aria-current="true"]{background:rgba(255,255,255,.03)}
|
|
202
|
+
.rpt .listview tr[aria-current="true"] th::before{width:3px;box-shadow:0 0 12px rgba(255,153,127,.33)}
|
|
203
|
+
.rpt .kid{color:#5d5d67;font:12px var(--mono);width:10px;flex-shrink:0}
|
|
204
|
+
.rpt td.task{white-space:normal;min-width:180px;color:#d6d2d7}
|
|
205
|
+
.rpt td.did{font:12px var(--mono);color:var(--muted);max-width:170px;overflow:hidden;text-overflow:ellipsis}
|
|
206
|
+
.rpt td.out{text-align:right;white-space:normal}
|
|
207
|
+
.rpt .f{display:inline-block;font:11px var(--mono);background:rgba(187,107,69,.09);color:#ffae95;border:1px solid rgba(120,80,66,.53);border-radius:5px;padding:3px 7px;margin:2px 0 2px 9px}
|
|
208
|
+
.rpt .out-badge{display:inline-flex;margin:2px 0 2px 9px;align-items:center;gap:6px;border:1px solid #3e3b42;border-radius:5px;padding:4px 8px;font-size:11px;color:#bcb6c0;white-space:nowrap}
|
|
209
|
+
.rpt .out-badge .dot{width:7px;height:7px}
|
|
210
|
+
.rpt .out-badge.value{color:#ffae95;border-color:rgba(120,80,66,.53);background:rgba(187,107,69,.06)}
|
|
211
|
+
.rpt .out-badge:is(.hit,.secret,.named,.unknown){color:var(--brass);border-color:rgba(129,106,63,.53);background:rgba(161,123,55,.06)}
|
|
212
|
+
.rpt .out-badge.gap{border-style:dashed}
|
|
213
|
+
.rpt .out-badge.block{color:var(--moss);border-color:#355d4e;background:rgba(84,142,105,.06)}
|
|
214
|
+
.rpt .out-badge.clean{color:#b0aab4;border-color:#42404a}
|
|
215
|
+
.rpt .table-footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:8px 20px;border-top:1px solid rgba(255,255,255,.04);font-size:12px;color:var(--muted)}
|
|
216
|
+
.rpt .more{display:inline-flex;align-items:center;gap:7px;min-height:44px;color:var(--muted);font-size:12px;text-align:left}
|
|
217
|
+
.rpt .more:hover{color:var(--ember)}
|
|
218
|
+
.rpt .more u{text-underline-offset:3px}
|
|
219
|
+
.rpt .empty-note{padding:28px 22px;color:var(--muted);font-size:13px}
|
|
220
|
+
|
|
221
|
+
/* ── graph view: a node canvas. Nothing here is positioned by hand — the script places every node and draws every
|
|
222
|
+
wire from the attributes the markup carries, so the picture is right whether a session has three agents or
|
|
223
|
+
thirty. The canvas is a surface in the page's elevation ladder, not a hole in it: page < canvas < node. ── */
|
|
224
|
+
.rpt .scroll-map{overflow:auto;scrollbar-width:thin;scrollbar-color:#48484f transparent;max-height:min(72vh,780px);background:var(--canvas);border-top:1px solid rgba(0,0,0,.24);box-shadow:inset 0 9px 16px -14px rgba(0,0,0,.6)}
|
|
225
|
+
.rpt .scene{position:relative;background-color:var(--canvas);background-image:radial-gradient(rgba(255,255,255,.12) 1.15px,transparent 1.15px);background-size:22px 22px;background-position:-11px -11px}
|
|
226
|
+
/* The four columns are the diagram's sentence — You, the main agent, its helpers, what they reached. A label in
|
|
227
|
+
--quiet at 11px was not carrying that, so the header is a band: a rule across the canvas and labels above it. */
|
|
228
|
+
.rpt .col-band{position:absolute;left:0;right:0;top:0;height:42px;background:linear-gradient(#191a1f,#15161a);border-bottom:1px solid rgba(255,255,255,.08);pointer-events:none}
|
|
229
|
+
.rpt .col{position:absolute;top:13px;display:flex;gap:8px;align-items:center;white-space:nowrap;font-size:11px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:#c0bac5}
|
|
230
|
+
.rpt .col em{font-style:normal;font:10px var(--mono);font-weight:400;letter-spacing:0;color:#e2dce6;background:#32333b;border:1px solid #474851;border-radius:4px;padding:1px 6px}
|
|
231
|
+
.rpt .col .head-short{display:none}
|
|
232
|
+
.rpt .scene.compact .col .head-full{display:none}
|
|
233
|
+
.rpt .scene.compact .col .head-short{display:inline}
|
|
234
|
+
.rpt .gedges{position:absolute;inset:0;overflow:visible;pointer-events:none}
|
|
235
|
+
.rpt .e{fill:none;stroke-width:1.7;vector-effect:non-scaling-stroke;transition:opacity .2s}
|
|
236
|
+
.rpt .e.dim{opacity:.2;stroke-width:1.2}
|
|
237
|
+
.rpt .e.lit{stroke-width:2.3}
|
|
238
|
+
.rpt .e-tree{stroke:#6e6c78}
|
|
239
|
+
.rpt .e-tree.unresolved{stroke:#6e6c78;stroke-dasharray:6 5}
|
|
240
|
+
.rpt .e-value{stroke:var(--ember)}
|
|
241
|
+
.rpt .e-hit{stroke:#c3a16c}
|
|
242
|
+
.rpt .e-named{stroke:#c3a16c;stroke-dasharray:7 6}
|
|
243
|
+
.rpt .e-secret{stroke:var(--brass);stroke-dasharray:2 6;stroke-linecap:round}
|
|
244
|
+
.rpt .e-unknown{stroke:var(--violet);stroke-dasharray:2 6}
|
|
245
|
+
.rpt .e-block{stroke:var(--moss)}
|
|
246
|
+
.rpt .gn{position:absolute;display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-align:left;border:1px solid #3d3b44;border-radius:10px;padding:9px 13px;background:linear-gradient(115deg,#212026,#1b1a1f);box-shadow:0 3px 10px rgba(0,0,0,.15);min-width:0;transition:opacity .2s,border-color .15s}
|
|
247
|
+
.rpt .gn:hover{border-color:#6f6a76}
|
|
248
|
+
/* Two lines, neither of which may be squeezed: the box has a set height, and flex would otherwise shrink both
|
|
249
|
+
until the words are a few pixels tall rather than let one of them run past the edge. */
|
|
250
|
+
.rpt .gn-top{display:flex;align-items:center;gap:9px;flex:none;min-width:0;font-size:14px;line-height:1.25;font-weight:600;letter-spacing:-.2px}
|
|
251
|
+
.rpt .gn-top b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
252
|
+
.rpt .gn-sub{flex:none;margin-top:4px;font-size:12px;line-height:1.35;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
253
|
+
.rpt .gn-n{margin-left:auto;flex:none;color:var(--quiet);font:11px var(--mono);background:rgba(255,255,255,.04);border-radius:4px;padding:1px 6px}
|
|
254
|
+
.rpt .gn .dot{width:9px;height:9px;flex:none}
|
|
255
|
+
.rpt .gn.dim{opacity:.34}
|
|
256
|
+
.rpt .gn[aria-pressed="true"]{border-color:var(--ember);box-shadow:0 0 0 3px rgba(255,153,127,.14),0 4px 14px rgba(0,0,0,.25)}
|
|
257
|
+
/* Each tier keeps its own skin, so a glance at the column sorts the session before a word is read. */
|
|
258
|
+
.rpt .gn.value{border-color:#6b4c44;background:linear-gradient(115deg,#2a2124,#221e21)}
|
|
259
|
+
.rpt .gn.value .gn-sub{color:#d6a897}
|
|
260
|
+
.rpt .gn:is(.hit,.named,.secret){border-color:#5e5240;background:linear-gradient(115deg,#26241e,#1f1e1b)}
|
|
261
|
+
.rpt .gn:is(.hit,.named,.secret) .gn-sub{color:#c8b083}
|
|
262
|
+
.rpt .gn.block{border-color:#33574a}
|
|
263
|
+
.rpt .gn.block .gn-sub{color:#8fc7ae}
|
|
264
|
+
.rpt .gn:is(.unknown,.gap){border-style:dashed;border-color:#4d4666}
|
|
265
|
+
.rpt .gn.ty{border-radius:26px;align-items:center;padding:0;background:#202126;border-color:#41424b}
|
|
266
|
+
.rpt .gn.ty .gn-top{font-size:13px;font-weight:550}
|
|
267
|
+
.rpt .gn.file .gn-top b{font-family:var(--mono);font-size:13px;font-weight:500}
|
|
268
|
+
.rpt .gn.file.value .gn-top b{color:#ffc0ac}
|
|
269
|
+
.rpt .gn.file:is(.hit,.named) .gn-top b{color:#e0c48d}
|
|
270
|
+
.rpt .gn .gi{width:15px;height:15px;flex:none;color:var(--quiet)}
|
|
271
|
+
.rpt .gn.signal{border-color:#5d533c;background:linear-gradient(115deg,#262319,#1f1d18)}
|
|
272
|
+
.rpt .gn.signal .gn-top b{color:var(--brass);font-size:13px}
|
|
273
|
+
.rpt .glegend{display:flex;flex-wrap:wrap;gap:9px 18px;padding:13px 22px;border-top:1px solid rgba(255,255,255,.04);font-size:11px;color:var(--muted)}
|
|
274
|
+
.rpt .lg{display:flex;align-items:center;gap:8px;white-space:nowrap}
|
|
275
|
+
.rpt .lg svg{width:22px;height:10px;flex:none;overflow:visible}
|
|
276
|
+
.rpt .map-note{display:flex;gap:8px;padding:12px 2px;font-size:12px;line-height:1.55;color:var(--muted)}
|
|
277
|
+
.rpt .map-note .icon{width:15px;height:15px;margin-top:2px;color:var(--quiet)}
|
|
278
|
+
|
|
279
|
+
/* ── the inspector: one card per thing the page can say something about ── */
|
|
280
|
+
.rpt .inspector{display:flex;flex-direction:column;gap:18px;align-self:start;min-width:0}
|
|
281
|
+
/* Without a script every card is in the page at once, so the stack needs the gap the switch would otherwise hide. */
|
|
282
|
+
.rpt #pane{display:flex;flex-direction:column;gap:18px;min-width:0}
|
|
283
|
+
.rpt .inspector .panel{padding:0}
|
|
284
|
+
.rpt .inspector-head{padding:20px 22px 16px}
|
|
285
|
+
/* The name and what was found, on one line - wrapping onto a second only when the card is too narrow to hold both. */
|
|
286
|
+
.rpt .who-name{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
|
|
287
|
+
.rpt .chip{--c:#b0aab4;display:inline-flex;align-items:center;gap:7px;flex:none;padding:4px 11px;border-radius:20px;font-size:11px;font-weight:600;color:color-mix(in srgb,var(--c) 70%,var(--text));background:color-mix(in srgb,var(--c) 12%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--c) 20%,transparent)}
|
|
288
|
+
.rpt .chip i{width:7px;height:7px;border-radius:50%;background:currentColor;display:block}
|
|
289
|
+
.rpt .chip.value,.rpt .avatar.value{--c:var(--ember)}
|
|
290
|
+
.rpt .chip:is(.hit,.secret,.named,.unknown),.rpt .avatar:is(.hit,.secret,.named,.unknown){--c:var(--brass)}
|
|
291
|
+
.rpt .chip.block,.rpt .avatar.block{--c:var(--moss)}
|
|
292
|
+
.rpt .who-line{display:flex;align-items:center;gap:12px}
|
|
293
|
+
.rpt .avatar{display:grid;place-items:center;width:42px;height:42px;flex:none;border-radius:10px;background:color-mix(in srgb,var(--c,var(--ember)) 5%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--c,var(--ember)) 34%,transparent);color:var(--c,var(--ember))}
|
|
294
|
+
.rpt .avatar svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
|
|
295
|
+
.rpt .who-line h2{min-width:0;font-size:20px;letter-spacing:-.4px;font-weight:570;line-height:1.2;word-break:break-word}
|
|
296
|
+
.rpt .who-line .sub{display:block;font-size:12px;margin-top:2px;color:var(--muted);word-break:break-word}
|
|
297
|
+
.tabs{display:flex;border-bottom:1px solid var(--hair);padding:0 14px;gap:6px}
|
|
298
|
+
.tabs button{position:relative;flex:1;padding:12px 8px;min-height:46px;font-size:13px;color:var(--muted)}
|
|
299
|
+
.tabs button:hover{color:var(--text)}
|
|
300
|
+
.tabs button[aria-selected="true"]{color:var(--text)}
|
|
301
|
+
.tabs button[aria-selected="true"]::after{content:"";position:absolute;bottom:-1px;height:2px;background:var(--ember);left:8px;right:8px}
|
|
302
|
+
.rpt .inspector-body{padding:16px;min-width:0}
|
|
303
|
+
.tabpane{min-width:0}
|
|
304
|
+
|
|
305
|
+
/* ── what one panel says, at the mock's sizes ── */
|
|
306
|
+
.rpt .tldr{--c:var(--indigo);margin-top:4px;padding:20px;border:1px solid color-mix(in srgb,var(--c) 26%,transparent);border-left:4px solid var(--c);border-radius:4px 13px 13px 4px;background:color-mix(in srgb,var(--c) 9%,transparent);font-size:16px;font-weight:600;line-height:1.45;color:color-mix(in srgb,var(--c) 62%,var(--text))}
|
|
307
|
+
.rpt .tldr.tone-bad{--c:var(--ember)}.rpt .tldr.tone-warn,.rpt .tldr.tone-low{--c:var(--brass)}.rpt .tldr.tone-ok{--c:var(--moss)}
|
|
308
|
+
.rpt .panel.value .tldr{--c:var(--ember)}.rpt .panel:is(.hit,.secret,.named,.unknown) .tldr{--c:var(--brass)}.rpt .panel.block .tldr{--c:var(--moss)}
|
|
309
|
+
.rpt .seen-answer{display:flex;flex-direction:column;gap:2px;margin-top:12px}
|
|
310
|
+
.rpt .seen-word{font-size:40px;line-height:1.15;font-weight:700;letter-spacing:-.035em;color:var(--c);text-transform:uppercase}
|
|
311
|
+
.rpt .seen-says{margin-top:12px;font-size:17px;line-height:1.55;font-weight:400;color:#f0e9e7}
|
|
312
|
+
.rpt .seen-rows{list-style:none;margin-top:22px;border-top:1px solid color-mix(in srgb,var(--c) 30%,transparent)}
|
|
313
|
+
.rpt .seen-rows li{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:46px;padding:6px 0;border-bottom:1px solid color-mix(in srgb,var(--c) 30%,transparent);font-size:14px;line-height:1.45}
|
|
314
|
+
.rpt .seen-rows li>span{min-width:0;overflow-wrap:anywhere}
|
|
315
|
+
.rpt .yn{flex:none;padding:3px 10px;border-radius:14px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}
|
|
316
|
+
.rpt .yn.yes{color:var(--ember);background:color-mix(in srgb,var(--ember) 17%,transparent)}
|
|
317
|
+
.rpt .yn.no{color:var(--muted);background:rgba(255,255,255,.06)}
|
|
318
|
+
.rpt .yn.unknown{color:var(--brass);background:color-mix(in srgb,var(--brass) 15%,transparent)}
|
|
319
|
+
.rpt .summary-next{margin-top:22px}
|
|
320
|
+
.rpt .summary-next h4{font-size:15px;font-weight:650;color:var(--text);margin-bottom:6px}
|
|
321
|
+
.rpt .summary-next p{font-size:16px;line-height:1.6;color:#e4dce0}
|
|
322
|
+
.rpt .summary-help{margin-top:12px;font-size:13px;line-height:1.6;color:var(--muted)}
|
|
323
|
+
.rpt .summary-help summary{cursor:pointer;text-decoration:underline;text-underline-offset:3px;min-height:34px}
|
|
324
|
+
.rpt .section-title,.rpt .sect h3,.rpt .happened h3{font-size:16px;font-weight:550;letter-spacing:-.2px;margin-bottom:6px;color:var(--text)}
|
|
325
|
+
.rpt .section-lead{font-size:13px;color:var(--muted);line-height:1.6;margin-bottom:20px}
|
|
326
|
+
.rpt .sec-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}
|
|
327
|
+
.rpt .sec-head .section-title{display:flex;align-items:baseline;margin-bottom:0}
|
|
328
|
+
.rpt .steps-count{font:11px var(--mono);color:var(--quiet);background:rgba(255,255,255,.04);border-radius:4px;padding:2px 7px;margin-left:9px}
|
|
329
|
+
/* Framed, so it reads as a control; sized to the line beside it, so it does not outrank the heading. The accent
|
|
330
|
+
stays reserved for what the report found - a utility button does not borrow it until hover. */
|
|
331
|
+
.rpt .ghost-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 11px;border:1px solid #3f3b44;border-radius:7px;font-size:12px;font-weight:550;color:#cfcad2;flex-shrink:0}
|
|
332
|
+
.rpt .ghost-btn:hover{border-color:var(--ember);color:var(--ember)}
|
|
333
|
+
.rpt .ghost-btn .ico{width:13px;height:13px;flex:none}
|
|
334
|
+
.rpt .more-steps{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:46px;margin-top:2px;border:1px dashed #45424a;border-radius:9px;font-size:13px;color:var(--muted)}
|
|
335
|
+
.rpt .more-steps:hover{color:var(--ember);border-color:#77584e}
|
|
336
|
+
.rpt .more-steps .ico{width:15px;height:15px;flex:none}
|
|
337
|
+
.rpt .steps{list-style:none;margin:20px 0 0}
|
|
338
|
+
.rpt .steps>li{position:relative;margin-left:12px;padding:0 0 24px 32px;border-left:1px solid #414149}
|
|
339
|
+
.rpt .steps>li:last-child{padding-bottom:2px;border-left-color:transparent}
|
|
340
|
+
.rpt .steps .n{position:absolute;left:-13px;top:0;display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:#222329;box-shadow:inset 0 0 0 1px #4b4b54;font:11px var(--mono);color:#c9c8ce}
|
|
341
|
+
.rpt .steps h3{font-size:14px;font-weight:550;color:var(--text);margin-bottom:6px;padding-top:2px}
|
|
342
|
+
.rpt .steps blockquote{font-size:15px;line-height:1.55}
|
|
343
|
+
.rpt .steps p,.rpt .sect p{font-size:14px;line-height:1.65;color:#c3c2ca}
|
|
344
|
+
.rpt .steps p+p{margin-top:6px}
|
|
345
|
+
.rpt .note{padding:12px;background:rgba(255,255,255,.02);border-radius:7px;color:var(--muted);font-size:13px!important;line-height:1.6}
|
|
346
|
+
.rpt .none{color:var(--muted);font-size:13px;border:1px dashed var(--hair-3);border-radius:10px;padding:10px 12px}
|
|
347
|
+
.rpt .filebtn{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;margin-top:10px;padding:10px 12px;min-height:44px;border-radius:7px;background:#1e1d21;box-shadow:inset 0 0 0 1px #343238;text-decoration:none}
|
|
348
|
+
.rpt .filebtn:hover{background:var(--raise-2);box-shadow:inset 0 0 0 1px var(--hair-3)}
|
|
349
|
+
.rpt .filebtn code{background:none;padding:0;font:12px var(--mono);color:#ffc0ac;word-break:break-all}
|
|
350
|
+
.rpt .filebtn span,.rpt .linkish{font-size:13px;font-weight:500;color:var(--indigo)}
|
|
351
|
+
.rpt .linkish{display:inline-block;margin-top:9px;text-decoration:none}
|
|
352
|
+
.rpt .linkish:hover,.rpt .filebtn:hover span{text-decoration:underline}
|
|
353
|
+
.rpt .sect{margin-top:22px}
|
|
354
|
+
/* Who touched it: one card per agent, because this list is the answer to "who", not a set of links. */
|
|
355
|
+
.rpt .touch{list-style:none;margin-top:12px;border-radius:11px;background:rgba(255,255,255,.012);box-shadow:inset 0 0 0 1px var(--hair);overflow:hidden}
|
|
356
|
+
.rpt .touch li+li{border-top:1px solid rgba(255,255,255,.04)}
|
|
357
|
+
.rpt .touch a{display:grid;grid-template-columns:11px minmax(0,1fr) auto;align-items:center;column-gap:12px;padding:13px 15px;min-height:66px;color:var(--text);text-decoration:none}
|
|
358
|
+
.rpt .touch a:hover{background:rgba(255,255,255,.03)}
|
|
359
|
+
.rpt .touch .dot{width:11px;height:11px}
|
|
360
|
+
.rpt .touch b{font-size:15px;font-weight:620;letter-spacing:-.2px}
|
|
361
|
+
.rpt .touch em{--c:var(--muted);display:inline-flex;align-items:center;height:20px;padding:0 10px;margin-left:8px;border-radius:20px;vertical-align:1px;font-style:normal;font-size:12px;font-weight:550;color:var(--c);background:color-mix(in srgb,var(--c) 15%,transparent)}
|
|
362
|
+
.rpt .touch em.value{--c:var(--ember)}.rpt .touch em:is(.hit,.secret,.named,.unknown){--c:var(--brass)}.rpt .touch em.block{--c:var(--moss)}
|
|
363
|
+
.rpt .touch small{display:block;margin-top:4px;font-size:13px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
364
|
+
.rpt .touch .arr{color:var(--quiet)}
|
|
365
|
+
.rpt .touch a:hover .arr{color:var(--ember)}
|
|
366
|
+
.rpt .next{--c:var(--ember);margin-top:22px;padding:16px 18px;border:1px solid #4a3a3c;border-left:3px solid #ff896b;border-radius:4px 12px 12px 4px;background:linear-gradient(140deg,#2a2225,#221e22)}
|
|
367
|
+
.rpt .next h3{font-size:15px;font-weight:650;color:var(--c);margin-bottom:6px}
|
|
368
|
+
.rpt .next p{font-size:15px;line-height:1.6;color:#e4dce0}
|
|
369
|
+
.rpt .story{margin-top:10px;padding:14px 15px;border:1px solid var(--hair);border-radius:11px;background:rgba(255,255,255,.015)}
|
|
370
|
+
.rpt .story h4{font-size:15px;font-weight:600;line-height:1.4;margin-bottom:5px}
|
|
371
|
+
.rpt .story p{font-size:13px;color:var(--muted);line-height:1.55}
|
|
372
|
+
.rpt .story .meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 11px;margin-top:12px;font-size:12px;color:var(--muted)}
|
|
373
|
+
.rpt .story.value{border-color:#6b4c44;background:rgba(255,153,127,.03)}
|
|
374
|
+
.rpt .story.block{border-color:#33574a;background:rgba(125,206,176,.03)}
|
|
375
|
+
.rpt .what{margin-top:16px;padding:14px 16px;border-radius:12px;background:rgba(255,255,255,.02);box-shadow:inset 0 0 0 1px var(--hair);font-size:13.5px;line-height:1.6;color:var(--muted)}
|
|
376
|
+
.rpt .what h3{font-size:13px;font-weight:600;color:var(--text);margin-bottom:6px}
|
|
377
|
+
.rpt .what p+p{margin-top:7px}
|
|
378
|
+
.rpt .what b{color:var(--text);font-weight:600}
|
|
379
|
+
.rpt .ev{margin-top:16px;font-size:12.5px;font-weight:600;color:var(--muted)}
|
|
380
|
+
.rpt .ev code{display:block;margin-top:7px;font:11px/1.8 var(--mono);padding:12px;background:#101114;border:1px solid #2b2c33;border-radius:6px;overflow-wrap:anywhere;color:var(--muted)}
|
|
381
|
+
.rpt .limit{margin-top:18px;padding-top:16px;border-top:1px solid var(--hair);font-size:13px;line-height:1.7;color:var(--muted)}
|
|
382
|
+
.rpt .codes{display:flex;flex-wrap:wrap;gap:6px}
|
|
383
|
+
.rpt .facts{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:13px}
|
|
384
|
+
.rpt .facts dt{color:var(--muted)}
|
|
385
|
+
.rpt .gap-list{margin:8px 0 0 18px;font-size:13.5px}
|
|
386
|
+
.rpt .came-back,.rpt .use-line{margin-top:12px}
|
|
387
|
+
.file-chip{display:inline-block;max-width:100%;margin:1px 0;padding:0 6px;border-radius:6px;background:var(--raise-2);font-size:12.5px;line-height:1.7;overflow-wrap:anywhere}
|
|
388
|
+
/* The evidence card: a bordered card per section, its heading the size of a heading, and a marker that turns and
|
|
389
|
+
takes the accent when the card is open. */
|
|
390
|
+
details.fold{margin-top:10px;border:1px solid var(--hair);border-radius:11px;background:rgba(255,255,255,.012)}
|
|
391
|
+
details.fold>summary{display:flex;align-items:center;gap:11px;min-height:58px;padding:14px 16px;cursor:pointer;color:var(--text);font-size:15px;font-weight:600;list-style:none}
|
|
392
|
+
details.fold>summary::-webkit-details-marker{display:none}
|
|
393
|
+
details.fold>summary::before{content:"";flex:none;width:0;height:0;border-left:6px solid var(--quiet);border-top:4.5px solid transparent;border-bottom:4.5px solid transparent}
|
|
394
|
+
details.fold[open]>summary::before{border-left-color:var(--ember);transform:rotate(90deg)}
|
|
395
|
+
details.fold[open]>summary{border-bottom:0;padding-bottom:6px}
|
|
396
|
+
.rpt .evidence-fold>p,.rpt .evidence-fold>.steps,.rpt .evidence-fold>.sect{margin-left:14px;margin-right:14px}
|
|
397
|
+
.rpt .evidence-fold>.sect{margin-bottom:14px}
|
|
398
|
+
.rpt .happened h3{color:var(--c)}
|
|
399
|
+
.rpt .happened ol{margin:0 0 0 20px;display:flex;flex-direction:column;gap:7px;font-size:15px;line-height:1.55}
|
|
400
|
+
.rpt .happened li::marker{color:var(--muted);font-weight:600}
|
|
401
|
+
.rpt .happened li.key{color:var(--text);font-weight:600}
|
|
402
|
+
.rpt .happened li.key::marker{color:var(--c)}
|
|
403
|
+
|
|
404
|
+
/* ── the tables of evidence, and the dialogs they open into ── */
|
|
405
|
+
.rpt table{width:100%;border-collapse:collapse;font-size:13.5px}
|
|
406
|
+
/* An identifier is one thing. Broken across lines it reads as several, and neither half can be searched for. */
|
|
407
|
+
.rpt th code,.rpt td code{white-space:nowrap;word-break:normal;overflow-wrap:normal}
|
|
408
|
+
.rpt caption{text-align:left;padding:10px 14px;color:var(--muted);font-size:12.5px}
|
|
409
|
+
/* Written for every table but the list one, which sets its own: an evidence table is moved into the dialog to be
|
|
410
|
+
read full width, and rules keyed to the fold it came from would not travel with it. */
|
|
411
|
+
.rpt th,.rpt td{text-align:left;padding:10px 14px;border-top:1px solid var(--hair);vertical-align:top}
|
|
412
|
+
.rpt th{color:var(--muted);font-weight:600}
|
|
413
|
+
.badge{display:inline-flex;gap:5px;align-items:center;padding:2px 9px;border-radius:999px;font-size:12.5px;font-weight:600;white-space:nowrap;background:rgba(255,255,255,.09)}
|
|
414
|
+
.badge.succeeded{color:var(--ember)}.badge.blocked{color:var(--moss)}.badge.unknown{color:var(--brass);border:1px dashed var(--brass)}
|
|
415
|
+
.table-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:6px;min-width:0}
|
|
416
|
+
.table-wrap>.table-scroll{width:100%}
|
|
417
|
+
.table-open{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;box-shadow:inset 0 0 0 1px var(--hair-2);color:var(--muted)}
|
|
418
|
+
.table-open:hover{color:var(--text);box-shadow:inset 0 0 0 1px var(--hair)}
|
|
419
|
+
/* A modal dialog is centred by the browser through margin:auto, which the reset at the top takes away from
|
|
420
|
+
everything. Without these the dialog sits in the top-left corner, half of it off the page. */
|
|
421
|
+
dialog::backdrop{background:rgba(4,5,8,.72)}
|
|
422
|
+
dialog{color:var(--text);background:#191a1e;border:1px solid #424148;border-radius:14px;box-shadow:0 24px 90px rgba(0,0,0,.6);inset:0;margin:auto;padding:28px;width:min(96vw,1200px);max-height:86vh;overflow:auto}
|
|
423
|
+
.dialog-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px}
|
|
424
|
+
.dialog-head h2{font-size:20px;font-weight:600}
|
|
425
|
+
.dialog-acts{display:flex;align-items:center;gap:8px}
|
|
426
|
+
.dialog-x,.dialog-back{display:grid;place-items:center;min-width:44px;min-height:44px;border:1px solid var(--hair);border-radius:8px;color:var(--muted)}
|
|
427
|
+
.dialog-back{grid-auto-flow:column;gap:5px;padding:0 12px;font-size:13px;font-weight:600}
|
|
428
|
+
.dialog-back svg{width:14px;height:14px}
|
|
429
|
+
.dialog-x:hover,.dialog-back:hover{color:var(--text);border-color:var(--hair-3)}
|
|
430
|
+
#table-modal{width:min(96vw,1200px)}
|
|
431
|
+
#table-modal-body th code,#table-modal-body td code{white-space:normal;overflow-wrap:anywhere}
|
|
432
|
+
.flow-link{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:7px 12px;border-radius:9px;background:var(--raise);box-shadow:inset 0 0 0 1px var(--hair-2);color:var(--indigo);font-size:13px;font-weight:600}
|
|
433
|
+
.flow-link:hover{background:var(--raise-2);box-shadow:inset 0 0 0 1px var(--hair-3)}
|
|
434
|
+
/* The one action a panel offers. */
|
|
435
|
+
.rpt .primary{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:48px;margin-top:14px;padding:12px 15px;border-radius:8px;background:#28282d;box-shadow:inset 0 0 0 1px #414047;font-size:13px;font-weight:500;color:var(--text)}
|
|
436
|
+
.rpt .primary:hover{background:#33303a;box-shadow:inset 0 0 0 1px #796257}
|
|
437
|
+
.rpt .happened>.note{margin-top:10px}
|
|
438
|
+
#flow-modal{width:min(780px,calc(100% - 32px))}
|
|
439
|
+
.flow-title{font-size:20px;line-height:1.25;letter-spacing:-.01em;margin:0 0 2px}
|
|
440
|
+
/* The tab shows the opening of a long run and the dialog shows all of it - the same element, cut by the tab it
|
|
441
|
+
sits in, so nothing has to be rendered twice and the two can never disagree. */
|
|
442
|
+
.rpt .tabpane .flow-title{display:none}
|
|
443
|
+
/* Only where the dialog that shows the rest can be opened: with no script the whole run is the only run there is. */
|
|
444
|
+
.interactive .rpt .tabpane .flow.long .flow-steps>li:nth-child(n+6){display:none}
|
|
445
|
+
.flow-steps>li{padding-bottom:22px}
|
|
446
|
+
.flow-step p{font-size:14.5px;line-height:1.65}
|
|
447
|
+
.flow-step.chain.unknown>p{border:1px dashed var(--brass);border-radius:10px;padding:8px 11px}
|
|
448
|
+
.flow-step.chain.unknown .n{box-shadow:none;border:1px dashed var(--brass)}
|
|
449
|
+
.times{color:var(--ember);font-family:var(--mono);font-weight:600}
|
|
450
|
+
.flow-ev{margin-top:6px}
|
|
451
|
+
.flow-ev>summary{cursor:pointer;font-size:12px;color:var(--quiet);min-height:30px}
|
|
452
|
+
.flow-ev>summary:hover{color:var(--muted)}
|
|
453
|
+
.flow-ev code{display:block;margin-top:5px;font-size:12px;color:var(--muted);overflow-wrap:anywhere}
|
|
454
|
+
|
|
455
|
+
/* ── footer ── */
|
|
456
|
+
.rpt .footer{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;color:var(--quiet);font-size:11px;padding:24px 2px 0;margin-top:20px;border-top:1px solid rgba(255,255,255,.03)}
|
|
457
|
+
|
|
458
|
+
/* ── the way back inside the inspector, and the way out of it on a narrow screen ── */
|
|
459
|
+
.paneback{display:inline-flex;align-items:center;gap:5px;max-width:100%;height:30px;padding:0 11px 0 7px;margin:0 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px var(--hair-2);color:var(--muted);font-size:13px;font-weight:500}
|
|
460
|
+
.paneback svg{width:15px;height:15px;flex:none}
|
|
461
|
+
.paneback b{color:var(--text);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
|
|
462
|
+
.paneback:hover{background:rgba(255,255,255,.05);color:var(--text)}
|
|
463
|
+
|
|
464
|
+
/* ── narrower ── */
|
|
465
|
+
@media (max-width:1400px){.rpt .workbench{grid-template-columns:minmax(0,1fr) 380px}}
|
|
466
|
+
/* The column keeps one width at every size it is a column. It used to have four - 232, then 200, then 72px of
|
|
467
|
+
icons, then a bar along the bottom - so the same page put its own chrome in a different place on almost every
|
|
468
|
+
screen, and none of the steps bought room the page could not spare. Two states now: this column, or none. */
|
|
469
|
+
@media (max-width:1180px){
|
|
470
|
+
.rpt .topbar{margin-inline:22px}.rpt .main{padding:20px 22px 44px}
|
|
471
|
+
.rpt .workbench{grid-template-columns:minmax(0,1fr)}
|
|
472
|
+
.rpt .listview th,.rpt .listview td,.rpt .listview tbody th a{padding-inline:14px}
|
|
473
|
+
}
|
|
474
|
+
@media (max-width:850px){
|
|
475
|
+
.rpt .topbar{min-height:60px}
|
|
476
|
+
}
|
|
477
|
+
@media (max-width:580px){
|
|
478
|
+
.rpt .shell{margin-left:0}.rpt .ambient{left:0}
|
|
479
|
+
.rpt .topbar{margin:0 18px;min-height:58px}
|
|
480
|
+
.rpt .breadcrumb{font-size:11px;gap:8px}
|
|
481
|
+
.rpt .breadcrumb .session-id{display:none}
|
|
482
|
+
.rpt .top-actions{gap:10px}
|
|
483
|
+
.rpt .policy-label{display:none}
|
|
484
|
+
.rpt .main{padding:16px 16px 92px}
|
|
485
|
+
.rpt .verdict{margin-bottom:14px}
|
|
486
|
+
.rpt .verdict h1{align-items:flex-start;font-size:17px}
|
|
487
|
+
.rpt .lead,.rpt .tier-legend{padding-left:0}
|
|
488
|
+
.rpt .panel-head{padding:14px 16px;flex-wrap:wrap}
|
|
489
|
+
.rpt .seg{width:100%}.rpt .seg button{flex:1}
|
|
490
|
+
.rpt .filters{padding:8px 16px}.rpt .filters-label{display:none}
|
|
491
|
+
.rpt .listview table{min-width:720px}
|
|
492
|
+
.rpt .glegend{padding-inline:16px;gap:8px 12px}
|
|
493
|
+
.rpt .inspector-head{padding:18px}
|
|
494
|
+
.rpt .inspector-body{padding:12px}
|
|
495
|
+
.rpt .seen-word{font-size:34px}
|
|
496
|
+
.rpt .footer{font-size:10px}
|
|
497
|
+
}
|
|
498
|
+
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
|
|
499
|
+
@media print{.rpt .sidebar{display:none!important}.rpt .shell{margin-left:0!important}.js-only{display:none!important}.rpt .panel[hidden]{display:block!important}}
|
|
500
|
+
`;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { labelAttributes } from './report-copy.js';
|
|
2
|
+
import { BRAND_MARK } from './ui/brand-mark.js';
|
|
3
|
+
/**
|
|
4
|
+
* The column both pages carry: the mark, what you are looking at, the way around or the way out, and the one
|
|
5
|
+
* standing fact about where the work happened.
|
|
6
|
+
*
|
|
7
|
+
* It lives here and not twice. The index and the report each grew their own copy of it - two widths, two brands,
|
|
8
|
+
* two sets of nearly-identical rules - which is how the same column came to look like a different component
|
|
9
|
+
* depending on which page you were on. One module, one block of CSS, and the width is a token neither page sets.
|
|
10
|
+
*/
|
|
11
|
+
export function sidebar(options) {
|
|
12
|
+
const mark = BRAND_MARK + '<span class="brand-name">agent<em>why</em></span>';
|
|
13
|
+
return '<aside class="sidebar">' +
|
|
14
|
+
(options.home === undefined
|
|
15
|
+
? '<span class="brand" role="img" aria-label="agentwhy">' + mark + '</span>'
|
|
16
|
+
: '<a class="brand" href="' + options.home + '" aria-label="agentwhy">' + mark + '</a>') +
|
|
17
|
+
// The mark and the count lead, and the name has the whole width of the card under them. Beside the mark the
|
|
18
|
+
// name had about half a column to wrap inside, and a real project folder - `test-project-for-agentwhy` -
|
|
19
|
+
// came apart over three lines in it. The line above is short in every language, so the mark costs it nothing.
|
|
20
|
+
'<div class="workspace"><span class="workspace-meta"><span class="workspace-icon">' + options.card.icon +
|
|
21
|
+
'</span><small>' + options.card.sub + '</small></span>' +
|
|
22
|
+
'<b' + (options.card.hint === undefined ? '' : ' title="' + options.card.hint + '"') + '>' +
|
|
23
|
+
options.card.title + '</b></div>' +
|
|
24
|
+
(options.items.length === 0 ? '' :
|
|
25
|
+
'<p class="nav-label" aria-hidden="true">' + options.label + '</p>' +
|
|
26
|
+
'<nav class="nav"' + labelAttributes((t) => t('rail.nav')) + '>' + options.items.map(item).join('') + '</nav>') +
|
|
27
|
+
'<div class="sidebar-bottom"><p class="local-note"><span class="dot" aria-hidden="true"></span>' +
|
|
28
|
+
options.note.text + '<small>' + options.note.sub + '</small></p></div>' +
|
|
29
|
+
'</aside>';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The name is written twice: as text, and as a label, because a column narrow enough to hide that text leaves a
|
|
33
|
+
* control with no name at all (R4).
|
|
34
|
+
*/
|
|
35
|
+
function item(entry) {
|
|
36
|
+
const inside = entry.icon + '<span class="nav-name">' + entry.name + '</span>' +
|
|
37
|
+
(entry.count === undefined || entry.count === 0 ? '' : '<span class="nav-count">' + entry.count + '</span>');
|
|
38
|
+
const marks = labelAttributes(entry.label) + (entry.view === undefined ? '' : ' data-view="' + entry.view + '"');
|
|
39
|
+
return entry.radio === undefined
|
|
40
|
+
? '<a class="nav-item" href="' + (entry.href ?? '') + '"' + marks + '>' + inside + '</a>'
|
|
41
|
+
: '<label class="nav-item" for="' + entry.radio + '"' + marks + '>' + inside + '</label>';
|
|
42
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How many of a path's last segments it takes to tell it from every other path named beside it
|
|
3
|
+
* (`specs/2026-09-14-path-display-and-share.md` R5): two files a page names must never read alike, and a name alone reads
|
|
4
|
+
* alike wherever two folders hold a file of that name. Segments are compared, not text; where no tail tells the path
|
|
5
|
+
* apart, the answer is every segment it has.
|
|
6
|
+
*/
|
|
7
|
+
export function distinctDepth(parts, others) {
|
|
8
|
+
for (let depth = 1; depth < parts.length; depth += 1) {
|
|
9
|
+
const tail = parts.slice(-depth).join('/');
|
|
10
|
+
if (!others.some((other) => other.slice(-depth).join('/') === tail))
|
|
11
|
+
return depth;
|
|
12
|
+
}
|
|
13
|
+
return parts.length;
|
|
14
|
+
}
|