@bastani/atomic 0.8.21-0 → 0.8.22-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -9
- package/dist/builtin/intercom/broker/broker.ts +3 -3
- package/dist/builtin/intercom/config.ts +3 -3
- package/dist/builtin/intercom/index.ts +1 -1
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/ui/compose.ts +2 -2
- package/dist/builtin/mcp/host-html-template.ts +0 -3
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +13 -4
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +9 -9
- package/dist/builtin/subagents/agents/debugger.md +6 -6
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +1 -1
- package/dist/builtin/subagents/skills/browser-use/SKILL.md +234 -0
- package/dist/builtin/subagents/skills/browser-use/references/cdp-python.md +76 -0
- package/dist/builtin/subagents/skills/browser-use/references/multi-session.md +92 -0
- package/dist/builtin/subagents/skills/subagent/SKILL.md +4 -4
- package/dist/builtin/subagents/src/agents/skills.ts +19 -1
- package/dist/builtin/subagents/src/extension/index.ts +24 -22
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +7 -1
- package/dist/builtin/subagents/src/runs/background/async-execution.ts +23 -7
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +98 -3
- package/dist/builtin/subagents/src/runs/background/async-status.ts +3 -1
- package/dist/builtin/subagents/src/runs/background/run-status.ts +1 -1
- package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +3 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +37 -12
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +15 -15
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +26 -2
- package/dist/builtin/subagents/src/runs/shared/nested-render.ts +1 -1
- package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +7 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +28 -1
- package/dist/builtin/subagents/src/shared/fast-mode.ts +80 -0
- package/dist/builtin/subagents/src/shared/formatters.ts +4 -2
- package/dist/builtin/subagents/src/shared/types.ts +4 -2
- package/dist/builtin/subagents/src/shared/utils.ts +3 -61
- package/dist/builtin/subagents/src/tui/render.ts +303 -157
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +101 -35
- package/dist/builtin/workflows/README.md +228 -41
- package/dist/builtin/workflows/builtin/deep-research-codebase.ts +535 -541
- package/dist/builtin/workflows/builtin/goal.ts +39 -25
- package/dist/builtin/workflows/builtin/open-claude-design.ts +66 -69
- package/dist/builtin/workflows/builtin/ralph.ts +21 -21
- package/dist/builtin/workflows/package.json +6 -5
- package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
- package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +2 -2
- package/dist/builtin/workflows/src/extension/discovery.ts +25 -146
- package/dist/builtin/workflows/src/extension/dispatcher.ts +72 -24
- package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +363 -0
- package/dist/builtin/workflows/src/extension/index.ts +690 -352
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +99 -62
- package/dist/builtin/workflows/src/extension/render-call.ts +2 -1
- package/dist/builtin/workflows/src/extension/render-result.ts +9 -3
- package/dist/builtin/workflows/src/extension/renderers.ts +5 -3
- package/dist/builtin/workflows/src/extension/runtime.ts +68 -33
- package/dist/builtin/workflows/src/extension/status-writer.ts +1 -1
- package/dist/builtin/workflows/src/extension/wiring.ts +34 -13
- package/dist/builtin/workflows/src/extension/workflow-module-loader.ts +142 -0
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +4 -4
- package/dist/builtin/workflows/src/index.ts +2 -0
- package/dist/builtin/workflows/src/intercom/result-intercom.ts +1 -1
- package/dist/builtin/workflows/src/runs/background/runner.ts +6 -4
- package/dist/builtin/workflows/src/runs/background/status.ts +45 -21
- package/dist/builtin/workflows/src/runs/foreground/executor.ts +624 -52
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +80 -24
- package/dist/builtin/workflows/src/runs/shared/validate-inputs.ts +61 -24
- package/dist/builtin/workflows/src/runs/shared/workflow-runner.ts +32 -10
- package/dist/builtin/workflows/src/sdk-surface.ts +6 -0
- package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +178 -0
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +92 -12
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +21 -3
- package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +1 -2
- package/dist/builtin/workflows/src/shared/run-visibility.ts +9 -0
- package/dist/builtin/workflows/src/shared/schema-introspection.ts +121 -0
- package/dist/builtin/workflows/src/shared/serializable.ts +132 -0
- package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +91 -9
- package/dist/builtin/workflows/src/shared/store-types.ts +31 -3
- package/dist/builtin/workflows/src/shared/store.ts +58 -14
- package/dist/builtin/workflows/src/shared/types.ts +105 -40
- package/dist/builtin/workflows/src/tui/chat-surface-message.ts +129 -13
- package/dist/builtin/workflows/src/tui/chat-surface.ts +6 -1
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +3 -2
- package/dist/builtin/workflows/src/tui/graph-canvas.ts +1 -1
- package/dist/builtin/workflows/src/tui/graph-view.ts +91 -65
- package/dist/builtin/workflows/src/tui/inline-form-card.ts +1 -1
- package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +3 -2
- package/dist/builtin/workflows/src/tui/inputs-overlay.ts +3 -2
- package/dist/builtin/workflows/src/tui/inputs-picker.ts +8 -7
- package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
- package/dist/builtin/workflows/src/tui/node-card.ts +34 -8
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -11
- package/dist/builtin/workflows/src/tui/prompt-card.ts +98 -50
- package/dist/builtin/workflows/src/tui/session-list.ts +7 -2
- package/dist/builtin/workflows/src/tui/session-picker.ts +2 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +226 -55
- package/dist/builtin/workflows/src/tui/status-helpers.ts +2 -0
- package/dist/builtin/workflows/src/tui/store-widget-installer.ts +37 -158
- package/dist/builtin/workflows/src/tui/toast.ts +2 -2
- package/dist/builtin/workflows/src/tui/widget.ts +53 -12
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +270 -19
- package/dist/builtin/workflows/src/tui/workflow-notice-card.ts +184 -0
- package/dist/builtin/workflows/src/workflows/define-workflow.ts +138 -43
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +45 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +27 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +196 -17
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.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/codex-fast-mode.d.ts +36 -0
- package/dist/core/codex-fast-mode.d.ts.map +1 -0
- package/dist/core/codex-fast-mode.js +117 -0
- package/dist/core/codex-fast-mode.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/index.d.ts +4 -1
- 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.d.ts +7 -2
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +23 -8
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/reactive-widget.d.ts +58 -0
- package/dist/core/extensions/reactive-widget.d.ts.map +1 -0
- package/dist/core/extensions/reactive-widget.js +182 -0
- package/dist/core/extensions/reactive-widget.js.map +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +26 -12
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +8 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +4 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +11 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +49 -21
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +22 -13
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +7 -5
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +5 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +16 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +64 -5
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -4
- package/dist/core/system-prompt.js.map +1 -1
- 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 +2 -2
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +12 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
- package/dist/modes/interactive/chat-input-actions.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +0 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/fast-mode-selector.d.ts +27 -0
- package/dist/modes/interactive/components/fast-mode-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/fast-mode-selector.js +105 -0
- package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -12
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +132 -30
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +53 -6
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/docs/compaction.md +1 -1
- package/docs/custom-provider.md +2 -2
- package/docs/development.md +2 -2
- package/docs/docs.json +2 -2
- package/docs/extensions.md +18 -13
- package/docs/providers.md +5 -1
- package/docs/quickstart.md +5 -3
- package/docs/rpc.md +5 -5
- package/docs/sdk.md +12 -12
- package/docs/settings.md +18 -0
- package/docs/themes.md +6 -6
- package/docs/tui.md +20 -18
- package/docs/usage.md +2 -0
- package/docs/workflows.md +403 -39
- package/examples/extensions/qna.ts +2 -2
- package/package.json +4 -4
- package/dist/builtin/subagents/skills/playwright-cli/SKILL.md +0 -392
- package/dist/builtin/subagents/skills/playwright-cli/references/element-attributes.md +0 -23
- package/dist/builtin/subagents/skills/playwright-cli/references/playwright-tests.md +0 -39
- package/dist/builtin/subagents/skills/playwright-cli/references/request-mocking.md +0 -87
- package/dist/builtin/subagents/skills/playwright-cli/references/running-code.md +0 -241
- package/dist/builtin/subagents/skills/playwright-cli/references/session-management.md +0 -225
- package/dist/builtin/subagents/skills/playwright-cli/references/spec-driven-testing.md +0 -305
- package/dist/builtin/subagents/skills/playwright-cli/references/storage-state.md +0 -275
- package/dist/builtin/subagents/skills/playwright-cli/references/test-generation.md +0 -134
- package/dist/builtin/subagents/skills/playwright-cli/references/tracing.md +0 -139
- package/dist/builtin/subagents/skills/playwright-cli/references/video-recording.md +0 -143
|
@@ -10,7 +10,8 @@ import { randomUUID } from "node:crypto";
|
|
|
10
10
|
import { mkdtemp, writeFile } from "node:fs/promises";
|
|
11
11
|
import { tmpdir } from "node:os";
|
|
12
12
|
import { join } from "node:path";
|
|
13
|
-
import { defineWorkflow } from "../src/
|
|
13
|
+
import { defineWorkflow } from "../src/workflows/define-workflow.js";
|
|
14
|
+
import { Type } from "typebox";
|
|
14
15
|
import type { WorkflowTaskResult } from "../src/shared/types.js";
|
|
15
16
|
import { WORKER_PREFLIGHT_CONTRACT } from "./shared-prompts.js";
|
|
16
17
|
|
|
@@ -127,12 +128,6 @@ type ReducerOutcome = {
|
|
|
127
128
|
readonly blockerObservation?: BlockerObservation;
|
|
128
129
|
};
|
|
129
130
|
|
|
130
|
-
type GoalInputs = {
|
|
131
|
-
readonly objective?: string;
|
|
132
|
-
readonly max_turns?: number;
|
|
133
|
-
readonly base_branch?: string;
|
|
134
|
-
};
|
|
135
|
-
|
|
136
131
|
function positiveInteger(value: number | undefined, fallback: number): number {
|
|
137
132
|
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
138
133
|
return fallback;
|
|
@@ -790,7 +785,7 @@ function renderReviewerPrompt(args: {
|
|
|
790
785
|
[
|
|
791
786
|
"Inspect the actual diff/repository state rather than trusting stage summaries.",
|
|
792
787
|
"Identify the smallest relevant validation set from repository evidence: targeted tests, lint, typecheck, build, generated-artifact checks, CI-equivalent scripts, or user-flow proof.",
|
|
793
|
-
"When practical, include an end-to-end QA check that exercises the app the way a user would: use the tmux skill for terminal app environments and
|
|
788
|
+
"When practical, include an end-to-end QA check that exercises the app the way a user would: use the tmux skill for terminal app environments and browser-use for web app environments.",
|
|
794
789
|
"For web app environments, capture a screenshot as a certificate of correct completion when the UI state proves the objective; for terminal app environments, capture the terminal window/output that shows proof of correctness.",
|
|
795
790
|
"Run or delegate focused validation when it is necessary to distinguish a real bug from a hunch.",
|
|
796
791
|
"If tests or typechecks fail because dependencies are missing, install/download the missing dependencies with the repo's documented package manager instead of bypassing the check.",
|
|
@@ -962,26 +957,45 @@ export default defineWorkflow("goal")
|
|
|
962
957
|
.description(
|
|
963
958
|
"Goal Runner workflow with bounded LM turns, ledger artifacts, parallel reviewers, and reducer-gated completion.",
|
|
964
959
|
)
|
|
965
|
-
.input("objective", {
|
|
966
|
-
|
|
967
|
-
required: true,
|
|
968
|
-
description: "The objective for the Goal Runner workflow.",
|
|
969
|
-
})
|
|
970
|
-
.input("max_turns", {
|
|
971
|
-
type: "number",
|
|
960
|
+
.input("objective", Type.String({ description: "The objective for the Goal Runner workflow." }))
|
|
961
|
+
.input("max_turns", Type.Number({
|
|
972
962
|
default: DEFAULT_MAX_TURNS,
|
|
973
|
-
description:
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
.input("base_branch", {
|
|
977
|
-
type: "string",
|
|
963
|
+
description: "Maximum worker/review turns before Goal Runner stops as needs_human.",
|
|
964
|
+
}))
|
|
965
|
+
.input("base_branch", Type.String({
|
|
978
966
|
default: "origin/main",
|
|
979
|
-
description:
|
|
980
|
-
|
|
981
|
-
})
|
|
967
|
+
description: "Optional branch reviewers compare the current code delta against (default origin/main).",
|
|
968
|
+
}))
|
|
969
|
+
.output("result", Type.Optional(Type.String({ description: "Final report with objective, status, receipts, turns, and remaining work." })))
|
|
970
|
+
.output("status", Type.Optional(Type.Union(
|
|
971
|
+
[Type.Literal("complete"), Type.Literal("blocked"), Type.Literal("needs_human"), Type.Literal("active")],
|
|
972
|
+
{ description: "Final reducer status: complete, blocked, needs_human, or active if externally interrupted." },
|
|
973
|
+
)))
|
|
974
|
+
.output("approved", Type.Optional(Type.Boolean({ description: "Whether the reducer reached complete." })))
|
|
975
|
+
.output("goal_id", Type.Optional(Type.String({ description: "Per-run goal identifier stored in the ledger." })))
|
|
976
|
+
.output("objective", Type.Optional(Type.String({ description: "Normalized goal objective used by the run." })))
|
|
977
|
+
.output("ledger_path", Type.Optional(Type.String({ description: "OS-temp path to goal-ledger.json with receipts, reviewer decisions, blockers, and lifecycle events." })))
|
|
978
|
+
.output("turns_completed", Type.Optional(Type.Number({ description: "Worker/review turns completed." })))
|
|
979
|
+
.output("iterations_completed", Type.Optional(Type.Number({ description: "Worker/review turns completed, retained for status summaries." })))
|
|
980
|
+
.output(
|
|
981
|
+
"receipts",
|
|
982
|
+
Type.Optional(
|
|
983
|
+
Type.Array(
|
|
984
|
+
Type.Object({
|
|
985
|
+
turn: Type.Number(),
|
|
986
|
+
stage: Type.String(),
|
|
987
|
+
artifact_path: Type.String(),
|
|
988
|
+
summary: Type.String(),
|
|
989
|
+
}),
|
|
990
|
+
{ description: "Ledger receipt summaries and worker artifact paths." },
|
|
991
|
+
),
|
|
992
|
+
),
|
|
993
|
+
)
|
|
994
|
+
.output("remaining_work", Type.Optional(Type.String({ description: "Remaining gaps or blockers when incomplete, or none." })))
|
|
995
|
+
.output("review_report", Type.Optional(Type.String({ description: "Markdown report containing the last structured reviewer decision payloads used by the reducer." })))
|
|
982
996
|
.run(async (ctx) => {
|
|
983
|
-
const inputs = ctx.inputs
|
|
984
|
-
const objective =
|
|
997
|
+
const inputs = ctx.inputs;
|
|
998
|
+
const objective = inputs.objective.trim();
|
|
985
999
|
if (!objective) {
|
|
986
1000
|
throw new Error("goal requires an objective input.");
|
|
987
1001
|
}
|
|
@@ -21,13 +21,14 @@
|
|
|
21
21
|
*
|
|
22
22
|
* The refinement loop has been re-shaped so that the artifact under review is
|
|
23
23
|
* a real HTML page on disk (`preview.html`). The workflow attempts to open it
|
|
24
|
-
* through `
|
|
25
|
-
* when
|
|
24
|
+
* through `browser-use` so the user can interactively review and annotate;
|
|
25
|
+
* when browser-use is unavailable, the file path is surfaced so the user
|
|
26
26
|
* can open it manually. The final exporter produces a rich `spec.html` that
|
|
27
27
|
* embeds the agreed-upon design alongside the implementation handoff.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import { defineWorkflow } from "../src/
|
|
30
|
+
import { defineWorkflow } from "../src/workflows/define-workflow.js";
|
|
31
|
+
import { Type } from "typebox";
|
|
31
32
|
import type {
|
|
32
33
|
WorkflowTaskResult,
|
|
33
34
|
WorkflowTaskStep,
|
|
@@ -140,7 +141,7 @@ function prepareArtifactDir(cwd = process.cwd()): {
|
|
|
140
141
|
}
|
|
141
142
|
// Last-resort: synthesize paths even if mkdir failed; downstream agents will
|
|
142
143
|
// recreate parents using their Write tool.
|
|
143
|
-
const fallback = join(tmpdir(), "
|
|
144
|
+
const fallback = join(tmpdir(), "open-claude-design", runId);
|
|
144
145
|
return {
|
|
145
146
|
runId,
|
|
146
147
|
artifactDir: fallback,
|
|
@@ -164,56 +165,52 @@ const ANTI_SLOP_RULES = [
|
|
|
164
165
|
"Commit to a specific aesthetic direction; do not hedge with generic SaaS defaults.",
|
|
165
166
|
].join("\n");
|
|
166
167
|
|
|
167
|
-
const
|
|
168
|
-
"Probe for
|
|
169
|
-
"If
|
|
170
|
-
"Only install the missing browser runtime; do not install npm packages, change project dependencies, or repeatedly retry failed
|
|
171
|
-
"If
|
|
168
|
+
const BROWSER_USE_BOOTSTRAP_RULES = [
|
|
169
|
+
"Probe for browser-use availability with `browser-use --version` (or `bunx browser-use --version` when relying on an ephemeral Bun execution). Do not install browser-use itself.",
|
|
170
|
+
"If browser-use is available but opening a page fails because Chrome, Chrome for Testing, Chromium, or another browser executable is not installed, first run `browser-use doctor`, then run `browser-use setup` if the doctor output recommends setup, and retry the browser action once.",
|
|
171
|
+
"Only install or configure the missing browser runtime; do not install npm packages, change project dependencies, or repeatedly retry failed setup.",
|
|
172
|
+
"If browser-use is unavailable or browser setup still fails, degrade gracefully and surface the manual file path / URL.",
|
|
172
173
|
].join("\n");
|
|
173
174
|
|
|
174
175
|
export default defineWorkflow("open-claude-design")
|
|
175
176
|
.description(
|
|
176
|
-
"AI-powered design workflow: design-system onboarding → reference import → HTML generation → impeccable-driven refinement → quality gate → rich HTML handoff. Each stage delegates to a specific impeccable sub-skill; the user can iteratively review and annotate the generated HTML through
|
|
177
|
+
"AI-powered design workflow: design-system onboarding → reference import → HTML generation → impeccable-driven refinement → quality gate → rich HTML handoff. Each stage delegates to a specific impeccable sub-skill; the user can iteratively review and annotate the generated HTML through browser-use.",
|
|
177
178
|
)
|
|
178
|
-
.input("prompt", {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
})
|
|
184
|
-
.input("
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
})
|
|
190
|
-
.input("output_type", {
|
|
191
|
-
type: "select",
|
|
192
|
-
choices: OUTPUT_TYPES,
|
|
193
|
-
default: DEFAULT_OUTPUT_TYPE,
|
|
194
|
-
description: "Kind of design artifact to produce.",
|
|
195
|
-
})
|
|
196
|
-
.input("design_system", {
|
|
197
|
-
type: "text",
|
|
198
|
-
required: false,
|
|
179
|
+
.input("prompt", Type.String({
|
|
180
|
+
description: "What to design (for example, a dashboard, page, component, or prototype).",
|
|
181
|
+
}))
|
|
182
|
+
.input("reference", Type.Optional(Type.String({
|
|
183
|
+
description: "URL, file path, screenshot path, or design doc to import as a reference.",
|
|
184
|
+
})))
|
|
185
|
+
.input("output_type", Type.Union(
|
|
186
|
+
[...OUTPUT_TYPES].map((value) => Type.Literal(value)),
|
|
187
|
+
{ default: DEFAULT_OUTPUT_TYPE, description: "Kind of design artifact to produce." },
|
|
188
|
+
))
|
|
189
|
+
.input("design_system", Type.Optional(Type.String({
|
|
199
190
|
description:
|
|
200
191
|
"Path(s) or description of an existing design system (DESIGN.md, PRODUCT.md, etc.); skips onboarding when provided.",
|
|
201
|
-
})
|
|
202
|
-
.input("max_refinements", {
|
|
203
|
-
type: "number",
|
|
192
|
+
})))
|
|
193
|
+
.input("max_refinements", Type.Number({
|
|
204
194
|
default: DEFAULT_MAX_REFINEMENTS,
|
|
205
195
|
description: `Maximum critique/apply refinement iterations (default ${DEFAULT_MAX_REFINEMENTS}).`,
|
|
206
|
-
})
|
|
196
|
+
}))
|
|
197
|
+
.output("output_type", Type.Optional(Type.String({ description: "Kind of design artifact produced." })))
|
|
198
|
+
.output("design_system", Type.Optional(Type.String({ description: "Design system source used for generation: supplied input or project-derived design system." })))
|
|
199
|
+
.output("artifact", Type.Optional(Type.String({ description: "Latest final design summary from the approved preview artifact." })))
|
|
200
|
+
.output("handoff", Type.Optional(Type.String({ description: "Final rich HTML spec and implementation handoff summary." })))
|
|
201
|
+
.output("approved_for_export", Type.Optional(Type.Boolean({ description: "Whether refinement completed before the final export gate." })))
|
|
202
|
+
.output("refinements_completed", Type.Optional(Type.Number({ description: "Number of refinement iterations completed." })))
|
|
203
|
+
.output("import_context", Type.Optional(Type.String({ description: "Reference-import context used during generation." })))
|
|
204
|
+
.output("run_id", Type.Optional(Type.String({ description: "Per-run design workflow artifact identifier." })))
|
|
205
|
+
.output("artifact_dir", Type.Optional(Type.String({ description: "Directory containing preview and spec artifacts." })))
|
|
206
|
+
.output("preview_path", Type.Optional(Type.String({ description: "Absolute path to the generated preview.html file." })))
|
|
207
|
+
.output("preview_file_url", Type.Optional(Type.String({ description: "file:// URL for the generated preview.html file." })))
|
|
208
|
+
.output("spec_path", Type.Optional(Type.String({ description: "Absolute path to the generated spec.html file." })))
|
|
209
|
+
.output("spec_file_url", Type.Optional(Type.String({ description: "file:// URL for the generated spec.html file." })))
|
|
207
210
|
.run(async (ctx) => {
|
|
208
|
-
const inputs = ctx.inputs
|
|
209
|
-
prompt?: string;
|
|
210
|
-
reference?: string;
|
|
211
|
-
output_type?: string;
|
|
212
|
-
design_system?: string;
|
|
213
|
-
max_refinements?: number;
|
|
214
|
-
};
|
|
211
|
+
const inputs = ctx.inputs;
|
|
215
212
|
|
|
216
|
-
const prompt = inputs.prompt
|
|
213
|
+
const prompt = inputs.prompt;
|
|
217
214
|
const reference = inputs.reference?.trim() ?? "";
|
|
218
215
|
const outputType = normalizeOutputType(inputs.output_type);
|
|
219
216
|
const designSystemInput = (inputs.design_system ?? "").trim();
|
|
@@ -456,12 +453,12 @@ export default defineWorkflow("open-claude-design")
|
|
|
456
453
|
"impeccable_skill",
|
|
457
454
|
"extract — separate one-off styling from repeated, intentional patterns. Only carry forward what is used 3+ times or what is structurally load-bearing.",
|
|
458
455
|
],
|
|
459
|
-
["
|
|
456
|
+
["browser_use_bootstrap", BROWSER_USE_BOOTSTRAP_RULES],
|
|
460
457
|
[
|
|
461
458
|
"instructions",
|
|
462
459
|
[
|
|
463
|
-
"1. Use browser/screenshot tooling (e.g.
|
|
464
|
-
"2. If
|
|
460
|
+
"1. Use browser/screenshot tooling (e.g. browser-use) if available; cite observable evidence rather than guessing.",
|
|
461
|
+
"2. If browser-use is available but opening the reference URL reports a missing browser executable, follow the bootstrap rules and retry once.",
|
|
465
462
|
"3. Analyze: layout, visual hierarchy, navigation, color, typography, spacing, states, interactions, responsive behavior.",
|
|
466
463
|
"4. Separate reference-specific styling from requirements that should transfer to this project's design system.",
|
|
467
464
|
"5. If the URL is inaccessible or browser bootstrap fails, state that and provide a best-effort fallback based only on available information — never fabricate observations.",
|
|
@@ -570,7 +567,7 @@ export default defineWorkflow("open-claude-design")
|
|
|
570
567
|
let approvedForExport = false;
|
|
571
568
|
let refinementCount = 0;
|
|
572
569
|
|
|
573
|
-
// Try to display the freshly generated preview to the user via
|
|
570
|
+
// Try to display the freshly generated preview to the user via browser-use.
|
|
574
571
|
await ctx
|
|
575
572
|
.task("preview-display-initial", {
|
|
576
573
|
prompt: taggedPrompt([
|
|
@@ -580,19 +577,19 @@ export default defineWorkflow("open-claude-design")
|
|
|
580
577
|
],
|
|
581
578
|
[
|
|
582
579
|
"objective",
|
|
583
|
-
"Open the HTML preview file in a browser using
|
|
580
|
+
"Open the HTML preview file in a browser using browser-use and prompt the user for annotated feedback. Gracefully degrade if browser-use is unavailable.",
|
|
584
581
|
],
|
|
585
582
|
["preview_path", previewPath],
|
|
586
583
|
["preview_file_url", previewFileUrl],
|
|
587
|
-
["
|
|
584
|
+
["browser_use_bootstrap", BROWSER_USE_BOOTSTRAP_RULES],
|
|
588
585
|
[
|
|
589
586
|
"instructions",
|
|
590
587
|
[
|
|
591
|
-
"1. Probe for
|
|
592
|
-
`2. If available, run: \`
|
|
593
|
-
"3. Then run `
|
|
588
|
+
"1. Probe for browser-use availability using the bootstrap rules above.",
|
|
589
|
+
`2. If available, run: \`browser-use open ${previewFileUrl}\`. If that reports a missing browser executable, follow the bootstrap rules and retry once.`,
|
|
590
|
+
"3. Then run `browser-use show --annotate` so the user can draw boxes and leave notes directly on the live page.",
|
|
594
591
|
"4. Once the user finishes annotating, capture the returned annotated snapshot path / notes and surface them in your output.",
|
|
595
|
-
`5. If
|
|
592
|
+
`5. If browser-use is NOT available or browser bootstrap fails, print a clear instruction block telling the user to open the file manually at: ${previewPath} (or via the URL ${previewFileUrl}).`,
|
|
596
593
|
"6. Never block the workflow on unavailable tooling; always exit with a non-empty status string.",
|
|
597
594
|
].join("\n"),
|
|
598
595
|
],
|
|
@@ -713,16 +710,16 @@ export default defineWorkflow("open-claude-design")
|
|
|
713
710
|
["preview_file_url", previewFileUrl],
|
|
714
711
|
["current_design_and_feedback", "{previous}"],
|
|
715
712
|
[
|
|
716
|
-
"
|
|
717
|
-
|
|
713
|
+
"browser_use_bootstrap",
|
|
714
|
+
BROWSER_USE_BOOTSTRAP_RULES,
|
|
718
715
|
],
|
|
719
716
|
[
|
|
720
717
|
"instructions",
|
|
721
718
|
[
|
|
722
|
-
`1. Attempt rendering verification via
|
|
723
|
-
`2. Then run \`
|
|
719
|
+
`1. Attempt rendering verification via browser-use: \`browser-use open ${previewFileUrl}\`. If that reports a missing browser executable, follow the bootstrap rules and retry once.`,
|
|
720
|
+
`2. Then run \`browser-use resize 360 800\`, \`browser-use screenshot ${join(artifactDir, `mobile-${iteration}.png`)}\`, \`browser-use resize 1440 900\`, \`browser-use screenshot ${join(artifactDir, `desktop-${iteration}.png`)}\`.`,
|
|
724
721
|
"3. Check: contrast (WCAG AA), overflow, spacing rhythm, alignment, breakpoint behavior, empty/loading/error states, keyboard/pointer affordances, focus rings, prefers-reduced-motion.",
|
|
725
|
-
"4. If
|
|
722
|
+
"4. If browser-use is unavailable or browser bootstrap fails, perform a static design review of the HTML source and mark every finding as `needs-rendering-verification`.",
|
|
726
723
|
"5. Distinguish confirmed visual issues from risks that need rendering verification. Never fabricate rendered evidence.",
|
|
727
724
|
].join("\n"),
|
|
728
725
|
],
|
|
@@ -804,15 +801,15 @@ export default defineWorkflow("open-claude-design")
|
|
|
804
801
|
["preview_path", previewPath],
|
|
805
802
|
["preview_file_url", previewFileUrl],
|
|
806
803
|
[
|
|
807
|
-
"
|
|
808
|
-
|
|
804
|
+
"browser_use_bootstrap",
|
|
805
|
+
BROWSER_USE_BOOTSTRAP_RULES,
|
|
809
806
|
],
|
|
810
807
|
[
|
|
811
808
|
"instructions",
|
|
812
809
|
[
|
|
813
|
-
`1. If
|
|
814
|
-
"2. Then run `
|
|
815
|
-
`3. If
|
|
810
|
+
`1. If browser-use is available, run \`browser-use open ${previewFileUrl}\`. If that reports a missing browser executable, follow the bootstrap rules and retry once.`,
|
|
811
|
+
"2. Then run `browser-use show --annotate` to invite annotated feedback.",
|
|
812
|
+
`3. If browser-use is unavailable or browser bootstrap fails, surface the path clearly: ${previewPath} (URL: ${previewFileUrl}).`,
|
|
816
813
|
"4. Return any captured annotations as structured notes the next user-feedback step can read.",
|
|
817
814
|
"5. Do not block on unavailable tooling.",
|
|
818
815
|
].join("\n"),
|
|
@@ -941,7 +938,7 @@ export default defineWorkflow("open-claude-design")
|
|
|
941
938
|
"Return markdown with headings (NOT the HTML):",
|
|
942
939
|
"1. Spec written to (absolute path)",
|
|
943
940
|
"2. Sections included",
|
|
944
|
-
"3. How to open the spec (
|
|
941
|
+
"3. How to open the spec (browser-use command + manual fallback path)",
|
|
945
942
|
"4. Recommended files and components",
|
|
946
943
|
"5. Implementation steps",
|
|
947
944
|
"6. Usage example",
|
|
@@ -965,19 +962,19 @@ export default defineWorkflow("open-claude-design")
|
|
|
965
962
|
],
|
|
966
963
|
[
|
|
967
964
|
"objective",
|
|
968
|
-
"Open the final spec.html in a browser via
|
|
965
|
+
"Open the final spec.html in a browser via browser-use so the user can review the agreed design and implementation handoff. Degrade gracefully if browser-use is unavailable.",
|
|
969
966
|
],
|
|
970
967
|
["spec_path", specPath],
|
|
971
968
|
["spec_file_url", specFileUrl],
|
|
972
969
|
["preview_path", previewPath],
|
|
973
970
|
["preview_file_url", previewFileUrl],
|
|
974
|
-
["
|
|
971
|
+
["browser_use_bootstrap", BROWSER_USE_BOOTSTRAP_RULES],
|
|
975
972
|
[
|
|
976
973
|
"instructions",
|
|
977
974
|
[
|
|
978
|
-
"1. Probe for
|
|
979
|
-
`2. If available, run \`
|
|
980
|
-
"3. Then run `
|
|
975
|
+
"1. Probe for browser-use availability using the bootstrap rules above.",
|
|
976
|
+
`2. If available, run \`browser-use open ${specFileUrl}\`. If that reports a missing browser executable, follow the bootstrap rules and retry once.`,
|
|
977
|
+
"3. Then run `browser-use show --annotate` so the user can capture any final notes.",
|
|
981
978
|
`4. Always print, prominently, the absolute paths so the user can open them manually:\n - Final spec: ${specPath}\n - Approved preview: ${previewPath}`,
|
|
982
979
|
"5. Do not block the workflow; return a structured summary even if no tooling worked.",
|
|
983
980
|
].join("\n"),
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
|
|
11
11
|
import { tmpdir } from "node:os";
|
|
12
12
|
import { dirname, join, resolve } from "node:path";
|
|
13
|
-
import { defineWorkflow } from "../src/
|
|
13
|
+
import { defineWorkflow } from "../src/workflows/define-workflow.js";
|
|
14
|
+
import { Type } from "typebox";
|
|
14
15
|
import type {
|
|
15
16
|
WorkflowRunContext,
|
|
16
17
|
WorkflowTaskResult,
|
|
@@ -322,7 +323,6 @@ function reviewApproved(text: string): boolean {
|
|
|
322
323
|
}
|
|
323
324
|
|
|
324
325
|
function reviewerErrorResult(
|
|
325
|
-
iteration: number,
|
|
326
326
|
error: string,
|
|
327
327
|
): WorkflowTaskResult {
|
|
328
328
|
const decision: ReviewDecision = {
|
|
@@ -1041,7 +1041,7 @@ async function runRalphWorkflow(
|
|
|
1041
1041
|
);
|
|
1042
1042
|
} catch (err) {
|
|
1043
1043
|
const message = err instanceof Error ? err.message : String(err);
|
|
1044
|
-
reviews = [reviewerErrorResult(
|
|
1044
|
+
reviews = [reviewerErrorResult(message)];
|
|
1045
1045
|
}
|
|
1046
1046
|
|
|
1047
1047
|
approved =
|
|
@@ -1132,37 +1132,37 @@ export default defineWorkflow("ralph")
|
|
|
1132
1132
|
.description(
|
|
1133
1133
|
"Plan → orchestrate → simplify → parallel review loop with bounded iteration.",
|
|
1134
1134
|
)
|
|
1135
|
-
.input("prompt", {
|
|
1136
|
-
|
|
1137
|
-
required: true,
|
|
1138
|
-
description: "The task or goal to plan, execute, and refine.",
|
|
1139
|
-
})
|
|
1140
|
-
.input("max_loops", {
|
|
1141
|
-
type: "number",
|
|
1135
|
+
.input("prompt", Type.String({ description: "The task or goal to plan, execute, and refine." }))
|
|
1136
|
+
.input("max_loops", Type.Number({
|
|
1142
1137
|
default: DEFAULT_MAX_LOOPS,
|
|
1143
1138
|
description: `Maximum plan/orchestrate/review iterations (default ${DEFAULT_MAX_LOOPS}).`,
|
|
1144
|
-
})
|
|
1145
|
-
.input("base_branch", {
|
|
1146
|
-
type: "string",
|
|
1139
|
+
}))
|
|
1140
|
+
.input("base_branch", Type.String({
|
|
1147
1141
|
default: "origin/main",
|
|
1148
|
-
description:
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
.input("git_worktree_dir", {
|
|
1152
|
-
type: "string",
|
|
1142
|
+
description: "Branch reviewers compare the current code delta against (default origin/main).",
|
|
1143
|
+
}))
|
|
1144
|
+
.input("git_worktree_dir", Type.String({
|
|
1153
1145
|
default: "",
|
|
1154
1146
|
description:
|
|
1155
1147
|
"Optional Git worktree path. Ralph must start inside a Git repo; absolute paths are used as-is, relative paths resolve from the repo root, existing Git worktrees from the invoking repository are reused/shared as-is, and missing paths are created from base_branch.",
|
|
1156
|
-
})
|
|
1148
|
+
}))
|
|
1157
1149
|
.worktreeFromInputs({
|
|
1158
1150
|
gitWorktreeDir: "git_worktree_dir",
|
|
1159
1151
|
baseBranch: "base_branch",
|
|
1160
1152
|
})
|
|
1153
|
+
.output("result", Type.Optional(Type.String({ description: "Final implementation report from the orchestrator stage." })))
|
|
1154
|
+
.output("plan", Type.Optional(Type.String({ description: "Latest RFC-style plan text." })))
|
|
1155
|
+
.output("plan_path", Type.Optional(Type.String({ description: "Path to the latest generated spec under specs/." })))
|
|
1156
|
+
.output("implementation_notes_path", Type.Optional(Type.String({ description: "OS-temp notes file containing decisions, deviations, blockers, and validation notes." })))
|
|
1157
|
+
.output("pr_report", Type.Optional(Type.String({ description: "Pull-request preparation report with diff review, PR status, commands, and follow-up steps." })))
|
|
1158
|
+
.output("approved", Type.Optional(Type.Boolean({ description: "Whether the reviewer loop approved before PR handoff." })))
|
|
1159
|
+
.output("iterations_completed", Type.Optional(Type.Number({ description: "Number of plan/orchestrate/review loops completed." })))
|
|
1160
|
+
.output("review_report", Type.Optional(Type.String({ description: "Markdown report containing the latest reviewer payloads." })))
|
|
1161
1161
|
.run(async (ctx) => {
|
|
1162
|
-
const workflowCtx = ctx
|
|
1162
|
+
const workflowCtx = ctx;
|
|
1163
1163
|
const workflowStartCwd = workflowCtx.cwd ?? process.cwd();
|
|
1164
1164
|
const inputs = workflowCtx.inputs;
|
|
1165
|
-
const prompt = inputs.prompt
|
|
1165
|
+
const prompt = inputs.prompt;
|
|
1166
1166
|
const maxLoops = positiveInteger(inputs.max_loops, DEFAULT_MAX_LOOPS);
|
|
1167
1167
|
const comparisonBaseBranch = normalizeBranchInput(
|
|
1168
1168
|
inputs.base_branch,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/workflows",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.22-0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for multi-stage workflow authoring and execution.",
|
|
6
6
|
"contributors": [
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "git+https://github.com/
|
|
24
|
+
"url": "git+https://github.com/bastani-inc/atomic.git",
|
|
25
25
|
"directory": "packages/workflows"
|
|
26
26
|
},
|
|
27
|
-
"homepage": "https://github.com/
|
|
27
|
+
"homepage": "https://github.com/bastani-inc/atomic/tree/main/packages/workflows#readme",
|
|
28
28
|
"bugs": {
|
|
29
|
-
"url": "https://github.com/
|
|
29
|
+
"url": "https://github.com/bastani-inc/atomic/issues"
|
|
30
30
|
},
|
|
31
31
|
"keywords": [
|
|
32
32
|
"pi-package",
|
|
@@ -68,7 +68,8 @@
|
|
|
68
68
|
"prompts": []
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"jiti": "^2.7.0"
|
|
71
|
+
"jiti": "^2.7.0",
|
|
72
|
+
"typebox": "^1.1.24"
|
|
72
73
|
},
|
|
73
74
|
"peerDependencies": {
|
|
74
75
|
"@bastani/atomic": "*",
|
|
@@ -52,7 +52,7 @@ The user's research question/request is: **$ARGUMENTS**
|
|
|
52
52
|
|
|
53
53
|
**For online search:**
|
|
54
54
|
- VERY IMPORTANT: In case you discover external libraries as dependencies, use the **codebase-online-researcher** agent for external documentation and resources
|
|
55
|
-
- The agent fetches live web content using the **
|
|
55
|
+
- The agent fetches live web content using the **browser-use** skill (or `bunx browser-use` / `curl`). Instruct it to apply the token-efficient fetch order: (1) try `curl https://<site>/llms.txt` for an AI-friendly index (see [llmstxt.org](https://llmstxt.org/llms.txt)), (2) try `curl <url> -H "Accept: text/markdown"` to get pre-converted Markdown (supported on Cloudflare-hosted docs via [Markdown for Agents](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/)), (3) fall back to HTML parsing via `browser-use`
|
|
56
56
|
- Instruct the agent to return LINKS with their findings and INCLUDE those links in the research document
|
|
57
57
|
- The agent should persist reusable source documents under `research/web/<YYYY-MM-DD>-<kebab-case-topic>.md` (with frontmatter noting `source_url`, `fetched_at`, and `fetch_method`) so future research can reuse them without re-fetching
|
|
58
58
|
- Output directory for the synthesized research artifact: `research/docs/`
|
|
@@ -87,7 +87,7 @@ function ask(
|
|
|
87
87
|
reject(
|
|
88
88
|
signal.reason instanceof Error
|
|
89
89
|
? signal.reason
|
|
90
|
-
: new Error("
|
|
90
|
+
: new Error("atomic-workflows: HIL aborted"),
|
|
91
91
|
);
|
|
92
92
|
};
|
|
93
93
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
@@ -151,7 +151,7 @@ export function buildBackgroundUIAdapter(
|
|
|
151
151
|
options: readonly T[],
|
|
152
152
|
): Promise<T> {
|
|
153
153
|
if (options.length === 0) {
|
|
154
|
-
throw new Error("
|
|
154
|
+
throw new Error("atomic-workflows: ctx.ui.select requires at least one option");
|
|
155
155
|
}
|
|
156
156
|
const response = await ask(store, runId, {
|
|
157
157
|
kind: "select",
|