@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
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, cycle-safe, accessor-safe handling for durable `ctx.tool` payloads.
|
|
3
|
+
*
|
|
4
|
+
* Tool args and results are author-supplied values that reach two long-lived
|
|
5
|
+
* surfaces: the memoized graph projection and the read-only detail view. A
|
|
6
|
+
* payload that is cyclic, carries a throwing `toJSON`, or exposes a throwing
|
|
7
|
+
* getter must not crash either surface, and neither surface may retain or walk
|
|
8
|
+
* more than the inspection cap. `structuredClone` and `JSON.stringify` fail
|
|
9
|
+
* all three requirements — they throw on hostile input and their cost is set
|
|
10
|
+
* by the payload rather than by the cap — so both paths go through this module.
|
|
11
|
+
*
|
|
12
|
+
* Key discovery has one runtime limitation that callers cannot remove:
|
|
13
|
+
* `Reflect.ownKeys` invokes the proxy's `[[OwnPropertyKeys]]` trap and the
|
|
14
|
+
* engine may materialize that trap's complete key list before this module can
|
|
15
|
+
* inspect it. We call that trap once, then bound all controlled per-key work:
|
|
16
|
+
* at most `TOOL_PAYLOAD_MAX_KEYS` candidate keys have descriptors read, and
|
|
17
|
+
* only those candidates that pass the enumerable-string check have values
|
|
18
|
+
* read. The budget is charged before filtering, deliberately including symbol
|
|
19
|
+
* and non-enumerable candidates, so hostile key lists cannot make filtering
|
|
20
|
+
* work unbounded. This preserves own enumerable string-key order while making
|
|
21
|
+
* descriptor and value work independent of the remaining payload width.
|
|
22
|
+
*
|
|
23
|
+
* Every bound here is explicit in the output: truncation appends
|
|
24
|
+
* `TOOL_PAYLOAD_TRUNCATION_MARKER`, a back-reference becomes
|
|
25
|
+
* `TOOL_PAYLOAD_CYCLE_PLACEHOLDER`, and a property that cannot be read becomes
|
|
26
|
+
* `TOOL_PAYLOAD_UNREADABLE_PLACEHOLDER`. Nothing is silently dropped.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { flattenTruncatedString } from "./flat-string.js";
|
|
30
|
+
import type { WorkflowSerializableValue } from "./types.js";
|
|
31
|
+
|
|
32
|
+
/** A callable value supplied by an untrusted payload boundary. */
|
|
33
|
+
export type ToolPayloadCallable = (this: ToolPayloadValue, ...args: never[]) => ToolPayloadValue;
|
|
34
|
+
|
|
35
|
+
/** An index-signature object supplied by an untrusted payload boundary. */
|
|
36
|
+
export interface ToolPayloadObject {
|
|
37
|
+
readonly [key: string]: ToolPayloadValue | undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** An array whose elements may be hostile values. */
|
|
41
|
+
export type ToolPayloadArray = readonly ToolPayloadValue[];
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Runtime values that can cross an inspection boundary before validation.
|
|
45
|
+
*
|
|
46
|
+
* WorkflowSerializableValue is the normal authoring contract. The additional
|
|
47
|
+
* members describe values that hostile callbacks and JavaScript callers can
|
|
48
|
+
* still hand to an inspection surface: omitted values, symbols, bigint,
|
|
49
|
+
* functions, arrays, and index-signature objects.
|
|
50
|
+
*/
|
|
51
|
+
export type ToolPayloadValue =
|
|
52
|
+
| string
|
|
53
|
+
| number
|
|
54
|
+
| boolean
|
|
55
|
+
| null
|
|
56
|
+
| undefined
|
|
57
|
+
| bigint
|
|
58
|
+
| symbol
|
|
59
|
+
| ToolPayloadCallable
|
|
60
|
+
| ToolPayloadArray
|
|
61
|
+
| ToolPayloadObject;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Values produced by bounded retention after omitted members are removed.
|
|
65
|
+
*
|
|
66
|
+
* BigInt is preserved here because the inspection copy mirrors structuredClone
|
|
67
|
+
* for unusual JavaScript values; ordinary typed workflow callers select the
|
|
68
|
+
* narrower WorkflowSerializableValue overload below.
|
|
69
|
+
*/
|
|
70
|
+
export type ToolPayloadRetainedValue =
|
|
71
|
+
| string
|
|
72
|
+
| number
|
|
73
|
+
| boolean
|
|
74
|
+
| null
|
|
75
|
+
| bigint
|
|
76
|
+
| readonly ToolPayloadRetainedValue[]
|
|
77
|
+
| { readonly [key: string]: ToolPayloadRetainedValue | undefined };
|
|
78
|
+
/** Maximum candidate keys whose descriptors may be inspected per payload walk. */
|
|
79
|
+
/** This is one total-work budget across the recursive walk; a wide member may consume sibling budget. */
|
|
80
|
+
export const TOOL_PAYLOAD_MAX_KEYS = 2_048;
|
|
81
|
+
|
|
82
|
+
/** Maximum serialized payload characters retained or displayed per field. */
|
|
83
|
+
export const TOOL_PAYLOAD_VALUE_LIMIT = 16_384;
|
|
84
|
+
export const TOOL_PAYLOAD_TRUNCATION_MARKER = "… [truncated]";
|
|
85
|
+
export const TOOL_PAYLOAD_CYCLE_PLACEHOLDER = "<cycle>";
|
|
86
|
+
export const TOOL_PAYLOAD_UNREADABLE_PLACEHOLDER = "<unreadable>";
|
|
87
|
+
export const TOOL_PAYLOAD_UNSERIALIZABLE_PLACEHOLDER = "<unserializable>";
|
|
88
|
+
/** Key carrying the marker when an object is cut short by the cap. */
|
|
89
|
+
export const TOOL_PAYLOAD_TRUNCATION_KEY = "…";
|
|
90
|
+
/**
|
|
91
|
+
* Nesting bound. Both walkers recurse, so a pathological payload would
|
|
92
|
+
* otherwise exhaust the stack before the character cap could stop it.
|
|
93
|
+
*/
|
|
94
|
+
export const TOOL_PAYLOAD_MAX_DEPTH = 256;
|
|
95
|
+
|
|
96
|
+
/** Values JSON omits from objects entirely. */
|
|
97
|
+
function isOmittedJsonValue(value: ToolPayloadValue | undefined): boolean {
|
|
98
|
+
return value === undefined || typeof value === "function" || typeof value === "symbol";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Narrow an untrusted value to an object with ordinary own properties. */
|
|
102
|
+
export function isToolPayloadObject(value: ToolPayloadValue): value is ToolPayloadObject {
|
|
103
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Narrow an untrusted value to an array-like object. */
|
|
107
|
+
export function isToolPayloadArray(value: ToolPayloadValue): value is ToolPayloadArray {
|
|
108
|
+
return Array.isArray(value);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Narrow an untrusted value to any object-like payload, including arrays. */
|
|
112
|
+
export function isToolPayloadObjectLike(value: ToolPayloadValue): value is ToolPayloadObject | ToolPayloadArray {
|
|
113
|
+
return value !== null && typeof value === "object";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Narrow a payload member to a callable value without invoking it. */
|
|
117
|
+
export function isToolPayloadCallable(value: ToolPayloadValue | undefined): value is ToolPayloadCallable {
|
|
118
|
+
return typeof value === "function";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
interface PropertyRead {
|
|
122
|
+
readonly ok: true;
|
|
123
|
+
readonly value: ToolPayloadValue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
interface PropertyReadFailure {
|
|
127
|
+
readonly ok: false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function readToolPayloadProperty(
|
|
131
|
+
value: ToolPayloadObject | ToolPayloadArray,
|
|
132
|
+
key: PropertyKey,
|
|
133
|
+
): PropertyRead | PropertyReadFailure {
|
|
134
|
+
try {
|
|
135
|
+
const property: ToolPayloadValue = Reflect.get(value, key);
|
|
136
|
+
return { ok: true, value: property };
|
|
137
|
+
} catch {
|
|
138
|
+
return { ok: false };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function safeProperty(value: ToolPayloadObject | ToolPayloadArray, key: PropertyKey): ToolPayloadValue {
|
|
143
|
+
const result = readToolPayloadProperty(value, key);
|
|
144
|
+
return result.ok ? result.value : TOOL_PAYLOAD_UNREADABLE_PLACEHOLDER;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Lazily expose own enumerable string keys without paying Object.keys' eager
|
|
149
|
+
* descriptor pass. The engine may still materialize the complete ownKeys list;
|
|
150
|
+
* `consumeKey` bounds every descriptor/value operation under our control.
|
|
151
|
+
*/
|
|
152
|
+
interface SafeOwnKeyScan {
|
|
153
|
+
readonly keys: Iterable<string>;
|
|
154
|
+
readonly stoppedByLimit: () => boolean;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function safeOwnKeys(value: ToolPayloadObject | ToolPayloadArray, consumeKey: () => boolean): SafeOwnKeyScan {
|
|
158
|
+
let stopped = false;
|
|
159
|
+
function* enumerate(): Generator<string> {
|
|
160
|
+
let keys: readonly PropertyKey[];
|
|
161
|
+
try {
|
|
162
|
+
keys = Reflect.ownKeys(value);
|
|
163
|
+
} catch {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
for (const key of keys) {
|
|
167
|
+
if (!consumeKey()) {
|
|
168
|
+
stopped = true;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (typeof key !== "string") continue;
|
|
172
|
+
let descriptor: PropertyDescriptor | undefined;
|
|
173
|
+
try {
|
|
174
|
+
descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
175
|
+
} catch {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (descriptor?.enumerable === true) yield key;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { keys: enumerate(), stoppedByLimit: () => stopped };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function safeArrayLength(value: ToolPayloadArray): number {
|
|
185
|
+
const result = readToolPayloadProperty(value, "length");
|
|
186
|
+
if (!result.ok || typeof result.value !== "number") return 0;
|
|
187
|
+
return Number.isSafeInteger(result.value) && result.value > 0 ? result.value : 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Apply `toJSON` the way `JSON.stringify` would, containing a throwing accessor
|
|
192
|
+
* or a throwing conversion instead of letting it escape.
|
|
193
|
+
*/
|
|
194
|
+
function resolveJsonValue(value: ToolPayloadValue): ToolPayloadValue {
|
|
195
|
+
if (!isToolPayloadObjectLike(value)) return value;
|
|
196
|
+
const toJson = readToolPayloadProperty(value, "toJSON");
|
|
197
|
+
if (!toJson.ok) return TOOL_PAYLOAD_UNREADABLE_PLACEHOLDER;
|
|
198
|
+
if (!isToolPayloadCallable(toJson.value)) return value;
|
|
199
|
+
try {
|
|
200
|
+
return toJson.value.call(value);
|
|
201
|
+
} catch {
|
|
202
|
+
return TOOL_PAYLOAD_UNSERIALIZABLE_PLACEHOLDER;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Bounded retention
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Serialized cost charged per value kind.
|
|
212
|
+
*
|
|
213
|
+
* Every branch of the walker must charge something. A branch that returns
|
|
214
|
+
* without charging makes the cap unreachable for payloads built out of that
|
|
215
|
+
* kind alone — a million nulls, holes, or omitted entries are all ordinary
|
|
216
|
+
* `ctx.tool` results, and they are retained in the memoized projection and
|
|
217
|
+
* written into durable checkpoints.
|
|
218
|
+
*/
|
|
219
|
+
const NULL_COST = 4; // "null"
|
|
220
|
+
const NUMBER_COST = 8;
|
|
221
|
+
const BOOLEAN_COST = 5; // "false"
|
|
222
|
+
const CONTAINER_COST = 2; // "{}" or "[]"
|
|
223
|
+
const SEPARATOR_COST = 1; // "," between elements
|
|
224
|
+
|
|
225
|
+
interface CloneState {
|
|
226
|
+
remaining: number;
|
|
227
|
+
depth: number;
|
|
228
|
+
keysRemaining: number;
|
|
229
|
+
readonly seen: Set<object>;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function consumeKeyBudget(state: { keysRemaining: number }): boolean {
|
|
233
|
+
if (state.keysRemaining <= 0) return false;
|
|
234
|
+
state.keysRemaining -= 1;
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function addTruncationMarker(record: { [key: string]: ToolPayloadRetainedValue }): void {
|
|
239
|
+
let key = TOOL_PAYLOAD_TRUNCATION_KEY;
|
|
240
|
+
let suffix = 1;
|
|
241
|
+
while (Object.hasOwn(record, key)) key = `${TOOL_PAYLOAD_TRUNCATION_KEY}${suffix++}`;
|
|
242
|
+
record[key] = TOOL_PAYLOAD_TRUNCATION_MARKER;
|
|
243
|
+
}
|
|
244
|
+
function cloneObjectLike(state: CloneState, value: ToolPayloadObject | ToolPayloadArray): ToolPayloadRetainedValue {
|
|
245
|
+
if (state.seen.has(value)) return TOOL_PAYLOAD_CYCLE_PLACEHOLDER;
|
|
246
|
+
if (state.depth >= TOOL_PAYLOAD_MAX_DEPTH) return TOOL_PAYLOAD_TRUNCATION_MARKER;
|
|
247
|
+
state.seen.add(value);
|
|
248
|
+
state.depth += 1;
|
|
249
|
+
// Charge the container itself so deep, empty nesting still reaches the cap.
|
|
250
|
+
state.remaining -= CONTAINER_COST;
|
|
251
|
+
try {
|
|
252
|
+
if (isToolPayloadArray(value)) {
|
|
253
|
+
const items: ToolPayloadRetainedValue[] = [];
|
|
254
|
+
const length = safeArrayLength(value);
|
|
255
|
+
for (let index = 0; index < length; index++) {
|
|
256
|
+
if (state.remaining <= 0) {
|
|
257
|
+
items.push(TOOL_PAYLOAD_TRUNCATION_MARKER);
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
state.remaining -= SEPARATOR_COST;
|
|
261
|
+
const item = safeProperty(value, index);
|
|
262
|
+
// A hole, `undefined`, a function, or a symbol serializes as `null`
|
|
263
|
+
// and is charged as one: an array of them is not free to retain.
|
|
264
|
+
if (isOmittedJsonValue(item)) {
|
|
265
|
+
state.remaining -= NULL_COST;
|
|
266
|
+
items.push(null);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
items.push(cloneValue(state, item));
|
|
270
|
+
}
|
|
271
|
+
return items;
|
|
272
|
+
}
|
|
273
|
+
const cloned: { [key: string]: ToolPayloadRetainedValue } = {};
|
|
274
|
+
const scan = safeOwnKeys(value, () => state.remaining > 0 && consumeKeyBudget(state));
|
|
275
|
+
for (const key of scan.keys) {
|
|
276
|
+
// Charged before the omission check for the same reason: inspecting a
|
|
277
|
+
// key costs work whether or not JSON would emit it.
|
|
278
|
+
state.remaining -= key.length + SEPARATOR_COST;
|
|
279
|
+
const child = safeProperty(value, key);
|
|
280
|
+
if (isOmittedJsonValue(child)) continue;
|
|
281
|
+
cloned[key] = cloneValue(state, child);
|
|
282
|
+
}
|
|
283
|
+
if (scan.stoppedByLimit()) addTruncationMarker(cloned);
|
|
284
|
+
return cloned;
|
|
285
|
+
} finally {
|
|
286
|
+
state.depth -= 1;
|
|
287
|
+
state.seen.delete(value);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function cloneValue(state: CloneState, value: ToolPayloadValue): ToolPayloadRetainedValue {
|
|
292
|
+
const resolved = resolveJsonValue(value);
|
|
293
|
+
if (resolved === null) {
|
|
294
|
+
state.remaining -= NULL_COST;
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
switch (typeof resolved) {
|
|
298
|
+
case "string":
|
|
299
|
+
return cloneString(state, resolved);
|
|
300
|
+
case "number":
|
|
301
|
+
state.remaining -= NUMBER_COST;
|
|
302
|
+
return Number.isFinite(resolved) ? resolved : null;
|
|
303
|
+
case "boolean":
|
|
304
|
+
state.remaining -= BOOLEAN_COST;
|
|
305
|
+
return resolved;
|
|
306
|
+
case "object":
|
|
307
|
+
return cloneObjectLike(state, resolved);
|
|
308
|
+
case "bigint":
|
|
309
|
+
// BigInt is retained in the inspection copy like structuredClone.
|
|
310
|
+
state.remaining -= NUMBER_COST;
|
|
311
|
+
return resolved;
|
|
312
|
+
default:
|
|
313
|
+
state.remaining -= TOOL_PAYLOAD_UNSERIALIZABLE_PLACEHOLDER.length;
|
|
314
|
+
return TOOL_PAYLOAD_UNSERIALIZABLE_PLACEHOLDER;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Detach a tool payload for the memoized graph projection.
|
|
320
|
+
*
|
|
321
|
+
* Cycles, throwing accessors, and throwing `toJSON` implementations are
|
|
322
|
+
* contained; retention is bounded by `limit` and the controlled key budget.
|
|
323
|
+
*/
|
|
324
|
+
export function boundedToolPayload(value: WorkflowSerializableValue, limit?: number): WorkflowSerializableValue;
|
|
325
|
+
export function boundedToolPayload(value: ToolPayloadValue, limit?: number): ToolPayloadRetainedValue;
|
|
326
|
+
export function boundedToolPayload(
|
|
327
|
+
value: ToolPayloadValue,
|
|
328
|
+
limit = TOOL_PAYLOAD_VALUE_LIMIT,
|
|
329
|
+
): ToolPayloadRetainedValue {
|
|
330
|
+
return cloneValue(
|
|
331
|
+
{ remaining: Math.max(1, limit), depth: 0, keysRemaining: TOOL_PAYLOAD_MAX_KEYS, seen: new Set<object>() },
|
|
332
|
+
value,
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Detach a tool argument record, always returning a plain object.
|
|
338
|
+
*
|
|
339
|
+
* The record boundary stays object-shaped even when a hostile top-level value
|
|
340
|
+
* is supplied. One character budget and one controlled key budget are shared
|
|
341
|
+
* across all emitted keys.
|
|
342
|
+
*/
|
|
343
|
+
export function boundedToolPayloadRecord(
|
|
344
|
+
value: Readonly<Record<string, WorkflowSerializableValue>>,
|
|
345
|
+
limit?: number,
|
|
346
|
+
): Readonly<Record<string, WorkflowSerializableValue>>;
|
|
347
|
+
export function boundedToolPayloadRecord(
|
|
348
|
+
value: ToolPayloadValue,
|
|
349
|
+
limit?: number,
|
|
350
|
+
): Readonly<Record<string, ToolPayloadRetainedValue>>;
|
|
351
|
+
export function boundedToolPayloadRecord(
|
|
352
|
+
value: ToolPayloadValue,
|
|
353
|
+
limit = TOOL_PAYLOAD_VALUE_LIMIT,
|
|
354
|
+
): Readonly<Record<string, ToolPayloadRetainedValue>> {
|
|
355
|
+
const record: { [key: string]: ToolPayloadRetainedValue } = {};
|
|
356
|
+
if (!isToolPayloadObject(value) && !isToolPayloadArray(value)) return record;
|
|
357
|
+
const state: CloneState = {
|
|
358
|
+
remaining: Math.max(1, limit),
|
|
359
|
+
depth: 0,
|
|
360
|
+
keysRemaining: TOOL_PAYLOAD_MAX_KEYS,
|
|
361
|
+
seen: new Set<object>([value]),
|
|
362
|
+
};
|
|
363
|
+
const scan = safeOwnKeys(value, () => state.remaining > 0 && consumeKeyBudget(state));
|
|
364
|
+
for (const key of scan.keys) {
|
|
365
|
+
state.remaining -= key.length + SEPARATOR_COST;
|
|
366
|
+
const child = safeProperty(value, key);
|
|
367
|
+
if (isOmittedJsonValue(child)) continue;
|
|
368
|
+
record[key] = cloneValue(state, child);
|
|
369
|
+
}
|
|
370
|
+
if (scan.stoppedByLimit()) addTruncationMarker(record);
|
|
371
|
+
return record;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function cloneString(state: CloneState, value: string): string {
|
|
375
|
+
if (state.remaining <= 0) return TOOL_PAYLOAD_TRUNCATION_MARKER;
|
|
376
|
+
if (value.length <= state.remaining) {
|
|
377
|
+
state.remaining -= value.length;
|
|
378
|
+
return value;
|
|
379
|
+
}
|
|
380
|
+
const keep = state.remaining;
|
|
381
|
+
state.remaining = 0;
|
|
382
|
+
// Flattened: this projection is memoized, so a SlicedString here would keep
|
|
383
|
+
// the whole original payload alive behind a bounded-looking value.
|
|
384
|
+
return `${flattenTruncatedString(value.slice(0, keep))}${TOOL_PAYLOAD_TRUNCATION_MARKER}`;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ---------------------------------------------------------------------------
|
|
388
|
+
// Bounded serialization
|
|
389
|
+
// ---------------------------------------------------------------------------
|
|
390
|
+
|
|
391
|
+
interface SerializeState {
|
|
392
|
+
readonly limit: number;
|
|
393
|
+
readonly parts: string[];
|
|
394
|
+
length: number;
|
|
395
|
+
depth: number;
|
|
396
|
+
keysRemaining: number;
|
|
397
|
+
truncated: boolean;
|
|
398
|
+
readonly seen: Set<object>;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/** Append `chunk`; returns false once the cap is reached so callers stop early. */
|
|
402
|
+
function writeChunk(state: SerializeState, chunk: string): boolean {
|
|
403
|
+
const remaining = state.limit - state.length;
|
|
404
|
+
if (remaining <= 0) {
|
|
405
|
+
state.truncated = true;
|
|
406
|
+
return false;
|
|
407
|
+
}
|
|
408
|
+
if (chunk.length > remaining) {
|
|
409
|
+
state.parts.push(chunk.slice(0, remaining));
|
|
410
|
+
state.length = state.limit;
|
|
411
|
+
state.truncated = true;
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
state.parts.push(chunk);
|
|
415
|
+
state.length += chunk.length;
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function writeString(state: SerializeState, value: string): boolean {
|
|
420
|
+
const remaining = state.limit - state.length;
|
|
421
|
+
if (remaining <= 0) {
|
|
422
|
+
state.truncated = true;
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
// Quote only what can still fit, so a multi-megabyte string costs the cap
|
|
426
|
+
// rather than its own length.
|
|
427
|
+
if (value.length > remaining) {
|
|
428
|
+
state.truncated = true;
|
|
429
|
+
writeChunk(state, JSON.stringify(value.slice(0, remaining)));
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
return writeChunk(state, JSON.stringify(value));
|
|
433
|
+
}
|
|
434
|
+
function writeObjectLike(state: SerializeState, value: ToolPayloadObject | ToolPayloadArray): boolean {
|
|
435
|
+
if (state.seen.has(value)) return writeChunk(state, JSON.stringify(TOOL_PAYLOAD_CYCLE_PLACEHOLDER));
|
|
436
|
+
if (state.depth >= TOOL_PAYLOAD_MAX_DEPTH) {
|
|
437
|
+
state.truncated = true;
|
|
438
|
+
return writeChunk(state, JSON.stringify(TOOL_PAYLOAD_TRUNCATION_MARKER));
|
|
439
|
+
}
|
|
440
|
+
state.seen.add(value);
|
|
441
|
+
state.depth += 1;
|
|
442
|
+
try {
|
|
443
|
+
if (isToolPayloadArray(value)) {
|
|
444
|
+
if (!writeChunk(state, "[")) return false;
|
|
445
|
+
const length = safeArrayLength(value);
|
|
446
|
+
for (let index = 0; index < length; index++) {
|
|
447
|
+
if (index > 0 && !writeChunk(state, ",")) return false;
|
|
448
|
+
const item = safeProperty(value, index);
|
|
449
|
+
if (!writeValue(state, isOmittedJsonValue(item) ? null : item)) return false;
|
|
450
|
+
}
|
|
451
|
+
return writeChunk(state, "]");
|
|
452
|
+
}
|
|
453
|
+
if (!writeChunk(state, "{")) return false;
|
|
454
|
+
let first = true;
|
|
455
|
+
const scan = safeOwnKeys(value, () => state.length < state.limit && consumeKeyBudget(state));
|
|
456
|
+
for (const key of scan.keys) {
|
|
457
|
+
const child = safeProperty(value, key);
|
|
458
|
+
if (isOmittedJsonValue(child)) continue;
|
|
459
|
+
if (!first && !writeChunk(state, ",")) return false;
|
|
460
|
+
first = false;
|
|
461
|
+
if (!writeChunk(state, `${JSON.stringify(key)}:`)) return false;
|
|
462
|
+
if (!writeValue(state, child)) return false;
|
|
463
|
+
}
|
|
464
|
+
if (scan.stoppedByLimit()) {
|
|
465
|
+
state.truncated = true;
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
return writeChunk(state, "}");
|
|
469
|
+
} finally {
|
|
470
|
+
state.depth -= 1;
|
|
471
|
+
state.seen.delete(value);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function writeValue(state: SerializeState, value: ToolPayloadValue): boolean {
|
|
476
|
+
const resolved = resolveJsonValue(value);
|
|
477
|
+
if (resolved === null) return writeChunk(state, "null");
|
|
478
|
+
switch (typeof resolved) {
|
|
479
|
+
case "string":
|
|
480
|
+
return writeString(state, resolved);
|
|
481
|
+
case "number":
|
|
482
|
+
return writeChunk(state, Number.isFinite(resolved) ? String(resolved) : "null");
|
|
483
|
+
case "boolean":
|
|
484
|
+
return writeChunk(state, resolved ? "true" : "false");
|
|
485
|
+
case "object":
|
|
486
|
+
return writeObjectLike(state, resolved);
|
|
487
|
+
case "bigint":
|
|
488
|
+
return writeChunk(state, String(resolved));
|
|
489
|
+
default:
|
|
490
|
+
return writeChunk(state, "null");
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Serialize a tool payload for display with work bounded by `limit` rather than
|
|
496
|
+
* by the payload. Truncated output always carries the marker.
|
|
497
|
+
*/
|
|
498
|
+
export function boundedToolPayloadText(value: ToolPayloadValue, limit = TOOL_PAYLOAD_VALUE_LIMIT): string {
|
|
499
|
+
const cap = Math.max(TOOL_PAYLOAD_TRUNCATION_MARKER.length + 1, limit);
|
|
500
|
+
const state: SerializeState = {
|
|
501
|
+
limit: cap,
|
|
502
|
+
parts: [],
|
|
503
|
+
length: 0,
|
|
504
|
+
depth: 0,
|
|
505
|
+
keysRemaining: TOOL_PAYLOAD_MAX_KEYS,
|
|
506
|
+
truncated: false,
|
|
507
|
+
seen: new Set<object>(),
|
|
508
|
+
};
|
|
509
|
+
writeValue(state, value);
|
|
510
|
+
const text = state.parts.join("");
|
|
511
|
+
if (!state.truncated) return text;
|
|
512
|
+
const keep = Math.max(0, cap - TOOL_PAYLOAD_TRUNCATION_MARKER.length);
|
|
513
|
+
return `${text.slice(0, keep)}${TOOL_PAYLOAD_TRUNCATION_MARKER}`;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Bound already-textual inspection metadata, such as a captured callback
|
|
518
|
+
* source, with the same cap and marker.
|
|
519
|
+
*/
|
|
520
|
+
export function boundedToolText(value: string, limit = TOOL_PAYLOAD_VALUE_LIMIT): string {
|
|
521
|
+
const cap = Math.max(TOOL_PAYLOAD_TRUNCATION_MARKER.length + 1, limit);
|
|
522
|
+
if (value.length <= cap) return value;
|
|
523
|
+
const keep = Math.max(0, cap - TOOL_PAYLOAD_TRUNCATION_MARKER.length);
|
|
524
|
+
return `${flattenTruncatedString(value.slice(0, keep))}${TOOL_PAYLOAD_TRUNCATION_MARKER}`;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// ---------------------------------------------------------------------------
|
|
528
|
+
// Display-safe text
|
|
529
|
+
// ---------------------------------------------------------------------------
|
|
530
|
+
|
|
531
|
+
/** Columns one source tab expands to. Spaces are emitted, so this is exact. */
|
|
532
|
+
export const TOOL_TEXT_TAB_WIDTH = 4;
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Make author-supplied text safe to paint inside a bordered box.
|
|
536
|
+
*
|
|
537
|
+
* Serialized fields are JSON-quoted, which escapes control bytes for free.
|
|
538
|
+
* Source text is deliberately *not* quoted — it stays readable as source — so
|
|
539
|
+
* it needs the same protection applied directly: tabs become spaces, because
|
|
540
|
+
* the width model counts a tab as one grapheme while a terminal advances to
|
|
541
|
+
* its own tab stop, and every other control byte becomes a printable `\xNN`
|
|
542
|
+
* so an embedded ESC cannot emit a live escape sequence into the frame.
|
|
543
|
+
*/
|
|
544
|
+
export function sanitizeToolDisplayText(value: string, tabWidth = TOOL_TEXT_TAB_WIDTH): string {
|
|
545
|
+
const stops = Math.max(1, Math.floor(tabWidth));
|
|
546
|
+
let out = "";
|
|
547
|
+
let column = 0;
|
|
548
|
+
for (const char of value) {
|
|
549
|
+
const code = char.codePointAt(0) ?? 0;
|
|
550
|
+
if (char === "\n") {
|
|
551
|
+
out += char;
|
|
552
|
+
column = 0;
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
if (char === "\t") {
|
|
556
|
+
const pad = stops - (column % stops);
|
|
557
|
+
out += " ".repeat(pad);
|
|
558
|
+
column += pad;
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
if (code < 0x20 || code === 0x7f || (code >= 0x80 && code <= 0x9f)) {
|
|
562
|
+
const escaped = `\\x${code.toString(16).padStart(2, "0")}`;
|
|
563
|
+
out += escaped;
|
|
564
|
+
column += escaped.length;
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
out += char;
|
|
568
|
+
column += 1;
|
|
569
|
+
}
|
|
570
|
+
return out;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/** Single-line variant for chrome such as a box title. */
|
|
574
|
+
export function sanitizeToolTitleText(value: string): string {
|
|
575
|
+
return sanitizeToolDisplayText(value).replace(/\n/g, " ");
|
|
576
|
+
}
|
|
@@ -47,6 +47,7 @@ export type WorkflowRunOutputResult<TOutputs extends WorkflowOutputSchemaMap, TA
|
|
|
47
47
|
export interface AuthoredWorkflowSpec<TInputs extends WorkflowInputSchemaMap = Record<never, never>, TOutputs extends WorkflowOutputSchemaMap = WorkflowOutputSchemaMap, TActualOutputs extends WorkflowOutputsFromSchemas<TOutputs> = WorkflowOutputsFromSchemas<TOutputs>, TRunContext = unknown> {
|
|
48
48
|
readonly name?: string;
|
|
49
49
|
readonly autoAttach?: boolean;
|
|
50
|
+
readonly heartbeatIntervalMinutes?: number;
|
|
50
51
|
readonly description: string;
|
|
51
52
|
readonly inputs?: TInputs;
|
|
52
53
|
readonly outputs: TOutputs;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Cadence used when a workflow definition omits `heartbeatIntervalMinutes`. */
|
|
2
|
+
export declare const DEFAULT_WORKFLOW_HEARTBEAT_INTERVAL_MINUTES = 15;
|
|
3
|
+
export declare const WORKFLOW_HEARTBEAT_CUSTOM_TYPE = "workflows:workflow-heartbeat";
|
|
4
|
+
/** Stable identity for one scheduled boundary of a workflow run. */
|
|
5
|
+
export interface WorkflowHeartbeatIdentity {
|
|
6
|
+
readonly runId: string;
|
|
7
|
+
/** Unix timestamp in milliseconds for the cadence boundary. */
|
|
8
|
+
readonly scheduledAt: number;
|
|
9
|
+
}
|
|
10
|
+
/** Deterministic context carried by a workflow heartbeat event. */
|
|
11
|
+
export interface WorkflowHeartbeatEventDetails extends WorkflowHeartbeatIdentity {
|
|
12
|
+
readonly workflowName: string;
|
|
13
|
+
/** Persisted workflow start timestamp in Unix milliseconds. */
|
|
14
|
+
readonly startedAt: number;
|
|
15
|
+
readonly intervalMinutes: number;
|
|
16
|
+
}
|
|
17
|
+
/** Slice-1 event envelope; scheduling and delivery are wired separately. */
|
|
18
|
+
export interface WorkflowHeartbeatEvent {
|
|
19
|
+
readonly customType: typeof WORKFLOW_HEARTBEAT_CUSTOM_TYPE;
|
|
20
|
+
readonly details: WorkflowHeartbeatEventDetails;
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Cadence used when a workflow definition omits `heartbeatIntervalMinutes`. */
|
|
2
|
+
export const DEFAULT_WORKFLOW_HEARTBEAT_INTERVAL_MINUTES = 15;
|
|
3
|
+
|
|
4
|
+
export const WORKFLOW_HEARTBEAT_CUSTOM_TYPE = "workflows:workflow-heartbeat";
|
|
5
|
+
|
|
6
|
+
/** Stable identity for one scheduled boundary of a workflow run. */
|
|
7
|
+
export interface WorkflowHeartbeatIdentity {
|
|
8
|
+
readonly runId: string;
|
|
9
|
+
/** Unix timestamp in milliseconds for the cadence boundary. */
|
|
10
|
+
readonly scheduledAt: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Deterministic context carried by a workflow heartbeat event. */
|
|
14
|
+
export interface WorkflowHeartbeatEventDetails extends WorkflowHeartbeatIdentity {
|
|
15
|
+
readonly workflowName: string;
|
|
16
|
+
/** Persisted workflow start timestamp in Unix milliseconds. */
|
|
17
|
+
readonly startedAt: number;
|
|
18
|
+
readonly intervalMinutes: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Slice-1 event envelope; scheduling and delivery are wired separately. */
|
|
22
|
+
export interface WorkflowHeartbeatEvent {
|
|
23
|
+
readonly customType: typeof WORKFLOW_HEARTBEAT_CUSTOM_TYPE;
|
|
24
|
+
readonly details: WorkflowHeartbeatEventDetails;
|
|
25
|
+
}
|
|
@@ -40,6 +40,8 @@ const MOCHA = {
|
|
|
40
40
|
export interface GenericTheme {
|
|
41
41
|
bg?: string;
|
|
42
42
|
backgroundPanel?: string;
|
|
43
|
+
backgroundToolSuccess?: string;
|
|
44
|
+
backgroundToolError?: string;
|
|
43
45
|
backgroundElement?: string;
|
|
44
46
|
surface?: string;
|
|
45
47
|
selection?: string;
|
|
@@ -70,6 +72,8 @@ export interface GraphTheme {
|
|
|
70
72
|
/** Strata, deepest first */
|
|
71
73
|
bg: string;
|
|
72
74
|
backgroundPanel: string;
|
|
75
|
+
backgroundToolSuccess: string;
|
|
76
|
+
backgroundToolError: string;
|
|
73
77
|
backgroundElement: string;
|
|
74
78
|
surface: string;
|
|
75
79
|
selection: string;
|
|
@@ -99,6 +103,8 @@ export function deriveGraphTheme(theme: GenericTheme = {}): GraphTheme {
|
|
|
99
103
|
return {
|
|
100
104
|
bg: theme.bg ?? MOCHA.base,
|
|
101
105
|
backgroundPanel: theme.backgroundPanel ?? MOCHA.surface0,
|
|
106
|
+
backgroundToolSuccess: theme.backgroundToolSuccess ?? theme.backgroundPanel ?? MOCHA.surface0,
|
|
107
|
+
backgroundToolError: theme.backgroundToolError ?? theme.backgroundPanel ?? MOCHA.surface0,
|
|
102
108
|
backgroundElement: theme.backgroundElement ?? MOCHA.surface0,
|
|
103
109
|
surface: theme.surface ?? MOCHA.crust,
|
|
104
110
|
selection: theme.selection ?? MOCHA.surface1,
|
|
@@ -245,9 +251,10 @@ export function deriveGraphThemeFromPiTheme(theme: unknown): GraphTheme {
|
|
|
245
251
|
const accent = fgHex(t, "accent");
|
|
246
252
|
const overrides: GenericTheme = {
|
|
247
253
|
backgroundPanel: bgHex(t, "toolPendingBg") ?? bgHex(t, "customMessageBg"),
|
|
254
|
+
backgroundToolSuccess: bgHex(t, "toolSuccessBg") ?? bgHex(t, "toolPendingBg") ?? bgHex(t, "customMessageBg"),
|
|
255
|
+
backgroundToolError: bgHex(t, "toolErrorBg") ?? bgHex(t, "toolPendingBg") ?? bgHex(t, "customMessageBg"),
|
|
248
256
|
backgroundElement: bgHex(t, "customMessageBg") ?? bgHex(t, "toolPendingBg"),
|
|
249
257
|
selection: bgHex(t, "selectedBg"),
|
|
250
|
-
|
|
251
258
|
border: fgHex(t, "border"),
|
|
252
259
|
borderDim: fgHex(t, "borderMuted"),
|
|
253
260
|
borderActive: fgHex(t, "borderAccent"),
|
|
@@ -10,6 +10,17 @@ export const COMPACT_HINT_KEYS: Array<{ key: string; label: string }> = [
|
|
|
10
10
|
{ key: "↵", label: "stage chat" },
|
|
11
11
|
];
|
|
12
12
|
|
|
13
|
+
/** Read-only `ctx.tool` detail: scrolling first, then the way back. */
|
|
14
|
+
export const TOOL_DETAIL_HINT_KEYS: Array<{ key: string; label: string }> = [
|
|
15
|
+
{ key: "ctrl+x", label: "return to graph" },
|
|
16
|
+
{ key: "↑↓ pgup/pgdn", label: "scroll" },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export const COMPACT_TOOL_DETAIL_HINT_KEYS: Array<{ key: string; label: string }> = [
|
|
20
|
+
{ key: "ctrl+x", label: "graph" },
|
|
21
|
+
{ key: "↑↓", label: "scroll" },
|
|
22
|
+
];
|
|
23
|
+
|
|
13
24
|
/**
|
|
14
25
|
* Bottom mode pill. The status bar mirrors the top header band: a
|
|
15
26
|
* three-row chrome strip with an outlined pill flush-left and hints
|