@xdelivered/emberflow 0.2.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/LICENSE +21 -0
- package/README.md +153 -0
- package/bin/commands.test.ts +185 -0
- package/bin/commands.ts +306 -0
- package/bin/emberflow.mjs +38 -0
- package/bin/init.test.ts +165 -0
- package/bin/init.ts +297 -0
- package/bin/runtime.mjs +105 -0
- package/bin/runtime.test.ts +167 -0
- package/bin/skillTargets.test.ts +108 -0
- package/bin/skillTargets.ts +36 -0
- package/bin/skillTemplates.test.ts +37 -0
- package/bin/tsconfig.json +23 -0
- package/dist/bin/commands.d.ts +24 -0
- package/dist/bin/commands.js +252 -0
- package/dist/bin/init.d.ts +17 -0
- package/dist/bin/init.js +241 -0
- package/dist/bin/runtime.d.mts +39 -0
- package/dist/bin/runtime.mjs +96 -0
- package/dist/bin/skillTargets.d.ts +13 -0
- package/dist/bin/skillTargets.js +22 -0
- package/dist/server/agents/claudeAdapter.d.ts +8 -0
- package/dist/server/agents/claudeAdapter.js +190 -0
- package/dist/server/agents/claudeParse.d.ts +2 -0
- package/dist/server/agents/claudeParse.js +162 -0
- package/dist/server/agents/codexAdapter.d.ts +13 -0
- package/dist/server/agents/codexAdapter.js +174 -0
- package/dist/server/agents/codexParse.d.ts +2 -0
- package/dist/server/agents/codexParse.js +74 -0
- package/dist/server/agents/detect.d.ts +23 -0
- package/dist/server/agents/detect.js +35 -0
- package/dist/server/agents/gitScope.d.ts +24 -0
- package/dist/server/agents/gitScope.js +95 -0
- package/dist/server/agents/modelRejectionHint.d.ts +8 -0
- package/dist/server/agents/modelRejectionHint.js +12 -0
- package/dist/server/agents/prompt.d.ts +79 -0
- package/dist/server/agents/prompt.js +364 -0
- package/dist/server/agents/runManager.d.ts +90 -0
- package/dist/server/agents/runManager.js +259 -0
- package/dist/server/agents/types.d.ts +15 -0
- package/dist/server/agents/types.js +1 -0
- package/dist/server/apiStore.d.ts +60 -0
- package/dist/server/apiStore.js +249 -0
- package/dist/server/auth/enforce.d.ts +1 -0
- package/dist/server/auth/enforce.js +6 -0
- package/dist/server/auth/types.d.ts +1 -0
- package/dist/server/auth/types.js +1 -0
- package/dist/server/auth/verifiers.d.ts +1 -0
- package/dist/server/auth/verifiers.js +4 -0
- package/dist/server/authAttach.d.ts +19 -0
- package/dist/server/authAttach.js +79 -0
- package/dist/server/cli.d.ts +7 -0
- package/dist/server/cli.js +804 -0
- package/dist/server/client.d.ts +130 -0
- package/dist/server/client.js +247 -0
- package/dist/server/environments.d.ts +103 -0
- package/dist/server/environments.js +486 -0
- package/dist/server/flowStore.d.ts +37 -0
- package/dist/server/flowStore.js +117 -0
- package/dist/server/httpOperations.d.ts +32 -0
- package/dist/server/httpOperations.js +62 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1022 -0
- package/dist/server/infrastructure.d.ts +51 -0
- package/dist/server/infrastructure.js +116 -0
- package/dist/server/login.d.ts +21 -0
- package/dist/server/login.js +44 -0
- package/dist/server/mcp.d.ts +1 -0
- package/dist/server/mcp.js +182 -0
- package/dist/server/migrateFlows.d.ts +8 -0
- package/dist/server/migrateFlows.js +25 -0
- package/dist/server/mockHandler.d.ts +15 -0
- package/dist/server/mockHandler.js +35 -0
- package/dist/server/nodesPayload.d.ts +14 -0
- package/dist/server/nodesPayload.js +14 -0
- package/dist/server/normalizeFlow.d.ts +21 -0
- package/dist/server/normalizeFlow.js +48 -0
- package/dist/server/openBrowser.d.ts +8 -0
- package/dist/server/openBrowser.js +16 -0
- package/dist/server/operationResult.d.ts +12 -0
- package/dist/server/operationResult.js +26 -0
- package/dist/server/pathGuard.d.ts +1 -0
- package/dist/server/pathGuard.js +16 -0
- package/dist/server/pathSafety.d.ts +20 -0
- package/dist/server/pathSafety.js +35 -0
- package/dist/server/projectConfig.d.ts +47 -0
- package/dist/server/projectConfig.js +61 -0
- package/dist/server/projectMode.d.ts +26 -0
- package/dist/server/projectMode.js +44 -0
- package/dist/server/redact.d.ts +6 -0
- package/dist/server/redact.js +37 -0
- package/dist/server/runRegistry.d.ts +84 -0
- package/dist/server/runRegistry.js +200 -0
- package/dist/server/runtime/RuntimeAdapter.d.ts +22 -0
- package/dist/server/runtime/RuntimeAdapter.js +1 -0
- package/dist/server/runtime/expressAdapter.d.ts +19 -0
- package/dist/server/runtime/expressAdapter.js +56 -0
- package/dist/server/scenarioTest.d.ts +14 -0
- package/dist/server/scenarioTest.js +66 -0
- package/dist/server/subflowRunner.d.ts +32 -0
- package/dist/server/subflowRunner.js +72 -0
- package/dist/server/testRunner.d.ts +70 -0
- package/dist/server/testRunner.js +151 -0
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.js +2 -0
- package/dist/src/engine/authVerify.d.ts +33 -0
- package/dist/src/engine/authVerify.js +63 -0
- package/dist/src/engine/diagnostics.d.ts +62 -0
- package/dist/src/engine/diagnostics.js +148 -0
- package/dist/src/engine/executor.d.ts +151 -0
- package/dist/src/engine/executor.js +684 -0
- package/dist/src/engine/httpError.d.ts +7 -0
- package/dist/src/engine/httpError.js +14 -0
- package/dist/src/engine/index.d.ts +11 -0
- package/dist/src/engine/index.js +11 -0
- package/dist/src/engine/output.d.ts +11 -0
- package/dist/src/engine/output.js +20 -0
- package/dist/src/engine/publish.d.ts +30 -0
- package/dist/src/engine/publish.js +95 -0
- package/dist/src/engine/registry.d.ts +34 -0
- package/dist/src/engine/registry.js +67 -0
- package/dist/src/engine/scenarios.d.ts +12 -0
- package/dist/src/engine/scenarios.js +19 -0
- package/dist/src/engine/schemaCheck.d.ts +4 -0
- package/dist/src/engine/schemaCheck.js +34 -0
- package/dist/src/engine/trace.d.ts +12 -0
- package/dist/src/engine/trace.js +12 -0
- package/dist/src/engine/types.d.ts +308 -0
- package/dist/src/engine/types.js +1 -0
- package/dist/src/engine/validation.d.ts +26 -0
- package/dist/src/engine/validation.js +318 -0
- package/dist/src/flows/anomaly-flows.d.ts +23 -0
- package/dist/src/flows/anomaly-flows.js +151 -0
- package/dist/src/flows/city-sweep-flow.d.ts +10 -0
- package/dist/src/flows/city-sweep-flow.js +127 -0
- package/dist/src/flows/login-flow.d.ts +13 -0
- package/dist/src/flows/login-flow.js +145 -0
- package/dist/src/flows/pradar-flows.d.ts +5 -0
- package/dist/src/flows/pradar-flows.js +375 -0
- package/dist/src/flows/weather-flow.d.ts +12 -0
- package/dist/src/flows/weather-flow.js +150 -0
- package/dist/src/lib/pathParams.d.ts +3 -0
- package/dist/src/lib/pathParams.js +6 -0
- package/dist/src/nodes/anomaly.d.ts +2 -0
- package/dist/src/nodes/anomaly.js +556 -0
- package/dist/src/nodes/flow-control.d.ts +7 -0
- package/dist/src/nodes/flow-control.js +270 -0
- package/dist/src/nodes/index.d.ts +3 -0
- package/dist/src/nodes/index.js +20 -0
- package/dist/src/nodes/login.d.ts +7 -0
- package/dist/src/nodes/login.js +158 -0
- package/dist/src/nodes/loops.d.ts +11 -0
- package/dist/src/nodes/loops.js +60 -0
- package/dist/src/nodes/pradar/index.d.ts +7 -0
- package/dist/src/nodes/pradar/index.js +9 -0
- package/dist/src/nodes/pradar/logic.d.ts +189 -0
- package/dist/src/nodes/pradar/logic.js +370 -0
- package/dist/src/nodes/pradar/nodes.d.ts +42 -0
- package/dist/src/nodes/pradar/nodes.js +801 -0
- package/dist/src/nodes/requireAuth.d.ts +20 -0
- package/dist/src/nodes/requireAuth.js +48 -0
- package/dist/src/nodes/response.d.ts +8 -0
- package/dist/src/nodes/response.js +33 -0
- package/dist/src/nodes/weather.d.ts +33 -0
- package/dist/src/nodes/weather.js +260 -0
- package/package.json +92 -0
- package/server/agentRoute.test.ts +157 -0
- package/server/agents/__fixtures__/fake-claude-writer.mjs +23 -0
- package/server/agents/__fixtures__/fake-claude.mjs +55 -0
- package/server/agents/__fixtures__/fake-codex-writer.mjs +27 -0
- package/server/agents/__fixtures__/fake-codex.mjs +52 -0
- package/server/agents/__fixtures__/fake-version-empty.mjs +3 -0
- package/server/agents/__fixtures__/fake-version-fail.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-garbage.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-good.mjs +4 -0
- package/server/agents/__fixtures__/fake-version-hang.mjs +3 -0
- package/server/agents/claudeAdapter.test.ts +127 -0
- package/server/agents/claudeAdapter.ts +212 -0
- package/server/agents/claudeParse.ts +193 -0
- package/server/agents/codexAdapter.test.ts +125 -0
- package/server/agents/codexAdapter.ts +198 -0
- package/server/agents/codexParse.test.ts +58 -0
- package/server/agents/codexParse.ts +126 -0
- package/server/agents/detect.test.ts +65 -0
- package/server/agents/detect.ts +43 -0
- package/server/agents/gitScope.test.ts +129 -0
- package/server/agents/gitScope.ts +110 -0
- package/server/agents/modelRejectionHint.test.ts +30 -0
- package/server/agents/modelRejectionHint.ts +14 -0
- package/server/agents/prompt.test.ts +613 -0
- package/server/agents/prompt.ts +527 -0
- package/server/agents/runManager.test.ts +251 -0
- package/server/agents/runManager.ts +286 -0
- package/server/agents/types.ts +17 -0
- package/server/apiMount.test.ts +591 -0
- package/server/apiStore.test.ts +324 -0
- package/server/apiStore.ts +241 -0
- package/server/auth/enforce.test.ts +61 -0
- package/server/auth/enforce.ts +6 -0
- package/server/auth/types.ts +5 -0
- package/server/auth/verifiers.test.ts +37 -0
- package/server/auth/verifiers.ts +9 -0
- package/server/authAttach.test.ts +175 -0
- package/server/authAttach.ts +99 -0
- package/server/cli.ts +847 -0
- package/server/cliAuth.test.ts +229 -0
- package/server/cliCreate.test.ts +131 -0
- package/server/cliDoctor.test.ts +326 -0
- package/server/cliTest.test.ts +735 -0
- package/server/client.ts +314 -0
- package/server/demoProject.test.ts +29 -0
- package/server/diagnosticsRoute.test.ts +169 -0
- package/server/environments.test.ts +620 -0
- package/server/environments.ts +603 -0
- package/server/environmentsRoute.test.ts +385 -0
- package/server/errorWorkflow.test.ts +205 -0
- package/server/flowStore.test.ts +84 -0
- package/server/flowStore.ts +125 -0
- package/server/httpOperations.test.ts +377 -0
- package/server/httpOperations.ts +96 -0
- package/server/index.ts +1111 -0
- package/server/infrastructure.test.ts +154 -0
- package/server/infrastructure.ts +161 -0
- package/server/infrastructureRoute.test.ts +105 -0
- package/server/login.test.ts +153 -0
- package/server/login.ts +67 -0
- package/server/mcp.ts +278 -0
- package/server/migrateFlows.test.ts +55 -0
- package/server/migrateFlows.ts +23 -0
- package/server/mockHandler.test.ts +138 -0
- package/server/mockHandler.ts +52 -0
- package/server/mockRun.test.ts +367 -0
- package/server/mockServe.test.ts +467 -0
- package/server/nodesPayload.test.ts +29 -0
- package/server/nodesPayload.ts +26 -0
- package/server/normalizeFlow.test.ts +80 -0
- package/server/normalizeFlow.ts +59 -0
- package/server/openBrowser.test.ts +20 -0
- package/server/openBrowser.ts +22 -0
- package/server/operationResult.test.ts +67 -0
- package/server/operationResult.ts +27 -0
- package/server/pathGuard.test.ts +19 -0
- package/server/pathGuard.ts +12 -0
- package/server/pathSafety.test.ts +38 -0
- package/server/pathSafety.ts +33 -0
- package/server/projectConfig.test.ts +67 -0
- package/server/projectConfig.ts +101 -0
- package/server/projectMode.test.ts +106 -0
- package/server/projectMode.ts +59 -0
- package/server/redact.test.ts +88 -0
- package/server/redact.ts +35 -0
- package/server/redactEgress.test.ts +281 -0
- package/server/runRegistry.ts +270 -0
- package/server/runsAuth.test.ts +119 -0
- package/server/runtime/RuntimeAdapter.ts +24 -0
- package/server/runtime/expressAdapter.test.ts +38 -0
- package/server/runtime/expressAdapter.ts +70 -0
- package/server/scenarioTest.test.ts +148 -0
- package/server/scenarioTest.ts +88 -0
- package/server/setupStatus.test.ts +127 -0
- package/server/subflowRunner.ts +104 -0
- package/server/testRunner.ts +216 -0
- package/server/tsconfig.json +20 -0
- package/server/workflowTestRoute.test.ts +297 -0
- package/src/App.tsx +233 -0
- package/src/components/AgentConsole.tsx +461 -0
- package/src/components/BranchRulesEditor.tsx +156 -0
- package/src/components/CreateModal.tsx +275 -0
- package/src/components/Dock.tsx +487 -0
- package/src/components/EnvironmentDialog.tsx +569 -0
- package/src/components/EnvironmentPicker.tsx +357 -0
- package/src/components/EnvironmentsDialog.tsx +144 -0
- package/src/components/ExecutionPager.tsx +67 -0
- package/src/components/InfraPanel.test.tsx +103 -0
- package/src/components/InfraPanel.tsx +171 -0
- package/src/components/Inspector.tsx +1182 -0
- package/src/components/Json.tsx +50 -0
- package/src/components/JsonModal.tsx +52 -0
- package/src/components/LogMessage.tsx +61 -0
- package/src/components/NodeRunModal.tsx +213 -0
- package/src/components/RunLogPanel.tsx +397 -0
- package/src/components/RunbookView.tsx +1085 -0
- package/src/components/Scenarios.tsx +476 -0
- package/src/components/SettingsDialog.tsx +229 -0
- package/src/components/Sidebar.tsx +436 -0
- package/src/components/StatusBar.tsx +302 -0
- package/src/components/Toolbar.tsx +663 -0
- package/src/components/WelcomeDialog.test.tsx +107 -0
- package/src/components/WelcomeDialog.tsx +412 -0
- package/src/components/agentMarkdown.test.tsx +91 -0
- package/src/components/agentMarkdown.tsx +158 -0
- package/src/components/ui/badge.tsx +31 -0
- package/src/components/ui/button.tsx +46 -0
- package/src/components/ui/combobox.tsx +114 -0
- package/src/components/ui/command.tsx +82 -0
- package/src/components/ui/dialog.tsx +73 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/popover.tsx +32 -0
- package/src/components/ui/resizable.tsx +44 -0
- package/src/components/ui/tabs.tsx +36 -0
- package/src/config.ts +4 -0
- package/src/engine/authVerify.ts +81 -0
- package/src/engine/diagnostics.test.ts +437 -0
- package/src/engine/diagnostics.ts +211 -0
- package/src/engine/executor.test.ts +1339 -0
- package/src/engine/executor.ts +840 -0
- package/src/engine/httpError.test.ts +12 -0
- package/src/engine/httpError.ts +16 -0
- package/src/engine/index.ts +11 -0
- package/src/engine/output.ts +21 -0
- package/src/engine/publish.test.ts +176 -0
- package/src/engine/publish.ts +127 -0
- package/src/engine/registry.test.ts +64 -0
- package/src/engine/registry.ts +80 -0
- package/src/engine/scenarios.test.ts +55 -0
- package/src/engine/scenarios.ts +29 -0
- package/src/engine/schemaCheck.test.ts +21 -0
- package/src/engine/schemaCheck.ts +35 -0
- package/src/engine/trace.test.ts +19 -0
- package/src/engine/trace.ts +23 -0
- package/src/engine/types.test.ts +22 -0
- package/src/engine/types.ts +316 -0
- package/src/engine/validation.test.ts +314 -0
- package/src/engine/validation.ts +354 -0
- package/src/flows/anomaly-flows.test.ts +81 -0
- package/src/flows/anomaly-flows.ts +202 -0
- package/src/flows/city-sweep-flow.ts +131 -0
- package/src/flows/flows.test.ts +30 -0
- package/src/flows/login-flow.ts +150 -0
- package/src/flows/pradar-flows.test.ts +204 -0
- package/src/flows/pradar-flows.ts +419 -0
- package/src/flows/weather-flow.ts +154 -0
- package/src/globals.css +147 -0
- package/src/lib/pathParams.test.ts +24 -0
- package/src/lib/pathParams.ts +6 -0
- package/src/lib/registerLens.test.ts +79 -0
- package/src/lib/registerLens.ts +59 -0
- package/src/lib/runbookModel.test.ts +61 -0
- package/src/lib/runbookModel.ts +290 -0
- package/src/lib/runbookProjection.test.ts +417 -0
- package/src/lib/runbookProjection.ts +254 -0
- package/src/lib/useTailAnchor.ts +53 -0
- package/src/lib/utils.ts +7 -0
- package/src/main.tsx +13 -0
- package/src/nodes/anomaly.test.ts +98 -0
- package/src/nodes/anomaly.ts +637 -0
- package/src/nodes/effects-scan.test.ts +44 -0
- package/src/nodes/flow-control.test.ts +280 -0
- package/src/nodes/flow-control.ts +305 -0
- package/src/nodes/index.ts +22 -0
- package/src/nodes/login.test.ts +81 -0
- package/src/nodes/login.ts +186 -0
- package/src/nodes/loops.ts +69 -0
- package/src/nodes/pradar/index.ts +11 -0
- package/src/nodes/pradar/logic.test.ts +288 -0
- package/src/nodes/pradar/logic.ts +582 -0
- package/src/nodes/pradar/nodes.test.ts +146 -0
- package/src/nodes/pradar/nodes.ts +955 -0
- package/src/nodes/requireAuth.test.ts +75 -0
- package/src/nodes/requireAuth.ts +55 -0
- package/src/nodes/response.test.ts +33 -0
- package/src/nodes/response.ts +39 -0
- package/src/nodes/traceDetail.test.ts +39 -0
- package/src/nodes/weather.test.ts +65 -0
- package/src/nodes/weather.ts +306 -0
- package/src/store/agentClient.test.ts +103 -0
- package/src/store/agentClient.ts +131 -0
- package/src/store/apiTree.test.ts +17 -0
- package/src/store/apiTree.ts +73 -0
- package/src/store/builderStore.test.ts +1234 -0
- package/src/store/builderStore.ts +1879 -0
- package/src/store/infraClient.ts +63 -0
- package/src/store/nodeMeta.test.ts +24 -0
- package/src/store/nodeMeta.ts +21 -0
- package/src/store/persistence.test.ts +15 -0
- package/src/store/persistence.ts +54 -0
- package/src/store/serverRunner.ts +381 -0
- package/src/store/setupClient.ts +57 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/studio-dist/assets/index-DNJwW-hM.css +1 -0
- package/studio-dist/assets/index-O26dKRjW.js +65 -0
- package/studio-dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/studio-dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/studio-dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/studio-dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/studio-dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/studio-dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/studio-dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/studio-dist/favicon.svg +1 -0
- package/studio-dist/icons.svg +24 -0
- package/studio-dist/index.html +14 -0
- package/templates/skills/emberflow-basics/SKILL.md +316 -0
- package/templates/skills/emberflow-model-process/SKILL.md +209 -0
- package/templates/skills/emberflow-new-workflow/SKILL.md +211 -0
- package/templates/skills/emberflow-review-workflow/SKILL.md +148 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { ListChecksIcon, Loader2Icon, ShieldIcon } from 'lucide-react';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
import { useBuilderStore } from '../store/builderStore';
|
|
5
|
+
import { setupProgress } from '../store/setupClient';
|
|
6
|
+
import type { EnvironmentSummary } from '../store/serverRunner';
|
|
7
|
+
import type { WorkflowRun } from '../engine';
|
|
8
|
+
|
|
9
|
+
const statusDot: Record<string, string> = {
|
|
10
|
+
succeeded: 'bg-success',
|
|
11
|
+
failed: 'bg-destructive',
|
|
12
|
+
cancelled: 'bg-muted-foreground',
|
|
13
|
+
running: 'bg-highlight animate-pulse',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** Live-ticking elapsed while running, frozen duration once finished. */
|
|
17
|
+
function useRunElapsed(run: WorkflowRun | null): string {
|
|
18
|
+
const finished = run !== null && run.status !== 'running';
|
|
19
|
+
const [nowTick, setNowTick] = useState(() => Date.now());
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (finished) return;
|
|
22
|
+
const t = setInterval(() => setNowTick(Date.now()), 250);
|
|
23
|
+
return () => clearInterval(t);
|
|
24
|
+
}, [finished]);
|
|
25
|
+
const durationMs =
|
|
26
|
+
run?.completedAt && run.startedAt
|
|
27
|
+
? new Date(run.completedAt).getTime() - new Date(run.startedAt).getTime()
|
|
28
|
+
: null;
|
|
29
|
+
const elapsedMs = finished
|
|
30
|
+
? durationMs
|
|
31
|
+
: run?.startedAt
|
|
32
|
+
? Math.max(0, nowTick - new Date(run.startedAt).getTime())
|
|
33
|
+
: null;
|
|
34
|
+
return elapsedMs === null
|
|
35
|
+
? ''
|
|
36
|
+
: elapsedMs < 1000
|
|
37
|
+
? `${elapsedMs}ms`
|
|
38
|
+
: `${(elapsedMs / 1000).toFixed(1)}s`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const Divider = () => <span className="mx-0.5 h-3 w-px shrink-0 bg-border/70" />;
|
|
42
|
+
|
|
43
|
+
const segment = 'flex h-full min-w-0 items-center gap-1.5 px-2';
|
|
44
|
+
const interactive = 'cursor-pointer transition-colors hover:bg-secondary/50';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Login-auth affordance for a runner environment. Hidden entirely unless the
|
|
48
|
+
* environment declares `auth.configured` — no visual change for envs without
|
|
49
|
+
* it. Never renders a secret value, only the authenticated boolean.
|
|
50
|
+
*/
|
|
51
|
+
function EnvAuthBadge({ env }: { env: EnvironmentSummary }) {
|
|
52
|
+
const loginEnvironment = useBuilderStore((s) => s.loginEnvironment);
|
|
53
|
+
const [pending, setPending] = useState(false);
|
|
54
|
+
const [error, setError] = useState<string | null>(null);
|
|
55
|
+
|
|
56
|
+
const authed = env.auth?.authenticated ?? false;
|
|
57
|
+
|
|
58
|
+
const onLogin = async () => {
|
|
59
|
+
setError(null);
|
|
60
|
+
setPending(true);
|
|
61
|
+
try {
|
|
62
|
+
await loginEnvironment(env.name);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
setError(err instanceof Error ? err.message : 'Login failed');
|
|
65
|
+
} finally {
|
|
66
|
+
setPending(false);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
if (authed) {
|
|
71
|
+
// Authenticated: calm filled dot. The whole segment is a quiet re-login
|
|
72
|
+
// control — hovering swaps the label so the affordance is discoverable
|
|
73
|
+
// without adding noise to the resting bar.
|
|
74
|
+
return (
|
|
75
|
+
<button
|
|
76
|
+
type="button"
|
|
77
|
+
onClick={() => void onLogin()}
|
|
78
|
+
disabled={pending}
|
|
79
|
+
title={error ?? 'Authenticated — click to log in again'}
|
|
80
|
+
className={cn(segment, 'group', interactive, 'disabled:cursor-wait disabled:opacity-60')}
|
|
81
|
+
>
|
|
82
|
+
<span className="size-1.5 shrink-0 rounded-full bg-success" />
|
|
83
|
+
{pending ? (
|
|
84
|
+
<span className="flex items-center gap-1 truncate">
|
|
85
|
+
<Loader2Icon className="size-3 shrink-0 animate-spin" />
|
|
86
|
+
Logging in…
|
|
87
|
+
</span>
|
|
88
|
+
) : (
|
|
89
|
+
<>
|
|
90
|
+
<span className="truncate group-hover:hidden">authenticated</span>
|
|
91
|
+
<span className="hidden truncate text-foreground/80 group-hover:inline">Re-log in</span>
|
|
92
|
+
</>
|
|
93
|
+
)}
|
|
94
|
+
{error && <span className="truncate text-destructive">{error}</span>}
|
|
95
|
+
</button>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<span className={segment} title={error ?? 'Not authenticated'}>
|
|
101
|
+
<span className="size-1.5 shrink-0 rounded-full border border-muted-foreground" />
|
|
102
|
+
<button
|
|
103
|
+
type="button"
|
|
104
|
+
onClick={() => void onLogin()}
|
|
105
|
+
disabled={pending}
|
|
106
|
+
className={cn(
|
|
107
|
+
'flex items-center gap-1 truncate text-foreground/80 transition-colors hover:text-foreground disabled:cursor-wait disabled:opacity-60',
|
|
108
|
+
)}
|
|
109
|
+
>
|
|
110
|
+
{pending && <Loader2Icon className="size-3 shrink-0 animate-spin" />}
|
|
111
|
+
{pending ? 'Logging in…' : 'Log in'}
|
|
112
|
+
</button>
|
|
113
|
+
{error && <span className="truncate text-destructive">{error}</span>}
|
|
114
|
+
</span>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Bottom status bar: a calm, always-present readout of where a run points and
|
|
120
|
+
* what's happening. Left = environment / runner / workspace source (interactive
|
|
121
|
+
* where it's safe to be); right = selection, flow shape and the live run.
|
|
122
|
+
*/
|
|
123
|
+
export function StatusBar() {
|
|
124
|
+
const environments = useBuilderStore((s) => s.environments);
|
|
125
|
+
const selectedEnvironment = useBuilderStore((s) => s.selectedEnvironment);
|
|
126
|
+
const safeMode = useBuilderStore((s) => s.safeMode);
|
|
127
|
+
const setSafeMode = useBuilderStore((s) => s.setSafeMode);
|
|
128
|
+
const runnerOnline = useBuilderStore((s) => s.runnerOnline);
|
|
129
|
+
const runnerMock = useBuilderStore((s) => s.runnerMock);
|
|
130
|
+
const checkRunner = useBuilderStore((s) => s.checkRunner);
|
|
131
|
+
const workspaceSource = useBuilderStore((s) => s.workspaceSource);
|
|
132
|
+
const register = useBuilderStore((s) => s.viewRegister);
|
|
133
|
+
const setRegister = useBuilderStore((s) => s.setViewRegister);
|
|
134
|
+
const selectedNodeId = useBuilderStore((s) => s.selectedNodeId);
|
|
135
|
+
const flow = useBuilderStore((s) => s.flow);
|
|
136
|
+
const run = useBuilderStore((s) => s.run);
|
|
137
|
+
const setupStatus = useBuilderStore((s) => s.setupStatus);
|
|
138
|
+
const setWelcomeOpen = useBuilderStore((s) => s.setWelcomeOpen);
|
|
139
|
+
|
|
140
|
+
// Setup entry point: a quiet progress chip while onboarding is unfinished.
|
|
141
|
+
// Complete setups drop the chip — the checklist auto-open and this chip are
|
|
142
|
+
// the only entry points, and a finished checklist has nothing left to do.
|
|
143
|
+
const progress = setupStatus ? setupProgress(setupStatus) : null;
|
|
144
|
+
const setupPending = progress !== null && progress.done < progress.total;
|
|
145
|
+
|
|
146
|
+
const current = environments.find((e) => e.name === selectedEnvironment);
|
|
147
|
+
const protectedEnv = current?.protected ?? false;
|
|
148
|
+
const envLabel = selectedEnvironment || 'browser';
|
|
149
|
+
|
|
150
|
+
const onEnvClick = () => {
|
|
151
|
+
if (!safeMode) {
|
|
152
|
+
// Off → always allowed back on.
|
|
153
|
+
setSafeMode(true);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Safe on: an unprotected env may be flipped off inline; protected must go
|
|
157
|
+
// through the environment picker's typed confirmation.
|
|
158
|
+
if (!protectedEnv) setSafeMode(false);
|
|
159
|
+
};
|
|
160
|
+
const envTitle = !safeMode
|
|
161
|
+
? 'Safe mode off — click to re-enable'
|
|
162
|
+
: protectedEnv
|
|
163
|
+
? 'Protected environment — use the environment picker to go live'
|
|
164
|
+
: 'Safe mode on — click to turn off';
|
|
165
|
+
|
|
166
|
+
const runnerDot =
|
|
167
|
+
runnerOnline === true ? 'bg-success' : runnerOnline === false ? 'bg-destructive' : 'bg-muted-foreground';
|
|
168
|
+
const runnerTitle =
|
|
169
|
+
runnerOnline === true
|
|
170
|
+
? 'Runner online — click to re-check'
|
|
171
|
+
: runnerOnline === false
|
|
172
|
+
? 'Runner offline — click to re-check'
|
|
173
|
+
: 'Runner status unknown — click to check';
|
|
174
|
+
|
|
175
|
+
const selectedNode = selectedNodeId
|
|
176
|
+
? flow.nodes.find((n) => n.id === selectedNodeId)
|
|
177
|
+
: undefined;
|
|
178
|
+
|
|
179
|
+
const elapsed = useRunElapsed(run);
|
|
180
|
+
|
|
181
|
+
return (
|
|
182
|
+
<footer className="flex h-[24px] shrink-0 items-center overflow-hidden border-t border-border bg-tertiary text-[11px] text-muted-foreground select-none">
|
|
183
|
+
<button type="button" onClick={onEnvClick} title={envTitle} className={cn(segment, interactive)}>
|
|
184
|
+
<span
|
|
185
|
+
className={cn('size-1.5 shrink-0 rounded-full', protectedEnv ? 'bg-destructive' : 'bg-muted-foreground')}
|
|
186
|
+
/>
|
|
187
|
+
<span className="truncate text-foreground/80">{envLabel}</span>
|
|
188
|
+
{safeMode && <ShieldIcon className="size-3 shrink-0" />}
|
|
189
|
+
</button>
|
|
190
|
+
{current?.auth?.configured && (
|
|
191
|
+
<>
|
|
192
|
+
<Divider />
|
|
193
|
+
<EnvAuthBadge key={current.name} env={current} />
|
|
194
|
+
</>
|
|
195
|
+
)}
|
|
196
|
+
{runnerMock && (
|
|
197
|
+
<>
|
|
198
|
+
<Divider />
|
|
199
|
+
<span
|
|
200
|
+
className={cn(segment, 'bg-warn/15 font-medium uppercase tracking-wide text-warn')}
|
|
201
|
+
title="The studio is in Mock mode — mounted endpoints answer with example responses from scenarios; nothing executes, no auth. Pick an environment in the toolbar dropdown to go live."
|
|
202
|
+
>
|
|
203
|
+
<span className="size-1.5 shrink-0 rounded-full bg-warn" />
|
|
204
|
+
mock
|
|
205
|
+
</span>
|
|
206
|
+
</>
|
|
207
|
+
)}
|
|
208
|
+
<Divider />
|
|
209
|
+
<button
|
|
210
|
+
type="button"
|
|
211
|
+
onClick={() => void checkRunner()}
|
|
212
|
+
title={runnerTitle}
|
|
213
|
+
className={cn(segment, interactive)}
|
|
214
|
+
>
|
|
215
|
+
<span className={cn('size-1.5 shrink-0 rounded-full', runnerDot)} />
|
|
216
|
+
<span className="truncate">runner</span>
|
|
217
|
+
</button>
|
|
218
|
+
{/* Workspace source only matters in the exception state: a browser-local
|
|
219
|
+
workspace means edits are NOT landing in the project's files. The
|
|
220
|
+
normal case (editing the runner's files) needs no chip. */}
|
|
221
|
+
{workspaceSource !== 'server' && (
|
|
222
|
+
<>
|
|
223
|
+
<Divider />
|
|
224
|
+
<span
|
|
225
|
+
className={cn(segment, 'bg-warn/15 font-medium text-warn')}
|
|
226
|
+
title="Editing a browser-local workspace — the runner is offline, so changes are not written to your project's files. They adopt into the project when the runner comes back."
|
|
227
|
+
>
|
|
228
|
+
local only
|
|
229
|
+
</span>
|
|
230
|
+
</>
|
|
231
|
+
)}
|
|
232
|
+
{setupPending && progress && (
|
|
233
|
+
<>
|
|
234
|
+
<Divider />
|
|
235
|
+
<button
|
|
236
|
+
type="button"
|
|
237
|
+
onClick={() => setWelcomeOpen(true)}
|
|
238
|
+
title="Setup — first-run checklist for this project"
|
|
239
|
+
className={cn(segment, interactive)}
|
|
240
|
+
>
|
|
241
|
+
<ListChecksIcon className="size-3 shrink-0" />
|
|
242
|
+
<span className="truncate text-foreground/80">setup</span>
|
|
243
|
+
<span className="shrink-0 font-mono tabular-nums text-muted-foreground/70">
|
|
244
|
+
{progress.done}/{progress.total}
|
|
245
|
+
</span>
|
|
246
|
+
</button>
|
|
247
|
+
</>
|
|
248
|
+
)}
|
|
249
|
+
<Divider />
|
|
250
|
+
<div
|
|
251
|
+
role="group"
|
|
252
|
+
aria-label="Runbook register"
|
|
253
|
+
title="Runbook register — Simple reads outcomes; Technical adds type names + trace badges"
|
|
254
|
+
className="flex h-full items-center gap-0.5 px-1"
|
|
255
|
+
>
|
|
256
|
+
{(['simple', 'technical'] as const).map((v) => (
|
|
257
|
+
<button
|
|
258
|
+
key={v}
|
|
259
|
+
type="button"
|
|
260
|
+
onClick={() => setRegister(v)}
|
|
261
|
+
aria-pressed={register === v}
|
|
262
|
+
className={cn(
|
|
263
|
+
'rounded-[4px] px-1.5 py-0.5 text-[11px] capitalize transition-colors',
|
|
264
|
+
register === v ? 'bg-secondary text-foreground' : 'text-muted-foreground hover:text-foreground',
|
|
265
|
+
)}
|
|
266
|
+
>
|
|
267
|
+
{v}
|
|
268
|
+
</button>
|
|
269
|
+
))}
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
<div className="ml-auto flex h-full min-w-0 items-center">
|
|
273
|
+
{selectedNode && (
|
|
274
|
+
<>
|
|
275
|
+
<span className={segment} title="Selected node">
|
|
276
|
+
<span className="truncate font-mono text-foreground/75">{selectedNode.label}</span>
|
|
277
|
+
</span>
|
|
278
|
+
<Divider />
|
|
279
|
+
</>
|
|
280
|
+
)}
|
|
281
|
+
<span className={segment} title="Active flow">
|
|
282
|
+
<span className="truncate">{flow.name}</span>
|
|
283
|
+
<span className="shrink-0 text-muted-foreground/70">
|
|
284
|
+
· {flow.nodes.length} {flow.nodes.length === 1 ? 'node' : 'nodes'}
|
|
285
|
+
</span>
|
|
286
|
+
</span>
|
|
287
|
+
{run && (
|
|
288
|
+
<>
|
|
289
|
+
<Divider />
|
|
290
|
+
<span className={segment} title="Latest run">
|
|
291
|
+
<span className={cn('size-1.5 shrink-0 rounded-full', statusDot[run.status] ?? 'bg-muted-foreground')} />
|
|
292
|
+
<span className="shrink-0 capitalize text-foreground/80">{run.status}</span>
|
|
293
|
+
{elapsed && (
|
|
294
|
+
<span className="shrink-0 font-mono tabular-nums text-muted-foreground/70">{elapsed}</span>
|
|
295
|
+
)}
|
|
296
|
+
</span>
|
|
297
|
+
</>
|
|
298
|
+
)}
|
|
299
|
+
</div>
|
|
300
|
+
</footer>
|
|
301
|
+
);
|
|
302
|
+
}
|