@bastani/atomic 0.9.13 → 0.9.14-alpha.2
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/CHANGELOG.md +58 -0
- package/README.md +3 -3
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/subagents/CHANGELOG.md +14 -0
- package/dist/builtin/subagents/README.md +6 -4
- package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
- package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
- package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
- package/dist/builtin/subagents/agents/debugger.md +1 -1
- package/dist/builtin/subagents/agents/worker.md +1 -1
- package/dist/builtin/subagents/package.json +6 -5
- package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
- package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
- package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
- package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
- package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
- package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
- package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
- package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
- package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
- package/dist/builtin/subagents/src/agents/agents.ts +7 -5
- package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
- package/dist/builtin/subagents/src/agents/identity.ts +1 -1
- package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
- package/dist/builtin/subagents/src/agents/skills.ts +64 -6
- package/dist/builtin/subagents/src/extension/config.ts +1 -1
- package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
- package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
- package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
- package/dist/builtin/subagents/src/extension/index.ts +23 -23
- package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
- package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
- package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
- package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
- package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
- package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
- package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
- package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
- package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
- package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
- package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
- package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
- package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
- package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
- package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
- package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
- package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
- package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
- package/dist/builtin/subagents/src/shared/settings.ts +4 -4
- package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
- package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
- package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
- package/dist/builtin/subagents/src/shared/types.ts +6 -6
- package/dist/builtin/subagents/src/shared/utils.ts +3 -3
- package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
- package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
- package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
- package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
- package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
- package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
- package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
- package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
- package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
- package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
- package/dist/builtin/subagents/src/tui/render.ts +4 -4
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +57 -0
- package/dist/builtin/workflows/README.md +39 -8
- package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
- package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
- package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
- package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
- package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
- package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
- package/dist/builtin/workflows/builtin/goal.ts +4 -0
- package/dist/builtin/workflows/builtin/index.d.ts +0 -4
- package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
- package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
- package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
- package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
- package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
- package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
- package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
- package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
- package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
- package/dist/builtin/workflows/builtin/ralph.ts +4 -0
- package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
- package/dist/builtin/workflows/builtin/tournament.ts +4 -0
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
- package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
- package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
- package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
- package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
- package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
- package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
- package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
- package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
- package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
- package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
- package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
- package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
- package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
- package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
- package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
- package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
- package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
- package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
- package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
- package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
- package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
- package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
- package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
- package/dist/builtin/workflows/src/authoring.d.ts +3 -0
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
- package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
- package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
- package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
- package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
- package/dist/builtin/workflows/src/durable/factory.ts +11 -8
- package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
- package/dist/builtin/workflows/src/durable/types.ts +4 -0
- package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
- package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
- package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
- package/dist/builtin/workflows/src/engine/run.ts +1 -0
- package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
- package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
- package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
- package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
- package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
- package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
- package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
- package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
- package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
- package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
- package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
- package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
- package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
- package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
- package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
- package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
- package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
- package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
- package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
- package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
- package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
- package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
- package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
- package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
- package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
- package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
- package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/credential-print.d.ts +1 -1
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +9 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +7 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/core/agent-session-custom-message-commit.js +2 -2
- package/dist/core/agent-session-custom-message-commit.js.map +1 -1
- package/dist/core/agent-session-export.d.ts +6 -1
- package/dist/core/agent-session-export.d.ts.map +1 -1
- package/dist/core/agent-session-export.js +6 -3
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +6 -4
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +5 -2
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts +12 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +31 -10
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-runtime-auth.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-skill-block.d.ts +1 -0
- package/dist/core/agent-session-skill-block.d.ts.map +1 -1
- package/dist/core/agent-session-skill-block.js +18 -2
- package/dist/core/agent-session-skill-block.js.map +1 -1
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +2 -1
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -1
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/atomic-guide-command.js +2 -2
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +0 -6
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
- package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
- package/dist/core/cloudflare-gateway-binding.js +11 -0
- package/dist/core/cloudflare-gateway-binding.js.map +1 -0
- package/dist/core/codex-fast-mode-transport.d.ts +12 -0
- package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
- package/dist/core/codex-fast-mode-transport.js +130 -0
- package/dist/core/codex-fast-mode-transport.js.map +1 -0
- package/dist/core/codex-fast-mode.d.ts +20 -6
- package/dist/core/codex-fast-mode.d.ts.map +1 -1
- package/dist/core/codex-fast-mode.js +111 -3
- package/dist/core/codex-fast-mode.js.map +1 -1
- package/dist/core/diagnostics.d.ts +4 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/event-bus.d.ts +12 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +22 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/experimental.d.ts +25 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +24 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
- package/dist/core/export-html/template.js +4 -3
- package/dist/core/extension-session-state.d.ts +28 -0
- package/dist/core/extension-session-state.d.ts.map +1 -0
- package/dist/core/extension-session-state.js +55 -0
- package/dist/core/extension-session-state.js.map +1 -0
- package/dist/core/extensions/api-types.d.ts +6 -0
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +4 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +16 -10
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +12 -1
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +2 -0
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +8 -0
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +3 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +26 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js +17 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +6 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts +1 -1
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +3 -3
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts +1 -1
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts +1 -1
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-runtime.d.ts +54 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +96 -13
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/oauth-login.js.map +1 -1
- package/dist/core/project-trust.d.ts +10 -0
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +12 -0
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.js +14 -5
- package/dist/core/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +3 -0
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +5 -0
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-internals.d.ts +2 -0
- package/dist/core/resource-loader-internals.d.ts.map +1 -1
- package/dist/core/resource-loader-internals.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +2 -0
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +2 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +1 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk-types.d.ts +7 -6
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +7 -1
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +11 -2
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +2 -2
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +6 -4
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-list.d.ts.map +1 -1
- package/dist/core/session-manager-list.js +5 -1
- package/dist/core/session-manager-list.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +25 -2
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +8 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.js +9 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-types.d.ts +4 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/skill-catalog.d.ts +35 -0
- package/dist/core/skill-catalog.d.ts.map +1 -0
- package/dist/core/skill-catalog.js +264 -0
- package/dist/core/skill-catalog.js.map +1 -0
- package/dist/core/skills-async.d.ts.map +1 -1
- package/dist/core/skills-async.js +12 -6
- package/dist/core/skills-async.js.map +1 -1
- package/dist/core/skills.d.ts +2 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +8 -5
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.js +2 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +3 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/hashline-engine/format.d.ts +2 -0
- package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/format.js +4 -2
- package/dist/core/tools/hashline-engine/format.js.map +1 -1
- package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
- package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/messages.js +4 -2
- package/dist/core/tools/hashline-engine/messages.js.map +1 -1
- package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/parser.js +16 -4
- package/dist/core/tools/hashline-engine/parser.js.map +1 -1
- package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
- package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
- package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
- package/dist/core/tools/hashline.d.ts.map +1 -1
- package/dist/core/tools/hashline.js +8 -2
- package/dist/core/tools/hashline.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +2 -0
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +8 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/search.d.ts.map +1 -1
- package/dist/core/tools/search.js +2 -0
- package/dist/core/tools/search.js.map +1 -1
- package/dist/core/tools/todos.d.ts +3 -12
- package/dist/core/tools/todos.d.ts.map +1 -1
- package/dist/core/tools/todos.js +19 -4
- package/dist/core/tools/todos.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/main-runtime-api-key.d.ts +1 -1
- package/dist/main-runtime-api-key.js.map +1 -1
- package/dist/main-session-options.d.ts +1 -1
- package/dist/main-session-options.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +38 -0
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
- package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-transcript.js +54 -1
- package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
- package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +4 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +7 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +5 -4
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +2 -2
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +80 -11
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
- package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +3 -4
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +6 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +7 -3
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +7 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +2 -2
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +34 -9
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts +21 -1
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +140 -38
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +84 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +6 -1
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +1 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.js +3 -1
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +1 -0
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +1 -0
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
- package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-component.js +3 -2
- package/dist/modes/interactive-engine/remote-component.js.map +1 -1
- package/dist/modes/json-event.d.ts +6 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +17 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +5 -4
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/modes/rpc/rpc-responses.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +11 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/abort.d.ts +9 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +19 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +16 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +19 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/custom-provider.md +9 -8
- package/docs/development.md +0 -1
- package/docs/docs.json +0 -1
- package/docs/environment-variables.md +3 -0
- package/docs/extensions.md +100 -2
- package/docs/json.md +3 -1
- package/docs/keybindings.md +8 -3
- package/docs/models/artificial-analysis-index.md +2 -2
- package/docs/models/model-selection.md +32 -23
- package/docs/models/pareto-efficiency.md +25 -24
- package/docs/providers.md +95 -2
- package/docs/quickstart.md +4 -2
- package/docs/rpc.md +21 -7
- package/docs/sdk.md +26 -1
- package/docs/session-format.md +5 -2
- package/docs/settings.md +34 -3
- package/docs/skills.md +16 -1
- package/docs/terminal-setup.md +15 -2
- package/docs/themes.md +22 -4
- package/docs/tools.md +3 -1
- package/docs/tui.md +2 -0
- package/docs/usage.md +5 -4
- package/docs/workflows.md +96 -19
- package/npm-shrinkwrap.json +211 -232
- package/package.json +8 -8
- package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
- package/dist/builtin/i-have-adhd/LICENSE +0 -21
- package/dist/builtin/i-have-adhd/README.md +0 -18
- package/dist/builtin/i-have-adhd/index.ts +0 -238
- package/dist/builtin/i-have-adhd/package.json +0 -56
- package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
- package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
- package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
- package/docs/i-have-adhd.md +0 -36
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { CONCEPT_STATUSES, normalizeConceptForm } from './concept-catalog.mjs';
|
|
4
|
+
// Defined in roll-selection.mjs for the same reason WELL_TIERS is: this file
|
|
5
|
+
// reads the filesystem, and the roll API imports the taxonomy to validate its
|
|
6
|
+
// grain and platform parameters. Re-exported so importers have one place to look.
|
|
7
|
+
import { COMPOSITION_GRAINS, COMPOSITION_PLATFORMS, isGrain, isPlatform } from './roll-selection.mjs';
|
|
8
|
+
export { COMPOSITION_GRAINS, COMPOSITION_PLATFORMS, isGrain, isPlatform };
|
|
4
9
|
|
|
5
|
-
// Catalog B:
|
|
10
|
+
// Catalog B: compositions rather than styles. A composition organizes attention,
|
|
6
11
|
// sequence, or manipulation on a surface and must survive being dressed in
|
|
7
12
|
// any committed visual identity; it deliberately carries no palette or type
|
|
8
13
|
// half. Surface-scope seeds draw from here (plus catalog A duals); direction
|
|
@@ -15,10 +20,11 @@ export const COMPOSITION_GRAMMAR_PREFIXES = [
|
|
|
15
20
|
'Adaptation:',
|
|
16
21
|
];
|
|
17
22
|
|
|
18
|
-
// Surfaces align with the skill's modes: a persuade
|
|
19
|
-
//
|
|
23
|
+
// Surfaces align with the skill's modes: a persuade composition and an operate
|
|
24
|
+
// composition are different species, and read/experience surfaces get their own.
|
|
20
25
|
export const COMPOSITION_SURFACES = new Set(['persuade', 'operate', 'read', 'experience']);
|
|
21
26
|
|
|
27
|
+
|
|
22
28
|
export function compositionContentHash(composition) {
|
|
23
29
|
const payload = [
|
|
24
30
|
composition?.form ?? '',
|
|
@@ -57,6 +63,26 @@ export function validateCompositionEntry(composition, { existingForms = new Map(
|
|
|
57
63
|
if (!COMPOSITION_SURFACES.has(composition?.surface)) {
|
|
58
64
|
errors.push(`composition ${id} needs a surface of ${[...COMPOSITION_SURFACES].join(', ')}`);
|
|
59
65
|
}
|
|
66
|
+
// Grain: how much of the product this composes. Optional, and absence means
|
|
67
|
+
// eligible at any grain, so nothing needs backfilling.
|
|
68
|
+
if (composition?.grain !== undefined && composition.grain !== null && !isGrain(composition.grain)) {
|
|
69
|
+
errors.push(`composition ${id} grain "${composition.grain}" must be one of ${COMPOSITION_GRAINS.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
// Platforms this composition survives. Absence means all of them, so listing
|
|
72
|
+
// every platform is the same as omitting the field and is rejected in favour of
|
|
73
|
+
// leaving it out; an empty array would exclude the entry from every roll.
|
|
74
|
+
if (composition?.platforms !== undefined && composition.platforms !== null) {
|
|
75
|
+
const list = composition.platforms;
|
|
76
|
+
if (!Array.isArray(list) || list.length === 0) {
|
|
77
|
+
errors.push(`composition ${id} platforms must be a non-empty array, or omitted to allow every platform`);
|
|
78
|
+
} else if (list.some(entry => !isPlatform(entry))) {
|
|
79
|
+
errors.push(`composition ${id} platforms may only contain ${COMPOSITION_PLATFORMS.join(', ')}`);
|
|
80
|
+
} else if (new Set(list).size !== list.length) {
|
|
81
|
+
errors.push(`composition ${id} platforms must not repeat a platform`);
|
|
82
|
+
} else if (list.length === COMPOSITION_PLATFORMS.length) {
|
|
83
|
+
errors.push(`composition ${id} platforms lists every platform; omit the field instead`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
60
86
|
if (!Array.isArray(composition?.tags)
|
|
61
87
|
|| composition.tags.length !== 3
|
|
62
88
|
|| composition.tags.some(tag => typeof tag !== 'string' || !tag.trim())) {
|
|
@@ -149,6 +175,15 @@ export function validateCompositionCatalog(catalog, reviewData, { minimumTotal }
|
|
|
149
175
|
errors.push(`composition review ${id} is stale: content changed since review`);
|
|
150
176
|
}
|
|
151
177
|
}
|
|
178
|
+
// Mirrors the concept catalog: an optional 1-3 grade on approved entries
|
|
179
|
+
// only, read as a calibration signal and used to weight challenger draws.
|
|
180
|
+
if (review?.rating !== undefined) {
|
|
181
|
+
if (![1, 2, 3].includes(review.rating)) {
|
|
182
|
+
errors.push(`review ${id} rating must be 1, 2, or 3`);
|
|
183
|
+
} else if (review.status !== 'approved') {
|
|
184
|
+
errors.push(`review ${id} rating only applies to approved compositions`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
152
187
|
if (review?.note !== undefined && (typeof review.note !== 'string' || !review.note.trim() || review.note.length > 500)) {
|
|
153
188
|
errors.push(`composition review ${id} note must be a non-empty string of 500 characters or fewer`);
|
|
154
189
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { WELL_TIERS } from './roll-selection.mjs';
|
|
3
4
|
|
|
4
5
|
export const CONCEPT_STATUSES = new Set(['approved', 'rejected']);
|
|
5
6
|
|
|
6
7
|
// What a concept is actually strong at. Worlds carry a durable visual
|
|
7
8
|
// identity (their palette/type half is the magnet); compositions carry a
|
|
8
|
-
//
|
|
9
|
+
// composition or interaction idea (their topology half is the magnet) that can be
|
|
9
10
|
// dressed in any committed identity; duals fuse both inseparably. Direction
|
|
10
11
|
// seeds draw world|dual, surface seeds draw composition|dual.
|
|
11
12
|
export const CONCEPT_STRENGTHS = new Set(['world', 'composition', 'dual']);
|
|
@@ -15,7 +16,20 @@ export const CONCEPT_STRENGTHS = new Set(['world', 'composition', 'dual']);
|
|
|
15
16
|
// atmosphere worlds need the largest translation step. Every seed roll draws
|
|
16
17
|
// one challenger from each tier so at least one directly-usable graphic
|
|
17
18
|
// system is always on the table.
|
|
18
|
-
|
|
19
|
+
// Defined in roll-selection.mjs, the dependency-free leaf both the seeder and
|
|
20
|
+
// the roll API import. It cannot depend on this file: this one reads the
|
|
21
|
+
// filesystem, and a Pages Function must not pull node:fs into its bundle.
|
|
22
|
+
// Imported and re-exported rather than re-exported alone: a bare
|
|
23
|
+
// `export { X } from` does not bind X in this module's own scope, and
|
|
24
|
+
// validateConceptCatalog needs it.
|
|
25
|
+
export { WELL_TIERS };
|
|
26
|
+
|
|
27
|
+
// Reviewer axes that gate the challenger draw without touching approval.
|
|
28
|
+
export const CONCEPT_BREADTHS = new Set(['general', 'niche']);
|
|
29
|
+
// The registers of work a roll can be asked for. Kept here beside the review
|
|
30
|
+
// validation that uses it; roll-selection.mjs filters on it and the seeder
|
|
31
|
+
// validates the --mode flag against the same four.
|
|
32
|
+
export const SEED_MODES = new Set(['persuade', 'operate', 'read', 'experience']);
|
|
19
33
|
|
|
20
34
|
const WEB_LEVERAGE_RE = /(?:\b3d\b|\badaptive\b|\banimat(?:e|ed|ion)\b|\bapi\b|\baria\b|\baudio\b|\bautomated?\b|\bbarcode\b|\bbroadcastchannel\b|\bbrowser\b|\bcamera\b|canvas\b|\bcaption\b|\bcollaborat(?:e|ive|ion)\b|\bcompar(?:e|ison)\b|\bcomput(?:e|ed|ation)\b|\bcomputer[- ]vision\b|\bconstraint[- ]solving\b|\bcryptographic?\b|\bcss\b|\bdeep[- ]link(?:ing)?\b|\bdirect manipulation\b|\bdom\b|\bdrag\b|\bfilter\b|\bfocus\b|\bgenerative\b|\bgeolocat(?:e|ed|ion)\b|\bgesture\b|\bgpu\b|\bgraph\b|\bhistory\b|\bindexeddb\b|\binteractive\b|\bintersectionobserver\b|\bkeyboard\b|\blive\b|\blocal\b|\bmicrophone\b|\bmotion\b|\bmultiplayer\b|\bnative\b|\bnotification\b|\boffline\b|\bpersonaliz(?:e|ed|ation)\b|\bplayable\b|\bpointer\b|\bprocedural\b|\bprovenance\b|\breal[- ]?time\b|\bresizeobserver\b|\bresponsive\b|\breveal\b|\bscrub\b|\bsearch\b|\bsearchparams\b|\bsensor\b|\bserver[- ]sent\b|\bservice worker\b|\bshader\b|\bsimulat(?:e|ed|ion|or)\b|\bspatial\b|\bstate\b|\bstream(?:ing)?\b|\bsvg\b|\bsynchroniz(?:e|ed|ation)\b|\btimeline\b|\btouch\b|\burl|\bvideo\b|\bweb(?:gl|socket|vtt)?\b|\bworker\b|\bzoom\b)/i;
|
|
21
35
|
export const SYSTEM_PREFIXES = [
|
|
@@ -36,9 +50,36 @@ export function normalizeConceptForm(value) {
|
|
|
36
50
|
.trim();
|
|
37
51
|
}
|
|
38
52
|
|
|
39
|
-
export function validateConceptEntry(concept, { existingForms = new Map() } = {}) {
|
|
53
|
+
export function validateConceptEntry(concept, { existingForms = new Map(), axes = null } = {}) {
|
|
40
54
|
const errors = [];
|
|
41
55
|
const id = concept?.id || '(unknown)';
|
|
56
|
+
|
|
57
|
+
// Recorded aesthetic axis values. Optional, and absent means the value is
|
|
58
|
+
// inferred from the system rules instead. Some axes cannot be inferred at all:
|
|
59
|
+
// depth's keyword probe matched worlds that said "no cast shadow anywhere",
|
|
60
|
+
// and motion and colour strategy describe properties the rules never state, so
|
|
61
|
+
// a wave that assigns those has to record them or the assignment is lost.
|
|
62
|
+
// Validated against the axes definition when the caller supplies it, because a
|
|
63
|
+
// typo would read as "unrecorded" and silently fall back to a probe that is
|
|
64
|
+
// known not to work.
|
|
65
|
+
if (concept?.axes !== undefined && concept.axes !== null) {
|
|
66
|
+
if (typeof concept.axes !== 'object' || Array.isArray(concept.axes)) {
|
|
67
|
+
errors.push(`concept ${id} axes must be an object of axis id to value id`);
|
|
68
|
+
} else if (axes) {
|
|
69
|
+
const byId = new Map((axes.axes || []).map(axis => [axis.id, axis]));
|
|
70
|
+
for (const [axisId, valueId] of Object.entries(concept.axes)) {
|
|
71
|
+
const axis = byId.get(axisId);
|
|
72
|
+
if (!axis) {
|
|
73
|
+
errors.push(`concept ${id} names unknown axis "${axisId}"`);
|
|
74
|
+
} else if (!(axis.values || []).some(value => value.id === valueId)) {
|
|
75
|
+
errors.push(
|
|
76
|
+
`concept ${id} axis "${axisId}" has unknown value "${valueId}" `
|
|
77
|
+
+ `(expected one of ${(axis.values || []).map(v => v.id).join(', ')})`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
42
83
|
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(concept?.id || '')) {
|
|
43
84
|
errors.push(`invalid concept id: ${String(concept?.id)}`);
|
|
44
85
|
}
|
|
@@ -68,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map() } = {}
|
|
|
68
109
|
|| concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) {
|
|
69
110
|
errors.push(`concept ${id} must have exactly three structural tags`);
|
|
70
111
|
}
|
|
112
|
+
// The slop this world in particular is at risk of. Optional, because 541
|
|
113
|
+
// entries predate it and none of them are wrong for lacking it. A world built
|
|
114
|
+
// from posters is at risk of shouting and one built from instruments is at
|
|
115
|
+
// risk of dead greys; a global detector cannot know which, and the author can.
|
|
116
|
+
if (concept?.avoid !== undefined) {
|
|
117
|
+
if (!Array.isArray(concept.avoid)
|
|
118
|
+
|| concept.avoid.length < 2
|
|
119
|
+
|| concept.avoid.length > 3
|
|
120
|
+
|| concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) {
|
|
121
|
+
errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
71
124
|
if (!Array.isArray(concept?.system)
|
|
72
125
|
|| concept.system.length !== SYSTEM_PREFIXES.length
|
|
73
126
|
|| concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) {
|
|
@@ -282,6 +335,27 @@ export function validateConceptCatalog(catalog, reviewData, {
|
|
|
282
335
|
errors.push(`review ${id} rating only applies to approved concepts`);
|
|
283
336
|
}
|
|
284
337
|
}
|
|
338
|
+
// Breadth: a world too narrow to serve an arbitrary build keeps its approval
|
|
339
|
+
// and leaves the challenger pool. Selection has honoured this for a while but
|
|
340
|
+
// nothing validated it, so a typo would silently read as "general".
|
|
341
|
+
if (review?.breadth !== undefined && !CONCEPT_BREADTHS.has(review.breadth)) {
|
|
342
|
+
errors.push(`review ${id} breadth must be one of ${[...CONCEPT_BREADTHS].join(', ')}`);
|
|
343
|
+
}
|
|
344
|
+
// Mode eligibility: which registers of work this world can carry. Absent
|
|
345
|
+
// means all of them, which is why it needs no backfill. Listing every mode
|
|
346
|
+
// is the same as omitting it, and an empty list would deal nothing, so both
|
|
347
|
+
// are rejected in favour of leaving the field out.
|
|
348
|
+
if (review?.allowedModes !== undefined) {
|
|
349
|
+
if (!Array.isArray(review.allowedModes) || review.allowedModes.length === 0) {
|
|
350
|
+
errors.push(`review ${id} allowedModes must be a non-empty array, or omitted to allow every mode`);
|
|
351
|
+
} else if (review.allowedModes.some(mode => !SEED_MODES.has(mode))) {
|
|
352
|
+
errors.push(`review ${id} allowedModes may only contain ${[...SEED_MODES].join(', ')}`);
|
|
353
|
+
} else if (new Set(review.allowedModes).size !== review.allowedModes.length) {
|
|
354
|
+
errors.push(`review ${id} allowedModes must not repeat a mode`);
|
|
355
|
+
} else if (review.allowedModes.length === SEED_MODES.size) {
|
|
356
|
+
errors.push(`review ${id} allowedModes lists every mode; omit the field instead`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
285
359
|
}
|
|
286
360
|
|
|
287
361
|
const wellTierById = new Map((catalog?.wells || []).map(well => [well.id, well.tier]));
|
|
@@ -319,11 +393,3 @@ export function approvedPoolRevision(concepts) {
|
|
|
319
393
|
.join('\n');
|
|
320
394
|
return crypto.createHash('sha256').update(payload).digest('hex').slice(0, 12);
|
|
321
395
|
}
|
|
322
|
-
|
|
323
|
-
export function deterministicRank(items, input, idFor = item => item.id) {
|
|
324
|
-
return [...items].sort((a, b) => {
|
|
325
|
-
const scoreA = crypto.createHash('sha256').update(`${input}:${idFor(a)}`).digest('hex');
|
|
326
|
-
const scoreB = crypto.createHash('sha256').update(`${input}:${idFor(b)}`).digest('hex');
|
|
327
|
-
return scoreB.localeCompare(scoreA) || idFor(a).localeCompare(idFor(b));
|
|
328
|
-
});
|
|
329
|
-
}
|
|
@@ -2,15 +2,20 @@
|
|
|
2
2
|
// the live-mode design-system panel can render. Deterministic, dependency-free.
|
|
3
3
|
//
|
|
4
4
|
// Two-layer: YAML frontmatter (machine-readable tokens) + markdown body
|
|
5
|
-
// (prose with
|
|
5
|
+
// (prose with eight canonical H2 sections). When frontmatter is present, it's
|
|
6
6
|
// exposed on `model.frontmatter` alongside the prose-scraped sections;
|
|
7
7
|
// consumers can prefer frontmatter values and fall back to prose.
|
|
8
8
|
|
|
9
|
+
// Array order is also match precedence: matchCanonicalSection's keyword-contained
|
|
10
|
+
// pass returns the first entry a heading contains, so reordering this changes
|
|
11
|
+
// which section an ambiguous heading resolves to.
|
|
9
12
|
const CANONICAL_SECTIONS = [
|
|
10
13
|
'Overview',
|
|
11
14
|
'Colors',
|
|
12
15
|
'Typography',
|
|
16
|
+
'Layout',
|
|
13
17
|
'Elevation',
|
|
18
|
+
'Shapes',
|
|
14
19
|
'Components',
|
|
15
20
|
"Do's and Don'ts",
|
|
16
21
|
];
|
|
@@ -115,10 +120,71 @@ function stripInlineYamlComment(s) {
|
|
|
115
120
|
return s;
|
|
116
121
|
}
|
|
117
122
|
|
|
123
|
+
// YAML double-quoted scalars process backslash escapes. Stripping the outer
|
|
124
|
+
// quotes without unescaping leaves them in place, so a nested font family like
|
|
125
|
+
// fontFamily: "\"IBM Plex Sans\", system-ui, sans-serif"
|
|
126
|
+
// keeps its literal backslashes and never matches the same family in CSS.
|
|
127
|
+
// The full YAML 1.2 double-quote escape set (spec section 5.7).
|
|
128
|
+
const YAML_SIMPLE_ESCAPES = {
|
|
129
|
+
'0': '\0',
|
|
130
|
+
a: '\x07',
|
|
131
|
+
b: '\b',
|
|
132
|
+
t: '\t',
|
|
133
|
+
n: '\n',
|
|
134
|
+
v: '\v',
|
|
135
|
+
f: '\f',
|
|
136
|
+
r: '\r',
|
|
137
|
+
e: '\x1b',
|
|
138
|
+
' ': ' ',
|
|
139
|
+
'"': '"',
|
|
140
|
+
'/': '/',
|
|
141
|
+
'\\': '\\',
|
|
142
|
+
N: '\u0085',
|
|
143
|
+
_: '\u00a0',
|
|
144
|
+
L: '\u2028',
|
|
145
|
+
P: '\u2029',
|
|
146
|
+
};
|
|
147
|
+
const YAML_HEX_ESCAPE_LENGTHS = { x: 2, u: 4, U: 8 };
|
|
148
|
+
|
|
149
|
+
function unescapeYamlDoubleQuoted(body) {
|
|
150
|
+
let out = '';
|
|
151
|
+
for (let i = 0; i < body.length; i++) {
|
|
152
|
+
const ch = body[i];
|
|
153
|
+
if (ch !== '\\' || i === body.length - 1) {
|
|
154
|
+
out += ch;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const next = body[i + 1];
|
|
158
|
+
if (Object.prototype.hasOwnProperty.call(YAML_SIMPLE_ESCAPES, next)) {
|
|
159
|
+
out += YAML_SIMPLE_ESCAPES[next];
|
|
160
|
+
i++;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// \xNN, \uNNNN, \UNNNNNNNN. Malformed or out-of-range sequences stay
|
|
164
|
+
// literal rather than corrupting the rest of the scalar.
|
|
165
|
+
const hexLen = YAML_HEX_ESCAPE_LENGTHS[next];
|
|
166
|
+
if (hexLen) {
|
|
167
|
+
const hex = body.slice(i + 2, i + 2 + hexLen);
|
|
168
|
+
const codePoint = hex.length === hexLen && /^[0-9a-fA-F]+$/.test(hex) ? parseInt(hex, 16) : -1;
|
|
169
|
+
if (codePoint >= 0 && codePoint <= 0x10ffff) {
|
|
170
|
+
out += String.fromCodePoint(codePoint);
|
|
171
|
+
i += 1 + hexLen;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
out += ch;
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
|
|
118
180
|
function parseScalar(raw) {
|
|
119
181
|
const s = raw.trim();
|
|
120
|
-
if (
|
|
121
|
-
return s.slice(1, -1);
|
|
182
|
+
if (s.length >= 2 && s.startsWith('"') && s.endsWith('"')) {
|
|
183
|
+
return unescapeYamlDoubleQuoted(s.slice(1, -1));
|
|
184
|
+
}
|
|
185
|
+
// Single-quoted YAML escapes only the quote itself, by doubling it.
|
|
186
|
+
if (s.length >= 2 && s.startsWith("'") && s.endsWith("'")) {
|
|
187
|
+
return s.slice(1, -1).split("''").join("'");
|
|
122
188
|
}
|
|
123
189
|
if (s === 'true') return true;
|
|
124
190
|
if (s === 'false') return false;
|
|
@@ -330,17 +396,16 @@ function extractOverview(section) {
|
|
|
330
396
|
if (!section) return null;
|
|
331
397
|
const text = section.lines.join('\n');
|
|
332
398
|
const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/);
|
|
333
|
-
const keyChars = [];
|
|
334
399
|
const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/);
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
400
|
+
const keyChars = keyCharMatch
|
|
401
|
+
? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim()))
|
|
402
|
+
: [];
|
|
403
|
+
const prose = keyCharMatch
|
|
404
|
+
? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length)
|
|
405
|
+
: text;
|
|
341
406
|
|
|
342
407
|
// Philosophy paragraphs: everything that isn't a rule header or key-char block
|
|
343
|
-
const paragraphs = collectParagraphs(
|
|
408
|
+
const paragraphs = collectParagraphs(prose.split('\n')).filter(
|
|
344
409
|
(p) =>
|
|
345
410
|
!p.startsWith('**Creative North Star') &&
|
|
346
411
|
!p.startsWith('**Key Characteristics')
|
|
@@ -602,11 +667,19 @@ function parseTypeBullet(bullet) {
|
|
|
602
667
|
};
|
|
603
668
|
}
|
|
604
669
|
|
|
605
|
-
function
|
|
670
|
+
function extractGuidance(section) {
|
|
606
671
|
if (!section) return null;
|
|
607
672
|
const subs = splitSubsections(section.lines);
|
|
673
|
+
return {
|
|
674
|
+
subtitle: section.subtitle,
|
|
675
|
+
description: collectParagraphs(subs[0].lines).join(' ') || null,
|
|
676
|
+
rules: extractNamedRules(section.lines),
|
|
677
|
+
};
|
|
678
|
+
}
|
|
608
679
|
|
|
609
|
-
|
|
680
|
+
function extractElevation(section) {
|
|
681
|
+
const guidance = extractGuidance(section);
|
|
682
|
+
if (!guidance) return null;
|
|
610
683
|
|
|
611
684
|
const shadows = [];
|
|
612
685
|
const seen = new Set();
|
|
@@ -631,12 +704,7 @@ function extractElevation(section) {
|
|
|
631
704
|
for (const inline of extractInlineShadows(b)) dedupe(inline);
|
|
632
705
|
}
|
|
633
706
|
|
|
634
|
-
return {
|
|
635
|
-
subtitle: section.subtitle,
|
|
636
|
-
description,
|
|
637
|
-
shadows,
|
|
638
|
-
rules: extractNamedRules(section.lines),
|
|
639
|
-
};
|
|
707
|
+
return { ...guidance, shadows };
|
|
640
708
|
}
|
|
641
709
|
|
|
642
710
|
function extractInlineShadows(text) {
|
|
@@ -768,6 +836,15 @@ function extractDosDonts(section) {
|
|
|
768
836
|
|
|
769
837
|
// ---------- Coverage assessment ----------
|
|
770
838
|
|
|
839
|
+
// Sections whose model is description-plus-rules only (see extractGuidance).
|
|
840
|
+
const guidanceCoverage = (guidance) =>
|
|
841
|
+
guidance
|
|
842
|
+
? {
|
|
843
|
+
description: Boolean(guidance.description),
|
|
844
|
+
rules: guidance.rules.length,
|
|
845
|
+
}
|
|
846
|
+
: 'missing';
|
|
847
|
+
|
|
771
848
|
function assessCoverage(model) {
|
|
772
849
|
const report = {};
|
|
773
850
|
|
|
@@ -796,6 +873,8 @@ function assessCoverage(model) {
|
|
|
796
873
|
}
|
|
797
874
|
: 'missing';
|
|
798
875
|
|
|
876
|
+
report.layout = guidanceCoverage(model.layout);
|
|
877
|
+
|
|
799
878
|
report.elevation = model.elevation
|
|
800
879
|
? {
|
|
801
880
|
shadows: model.elevation.shadows.length,
|
|
@@ -804,6 +883,8 @@ function assessCoverage(model) {
|
|
|
804
883
|
}
|
|
805
884
|
: 'missing';
|
|
806
885
|
|
|
886
|
+
report.shapes = guidanceCoverage(model.shapes);
|
|
887
|
+
|
|
807
888
|
report.components = model.components
|
|
808
889
|
? {
|
|
809
890
|
count: model.components.components.length,
|
|
@@ -833,7 +914,9 @@ export function parseDesignMd(md) {
|
|
|
833
914
|
overview: extractOverview(sections['Overview']),
|
|
834
915
|
colors: extractColors(sections['Colors']),
|
|
835
916
|
typography: extractTypography(sections['Typography']),
|
|
917
|
+
layout: extractGuidance(sections['Layout']),
|
|
836
918
|
elevation: extractElevation(sections['Elevation']),
|
|
919
|
+
shapes: extractGuidance(sections['Shapes']),
|
|
837
920
|
components: extractComponents(sections['Components']),
|
|
838
921
|
dosDonts: extractDosDonts(sections["Do's and Don'ts"]),
|
|
839
922
|
};
|
|
@@ -206,10 +206,10 @@ function parseIgnoreColor(value) {
|
|
|
206
206
|
if (rgb) {
|
|
207
207
|
const parts = splitColorArgs(rgb[1]);
|
|
208
208
|
if (parts.length < 3 || parts.length > 4) return null;
|
|
209
|
-
const r =
|
|
210
|
-
const g =
|
|
211
|
-
const b =
|
|
212
|
-
const a = parts[3] === undefined ? 1 :
|
|
209
|
+
const r = parseColorChannel(parts[0], COLOR_CHANNEL_FORMATS.rgb);
|
|
210
|
+
const g = parseColorChannel(parts[1], COLOR_CHANNEL_FORMATS.rgb);
|
|
211
|
+
const b = parseColorChannel(parts[2], COLOR_CHANNEL_FORMATS.rgb);
|
|
212
|
+
const a = parts[3] === undefined ? 1 : parseColorChannel(parts[3], COLOR_CHANNEL_FORMATS.alpha);
|
|
213
213
|
if ([r, g, b, a].some((v) => v === null)) return null;
|
|
214
214
|
return { r, g, b, a };
|
|
215
215
|
}
|
|
@@ -218,10 +218,10 @@ function parseIgnoreColor(value) {
|
|
|
218
218
|
if (hsl) {
|
|
219
219
|
const parts = splitColorArgs(hsl[1]);
|
|
220
220
|
if (parts.length < 3 || parts.length > 4) return null;
|
|
221
|
-
const h =
|
|
222
|
-
const s =
|
|
223
|
-
const l =
|
|
224
|
-
const a = parts[3] === undefined ? 1 :
|
|
221
|
+
const h = parseColorChannel(parts[0], COLOR_CHANNEL_FORMATS.hue);
|
|
222
|
+
const s = parseColorChannel(parts[1], COLOR_CHANNEL_FORMATS.percent);
|
|
223
|
+
const l = parseColorChannel(parts[2], COLOR_CHANNEL_FORMATS.percent);
|
|
224
|
+
const a = parts[3] === undefined ? 1 : parseColorChannel(parts[3], COLOR_CHANNEL_FORMATS.alpha);
|
|
225
225
|
if ([h, s, l, a].some((v) => v === null)) return null;
|
|
226
226
|
return hslToRgb(h, s, l, a);
|
|
227
227
|
}
|
|
@@ -230,18 +230,13 @@ function parseIgnoreColor(value) {
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
function parseHexIgnoreColor(hex) {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
const r = parseInt(hex.slice(0, 2), 16);
|
|
241
|
-
const g = parseInt(hex.slice(2, 4), 16);
|
|
242
|
-
const b = parseInt(hex.slice(4, 6), 16);
|
|
243
|
-
const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;
|
|
244
|
-
return { r, g, b, a };
|
|
233
|
+
const expanded = hex.length <= 4
|
|
234
|
+
? [...hex].map((digit) => digit.repeat(2)).join('')
|
|
235
|
+
: hex;
|
|
236
|
+
const [r, g, b, alpha = 255] = expanded
|
|
237
|
+
.match(/../g)
|
|
238
|
+
.map((channel) => Number.parseInt(channel, 16));
|
|
239
|
+
return { r, g, b, a: alpha / 255 };
|
|
245
240
|
}
|
|
246
241
|
|
|
247
242
|
function splitColorArgs(body) {
|
|
@@ -259,47 +254,34 @@ function splitColorArgs(body) {
|
|
|
259
254
|
return text.replace(/\s*\/\s*/g, ' / ').split(/\s+/).filter((part) => part && part !== '/');
|
|
260
255
|
}
|
|
261
256
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
257
|
+
const CSS_NUMBER_RE = /^(-?\d*\.?\d+)(%|deg|rad|turn|grad)?$/;
|
|
258
|
+
const identity = (value) => value;
|
|
259
|
+
const COLOR_CHANNEL_FORMATS = {
|
|
260
|
+
rgb: { units: { '': identity, '%': (value) => value * 2.55 }, min: 0, max: 255, round: true },
|
|
261
|
+
alpha: { units: { '': identity, '%': (value) => value / 100 }, min: 0, max: 1 },
|
|
262
|
+
hue: {
|
|
263
|
+
units: {
|
|
264
|
+
'': identity,
|
|
265
|
+
deg: identity,
|
|
266
|
+
rad: (value) => value * (180 / Math.PI),
|
|
267
|
+
turn: (value) => value * 360,
|
|
268
|
+
grad: (value) => value * 0.9,
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
percent: { units: { '%': (value) => value / 100 }, min: 0, max: 1 },
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
function parseColorChannel(raw, { units, min = -Infinity, max = Infinity, round = false }) {
|
|
274
275
|
const text = String(raw || '').trim();
|
|
275
|
-
const match = text.match(
|
|
276
|
+
const match = text.match(CSS_NUMBER_RE);
|
|
276
277
|
if (!match) return null;
|
|
277
|
-
const
|
|
278
|
-
if (!
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
const text = String(raw || '').trim();
|
|
285
|
-
const match = text.match(/^(-?\d*\.?\d+)(deg|rad|turn|grad)?$/);
|
|
286
|
-
if (!match) return null;
|
|
287
|
-
const value = Number.parseFloat(match[1]);
|
|
288
|
-
if (!Number.isFinite(value)) return null;
|
|
289
|
-
const unit = match[2] || 'deg';
|
|
290
|
-
if (unit === 'turn') return value * 360;
|
|
291
|
-
if (unit === 'rad') return value * (180 / Math.PI);
|
|
292
|
-
if (unit === 'grad') return value * 0.9;
|
|
293
|
-
return value;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function parsePercentChannel(raw) {
|
|
297
|
-
const text = String(raw || '').trim();
|
|
298
|
-
const match = text.match(/^(-?\d*\.?\d+)%$/);
|
|
299
|
-
if (!match) return null;
|
|
300
|
-
const value = Number.parseFloat(match[1]);
|
|
301
|
-
if (!Number.isFinite(value)) return null;
|
|
302
|
-
return value >= 0 && value <= 100 ? value / 100 : null;
|
|
278
|
+
const convert = units[match[2] || ''];
|
|
279
|
+
if (!convert) return null;
|
|
280
|
+
const number = Number.parseFloat(match[1]);
|
|
281
|
+
if (!Number.isFinite(number)) return null;
|
|
282
|
+
const value = convert(number);
|
|
283
|
+
if (value < min || value > max) return null;
|
|
284
|
+
return round ? Math.round(value) : value;
|
|
303
285
|
}
|
|
304
286
|
|
|
305
287
|
function hslToRgb(hue, saturation, lightness, alpha) {
|
|
@@ -529,6 +511,9 @@ function extractFindingIgnoreValueRaw(finding, rule = normalizeIgnoreRule(findin
|
|
|
529
511
|
const primary = text.match(/Primary font:\s*([^()\n;]+)/i);
|
|
530
512
|
if (primary) return cleanIgnoreValueDisplay(primary[1]);
|
|
531
513
|
|
|
514
|
+
const googleLabel = text.match(/Google Fonts:\s*([^()\n;]+)/i);
|
|
515
|
+
if (googleLabel) return cleanIgnoreValueDisplay(googleLabel[1]);
|
|
516
|
+
|
|
532
517
|
const family = text.match(/font-family\s*:\s*["']?([^'",;\n]+)/i);
|
|
533
518
|
if (family) return cleanIgnoreValueDisplay(family[1]);
|
|
534
519
|
|
|
@@ -41,6 +41,9 @@ export function isGeneratedFile(filePath, options = {}) {
|
|
|
41
41
|
|
|
42
42
|
function isGitIgnored(absPath, cwd) {
|
|
43
43
|
try {
|
|
44
|
+
// argv form, never a shell: this runs on every file the live-mode source
|
|
45
|
+
// walk reaches, so a hostile filename embedding $(...) or backticks must
|
|
46
|
+
// not be interpretable (issue #476). JSON.stringify is not shell quoting.
|
|
44
47
|
execFileSync('git', ['check-ignore', '--quiet', '--', absPath], {
|
|
45
48
|
cwd,
|
|
46
49
|
stdio: 'ignore',
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
|
|
4
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]/u;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Validate the URL before handing it to an operating-system browser opener.
|
|
8
|
+
* The opener is only used for local question/review pages; accepting a remote
|
|
9
|
+
* URL here would turn a convenience helper into an outbound navigation sink.
|
|
10
|
+
*/
|
|
11
|
+
export function validateBrowserUrl(value) {
|
|
12
|
+
if (typeof value !== 'string' || value.length === 0 || CONTROL_CHARACTERS.test(value)) return null;
|
|
13
|
+
let parsed;
|
|
14
|
+
try {
|
|
15
|
+
parsed = new URL(value);
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;
|
|
20
|
+
if (parsed.username || parsed.password) return null;
|
|
21
|
+
if (!LOOPBACK_HOSTS.has(parsed.hostname.toLowerCase())) return null;
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function browserOpenCommand(url, { platform = process.platform } = {}) {
|
|
26
|
+
if (!validateBrowserUrl(url)) return null;
|
|
27
|
+
if (platform === 'darwin') return { command: 'open', args: [url] };
|
|
28
|
+
// `start` is a cmd.exe built-in and would expose the URL to shell parsing.
|
|
29
|
+
// Explorer accepts a URL as an argv value and is a fixed non-shell target.
|
|
30
|
+
if (platform === 'win32') return { command: 'explorer.exe', args: [url] };
|
|
31
|
+
return { command: 'xdg-open', args: [url] };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Open a validated loopback URL with a fixed executable and argv. Synchronous
|
|
36
|
+
* spawn failures return false; asynchronous child failures are consumed so a
|
|
37
|
+
* browser that is unavailable cannot crash the serving question process.
|
|
38
|
+
*/
|
|
39
|
+
export function openSystemBrowser(url, {
|
|
40
|
+
platform = process.platform,
|
|
41
|
+
spawnImpl = spawn,
|
|
42
|
+
} = {}) {
|
|
43
|
+
const command = browserOpenCommand(url, { platform });
|
|
44
|
+
if (!command) return false;
|
|
45
|
+
try {
|
|
46
|
+
const child = spawnImpl(command.command, command.args, {
|
|
47
|
+
stdio: 'ignore',
|
|
48
|
+
detached: true,
|
|
49
|
+
shell: false,
|
|
50
|
+
});
|
|
51
|
+
child.once('error', () => {});
|
|
52
|
+
if (typeof child.unref === 'function') child.unref();
|
|
53
|
+
return true;
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|