justflow-admin 0.1.1__tar.gz

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.
@@ -0,0 +1,36 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
5
+ .mypy_cache/
6
+ .ruff_cache/
7
+ .coverage
8
+ htmlcov/
9
+ *.egg-info/
10
+ dist/
11
+ example-dist/
12
+ build/
13
+ .env
14
+ .DS_Store
15
+
16
+ # Generated visualization artifacts
17
+ workflow.html
18
+
19
+ examples/**/*.html
20
+ /examples_internal/
21
+
22
+ .codegraph
23
+ graphify-out/
24
+ .claude/settings.local.json
25
+ specs/
26
+ temp/
27
+ site/
28
+ /docs/scheduling-workflows-spec.md
29
+
30
+ # Administration panel tool output
31
+ ui/admin/node_modules/
32
+ ui/admin/coverage/
33
+ .justflow/
34
+ # The built panel bundle under packages/justflow-admin is covered by the dist/
35
+ # rule above. It ships in the optional wheel via Hatch build artifacts.
36
+ /CHANGELOG_private.md
@@ -0,0 +1,28 @@
1
+ Metadata-Version: 2.4
2
+ Name: justflow-admin
3
+ Version: 0.1.1
4
+ Summary: Optional beta admin panel for Justflow
5
+ Author: Mykyta Bakunov
6
+ License-Expression: Apache-2.0
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Typing :: Typed
16
+ Requires-Python: >=3.11
17
+ Requires-Dist: justflow<0.2,>=0.1.1
18
+ Description-Content-Type: text/markdown
19
+
20
+ # justflow-admin
21
+
22
+ `justflow-admin` is the optional beta admin panel for Justflow. It lets you inspect
23
+ workflows and runs, manage schedules, and edit configuration when the server permits it.
24
+ The package includes the built frontend, so you don't need Node.js to use it.
25
+
26
+ The panel uses Justflow's public API. You can use that API to build your own dashboard
27
+ or automate operations. Use Temporal UI when you need to inspect raw workflow history
28
+ or debug the Temporal service.
@@ -0,0 +1,9 @@
1
+ # justflow-admin
2
+
3
+ `justflow-admin` is the optional beta admin panel for Justflow. It lets you inspect
4
+ workflows and runs, manage schedules, and edit configuration when the server permits it.
5
+ The package includes the built frontend, so you don't need Node.js to use it.
6
+
7
+ The panel uses Justflow's public API. You can use that API to build your own dashboard
8
+ or automate operations. Use Temporal UI when you need to inspect raw workflow history
9
+ or debug the Temporal service.
@@ -0,0 +1,36 @@
1
+ [build-system]
2
+ requires = ["hatchling==1.31.0"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "justflow-admin"
7
+ version = "0.1.1"
8
+ description = "Optional beta admin panel for Justflow"
9
+ readme = "README.md"
10
+ license = "Apache-2.0"
11
+ requires-python = ">=3.11"
12
+ authors = [
13
+ { name = "Mykyta Bakunov"},
14
+ ]
15
+ classifiers = [
16
+ "Development Status :: 4 - Beta",
17
+ "Intended Audience :: Developers",
18
+ "License :: OSI Approved :: Apache Software License",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Programming Language :: Python :: 3.14",
24
+ "Typing :: Typed",
25
+ ]
26
+ dependencies = ["justflow>=0.1.1,<0.2"]
27
+
28
+ [tool.hatch.build.targets.wheel]
29
+ packages = ["src/justflow_admin"]
30
+
31
+ [tool.hatch.build.targets.sdist]
32
+ only-include = ["src/justflow_admin", "README.md", "pyproject.toml"]
33
+
34
+ [tool.hatch.build]
35
+ artifacts = ["/src/justflow_admin/assets/dist/**"]
36
+ exclude = ["**/__pycache__", "**/*.pyc", "**/*.pyo"]
@@ -0,0 +1,12 @@
1
+ """Optional beta administration console for Justflow."""
2
+
3
+ from justflow.runtime.admin_panel import AdminPanel, AdminPanelAsset
4
+ from justflow_admin.panel import BetaAdminPanel
5
+
6
+
7
+ def create_admin_panel() -> AdminPanel:
8
+ """Create the explicitly composed adapter for the prebuilt beta console."""
9
+ return BetaAdminPanel()
10
+
11
+
12
+ __all__ = ["AdminPanel", "AdminPanelAsset", "BetaAdminPanel", "create_admin_panel"]
@@ -0,0 +1 @@
1
+ """Prebuilt, manifest-verified administration console assets."""
@@ -0,0 +1,13 @@
1
+ import{t as e}from"./protocol-BBnPpHbF.js";function t(e){let t=document.getElementById(e);if(t===null)throw Error(`Administration panel element is missing: ${e}`);return t}function n(e){let n=t(e);if(!(n instanceof HTMLButtonElement))throw TypeError(`${e} must be a button`);return n}function r(e){let n=t(e);if(!(n instanceof HTMLInputElement))throw TypeError(`${e} must be an input`);return n}function i(e){let n=t(e);if(!(n instanceof HTMLSelectElement))throw TypeError(`${e} must be a select`);return n}function a(e){let n=t(e);if(!(n instanceof HTMLDialogElement))throw TypeError(`${e} must be a dialog`);return n}function o(e){let n=t(e);if(!(n instanceof HTMLTextAreaElement))throw TypeError(`${e} must be a textarea`);return n}function s(e){let n=t(e);if(!(n instanceof HTMLFormElement))throw TypeError(`${e} must be a form`);return n}function c(e){e.replaceChildren()}function l(e,t,n){let r=document.createElement(e);return r.textContent=t,n!==void 0&&(r.className=n),r}function u(e,t){let n=document.createElement(`button`);return n.textContent=e,n.className=t,n.type=`button`,n}function d(e,t,n){c(e);let r=document.createElement(`tr`),i=document.createElement(`td`);i.className=`empty-cell`,i.colSpan=t,i.textContent=n,r.appendChild(i),e.appendChild(r)}function f(e,t,n){let r=document.createElement(`td`);r.textContent=t,n!==void 0&&(r.className=n),e.appendChild(r)}function p(e,t){let n=document.createElement(`td`);n.appendChild(t),e.appendChild(n)}var m=12,ee={dateStyle:`medium`,timeStyle:`short`},te=1e3,ne=60,re=60;function h(e){return e===null?`—`:e.length<=m?e:`${e.slice(0,m)}…`}function g(e){if(e===null)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`Unavailable`:t.toLocaleString(void 0,ee)}function ie(e){return(e??`unknown`).toLowerCase()}function ae(e){return JSON.stringify([e.workflowId,e.runId])}function oe(e){let t=new Date(e.startTime).getTime(),n=e.closeTime===null?Date.now():new Date(e.closeTime).getTime();if(!Number.isFinite(t)||!Number.isFinite(n)||n<t)return`Unavailable`;let r=Math.floor((n-t)/te);if(r<ne)return`${r}s`;let i=Math.floor(r/ne);return i<re?`${i}m ${r%ne}s`:`${Math.floor(i/re)}h ${i%re}m`}function _(e){return e instanceof Error?e.message:`The operation failed.`}function v(e,t){let n=t??ie(e);return l(`span`,e??`Unknown`,`status-badge status-${n}`)}function y(e,t=``){se(`action-status`,e,t)}function se(e,n,r=``){let i=t(e);i.textContent=n,i.className=`action-status ${r}`.trim()}function ce(e){t(`connection-state`).textContent=e?`Connected`:`Unavailable`,t(`connection-dot`).className=e?`connection-dot is-connected`:`connection-dot is-unavailable`}var le=new Set([`http:`,`https:`]),ue=[`catalog`,`temporal`,`worker`,`trigger_consumer`,`response_consumer`,`providers`],de=[`ready`,`unavailable`],fe=[`pending`,`running`,`waiting_for_readiness`,`applied`,`failed`,`superseded`,`rolled_back`],pe=[`managed`,`local_source`,`unavailable`],me=[`workflow`,`trigger`],he=[`active`,`modified`,`new_pending_apply`,`removed_pending_apply`],ge=[`validation`,`definition_publication`,`publication`,`plan_confirmation`,`activation`,`readiness`,`process_restart`],_e=[`completed`,`pending`,`restart_required`,`not_applicable`],ve=[`error`,`warning`],ye=[`immutable_catalog`,`observed_host`],be=[`available`,`unavailable`],xe=[`step`,`trigger`],Se=[`api`,`schedule`,`webhook`,`event`,`broker`,`host`],Ce=[`active`,`inactive`],we=[`scheduled`,`dispatching`,`started`,`canceled`,`failed`],Te=[`interactive`,`standard`,`batch`],Ee=[`accepted`,`duplicate`,`rescheduled`,`canceled`,`in_progress`],De=1,Oe=1,ke=1,Ae=`This beta console is not compatible with the installed Justflow API. Upgrade justflow and justflow-admin together.`;function je(e){let t=b(e,`start result`),n=t.run_id;return{workflowId:w(t,`workflow_id`),runId:n==null?null:C(n,`run_id`),duplicate:w(t,`status`)===`duplicate`}}function Me(e){let t=b(e,`capabilities`),n=x(t,`scope`);return{api_compatibility:Ie(t),operations_view:D(t,`operations_view`),scope:{tenant:w(n,`tenant`),application:w(n,`application`),environment:w(n,`environment`)},configuration_mode:k(t,`configuration_mode`,pe),workflow_start:D(t,`workflow_start`),workflow_signal:D(t,`workflow_signal`),workflow_cancel:D(t,`workflow_cancel`),workflow_terminate:D(t,`workflow_terminate`),trigger_pause:D(t,`trigger_pause`),trigger_resume:D(t,`trigger_resume`),trigger_run:D(t,`trigger_run`),trigger_delete:D(t,`trigger_delete`),trigger_apply:D(t,`trigger_apply`),scheduled_start_create:D(t,`scheduled_start_create`),scheduled_start_view:D(t,`scheduled_start_view`),scheduled_start_reschedule:D(t,`scheduled_start_reschedule`),scheduled_start_cancel:D(t,`scheduled_start_cancel`),configuration_view:D(t,`configuration_view`),configuration_edit:D(t,`configuration_edit`),configuration_validate:D(t,`configuration_validate`),configuration_apply:D(t,`configuration_apply`),configuration_discard:D(t,`configuration_discard`),configuration_publish:D(t,`configuration_publish`),configuration_activate:D(t,`configuration_activate`),configuration_rollback:D(t,`configuration_rollback`)}}function Ne(e){let t=b(e,`scheduled starts`);return{scheduledStarts:S(t,`scheduled_starts`).map(Pe),nextCursor:T(t,`next_cursor`)}}function Pe(e){let t=b(e,`scheduled start`),n=pt(t,`run`),r=n===null?null:pt(n,`artifact_identity`);return{scheduledStartId:w(t,`scheduled_start_id`),workflowName:w(t,`workflow_name`),triggerName:w(t,`trigger_name`),startAt:w(t,`start_at`),workloadClass:k(t,`workload_class`,Te),state:k(t,`state`,we),version:O(t,`version`),acceptedAt:w(t,`accepted_at`),updatedAt:w(t,`updated_at`),dispatchStartedAt:T(t,`dispatch_started_at`),completedAt:T(t,`completed_at`),failureCode:T(t,`failure_code`),workflowId:E(n,`workflow_id`),runId:E(n,`run_id`),definitionDigest:E(n,`definition_digest`),artifactBuildId:E(r,`build_id`)}}function Fe(e){let t=b(e,`scheduled-start mutation`);return{status:k(t,`status`,Ee),scheduledStart:Pe(x(t,`scheduled_start`)),expectedVersion:_t(t,`expected_version`)}}function Ie(e){try{let t=x(e,`api_compatibility`),n=O(t,`current_version`),r=O(t,`minimum_supported_client_version`),i=O(t,`maximum_supported_client_version`);if(!(n>=Oe&&n<=ke)||!(De>=r&&De<=i)||r>i)throw Error(Ae);return{current_version:n,minimum_supported_client_version:r,maximum_supported_client_version:i}}catch{throw Error(Ae)}}function Le(e){let t=b(e,`operations overview`),n=x(t,`health`);return{ready:D(n,`ready`),components:S(n,`components`).map(e=>{let t=b(e,`health component`);return{component:yt(t,`component`),status:bt(t,`status`),required:D(t,`required`)}}),metricsLinks:S(t,`metrics_links`).map(e=>{let t=b(e,`metrics link`);return{label:w(t,`label`),url:vt(t,`url`)}})}}function Re(e){let t=b(e,`workflow runs`);return{runs:S(t,`workflows`).map(e=>{let t=b(e,`workflow run`);return{workflowId:w(t,`workflow_id`),runId:w(t,`run_id`),workflowType:w(t,`workflow_type`),status:T(t,`status`),startTime:w(t,`start_time`),closeTime:T(t,`close_time`)}}),nextCursor:T(t,`next_page_token`)}}function ze(e){let t=b(e,`workflow run detail`),n=pt(t,`artifact_identity`),r=pt(t,`execution_configuration`),i=pt(t,`continuation`),a=pt(t,`failure`);return{workflowId:w(t,`workflow_id`),runId:w(t,`run_id`),workflowType:w(t,`workflow_type`),status:T(t,`status`),startTime:w(t,`start_time`),closeTime:T(t,`close_time`),logicalWorkflow:T(t,`logical_workflow`),definitionDigest:T(t,`definition_digest`),deploymentName:E(n,`deployment_name`),buildId:E(n,`build_id`),artifactDigest:E(n,`artifact_digest`),configurationRevisionId:E(r,`configuration_revision_id`),triggerSource:T(t,`trigger_source`),pendingWaits:S(t,`pending_waits`).map(e=>{let t=b(e,`pending wait`);return{kind:w(t,`kind`),state:w(t,`state`)}}),pendingWaitsTruncated:D(t,`pending_waits_truncated`),firstRunId:E(i,`first_run_id`),nextRunId:ht(i,`next_run_id`),failureCode:E(a,`code`),failureCauseCode:ht(a,`cause_code`),failureCategory:ht(a,`category`),failurePhase:ht(a,`phase`),failureRetryable:gt(a,`retryable`),failedStep:ht(a,`step`)}}function Be(e){let t=b(e,`workflow registrations`);return{workflows:S(t,`workflows`).map(e=>{let t=b(e,`workflow registration`);return{logicalWorkflow:w(t,`logical_workflow`),activeDefinitionDigest:w(t,`active_definition_digest`),retainedDefinitionCount:O(t,`retained_definition_count`)}}),nextCursor:T(t,`next_cursor`)}}function Ve(e){let t=b(e,`workflow detail`);return{logicalWorkflow:w(t,`logical_workflow`),activeDefinitionDigest:w(t,`active_definition_digest`),retainedDefinitionCount:O(t,`retained_definition_count`),requiredEngineWorkflowAbi:w(t,`required_engine_workflow_abi`),description:w(t,`description`),graphNodes:S(t,`graph_nodes`).map(e=>{let t=b(e,`workflow graph node`);return{nodeId:w(t,`node_id`),label:w(t,`label`),kind:w(t,`kind`),group:T(t,`group`),metadata:mt(t,`metadata`)}}),graphEdges:S(t,`graph_edges`).map(e=>{let t=b(e,`workflow graph edge`);return{source:w(t,`source`),target:w(t,`target`),label:T(t,`label`),dashed:D(t,`dashed`)}}),definitions:S(t,`definitions`).map(e=>{let t=b(e,`workflow definition`);return{logicalWorkflow:w(t,`logical_workflow`),definitionDigest:w(t,`definition_digest`),active:D(t,`active`)}}),serviceDependencies:S(t,`service_dependencies`).map(e=>{let t=b(e,`service dependency`);return{service:w(t,`service`),actions:S(t,`actions`).map(e=>C(e,`service dependency action`))}}),resourceDependencies:S(t,`resource_dependencies`).map(e=>C(e,`resource dependency`)),hasInputContract:D(t,`has_input_contract`),hasOutputContract:D(t,`has_output_contract`),inputSchema:t.input_schema===null?null:x(t,`input_schema`),referencedGlobals:S(t,`referenced_globals`).map(e=>C(e,`referenced global`)),stepBindings:S(t,`step_bindings`).map(e=>{let t=b(e,`workflow step binding`);return{operation:w(t,`operation`),service:T(t,`service`),action:T(t,`action`),subworkflow:T(t,`subworkflow`),resources:S(t,`resources`).map(e=>C(e,`step binding resource`))}}),archival:He(t)}}function He(e){if(e.archival===null||e.archival===void 0)return null;let t=x(e,`archival`);return{resource:w(t,`resource`),retentionPolicy:w(t,`retention_policy`)}}function Ue(e){let t=b(e,`workflow definition document`);return{logicalWorkflow:w(t,`logical_workflow`),definitionDigest:w(t,`definition_digest`),document:w(t,`document`)}}function We(e){return S(b(e,`triggers`),`triggers`).map(e=>{let t=b(e,`trigger`),n=t.schedule===null?null:x(t,`schedule`);return{name:w(t,`name`),kind:k(t,`kind`,Se),state:k(t,`state`,Ce),workflowName:w(t,`workflow_name`),desiredDigest:n===null?null:w(n,`desired_digest`),definitionDigest:n===null?null:w(n,`definition_digest`),overlapPolicy:n===null?null:w(n,`overlap_policy`),nextRunTimes:n===null?[]:S(n,`next_run_times`).map(e=>C(e,`schedule-trigger next-run time`)),lastAction:n===null?null:Ge(n)}})}function Ge(e){let t=S(e,`recent_actions`),n=t[t.length-1];if(n===void 0)return null;let r=b(n,`schedule recent action`);return{startedAt:w(r,`started_at`),outcome:w(r,`outcome`),workflowId:w(r,`workflow_id`),runId:w(r,`run_id`)}}function Ke(e){let t=b(e,`configuration view`),n=t.active===null?null:b(t.active,`active revision`),r=x(t,`revisions`);return{activeRevisionId:n===null?null:w(n,`revision_id`),revisionsNextCursor:T(r,`next_cursor`),revisions:S(r,`revisions`).map(e=>{let t=b(e,`revision`);return{revisionId:w(t,`revision_id`),parentRevisionId:T(t,`parent_revision_id`),createdAt:w(t,`created_at`)}})}}function qe(e){let t=x(b(e,`activations view`),`activations`);return{activations:S(t,`activations`).map(e=>{let t=b(e,`activation`);return{activationId:w(t,`activation_id`),targetRevisionId:w(t,`target_revision_id`),state:xt(t,`state`),updatedAt:w(t,`updated_at`)}}),nextCursor:T(t,`next_cursor`)}}function Je(e){return x(b(e,`configuration schema response`),`schema_document`)}function Ye(e){let t=b(e,`authoring reference`),n=x(t,`dimension`);return{availability:k(n,`availability`,be),unavailableReason:T(n,`reason`),authority:k(t,`authority`,ye),catalogRevision:T(t,`catalog_revision`),components:S(t,`components`).map(Xe),services:S(t,`services`).map(e=>{let t=b(e,`authoring reference service`);return{name:w(t,`name`),description:T(t,`description`),actions:S(t,`actions`).map(e=>{let t=b(e,`authoring reference action`);return{name:w(t,`name`),workflows:S(t,`workflows`).map(e=>C(e,`authoring reference action workflow`)),inputSchema:t.input_schema===null?null:x(t,`input_schema`),inputContractIdentity:T(t,`input_contract_identity`),outputSchema:t.output_schema===null?null:x(t,`output_schema`),outputContractIdentity:T(t,`output_contract_identity`),contractConflict:D(t,`contract_conflict`)}})}}),resources:S(t,`resources`).map(e=>{let t=b(e,`authoring reference resource`);return{name:w(t,`name`),description:T(t,`description`),capabilities:S(t,`capabilities`).map(e=>C(e,`resource capability`))}}),triggerBindings:S(t,`trigger_bindings`).map(e=>{let t=b(e,`authoring reference trigger binding`);return{name:w(t,`name`),kind:w(t,`kind`)}}),truncated:D(t,`truncated`)}}function Xe(e){let t=b(e,`authoring reference component`);return{kind:k(t,`kind`,xe),name:w(t,`name`),version:w(t,`version`),description:T(t,`description`),action:T(t,`action`),capabilities:S(t,`capabilities`).map(e=>C(e,`component capability`)),parameterSchema:t.parameter_schema===null?null:x(t,`parameter_schema`),parameterContractIdentity:T(t,`parameter_contract_identity`),inputSchema:t.input_schema===null?null:x(t,`input_schema`),inputContractIdentity:T(t,`input_contract_identity`),outputSchema:t.output_schema===null?null:x(t,`output_schema`),outputContractIdentity:T(t,`output_contract_identity`),resourceSlots:S(t,`resource_slots`).map(e=>{let t=b(e,`component resource slot`);return{name:w(t,`name`),capability:w(t,`capability`)}})}}function Ze(e){let t=b(e,`workflow fragment preview`);if(t.draft_validated!==!1)throw TypeError(`Fragment previews must state that the draft is not validated`);let n=S(t,`diagnostics`).map(e=>{let t=b(e,`preview diagnostic`);return{severity:k(t,`severity`,ve),category:w(t,`category`),location:S(t,`location`).map(e=>C(e,`preview diagnostic location`)),message:w(t,`message`)}}),r=w(t,`status`);if(r===`invalid_fragment`)return{status:r,draftValidated:!1,diagnostics:n};if(r!==`graph_ready`)throw TypeError(`Fragment preview status is unsupported`);return{status:r,draftValidated:!1,diagnostics:n,graphNodes:S(t,`graph_nodes`).map(e=>{let t=b(e,`preview graph node`);return{nodeId:w(t,`node_id`),label:w(t,`label`),kind:w(t,`kind`),group:T(t,`group`),metadata:mt(t,`metadata`)}}),graphEdges:S(t,`graph_edges`).map(e=>{let t=b(e,`preview graph edge`);return{source:w(t,`source`),target:w(t,`target`),label:T(t,`label`),dashed:D(t,`dashed`)}})}}function Qe(e){let t=b(e,`workflow fragment`);return{workflow:w(t,`workflow`),version:O(t,`version`),document:w(t,`document`)}}function $e(e){let t=b(e,`triggers fragment`);return{version:O(t,`version`),document:w(t,`document`)}}function et(e){let t=b(e,`configuration draft`);return{version:O(t,`version`),bundle:x(t,`bundle`),restartRequired:typeof t.restart_required==`boolean`&&t.restart_required}}function tt(e){let t=b(e,`configuration relationships`);return{workingVersion:O(t,`working_version`),activeIdentity:T(t,`active_identity`),relationships:S(t,`relationships`).map(e=>{let t=b(e,`configuration relationship`);return{kind:k(t,`kind`,me),name:w(t,`name`),state:k(t,`state`,he)}}),restartRequired:D(t,`restart_required`)}}function nt(e){let t=b(e,`local configuration apply result`);if(t.mode!==`local_source`||t.running_process_changed!==!1)throw TypeError(`Local Apply result has an unsupported runtime outcome`);return{mode:`local_source`,workingVersion:O(t,`working_version`),stages:S(t,`stages`).map(e=>{let t=b(e,`configuration Apply stage`);return{kind:k(t,`kind`,ge),state:k(t,`state`,_e)}}),definitionsPublished:D(t,`definitions_published`),restartRequired:D(t,`restart_required`),runningProcessChanged:!1}}function rt(e){let t=b(e,`configuration discard result`);if(t.running_process_changed!==!1)throw TypeError(`Discard result has an unsupported runtime outcome`);return{discardId:w(t,`discard_id`),workingVersion:O(t,`working_version`),activeIdentity:w(t,`active_identity`),restartRequired:D(t,`restart_required`),runningProcessChanged:!1}}function it(e){let t=b(e,`validation report`);return{valid:D(t,`valid`),issues:S(t,`issues`).map(e=>{let t=b(e,`validation issue`);return{severity:k(t,`severity`,ve),category:w(t,`category`),location:S(t,`location`).map(e=>C(e,`validation issue location`)),message:w(t,`message`)}})}}function at(e){return{publishedRevisionId:T(b(e,`publication`),`published_revision_id`)}}function ot(e){let t=b(e,`activation plan`);return{planDigest:w(t,`plan_digest`),expectedActiveRevisionId:T(t,`expected_active_revision_id`)}}function st(e){let t=b(e,`activation`);return{activationId:w(t,`activation_id`),state:xt(t,`state`),plan:ot(x(t,`plan`))}}function ct(e){let t=b(e,`activation readiness`);return{activationId:w(t,`activation_id`),ready:D(t,`ready`),state:xt(t,`state`),targetRevisionId:w(t,`target_revision_id`),workerReadinessRegistered:D(t,`worker_readiness_registered`),completedCheckpoints:S(t,`completed_checkpoints`).map(e=>C(e,`activation readiness checkpoint`))}}function lt(e){return{items:S(b(e,`configuration difference`),`items`).map(e=>{let t=b(e,`difference item`);return{operation:w(t,`operation`),path:S(t,`path`).map(e=>C(e,`difference path`))}})}}function ut(e){let t=b(e,`revision record`);return{revisionId:w(t,`revision_id`),parentRevisionId:T(t,`parent_revision_id`),createdAt:w(t,`created_at`),bundle:x(t,`bundle`)}}function dt(e,t){if(typeof e==`object`&&e){let t=Reflect.get(e,`error`);if(typeof t==`object`&&t){let e=Reflect.get(t,`message`);if(typeof e==`string`&&e.length>0)return e}}return`Request failed (${t})`}function ft(e){if(typeof e==`object`&&e){let t=Reflect.get(e,`error`);if(typeof t==`object`&&t){let e=Reflect.get(t,`code`);if(typeof e==`string`&&e.length>0)return e}}return null}function b(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`${t} must be an object`);return e}function x(e,t){return b(e[t],t)}function pt(e,t){let n=e[t];return n===null?null:b(n,t)}function S(e,t){let n=e[t];if(!Array.isArray(n))throw TypeError(`${t} must be an array`);return n}function mt(e,t){let n=x(e,t),r={};for(let[e,i]of Object.entries(n))r[e]=C(i,`${t}.${e}`);return r}function C(e,t){if(typeof e!=`string`)throw TypeError(`${t} must be a string`);return e}function w(e,t){return C(e[t],t)}function T(e,t){let n=e[t];return n===null?null:C(n,t)}function E(e,t){return e===null?null:w(e,t)}function ht(e,t){return e===null?null:T(e,t)}function D(e,t){let n=e[t];if(typeof n!=`boolean`)throw TypeError(`${t} must be a boolean`);return n}function gt(e,t){return e===null||e[t]===null?null:D(e,t)}function O(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw TypeError(`${t} must be a safe integer`);return n}function _t(e,t){return e[t]===null?null:O(e,t)}function k(e,t,n){let r=w(e,t);if(!n.some(e=>e===r))throw TypeError(`${t} has an unsupported value`);return r}function vt(e,t){let n=w(e,t),r=new URL(n);if(!le.has(r.protocol)||r.username.length>0||r.password.length>0||r.search.length>0||r.hash.length>0)throw TypeError(`${t} must be a credential-free HTTP(S) URL`);return n}function yt(e,t){let n=w(e,t);if(!St(ue,n))throw TypeError(`${t} must be a known runtime component`);return n}function bt(e,t){let n=w(e,t);if(!St(de,n))throw TypeError(`${t} must be a known health status`);return n}function xt(e,t){let n=w(e,t);if(!St(fe,n))throw TypeError(`${t} must be a known activation state`);return n}function St(e,t){return e.some(e=>e===t)}var Ct=class extends Error{status;code;constructor(e,t,n){super(e),this.status=t,this.code=n}},wt=20,A=`/v1/operations`,Tt=`/v1/configuration`,j=`${Tt}/draft`,Et=`${Tt}/activations`,Dt=class{#e;constructor(e=globalThis.fetch.bind(globalThis)){this.#e=e}capabilities(){return this.#i(`${A}/capabilities`,{},Me)}overview(){return this.#i(A,{},Le)}workflowRegistrations(e=null){return this.#i(`${A}/workflows?${Ot(wt,e)}`,{},Be)}workflowDetail(e){return this.#i(`${A}/workflows/${encodeURIComponent(e)}`,{},Ve)}runs(e,t,n=null,r=null){let i=new URLSearchParams({limit:String(t),scope:`current`});return e!==null&&i.set(`state`,e),n!==null&&i.set(`cursor`,n),r!==null&&i.set(`workflow`,r),this.#i(`${A}/runs?${i.toString()}`,{},Re)}workflowDefinition(e){return this.#i(`${A}/workflows/${encodeURIComponent(e)}/definition`,{},Ue)}runDetail(e,t){let n=new URLSearchParams({run_id:t});return this.#i(`${A}/runs/${encodeURIComponent(e)}?${n.toString()}`,{},ze)}startWorkflow(e,t,n){return this.#i(`/v1/workflows`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({workflow_name:e,business_request_id:t,input:n,correlation_id:t})},je)}scheduleWorkflow(e,t,n,r,i,a){return this.#i(`/v1/scheduled-starts`,{method:`POST`,headers:{"content-type":`application/json`,"x-idempotency-key":a},body:JSON.stringify({workflow_name:e,business_request_id:t,input:n,start_at:r,workload_class:i})},Fe)}scheduledStarts(e=[],t=null){let n=new URLSearchParams({limit:String(wt)});for(let t of e)n.append(`state`,t);return t!==null&&n.set(`cursor`,t),this.#i(`${A}/scheduled-starts?${n.toString()}`,{},Ne)}scheduledStart(e){return this.#i(`${A}/scheduled-starts/${encodeURIComponent(e)}`,{},Pe)}rescheduleScheduledStart(e,t,n,r){return this.#r(e,`reschedule`,{start_at:t,expected_version:n},r)}cancelScheduledStart(e,t,n){return this.#r(e,`cancel`,{expected_version:t},n)}async signalWorkflow(e,t,n,r){let i=new URLSearchParams({run_id:t});await this.#a(`/v1/workflows/${encodeURIComponent(e)}/events/${encodeURIComponent(n)}?${i.toString()}`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:r})})}async cancelRun(e,t){await this.#t(e,t,`cancel`)}async terminateRun(e,t){await this.#t(e,t,`terminate`)}triggers(){return this.#i(`${A}/triggers`,{},We)}async pauseTrigger(e){await this.#n(e,`pause`,{})}async resumeTrigger(e){await this.#n(e,`resume`,{})}async runTrigger(e,t){await this.#n(e,`run`,{headers:{"x-idempotency-key":t},body:``})}async deleteTrigger(e,t){await this.#n(e,`delete`,{headers:{"content-type":`application/json`},body:JSON.stringify({confirmation:t})})}configuration(e=null){return this.#i(`${A}/configuration?${Ot(wt,e)}`,{},Ke)}activations(e=null){return this.#i(`${A}/activations?${Ot(wt,e)}`,{},qe)}authoringReference(){return this.#i(`${A}/authoring-reference`,{},Ye)}configurationSchema(){return this.#i(`${A}/configuration-schema`,{},Je)}draft(){return this.#i(j,{},et)}async draftYaml(e){let t=e===void 0?``:`?expected_version=${e}`;return(await this.#a(`${j}/export${t}`,{})).text()}saveJsonDraft(e,t){let n=t?{expected_version:t.version,configuration:e}:{configuration:e};return this.#i(j,{method:t?`PUT`:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n)},et)}saveYamlDraft(e,t){let n=t?`?expected_version=${t.version}`:``;return this.#i(`${j}/import${n}`,{method:`POST`,headers:{"content-type":`application/yaml`},body:e},et)}workflowFragment(e){return this.#i(`${j}/workflows/${encodeURIComponent(e)}`,{},Qe)}triggersFragment(){return this.#i(`${j}/triggers`,{},$e)}saveTriggersFragment(e,t){return this.#i(`${j}/triggers?expected_version=${t}`,{method:`PUT`,headers:{"content-type":`application/yaml`},body:e},et)}saveWorkflowFragment(e,t,n){return this.#i(`${j}/workflows/${encodeURIComponent(e)}?expected_version=${n}`,{method:`PUT`,headers:{"content-type":`application/yaml`},body:t},et)}previewWorkflowFragment(e,t,n){let r={method:`POST`,headers:{"content-type":`application/yaml`},body:t};return n!==void 0&&(r.signal=n),this.#i(`${j}/workflows/${encodeURIComponent(e)}/preview`,r,Ze)}deleteWorkflowFragment(e,t){return this.#i(`${j}/workflows/${encodeURIComponent(e)}?expected_version=${t}`,{method:`DELETE`,body:``},et)}validateDraft(){return this.#i(`${j}/validate`,{method:`POST`,body:``},it)}configurationRelationships(){return this.#i(`${Tt}/relationships`,{},tt)}applyLocalConfiguration(e,t){return this.#i(`${Tt}/apply`,{method:`POST`,headers:t,body:JSON.stringify({expected_draft_version:e})},nt)}discardConfiguration(e,t,n){return this.#i(`${j}/discard`,{method:`POST`,headers:n,body:JSON.stringify({expected_draft_version:e,expected_active_identity:t})},rt)}publishDraft(e,t){return this.#i(`${Tt}/publications`,{method:`POST`,headers:t,body:JSON.stringify({expected_draft_version:e})},at)}planActivation(e){return this.#i(`${Et}/plan`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({target_revision_id:e})},ot)}activate(e,t,n){return this.#i(Et,{method:`POST`,headers:n,body:JSON.stringify({target_revision_id:e,plan_digest:t})},st)}activation(e){return this.#i(`${Et}/${encodeURIComponent(e)}`,{},st)}activationReadiness(e){return this.#i(`${Et}/${encodeURIComponent(e)}/readiness`,{},ct)}rollback(e,t,n){return this.#i(`${Et}/${encodeURIComponent(e)}/rollback`,{method:`POST`,headers:n,body:JSON.stringify({plan_digest:t})},st)}revision(e){return this.#i(`${Tt}/revisions/${encodeURIComponent(e)}`,{},ut)}difference(e,t){let n=new URLSearchParams({source_revision_id:e,target_revision_id:t});return this.#i(`${Tt}/revisions/compare?${n.toString()}`,{},lt)}async#t(e,t,n){let r=new URLSearchParams({run_id:t});await this.#a(`/v1/workflows/${encodeURIComponent(e)}/${n}?${r.toString()}`,{method:`POST`,body:``})}async#n(e,t,n){await this.#a(`/v1/triggers/${encodeURIComponent(e)}/${t}`,{method:`POST`,...n})}#r(e,t,n,r){return this.#i(`/v1/scheduled-starts/${encodeURIComponent(e)}/${t}`,{method:`POST`,headers:{"content-type":`application/json`,"x-idempotency-key":r},body:JSON.stringify(n)},Fe)}async applyTriggers(){await this.#a(`/v1/triggers/apply`,{method:`POST`,body:``})}async#i(e,t,n){return n(await(await this.#a(e,t)).json())}async#a(e,t){let n=await this.#e(e,{credentials:`same-origin`,cache:`no-store`,...t});if(n.ok)return n;let r=(n.headers.get(`content-type`)??``).includes(`json`)?await n.json():await n.text();throw new Ct(dt(r,n.status),n.status,ft(r))}};function Ot(e,t){let n=new URLSearchParams({limit:String(e)});return t!==null&&n.set(`cursor`,t),n.toString()}var M=new Dt;function kt(){let e=crypto.randomUUID();return{"content-type":`application/json`,"x-correlation-id":e,"x-idempotency-key":e}}var At=null;function jt(e){At=e}function N(){return At}var Mt=()=>Promise.resolve();function Nt(e){Mt=e}function P(){return Mt()}var Pt=[`overview`,`workflows`,`workflow`,`workflow-editor`,`runs`,`triggers`,`editor`,`components`,`releases`,`system`],Ft=`/admin/workflows/`,It=`/admin/editor/workflows/`,Lt=[`overview`,`definition`,`runs`,`triggers`];function Rt(){let e=new URLSearchParams(window.location.search).get(`tab`)??`overview`;return Lt.some(t=>t===e)?e:`overview`}function zt(e){return Pt.some(t=>t===e)}function F(e,t=!0,n=null){for(let t of document.querySelectorAll(`[data-panel]`))t.hidden=t.dataset.panel!==e;for(let t of document.querySelectorAll(`[data-view]`)){let n=t.dataset.view===e||e===`workflow`&&t.dataset.view===`workflows`||e===`workflow-editor`&&t.dataset.view===`editor`;t.classList.toggle(`is-active`,n),n?t.setAttribute(`aria-current`,`page`):t.removeAttribute(`aria-current`)}let r=document.getElementById(`current-view-label`);if(r!==null&&(r.textContent=(e===`workflow`||e===`workflow-editor`)&&n!==null?n:`${e[0]?.toUpperCase()}${e.slice(1)}`),t){let t=`/admin/#${e}`;if(e===`workflow`&&n!==null){t=`${Ft}${encodeURIComponent(n)}`;let e=Rt();e!==`overview`&&window.location.pathname===t&&(t=`${t}?tab=${e}`)}else e===`workflow-editor`&&n!==null&&(t=`${It}${encodeURIComponent(n)}`);window.history.pushState(null,``,t)}}function Bt(){if(window.location.pathname.startsWith(`/admin/editor/workflows/`))return`workflow-editor`;if(window.location.pathname.startsWith(`/admin/workflows/`))return`workflow`;let e=window.location.hash.slice(1);return zt(e)?e:`workflows`}function Vt(e,t){let n=`${Ft}${encodeURIComponent(e)}`;window.history.pushState(null,``,t===`overview`?n:`${n}?tab=${t}`)}function Ht(){let e=window.location.pathname,t=e.startsWith(`/admin/editor/workflows/`)?It:e.startsWith(`/admin/workflows/`)?Ft:null;if(t===null)return null;let n=e.slice(t.length);if(n.length===0||n.includes(`/`))return null;try{return decodeURIComponent(n)}catch{return null}}var Ut=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Wt=function(e){return`/admin/`+e},Gt={},Kt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Wt(t,n),t=s(t),t in Gt)return;Gt[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Ut,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function qt(e,t){let n=o(e);try{let{mountCodeMirror:e}=await Kt(async()=>{let{mountCodeMirror:e}=await import(`./codemirror-editor-BU3Ai44g.js`);return{mountCodeMirror:e}},[]);return e(n,t)}catch{return n.addEventListener(`input`,t),Jt(n)}}function Jt(e){return{value:()=>e.value,setValue:t=>{e.value=t},setReadOnly:t=>{e.readOnly=t},focus:()=>e.focus()}}var Yt=`stale_cursor`,Xt=class{#e=[];#t=null;#n;constructor(e){this.#n=e}get items(){return this.#e}get hasMore(){return this.#t!==null}async reload(){let e=await this.#n(null);this.#e=e.items,this.#t=e.nextCursor}async loadMore(){if(this.#t===null)return`complete`;try{let e=await this.#n(this.#t);return this.#e=[...this.#e,...e.items],this.#t=e.nextCursor,`appended`}catch(e){if(e instanceof Ct&&e.code===Yt)return await this.reload(),`reset`;throw e}}},Zt=`The list changed on the server while paging; it was reloaded from the first page.`,Qt=3,$t=4,en=`release-status`,tn=null,nn=null,rn=!1,an=new Xt(async e=>{let t=await M.configuration(e);return tn=t.activeRevisionId,{items:t.revisions,nextCursor:t.revisionsNextCursor}}),on=new Xt(async e=>{let t=await M.activations(e);return{items:t.activations,nextCursor:t.nextCursor}});function sn(){return rn}function cn(e){nn=e}function ln(e){F(`releases`),tn!==null&&(i(`diff-source`).value=tn),i(`diff-target`).value=e,i(`activation-target`).value=e,I(`Review the comparison against the active revision before activating.`,``)}async function un(){await Promise.all([an.reload(),on.reload()]),mn()}async function dn(){await pn(an,`load-more-revisions`)}async function fn(){await pn(on,`load-more-activations`)}async function pn(e,t){let r=n(t);r.disabled=!0;try{await e.loadMore()===`reset`&&window.alert(Zt),mn()}catch(e){window.alert(_(e))}finally{r.disabled=!1}}function I(e,t){se(en,e,t)}function mn(){t(`active-revision`).textContent=tn===null?`No active revision`:`Active ${h(tn)}`,_n(an.items),hn(an.items),gn(on.items)}function hn(e){let r=t(`revision-list`);if(n(`load-more-revisions`).hidden=!an.hasMore,c(r),e.length===0){d(r,Qt,`No published revisions are available.`);return}for(let t of e){let e=document.createElement(`tr`);e.className=`interactive-row`,e.addEventListener(`click`,()=>void xn(t.revisionId)),f(e,h(t.revisionId),`mono`),f(e,g(t.createdAt)),f(e,t.parentRevisionId===null?`Initial`:h(t.parentRevisionId),`mono`),r.appendChild(e)}}function gn(e){let r=t(`activation-list`);if(n(`load-more-activations`).hidden=!on.hasMore,c(r),e.length===0){d(r,$t,`No activation history is available.`);return}for(let t of e){let e=document.createElement(`tr`);e.className=`interactive-row`,e.addEventListener(`click`,()=>void Sn(t)),f(e,h(t.targetRevisionId),`mono`),p(e,v(t.state,Dn(t.state))),f(e,g(t.updatedAt));let n=document.createElement(`div`);if(n.className=`row-actions`,N()?.configuration_rollback&&t.state===`applied`){let e=u(`Rollback`,`row-action`);e.addEventListener(`click`,()=>void yn(t.activationId)),n.appendChild(e)}p(e,n),r.appendChild(e)}}function _n(e){for(let t of[i(`activation-target`),i(`diff-source`),i(`diff-target`)]){c(t);for(let n of e){let e=document.createElement(`option`);e.value=n.revisionId;let r=n.revisionId===tn?` · active`:``;e.textContent=`${h(n.revisionId)} — ${g(n.createdAt)}${r}`,t.appendChild(e)}}nn!==null&&(i(`activation-target`).value=nn)}async function vn(){let e=i(`activation-target`).value;if(e.length===0){I(`Select or publish a revision before activation.`,`is-error`);return}try{let t=await M.planActivation(e),n=await M.activate(e,t.planDigest,kt());I(`Activation is ${n.state}.`,En(n.state)),await P()}catch(e){I(_(e),`is-error`)}}async function yn(e){try{let t=(await M.activation(e)).plan.expectedActiveRevisionId;if(t===null)throw Error(`This activation has no retained predecessor revision.`);let n=await M.planActivation(t),r=await M.rollback(e,n.planDigest,kt());I(`Rollback activation is ${r.state}.`,En(r.state)),await P()}catch(e){I(_(e),`is-error`)}}var bn=1e3;async function xn(e){try{let n=await M.revision(e);t(`revision-inspector-note`).textContent=`Revision ${h(n.revisionId)} · created ${g(n.createdAt)} · parent ${n.parentRevisionId===null?`initial`:h(n.parentRevisionId)}.`,t(`revision-document`).textContent=JSON.stringify(n.bundle,null,2),t(`revision-inspector`).hidden=!1}catch(e){I(_(e),`is-error`)}}async function Sn(e){try{let n=await M.activation(e.activationId),r=t(`activation-inspector-fields`);c(r);let i=[[`State`,n.state],[`Target revision`,h(e.targetRevisionId)],[`Plan digest`,h(n.plan.planDigest)],[`Expected active revision`,n.plan.expectedActiveRevisionId===null?`None (initial activation)`:h(n.plan.expectedActiveRevisionId)],[`Updated`,g(e.updatedAt)]];for(let[e,t]of i){let n=document.createElement(`div`);n.className=`metadata-field`,n.append(l(`span`,e),l(`strong`,t)),r.appendChild(n)}t(`activation-inspector-note`).textContent=n.state===`waiting_for_readiness`?`Waiting for required workers and definitions to become ready before the active pointer moves.`:`Observed state for one activation operation.`,t(`activation-inspector`).hidden=!1}catch(e){I(_(e),`is-error`)}}function Cn(e){let n=t(`diff-items`);if(c(n),e.length===0){d(n,2,`No differences between the selected revisions.`);return}for(let t of e){let e=document.createElement(`tr`);p(e,v(t.operation,t.operation)),f(e,t.path.join(`.`),`mono`),n.appendChild(e)}}async function wn(){let e=i(`diff-source`).value,n=i(`diff-target`).value;if(e.length===0||n.length===0){I(`Two revisions are required for comparison.`,`is-error`);return}try{let[r,i,a]=await Promise.all([M.difference(e,n),M.revision(e),M.revision(n)]);Cn(r.items),t(`compare-note`).textContent=r.items.length>=bn?`Showing the first ${bn} bounded changes — the comparison was truncated.`:`${r.items.length} bounded change(s) between the selected revisions.`,t(`diff-source-label`).textContent=`From ${h(e)} — ${g(i.createdAt)}`,t(`diff-target-label`).textContent=`To ${h(n)} — ${g(a.createdAt)}`,t(`diff-source-doc`).textContent=JSON.stringify(i.bundle,null,2),t(`diff-target-doc`).textContent=JSON.stringify(a.bundle,null,2),t(`compare-result`).hidden=!1,t(`diff-result`).textContent=``}catch(e){I(_(e),`is-error`)}}function Tn(e){rn=e.configuration_mode===`managed`&&e.configuration_view,t(`nav-releases`).hidden=!rn,n(`activate-revision`).disabled=!e.configuration_activate,n(`compare-revisions`).disabled=!e.configuration_view}function En(e){return e===`applied`||e===`rolled_back`?`is-success`:e===`failed`||e===`superseded`?`is-error`:``}function Dn(e){return e===`running`?`running-activation`:e}var On=class{#e=0;#t=0;#n=0;#r=!1;get dirty(){return this.#t!==this.#n}edit(){this.#t+=1}beginLoad(){return this.#r?null:(this.#e+=1,{generation:this.#e,revision:this.#t})}acceptLoad(e){return!this.current(e)||e.revision!==this.#t?!1:(this.#n=this.#t,!0)}beginSave(){let e=this.beginLoad();return e!==null&&(this.#r=!0),e}acceptSave(e){return this.current(e)?(this.#n=e.revision,!0):!1}finishSave(){this.#r=!1}current(e){return e.generation===this.#e}},kn=`Discard unsaved changes and reload the saved configuration?`,An=`Discard all saved changes that are pending Apply and restore the active configuration?`,L=null,jn=null,R=null,z=new On,Mn=!1,Nn=null,Pn=()=>[],Fn=e=>fr(`workflow`,e);function In(e){Pn=e}function Ln(e){Fn=e}function Rn(){z.edit()}var zn=[`workflows`,`triggers`,`document`];function Bn(e){return zn.some(t=>t===e)}function Vn(e){for(let t of document.querySelectorAll(`[data-draft-panel]`))t.hidden=t.dataset.draftPanel!==e;for(let t of document.querySelectorAll(`[data-draft-tab]`)){let n=t.dataset.draftTab===e;t.classList.toggle(`is-active`,n),t.setAttribute(`aria-pressed`,String(n))}}function Hn(){if(Nn===null){let e=o(`configuration-editor`);e.addEventListener(`input`,Rn),Nn=Jt(e)}return Nn}async function Un(){Hn(),Nn=await qt(`configuration-editor`,Rn),Nn.setReadOnly(Mn)}var Wn=null,Gn=null,B=new On;function Kn(){B.edit()}function qn(){if(Wn===null){let e=o(`schedules-editor`);e.addEventListener(`input`,Kn),Wn=Jt(e)}return Wn}async function Jn(){qn(),Wn=await qt(`schedules-editor`,Kn),Wn.setReadOnly(Mn)}async function Yn(e=!1){if(B.dirty&&!e)return;let t=B.beginLoad();if(t!==null)try{let e=await M.triggersFragment();if(!B.acceptLoad(t))return;Gn=e.version,qn().setValue(e.document)}catch(e){if(!B.current(t))return;y(_(e),`is-error`)}}async function Xn(){if(Gn===null){y(`Reload the triggers before saving.`,`is-error`);return}let e=B.beginSave();if(e!==null)try{L=await M.saveTriggersFragment(qn().value(),Gn),Gn=L.version,B.acceptSave(e),R=await Er(L.version),V(),cr(),ir(),y(B.dirty?`Saved triggers. Newer edits are still unsaved.`:`Saved triggers.`,`is-success`),await P()}catch(e){y(_(e),`is-error`)}finally{B.finishSave()}}function Zn(){return z.dirty||B.dirty}var Qn=6,$n=6,er=96;function tr(e){return e.length>er?`${e.slice(0,er)}…`:e}function nr(e){return H(e)?Array.isArray(e.flow)?String(e.flow.length):H(e.steps)?String(Object.keys(e.steps).length):`—`:`—`}function rr(e){return H(e)?e.kind===`cron`&&Array.isArray(e.expressions)?e.expressions.filter(e=>typeof e==`string`).join(`, `):e.kind===`interval`&&typeof e.every_seconds==`number`?`every ${e.every_seconds}s`:e.kind===`calendar`?`calendar`:`—`:`—`}function ir(){let e=t(`editor-workflow-list`);c(e);let n=L?.bundle.workflows,r=L===null?null:jr(L.bundle),i=H(r)?Object.entries(r):[],a=Array.from(new Set([...H(n)?Object.keys(n):[],...ar(`workflow`)])).sort();a.length===0&&d(e,Qn,`No workflows are declared yet. Create the first one.`);for(let t of a){let r=H(n)?n[t]:null,a=i.filter(e=>H(e[1])&&e[1].workflow===t).length,o=document.createElement(`tr`);if(o.className=`interactive-row`,f(o,t,`cell-primary`),p(o,or(`workflow`,t)),f(o,nr(r)),f(o,a>0?String(a):`—`),f(o,H(r)&&typeof r.description==`string`?tr(r.description.trim()):`—`),H(r)){let e=document.createElement(`button`);e.className=`text-button`,e.type=`button`,e.textContent=`Open`,e.addEventListener(`click`,()=>void Fn(t)),p(o,e),o.addEventListener(`click`,n=>{n.target!==e&&Fn(t)})}else p(o,l(`span`,`—`));e.appendChild(o)}let o=t(`editor-schedule-list`);c(o);let s=Array.from(new Set([...i.map(e=>e[0]),...ar(`trigger`)])).sort();s.length===0&&d(o,$n,`No triggers are declared.`);for(let e of s){let t=H(r)?r[e]:null,n=document.createElement(`tr`);if(f(n,e,`cell-primary`),p(n,or(`trigger`,e)),f(n,H(t)&&typeof t.workflow==`string`?t.workflow:`—`),f(n,H(t)&&H(t.component)?`${String(t.component.name??`—`)}@${String(t.component.version??`—`)}`:H(t)&&t.kind===`schedule`?`schedule · ${rr(t.spec)}`:H(t)&&typeof t.kind==`string`?t.kind:`—`,`mono`),H(t)){p(n,sr(e,t.paused!==!0));let r=document.createElement(`button`);r.className=`text-button`,r.type=`button`,r.textContent=`Edit`,r.addEventListener(`click`,()=>void fr(`schedule`,e)),p(n,r)}else p(n,l(`span`,`—`)),p(n,l(`span`,`—`));o.appendChild(n)}}function ar(e){return R?.relationships.filter(t=>t.kind===e&&t.state===`removed_pending_apply`).map(e=>e.name)??[]}function or(e,t){let n=R?.relationships.find(n=>n.kind===e&&n.name===t)?.state;return n===void 0?v(`Unavailable`,`unavailable`):v({active:`Active`,modified:`Modified`,new_pending_apply:`New · pending Apply`,removed_pending_apply:`Removed · pending Apply`}[n],n===`active`?`active`:`pending`)}function sr(e,t){if(N()?.configuration_edit!==!0)return v(t?`Active`:`Inactive`,t?`active`:`none`);let n=document.createElement(`select`);n.setAttribute(`aria-label`,`State of ${e}`);for(let[e,t]of[[`active`,`Active`],[`inactive`,`Inactive`]]){let r=document.createElement(`option`);r.value=e,r.textContent=t,n.appendChild(r)}n.value=t?`active`:`inactive`;let r=()=>{n.className=`state-select ${n.value===`active`?`is-active`:`is-inactive`}`};return r(),n.addEventListener(`change`,()=>{r(),gr(e,n.value===`active`)}),n}function cr(){let e=t(`restart-required`);e.hidden=N()?.configuration_mode!==`local_source`||L?.restartRequired!==!0}function lr(){let e=t(`validation-issues`);c(e),e.hidden=!0}function ur(e){dr(`validation-issues`,e)}function dr(e,n){let r=t(e);c(r),r.hidden=n.length===0;for(let e of n){let t=document.createElement(`div`);t.className=`validation-issue is-${e.severity}`,t.append(l(`span`,e.severity,`issue-severity is-${e.severity}`),l(`span`,e.category,`issue-category`),l(`code`,e.location.join(`.`)),l(`p`,e.message)),r.appendChild(t)}}async function fr(e,t){if(F(`editor`),!N()?.configuration_view){y(`Configuration editing is unavailable on this runtime host.`,`is-error`);return}if(await br(),e===`schedule`||e===`triggers`){Vn(`triggers`),await Yn(),qn().focus();return}Vn(`document`);let n=t===void 0?`schedule declarations`:`“${t}”`;y(Mr(e===`retire`?`Remove ${n}. Retained definitions and execution history will not be deleted.`:`Edit ${n}.`)),Hn().focus()}async function pr(e){if(!N()?.configuration_edit){F(`editor`),y(`Configuration editing is unavailable on this runtime host.`,`is-error`);return}if(window.confirm(`Retire “${e}” from future starts? Existing runs and retained definitions are not deleted.`))try{let t=await M.draft(),n=Dr(t.bundle),r=Or(n,`workflows`);if(!(e in r))throw Error(`The workflow is not present in the current draft.`);let i=jr(n),a=Object.entries(i).filter(([,t])=>kr(t,`workflow`)===e).map(([e])=>e);if(a.length>0)throw Error(`Remove dependent schedule declarations first: ${a.join(`, `)}.`);delete r[e],L=await M.saveJsonDraft(n,t),F(`editor`),await br(),y(Mr(`Retired ${e} from the draft.`),`is-success`)}catch(e){window.alert(_(e))}}function mr(){if(!N()?.configuration_edit){F(`editor`),y(`Configuration editing is unavailable on this runtime host.`,`is-error`);return}r(`workflow-name`).value=``,o(`workflow-description`).value=``,a(`workflow-dialog`).showModal(),r(`workflow-name`).focus()}async function hr(){let e=r(`workflow-name`).value.trim(),t=o(`workflow-description`).value.trim();try{let n=await M.draft(),r=Dr(n.bundle),i=Or(r,`workflows`);if(e in i)throw Error(`Workflow “${e}” already exists.`);i[e]={workflow:e,description:t,steps:{},flow:[{name:`done`,terminal:!0}]},L=await M.saveJsonDraft(r,n),a(`workflow-dialog`).close(),await Fn(e)}catch(e){window.alert(_(e))}}async function gr(e,t){try{let n=await M.draft(),r=Dr(n.bundle),i=jr(r)[e];if(!H(i))throw Error(`Schedule “${e}” is missing from the configuration.`);i.paused=!t,L=await M.saveJsonDraft(r,n),R=await Er(L.version),V(),cr(),ir(),y(Mr(`${t?`Enabled`:`Paused`} “${e}” in the working declaration.`),`is-success`),await P()}catch(e){window.alert(_(e))}}function _r(e){if(!N()?.configuration_edit){F(`editor`),y(`Configuration editing is unavailable on this runtime host.`,`is-error`);return}if(N()?.configuration_mode!==`local_source`){F(`editor`),Vn(`triggers`),y(`Managed triggers must select an approved immutable component in the Triggers YAML.`,`is-error`);return}let t=i(`schedule-workflow`);c(t);for(let e of Ar()){let n=document.createElement(`option`);n.value=e,n.textContent=e,t.appendChild(n)}e!==void 0&&(t.value=e),r(`schedule-name`).value=``,a(`schedule-dialog`).showModal(),r(`schedule-name`).focus()}async function vr(){let e=r(`schedule-name`).value.trim(),t=i(`schedule-workflow`).value,n=i(`schedule-kind`).value;try{let i=JSON.parse(o(`schedule-input`).value);if(!H(i))throw TypeError(`Workflow input must be a JSON object.`);let s=n===`cron`?{kind:`cron`,expressions:[r(`schedule-cron`).value.trim()]}:{kind:`interval`,every_seconds:Number(r(`schedule-interval`).value)},c=await M.draft(),l=Dr(c.bundle),u=jr(l);if(e in u)throw Error(`Schedule “${e}” already exists.`);u[e]={kind:`schedule`,workflow:t,input:i,spec:s,timezone:n===`interval`?`UTC`:r(`schedule-timezone`).value.trim(),overlap_policy:`skip`,paused:!1},L=await M.saveJsonDraft(l,c),a(`schedule-dialog`).close(),F(`editor`),await br(),y(Mr(`Added schedule ${e} to the draft.`),`is-success`)}catch(e){window.alert(_(e))}}async function yr(){let e=N();if(!e?.configuration_view||e.configuration_mode!==`managed`)return;let n=await M.configurationSchema(),r=typeof n.title==`string`?n.title:`tenant configuration schema`;t(`editor-help`).textContent=`Validated against ${r}. Saving a draft does not publish or activate it.`}async function br(){if(z.dirty&&!window.confirm(kn))return;let e=z.beginLoad();if(e!==null)try{let t=await M.draft(),n=await M.draftYaml(t.version),r=await Er(t.version);if(!z.acceptLoad(e))return;L=t,jn=t,R=r,V(),Hn().setValue(n),lr(),cr(),ir(),y(N()?.configuration_mode===`local_source`?`Loaded the saved configuration. Changes take effect after restart.`:`Loaded configuration version ${L.version}.`,`is-success`)}catch(t){if(!z.current(e))return;y(_(t),`is-error`)}}async function xr(){let e=z.beginSave();if(e!==null)try{jn=await M.saveYamlDraft(Hn().value(),jn),L=jn,z.acceptSave(e),R=await Er(L.version),V(),lr(),cr(),ir(),y(z.dirty?`Saved the submitted document. Newer edits are still unsaved.`:N()?.configuration_mode===`local_source`?`Saved. Restart Justflow to activate the changes.`:`Saved configuration version ${L.version}.`,`is-success`)}catch(e){y(_(e),`is-error`)}finally{z.finishSave()}}async function Sr(){try{let e=await M.validateDraft();ur(e.issues);let t=e.issues.filter(e=>e.severity===`error`).length,n=e.issues.length-t,r=n>0?` with ${n} warning(s)`:``;y(e.valid?`Draft is valid${r}.`:`Draft has ${t} error(s)${r}.`,e.valid?`is-success`:`is-error`)}catch(e){y(_(e),`is-error`)}}async function Cr(){if(L===null){y(`Load or save a draft before Apply.`,`is-error`);return}if(z.dirty||B.dirty){y(`Save the edited document before Apply.`,`is-error`);return}try{if(N()?.configuration_mode===`local_source`){y(`Apply stage: validating and publishing immutable definitions…`);let e=await M.applyLocalConfiguration(L.version,kt());R=await Er(L.version),V(),ir(),cr(),y(e.restartRequired?`Validation and immutable definition publication completed. Restart is required; the running process did not change.`:`Validation and immutable definition publication completed. The saved configuration already matches this process startup snapshot.`,`is-success`);return}y(`Apply stage 1/4: publishing an immutable configuration revision…`);let e=await M.publishDraft(L.version,kt());if(e.publishedRevisionId===null)throw Error(`Publication completed without an immutable revision identity.`);cn(e.publishedRevisionId),y(`Apply stage 2/4: building the activation plan from authoritative state…`);let t=await M.planActivation(e.publishedRevisionId);if(!N()?.configuration_activate){y(`Published immutable revision ${h(e.publishedRevisionId)}. Activation is not authorized, so the active revision did not change.`,`is-success`),await P(),ln(e.publishedRevisionId);return}let n=t.expectedActiveRevisionId===null?`no active predecessor`:`active revision ${h(t.expectedActiveRevisionId)}`;if(!window.confirm(`Publication completed. Confirm activation of ${h(e.publishedRevisionId)} against ${n}?`)){y(`Published immutable revision ${h(e.publishedRevisionId)}. Activation was not requested, so the active revision did not change.`,`is-success`),await P(),ln(e.publishedRevisionId);return}y(`Apply stage 3/4: executing the confirmed activation plan…`);let r=await M.activate(e.publishedRevisionId,t.planDigest,kt());y(`Apply stage 4/4: reading authoritative activation readiness…`);let i=await M.activationReadiness(r.activationId);R=await Er(L.version),V(),ir(),await P(),i.ready?y(`Publication, plan confirmation, activation, and readiness completed for ${h(i.targetRevisionId)}. Audit records are available in Releases.`,`is-success`):(y(`Publication and activation request completed; authoritative readiness is ${i.state}. The console is not claiming the revision is ready.`,i.state===`failed`||i.state===`superseded`?`is-error`:``),ln(e.publishedRevisionId))}catch(e){y(_(e),`is-error`)}}async function wr(){let e=R?.activeIdentity;if(L===null||e==null){y(`Discard requires an authoritative active configuration.`,`is-error`);return}if(window.confirm(An))try{let t=N()?.configuration_mode,n=await M.discardConfiguration(L.version,e,kt());await br(),y(t===`local_source`?`Discarded saved changes and restored the process startup snapshot at version ${n.workingVersion}. The running process did not change.`:`Discarded saved changes and restored the draft from active revision ${h(n.activeIdentity)}. Publication and activation state did not change.`,`is-success`)}catch(e){y(_(e),`is-error`)}}function Tr(e){for(let[t,r]of[[`load-draft`,`configuration_view`],[`save-draft`,`configuration_edit`],[`validate-draft`,`configuration_validate`],[`discard-draft`,`configuration_discard`]])n(t).disabled=!e[r];Mn=!e.configuration_edit,Hn().setReadOnly(Mn),t(`configuration-availability`).hidden=e.configuration_view;let r=e.configuration_mode===`local_source`;t(`release-flow`).hidden=r||!e.configuration_view,t(`configuration-subtitle`).textContent=r?`Edit workflow and trigger YAML persisted for the next local restart.`:`Draft, validate, and publish declaration changes.`,t(`editor-help`).textContent=r?`Declarative workflows and triggers only. Saving never changes the running process or existing executions.`:`Apply uses separate publication, plan confirmation, activation, readiness, and audit operations.`,V(),n(`new-workflow-draft`).disabled=!e.configuration_edit,n(`new-schedule`).disabled=!e.configuration_edit||!r,n(`editor-add-schedule`).disabled=!e.configuration_edit||!r,n(`workflow-detail-schedule`).disabled=!e.configuration_edit||!r,n(`workflow-inline-schedule`).disabled=!e.configuration_edit||!r}function V(){let e=N();if(e===null)return;let t=e.configuration_mode===`local_source`,r=n(`apply-draft`);r.textContent=t?`Apply saved changes`:`Apply changes`,r.disabled=t?!e.configuration_apply:!e.configuration_publish,n(`discard-draft`).disabled=!e.configuration_discard||R?.activeIdentity==null}async function Er(e){let t=await M.configurationRelationships();if(t.workingVersion!==e)throw Error(`Configuration changed concurrently. Reload before continuing.`);return t}function H(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Dr(e){let t=structuredClone(e);if(!H(t))throw TypeError(`Configuration draft must be an object.`);return t}function Or(e,t){let n=e[t];if(!H(n))throw TypeError(`Configuration field ${t} must be an object.`);return n}function kr(e,t){if(!H(e))return null;let n=e[t];return typeof n==`string`?n:null}function Ar(){let e=new Set(Pn()),t=L?.bundle.workflows;if(H(t))for(let n of Object.keys(t))e.add(n);return[...e].sort((e,t)=>e.localeCompare(t))}function jr(e){let t=Or(e,`triggers`);if(N()?.configuration_mode!==`local_source`)return t;let n=t.triggers;if(n===void 0){let e={};return t.triggers=e,e}if(!H(n))throw TypeError(`Configuration trigger declarations must be an object.`);return n}function Mr(e){return N()?.configuration_mode===`local_source`?`${e} Restart Justflow to apply it to future starts.`:`${e} Apply when ready; publication, plan confirmation, activation, and readiness remain separate operations.`}var Nr=`/admin/graph-frame`;function Pr(t){let n=document.createElement(`iframe`);n.className=`graph-frame`,n.setAttribute(`sandbox`,`allow-scripts`),n.setAttribute(`title`,`Workflow graph`),n.src=Nr;let r=null,i=null,a=!1;n.addEventListener(`load`,()=>{if(a||n.contentWindow===null)return;let t=new MessageChannel;t.port1.onmessage=e=>{let n=e.data;typeof n==`object`&&n&&n.kind===`ready`&&(r=t.port1,i!==null&&(o(i),i=null))},n.contentWindow.postMessage({kind:e,version:1},`*`,[t.port2])}),t.replaceChildren(n);function o(e){r?.postMessage({kind:`render`,version:1,graph:e})}return{render(e){if(!a){if(r===null){i=e;return}o(e)}},destroy(){a=!0,r?.close(),r=null,n.remove()}}}function Fr(e,t){if(c(e),t.nodes.length===0){e.appendChild(l(`p`,`This definition has no displayable steps.`,`empty-state`));return}let n=document.createElement(`ul`);n.className=`graph-node-list`;for(let e of t.nodes){let r=document.createElement(`li`),i=document.createElement(`div`);i.append(l(`strong`,e.label),l(`span`,e.failed?`${e.kind} · failed`:e.kind,`graph-node-kind`)),e.group!==null&&i.appendChild(l(`span`,`sub-workflow: ${e.group}`,`graph-node-kind`)),r.appendChild(i);let a=t.edges.filter(t=>t.source===e.id);if(a.length>0){let e=document.createElement(`ul`);for(let n of a){let r=t.nodes.find(e=>e.id===n.target),i=n.label===null||n.label.length===0?``:` when ${n.label}`;e.appendChild(l(`li`,`then ${r?.label??n.target}${i}`))}r.appendChild(e)}n.appendChild(r)}e.appendChild(n)}var Ir=`component-services`,Lr=`component-resources`,Rr=`fragment-component-services`,zr=`fragment-component-resources`,Br=2,Vr=2,U=null;async function Hr(){F(`components`),await Kr(Ir,Lr,Gr())}async function Ur(){await Kr(Rr,zr,``)}function Wr(){U!==null&&qr(Ir,Lr,Gr())}function Gr(){return r(`component-search`).value.trim().toLowerCase()}async function Kr(e,n,r){try{U=await M.authoringReference(),qr(e,n,r)}catch(r){d(t(e),Br,_(r)),d(t(n),Vr,_(r))}}function qr(e,n,r){if(U===null)return;let i=t(e);c(i);let a=t(n);if(c(a),U.availability===`unavailable`){let e=U.unavailableReason??`Authoring reference is unavailable.`;d(i,Br,e),d(a,Vr,e);return}let o=U.components.filter(e=>`${e.name}@${e.version}`.toLowerCase().includes(r)),s=U.services.filter(e=>e.name.toLowerCase().includes(r));o.length===0&&s.length===0&&d(i,Br,r.length>0?`No services match this filter.`:`No approved services are configured.`);for(let e of o){let t=document.createElement(`tr`);f(t,`${e.name}@${e.version}`,`cell-primary`),p(t,Jr(e)),i.appendChild(t)}for(let e of s){let t=document.createElement(`tr`);f(t,e.name,`cell-primary`),p(t,Xr(e)),i.appendChild(t)}let u=U.resources.filter(e=>e.name.toLowerCase().includes(r)),m=U.triggerBindings.filter(e=>e.name.toLowerCase().includes(r));u.length===0&&m.length===0&&d(a,Vr,r.length>0?`No resources match this filter.`:`No approved resources are configured.`);for(let e of u){let t=document.createElement(`tr`);f(t,e.name,`cell-primary`);let n=document.createElement(`span`);n.className=`capability-chips`,e.capabilities.length===0&&n.appendChild(l(`span`,`capabilities unavailable`,`capability-chip is-empty`));for(let t of e.capabilities)n.appendChild(l(`span`,t,`capability-chip`));p(t,n),a.appendChild(t)}for(let e of m){let t=document.createElement(`tr`);f(t,e.name,`cell-primary`),p(t,l(`span`,`trigger · ${e.kind}`,`capability-chip`)),a.appendChild(t)}if(e===Ir){let e=t(`component-truncation-note`),n=[];U.authority===`observed_host`?n.push(`Local entries are a safe observation of loaded host declarations, not authoritative component contracts.`):U.catalogRevision!==null&&n.push(`Immutable catalog ${U.catalogRevision.slice(0,12)}…`),U.truncated&&n.push(`Some details were omitted because the reference reached its size limit.`),e.hidden=n.length===0,e.textContent=n.join(` `)}}function Jr(e){let t=document.createElement(`div`);e.description!==null&&t.appendChild(l(`p`,e.description));let n=[e.kind,...e.capabilities];e.action!==null&&n.push(e.action);for(let e of n)t.appendChild(l(`span`,e,`capability-chip`));let r=[Yr(`parameters`,e.parameterSchema,e.parameterContractIdentity),Yr(`input`,e.inputSchema,e.inputContractIdentity),Yr(`output`,e.outputSchema,e.outputContractIdentity)].filter(e=>e!==null);if(e.resourceSlots.length>0&&r.push(`resource slots: ${e.resourceSlots.map(e=>`${e.name} (${e.capability})`).join(`, `)}`),r.length===0)return t;let i=document.createElement(`details`),a=document.createElement(`summary`);a.textContent=`authoritative contracts`;let o=document.createElement(`pre`);return o.className=`declaration-view`,o.textContent=r.join(`
2
+ `),i.append(a,o),t.appendChild(i),t}function Yr(e,t,n){return t===null?n===null?null:`${e} contract: ${n}`:`${e}: ${JSON.stringify(t,null,2)}`}function Xr(e){if(e.actions.length===0)return l(`span`,`none referenced yet`,`graph-node-kind`);let t=document.createElement(`div`);e.description!==null&&t.appendChild(l(`p`,e.description));for(let n of e.actions){let e=document.createElement(`div`);e.className=`action-entry`,e.appendChild(l(`code`,n.name)),n.contractConflict&&e.appendChild(l(`span`,`conflicting declared contracts`,`capability-chip is-empty`));let r=[];if(n.inputSchema===null?n.inputContractIdentity!==null&&r.push(`input contract: ${n.inputContractIdentity}`):r.push(`input: ${JSON.stringify(n.inputSchema,null,2)}`),n.outputSchema===null?n.outputContractIdentity!==null&&r.push(`output contract: ${n.outputContractIdentity}`):r.push(`output: ${JSON.stringify(n.outputSchema,null,2)}`),r.length>0){let t=document.createElement(`details`),n=document.createElement(`summary`);n.textContent=`observed declaration contracts`;let i=document.createElement(`pre`);i.className=`declaration-view`,i.textContent=r.join(`
3
+ `),t.append(n,i),e.appendChild(t)}t.appendChild(e)}return t}var Zr=`fragment-status`,Qr=`fragment-validation-issues`,$r=`fragment-preview-issues`,ei=800,ti=`Discard unsaved workflow changes and reload the saved declaration?`,ni=`workflow: my_workflow
4
+ description: |
5
+ Describe what this workflow does.
6
+ steps: {}
7
+ flow:
8
+ - name: done
9
+ terminal: true
10
+ `,ri=`Edit one workflow declaration.`,ii="Name the workflow via the top-level `workflow:` key, then save to create it.",W=null,G=null,K=null,q=!1,J=new On,ai=null,oi=null,si=null,ci=0;function li(){J.edit(),ui()}function ui(){oi!==null&&clearTimeout(oi),oi=setTimeout(()=>{oi=null,fi()},ei)}function di(e){return/^workflow:\s*([A-Za-z_][A-Za-z0-9_]*)\s*$/m.exec(e)?.[1]??null}async function fi(){if(W===null)return;let e=q?di(W.value()):G;if(e===null)return;si?.abort();let n=new AbortController;si=n,ci+=1;let r=ci;try{let i=await M.previewWorkflowFragment(e,W.value(),n.signal);if(r!==ci)return;if(dr($r,i.diagnostics),i.status===`graph_ready`){let n={version:1,title:`${e} fragment preview`,nodes:i.graphNodes.map(e=>({id:e.nodeId,label:e.label,kind:e.kind,group:e.group,failed:!1,metadata:e.metadata})),edges:i.graphEdges.map(e=>({source:e.source,target:e.target,label:e.label,dashed:e.dashed}))};ai===null&&(ai=Pr(t(`fragment-preview-graph`))),ai.render(n),Fr(t(`fragment-preview-table`),n)}}catch(e){if(n.signal.aborted||r!==ci)return;Y(_(e),`is-error`)}}function pi(){if(W===null){let e=o(`fragment-editor`);e.addEventListener(`input`,li),W=Jt(e)}return W}async function mi(){W=await qt(`fragment-editor`,li),W.setReadOnly(!N()?.configuration_edit)}function hi(){return J.dirty}function gi(){let e=N();return e?.configuration_mode===`local_source`&&e.configuration_view}async function _i(e){if(gi()){await bi(e);return}await fr(`workflow`,e)}function vi(){n(`fragment-retire`).hidden=q,n(`fragment-reload`).hidden=q,n(`fragment-open-full`).hidden=q,t(`fragment-subtitle`).textContent=q?ii:ri}async function yi(){if(!gi()){mr();return}if(J.dirty&&!window.confirm(ti))return;let e=J.beginLoad();e!==null&&(q=!0,G=null,K=null,F(`workflow-editor`,!1),t(`fragment-workflow-name`).textContent=`New workflow`,vi(),pi().setValue(ni),J.acceptLoad(e),Oi(),Y(`Not saved yet — save to create it.`),pi().focus(),fi(),Ur())}async function bi(e,n=!0){if(J.dirty&&!window.confirm(ti))return;let r=J.beginLoad();if(r!==null){q=!1,G=e,K=null,F(`workflow-editor`,n,e),t(`fragment-workflow-name`).textContent=e,vi(),Y(`Loading the workflow fragment…`),Oi();try{let t=await M.workflowFragment(e);if(!J.acceptLoad(r))return;K=t.version,pi().setValue(t.document),Y(`Editing “${e}”. Saving updates only this workflow.`,`is-success`),pi().focus(),fi(),Ur()}catch(e){if(!J.current(r))return;K=null,Y(_(e),`is-error`)}}}async function xi(){G!==null&&await bi(G,!1)}async function Si(){let e=pi().value(),n=di(e);if(n===null){Y("Set the workflow name first: a top-level `workflow: <name>` key.",`is-error`);return}let r=J.beginSave();if(r!==null)try{let i=await M.draft(),a=i.bundle.workflows;if(typeof a==`object`&&a&&!Array.isArray(a)&&n in a){Y(`Workflow “${n}” already exists in the draft.`,`is-error`);return}let o=await M.saveWorkflowFragment(n,e,i.version);q=!1,G=n,K=o.version,J.acceptSave(r),F(`workflow-editor`,!0,n),t(`fragment-workflow-name`).textContent=n,vi(),Oi(),Y(J.dirty?`Created “${n}”. Newer edits are still unsaved.`:`Created “${n}”. Restart Justflow to activate it.`,`is-success`),await P(),fi()}catch(e){Y(_(e),`is-error`)}finally{J.finishSave()}}async function Ci(){if(q){await Si();return}if(G===null||K===null){Y(`Load a workflow fragment before saving.`,`is-error`);return}let e=J.beginSave();if(e!==null)try{K=(await M.saveWorkflowFragment(G,pi().value(),K)).version,J.acceptSave(e),Oi(),Y(J.dirty?`Saved “${G}”. Newer edits are still unsaved.`:N()?.configuration_mode===`local_source`?`Saved “${G}”. Restart Justflow to apply the changes to future starts.`:`Saved “${G}”.`,`is-success`)}catch(e){Y(_(e),`is-error`)}finally{J.finishSave()}}async function wi(){if(G===null||K===null){Y(`Load a workflow fragment before retiring it.`,`is-error`);return}let e=G;if(!window.confirm(`Retire “${e}” from future starts? Existing runs and retained definitions are not deleted.`))return;let t=J.beginSave();if(t!==null)try{if(await M.deleteWorkflowFragment(e,K),J.acceptSave(t),J.dirty){K=null,Y(`Retired “${e}”. Copy your newer unsaved edits before reloading.`);return}G=null,K=null,F(`workflows`),await P()}catch(e){Y(_(e),`is-error`)}finally{J.finishSave()}}async function Ti(){try{let e=await M.validateDraft();dr(Qr,e.issues);let t=e.issues.filter(e=>e.severity===`error`).length,n=e.issues.length-t,r=n>0?` with ${n} warning(s)`:``;Y(e.valid?`Draft is valid${r}.`:`Draft has ${t} error(s)${r}.`,e.valid?`is-success`:`is-error`)}catch(e){Y(_(e),`is-error`)}}async function Ei(){G!==null&&await fr(`workflow`,G)}function Di(){let e=N(),t=e?.configuration_edit===!0;n(`fragment-save`).disabled=!t,n(`fragment-retire`).disabled=!t,n(`fragment-validate`).disabled=e?.configuration_validate!==!0,W?.setReadOnly(!t)}function Oi(){dr(Qr,[])}function Y(e,t=``){se(Zr,e,t)}var ki=[`all`,`running`,`completed`,`failed`],Ai=30,ji=5e3,Mi=6e5,Ni=[],Pi=[],Fi=`all`,Ii=null,Li=null,Ri=null,zi=0,Bi=new Map,Vi=[],Hi=new Xt(async e=>{let t=await M.runs(Ui(Fi),Ai,e);return{items:t.runs,nextCursor:t.nextCursor}});function Ui(e){return e===`all`?null:e}function Wi(e,t){Ni=e,Pi=t}function Gi(){return Ni.length}function Ki(){return Pi.length}function qi(){return Pi}function Ji(e){return Bi.get(e)}var Yi=`__`;function Xi(e){let t=e.workflowType.indexOf(Yi);return t===-1?e.workflowType:e.workflowType.slice(0,t)}function Zi(){return[...Ni,...Pi].sort((e,t)=>new Date(t.startTime).getTime()-new Date(e.startTime).getTime())}function Qi(e){Vi.push(e)}async function $i(){let e=await Promise.allSettled(Pi.map(e=>M.runDetail(e.workflowId,e.runId)));for(let t of e)t.status===`fulfilled`&&Bi.set(ae(t.value),t.value)}function ea(e){Fi=e,ta()}async function ta(){await Hi.reload(),ra()}async function na(){let e=n(`load-more-runs`);e.disabled=!0;try{await Hi.loadMore()===`reset`&&window.alert(Zt),ra()}catch(e){window.alert(_(e))}finally{e.disabled=!1}}function ra(){let e=t(`run-list`),i=r(`run-search`).value.trim().toLowerCase(),a=Hi.items.filter(e=>i.length===0||e.workflowId.toLowerCase().includes(i)||e.runId.toLowerCase().includes(i));if(n(`load-more-runs`).hidden=!Hi.hasMore,t(`run-result-count`).textContent=`${a.length} run${a.length===1?``:`s`} on this page`,c(e),a.length===0){d(e,ia,`No runs match the selected filters.`);return}for(let t of a){let n=document.createElement(`tr`);n.className=`interactive-row`,n.tabIndex=0,n.addEventListener(`click`,()=>void ua(t)),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),ua(t))}),p(n,v(t.status)),f(n,Xi(t),`cell-primary`),f(n,h(t.workflowId),`mono`),f(n,h(t.runId),`mono`),f(n,g(t.startTime)),f(n,oe(t)),f(n,Bi.get(ae(t))?.failedStep??`—`),e.appendChild(n)}}var ia=7;async function aa(){Li!==null&&await ua(Li)}function oa(){return r(`watch-run-toggle`)}function sa(e){if(!e){ca();return}Ri===null&&Li!==null&&(zi=Date.now(),Ri=setInterval(()=>{if(!document.hidden){if(Date.now()-zi>Mi){ca();return}aa()}},ji))}function ca(){Ri!==null&&(clearInterval(Ri),Ri=null),oa().checked=!1}function la(e){Ri!==null&&ie(e.status)!==`running`&&ca()}async function ua(e){let n=ae(e);Ii=n,Li=e,t(`run-inspector-title`).textContent=e.workflowId;let r=t(`run-inspector`),i=t(`inspector-scrim`);r.hidden=!1,i.hidden=!1;let a=t(`run-detail`);c(a),a.appendChild(l(`p`,`Loading run details…`,`empty-state`));try{let t=await M.runDetail(e.workflowId,e.runId);Bi.set(ae(t),t),Ii===n&&(pa(t),la(t)),ra();for(let e of Vi)e()}catch(e){Ii===n&&(c(a),a.appendChild(l(`p`,_(e),`empty-state`)))}}function da(){Ii=null,Li=null,ca(),c(t(`run-detail`)),t(`run-inspector`).hidden=!0,t(`inspector-scrim`).hidden=!0}function fa(){return!t(`run-inspector`).hidden}function pa(e){t(`run-inspector-title`).textContent=e.logicalWorkflow??e.workflowId;let n=t(`run-detail`);c(n);let r=document.createElement(`div`);r.className=`run-summary`;let i=document.createElement(`div`);i.className=`run-title-block`;let a=document.createElement(`div`);a.append(l(`h3`,e.workflowId),l(`code`,`Run ${e.runId}`)),i.append(a,v(e.status)),r.appendChild(i);let o=document.createElement(`div`);o.className=`run-controls`;let s=ie(e.status)===`running`;s&&N()?.workflow_cancel&&o.appendChild(ga(`Request cancellation`,`button-secondary`,e,`cancel`)),s&&N()?.workflow_terminate&&o.appendChild(ga(`Terminate`,`button-danger`,e,`terminate`)),o.childElementCount>0&&(r.appendChild(o),r.appendChild(l(`p`,`Cancellation lets the workflow handle cleanup. Termination stops it immediately and cannot be undone.`,`run-control-note`))),s&&N()?.workflow_signal&&r.appendChild(ma(e)),r.appendChild(va(`Execution`,[[`Workflow name`,e.logicalWorkflow??`Unavailable`],[`Workflow ID`,e.workflowId],[`Run ID`,e.runId],[`Started`,g(e.startTime)],[`Closed`,g(e.closeTime)],[`Duration`,oe(e)],[`Trigger`,e.triggerSource??`Unavailable`],[`Pending waits`,ya(e)],[`Continuation`,ba(e)]]));let u=document.createElement(`section`);u.className=`provenance-panel`,u.appendChild(l(`h4`,`Execution versions`));let d=document.createElement(`div`);d.className=`provenance-rail`;let f=[[`Definition`,h(e.definitionDigest)],[`Configuration`,h(e.configurationRevisionId)],[`Worker artifact`,h(e.artifactDigest)]];for(let[e,t]of f){let n=document.createElement(`div`);n.className=`provenance-node`,n.append(l(`span`,e),l(`code`,t)),d.appendChild(n)}u.appendChild(d),r.appendChild(u),r.appendChild(va(`Deployment and failure`,[[`Deployment`,e.deploymentName??`Unavailable`],[`Build`,e.buildId??`Unavailable`],[`Failure code`,e.failureCode??`None`],[`Cause code`,e.failureCauseCode??`None`],[`Failure category`,e.failureCategory??`None`],[`Failure phase`,e.failurePhase??`None`],[`Failed step`,e.failedStep??`None`],[`Retryable`,e.failureRetryable===null?`Not applicable`:e.failureRetryable?`Yes`:`No`],[`Wait result`,e.pendingWaitsTruncated?`Bounded result truncated`:`Complete`]])),n.appendChild(r)}function ma(e){let t=document.createElement(`div`);t.className=`send-event-form`,t.appendChild(l(`h4`,`Send event`));let n=document.createElement(`input`);n.placeholder=`Event name`,n.setAttribute(`aria-label`,`Event name`);let r=e.pendingWaits.find(e=>e.kind===`signal`);r!==void 0&&(n.value=r.state);let i=document.createElement(`textarea`);i.value=`{}`,i.spellcheck=!1,i.setAttribute(`aria-label`,`Event payload (JSON)`);let a=l(`p`,`The payload is sent once and never stored by the panel.`,`run-control-note`),o=document.createElement(`button`);return o.className=`button button-secondary`,o.type=`button`,o.textContent=`Send event`,o.addEventListener(`click`,()=>void ha(e,n,i,o)),t.append(n,i,a,o),t}async function ha(e,t,n,r){let i=t.value.trim();if(i.length===0){window.alert(`An event name is required.`);return}let a;try{a=JSON.parse(n.value)}catch{window.alert(`The event payload must be valid JSON.`);return}r.disabled=!0;try{await M.signalWorkflow(e.workflowId,e.runId,i,a),n.value=`{}`,r.textContent=`Accepted`,await aa()}catch(e){r.disabled=!1,window.alert(_(e))}}function ga(e,t,n,r){let i=document.createElement(`button`);return i.className=`button ${t}`,i.type=`button`,i.textContent=e,i.addEventListener(`click`,()=>void _a(n,r,i)),i}async function _a(e,t,n){let r=t===`cancel`?`request cancellation for`:`terminate`;if(window.confirm(`Are you sure you want to ${r} this workflow run?`)){n.disabled=!0;try{t===`cancel`?await M.cancelRun(e.workflowId,e.runId):await M.terminateRun(e.workflowId,e.runId),n.textContent=`Accepted`,await P()}catch(e){n.disabled=!1,n.textContent=t===`cancel`?`Request cancellation`:`Terminate`,window.alert(_(e))}}}function va(e,t){let n=document.createElement(`section`);n.className=`detail-section`,n.appendChild(l(`h4`,e));let r=document.createElement(`div`);r.className=`detail-grid`;for(let[e,n]of t){let t=document.createElement(`div`);t.className=`detail-field`,t.append(l(`span`,e),l(`strong`,n)),r.appendChild(t)}return n.appendChild(r),n}function ya(e){return e.pendingWaits.length===0?`None reported`:e.pendingWaits.map(e=>`${e.kind}: ${e.state}`).join(`, `)}function ba(e){let t=[e.firstRunId,e.nextRunId].filter(e=>e!==null);return t.length===0?`None reported`:t.map(h).join(` → `)}var xa=7,Sa=6,X=[],Ca=()=>Promise.resolve(),wa=new Xt(async e=>{if(N()?.scheduled_start_view!==!0)return{items:[],nextCursor:null};let t=await M.scheduledStarts([],e);return{items:t.scheduledStarts,nextCursor:t.nextCursor}});async function Ta(){let e=N()?.scheduled_start_view===!0,[t]=await Promise.all([M.triggers(),e?wa.reload():Promise.resolve()]);X=t,await Ma()}async function Ea(){let e=n(`load-more-scheduled-starts`);e.disabled=!0;try{await wa.loadMore()===`reset`&&window.alert(Zt),Na()}catch(e){window.alert(_(e))}finally{e.disabled=!1}}function Da(){return X.length}function Oa(e){return X.filter(t=>t.kind===`schedule`&&t.workflowName===e)}function ka(e){return X.filter(t=>t.workflowName===e)}async function Aa(){return X.filter(e=>e.kind===`schedule`).map(e=>({name:e.name,workflow:e.workflowName,paused:e.state===`inactive`}))}function ja(e){Ca=e}async function Ma(){let e=t(`schedule-list`),n=t(`schedule-declared-note`);c(e);let r=X.filter(e=>e.state===`active`).length,i=X.length-r;if(t(`schedule-result-count`).textContent=`${r} active · ${i} inactive`,n.hidden=!0,n.textContent=``,Na(),X.length===0){d(e,xa,`No triggers are declared in this scope.`);return}for(let t of X){let n=document.createElement(`tr`);f(n,t.name,`cell-primary`),p(n,Pa(t.workflowName)),p(n,t.kind===`schedule`?sr(t.name,t.state===`active`):Fa(t.state===`active`)),f(n,t.kind),f(n,t.lastAction===null?`—`:`${t.lastAction.outcome} · ${g(t.lastAction.startedAt)}`),f(n,g(t.nextRunTimes[0]??null)),p(n,Ia(t.name)),e.appendChild(n)}}function Na(){let e=t(`scheduled-start-list`),r=N()?.scheduled_start_view===!0;if(t(`scheduled-starts-surface`).hidden=!r,!r)return;c(e);let i=wa.items;if(t(`scheduled-start-result-count`).textContent=`${i.length} scheduled start${i.length===1?``:`s`} on this page`,n(`load-more-scheduled-starts`).hidden=!wa.hasMore,i.length===0){d(e,Sa,`No one-off scheduled starts are visible in this scope.`);return}for(let t of i){let n=document.createElement(`tr`);p(n,Pa(t.workflowName)),f(n,g(t.startAt)),f(n,t.workloadClass),p(n,v(t.state)),f(n,t.workflowId===null?`—`:`${h(t.workflowId)} / ${h(t.runId)}`,`mono`),p(n,La(t)),e.appendChild(n)}}function Pa(e){let t=document.createElement(`a`);return t.className=`workflow-link`,t.href=`${Ft}${encodeURIComponent(e)}`,t.textContent=e,t.addEventListener(`click`,t=>{t.preventDefault(),Ca(e)}),t}function Fa(e){return v(e?`Active`:`Inactive`,e?`active`:`none`)}function Ia(e){let t=document.createElement(`div`);t.className=`row-actions`;let n=u(`Edit`,`row-action`);return n.addEventListener(`click`,()=>void fr(`schedule`,e)),t.appendChild(n),t}function La(e){let t=document.createElement(`div`);t.className=`row-actions`;let n=u(`Details`,`row-action`);if(n.addEventListener(`click`,()=>void Ra(e)),t.appendChild(n),e.state===`scheduled`&&N()?.scheduled_start_reschedule===!0){let n=u(`Reschedule`,`row-action`);n.addEventListener(`click`,()=>void za(e)),t.appendChild(n)}if(e.state===`scheduled`&&N()?.scheduled_start_cancel===!0){let n=u(`Cancel`,`row-action is-danger`);n.addEventListener(`click`,()=>void Ba(e)),t.appendChild(n)}return t}async function Ra(e){try{let t=await M.scheduledStart(e.scheduledStartId);window.alert([`Workflow: ${t.workflowName}`,`Due: ${g(t.startAt)}`,`State: ${t.state}`,`Workload: ${t.workloadClass}`,`Version: ${t.version}`,`Definition: ${h(t.definitionDigest)}`,`Worker build: ${t.artifactBuildId??`—`}`,`Run: ${t.workflowId===null?`—`:`${h(t.workflowId)} / ${h(t.runId)}`}`,`Failure: ${t.failureCode??`—`}`].join(`
11
+ `))}catch(e){window.alert(_(e))}}async function za(e){let t=window.prompt(`New due time (ISO 8601 with timezone)`,e.startAt);if(t===null)return;let n=new Date(t);if(Number.isNaN(n.getTime())){window.alert(`Enter a valid due time with a timezone.`);return}try{(await M.rescheduleScheduledStart(e.scheduledStartId,n.toISOString(),e.version,crypto.randomUUID())).status===`in_progress`&&window.alert(`The reschedule is durably owned and still completing. Refresh to follow it.`),await Ta()}catch(e){window.alert(_(e))}}async function Ba(e){if(window.confirm(`Cancel the scheduled start for “${e.workflowName}”?`))try{(await M.cancelScheduledStart(e.scheduledStartId,e.version,crypto.randomUUID())).status===`in_progress`&&window.alert(`The cancellation is durably owned and still completing. Refresh to follow it.`),await Ta()}catch(e){window.alert(_(e))}}var Va=`__`,Ha=5,Ua=2,Wa=7,Ga=3,Ka=20,Z=null,Q=null,qa=null,Ja=`overview`,Ya=null,Xa=new Xt(e=>{let t=Z;return t===null?Promise.resolve({items:[],nextCursor:null}):M.runs(null,Ka,e,t).then(e=>({items:e.runs,nextCursor:e.nextCursor}))}),Za=new Xt(async e=>{let t=await M.workflowRegistrations(e);return{items:t.workflows,nextCursor:t.nextCursor}}),Qa=[];async function $a(){if(N()?.configuration_view!==!0){Qa=[];return}try{let e=(await M.draft()).bundle.workflows;if(typeof e!=`object`||!e||Array.isArray(e)){Qa=[];return}let t=new Set(Za.items.map(e=>e.logicalWorkflow));Qa=Object.keys(e).filter(e=>!t.has(e)).sort()}catch{Qa=[]}}async function eo(){await Za.reload(),await $a(),so()}async function to(){await no(Za,`load-more-workflows`,so)}async function no(e,t,r){let i=n(t);i.disabled=!0;try{await e.loadMore()===`reset`&&window.alert(Zt),r()}catch(e){window.alert(_(e))}finally{i.disabled=!1}}function ro(){return Za.items.length}function io(){return Za.items.map(e=>e.logicalWorkflow)}function $(){return Z}function ao(e){Z=e}function oo(){Q!==null&&_o(Q)}function so(){let e=t(`workflow-list`),i=t(`workflow-draft-note`),a=r(`workflow-search`).value.trim().toLowerCase(),o=Za.items.filter(e=>e.logicalWorkflow.toLowerCase().includes(a)),s=Qa.filter(e=>e.toLowerCase().includes(a));if(n(`load-more-workflows`).hidden=!Za.hasMore,t(`workflow-result-count`).textContent=s.length>0?`${o.length} active · ${s.length} inactive`:`${o.length} workflow${o.length===1?``:`s`} on this page`,i.hidden=s.length===0,i.textContent=s.length>0?`Inactive workflows are saved but not yet activated; restart Justflow to activate them.`:``,c(e),o.length===0&&s.length===0){d(e,Ha,a.length>0?`No workflows match this filter.`:`No workflows are registered.`);return}for(let t of o){let n=document.createElement(`tr`);n.className=`interactive-row`;let r=document.createElement(`a`);r.className=`workflow-link`,r.href=`${Ft}${encodeURIComponent(t.logicalWorkflow)}`,r.textContent=t.logicalWorkflow,r.addEventListener(`click`,e=>{e.preventDefault(),po(t.logicalWorkflow)}),p(n,r),f(n,h(t.activeDefinitionDigest),`mono`),f(n,String(t.retainedDefinitionCount)),p(n,Fa(t.activeDefinitionDigest.length>0));let i=document.createElement(`div`);i.className=`row-actions`;let a=u(`Edit draft`,`row-action`);a.addEventListener(`click`,e=>{e.stopPropagation(),_i(t.logicalWorkflow)});let o=u(`Retire`,`row-action is-danger`);o.addEventListener(`click`,e=>{e.stopPropagation(),pr(t.logicalWorkflow)}),i.append(a,o),p(n,i),e.appendChild(n)}for(let t of s){let n=document.createElement(`tr`);n.className=`interactive-row`;let r=document.createElement(`a`);r.className=`workflow-link`,r.href=`#`,r.textContent=t,r.addEventListener(`click`,e=>{e.preventDefault(),_i(t)}),p(n,r),f(n,`—`,`mono`),f(n,`—`),p(n,Fa(!1));let i=document.createElement(`div`);i.className=`row-actions`;let a=u(`Edit draft`,`row-action`);a.addEventListener(`click`,e=>{e.stopPropagation(),_i(t)});let o=u(`Remove`,`row-action is-danger`);o.addEventListener(`click`,e=>{e.stopPropagation(),pr(t)}),i.append(a,o),p(n,i),e.appendChild(n)}}function co(e,t=!0){Ja=e;for(let t of document.querySelectorAll(`[data-workflow-panel]`))t.hidden=t.dataset.workflowPanel!==e;for(let t of document.querySelectorAll(`[data-workflow-tab]`)){let n=t.dataset.workflowTab===e;t.classList.toggle(`is-active`,n),t.setAttribute(`aria-pressed`,String(n))}t&&Z!==null&&Vt(Z,e),lo()}async function lo(){Z!==null&&(Ja===`definition`?(await yo(),await Oo(Z)):Ja===`runs`?await uo():Ja===`triggers`&&Q!==null&&await Ho(Q.logicalWorkflow))}async function uo(){await Xa.reload(),Bo()}async function fo(){let e=n(`load-more-workflow-runs`);e.disabled=!0;try{await Xa.loadMore()===`reset`&&window.alert(Zt),Bo()}catch(e){window.alert(_(e))}finally{e.disabled=!1}}async function po(e,n=!0){Z=e,Q=null,Ya=null,Mo=null,F(`workflow`,n,e),co(Rt(),!1),t(`workflow-detail-name`).textContent=e,t(`workflow-detail-description`).textContent=`Loading active definition…`;try{let t=await M.workflowDetail(e);if(Z!==e)return;Q=t,_o(t),await lo()}catch(n){if(Z!==e)return;t(`workflow-detail-description`).textContent=_(n),c(t(`workflow-graph-table`)),t(`workflow-graph-table`).appendChild(l(`p`,`The active workflow definition could not be loaded.`,`empty-state`))}}function mo(){let e=Q,n=N();if(e===null||n?.workflow_start!==!0&&n?.scheduled_start_create!==!0)return;t(`start-run-now-option`).hidden=n.workflow_start!==!0,t(`start-run-later-option`).hidden=n.scheduled_start_create!==!0,i(`start-run-mode`).value=n.workflow_start?`now`:`later`;let r=e.referencedGlobals.length>0?` Referenced trigger globals: ${e.referencedGlobals.join(`, `)}.`:``;t(`start-run-contract`).textContent=(e.hasInputContract?e.inputSchema===null?`The input is validated against the workflow's declared contract.`:`The input is validated against the inline schema shown on the Definition tab.`:`This workflow declares no input contract.`)+r,o(`start-run-input`).value=`{}`,ho(),a(`start-run-dialog`).showModal(),o(`start-run-input`).focus()}function ho(){let e=Q;if(e===null)return;let a=i(`start-run-mode`).value===`later`,o=N()?.scope;t(`start-run-schedule-fields`).hidden=!a,t(`start-run-workload-field`).hidden=!a,r(`start-run-at`).required=a,n(`start-run-submit`).textContent=a?`Schedule start`:`Start run`,t(`start-run-dialog-title`).textContent=a?`Schedule start`:`Start run`,t(`start-run-context`).textContent=a?`Schedules one future invocation of “${e.logicalWorkflow}” in ${o?.tenant??`?`} / ${o?.application??`?`} / ${o?.environment??`?`}. The active definition is resolved when dispatch begins.`:`Starts a real run of “${e.logicalWorkflow}” against active definition ${h(e.activeDefinitionDigest)} in ${o?.tenant??`?`} / ${o?.application??`?`} / ${o?.environment??`?`}.`}async function go(){let e=Q;if(e===null)return;let t;try{t=JSON.parse(o(`start-run-input`).value)}catch{window.alert(`The workflow input must be valid JSON.`);return}if(typeof t!=`object`||!t||Array.isArray(t)){window.alert(`The workflow input must be a JSON object.`);return}try{let n=crypto.randomUUID();if(i(`start-run-mode`).value===`later`){let s=new Date(r(`start-run-at`).value);if(Number.isNaN(s.getTime())){window.alert(`Choose a valid future due time.`);return}let c=i(`start-run-workload`).value;if(!vo(c)){window.alert(`Choose a supported workload class.`);return}await M.scheduleWorkflow(e.logicalWorkflow,n,t,s.toISOString(),c,n),o(`start-run-input`).value=`{}`,a(`start-run-dialog`).close(),F(`triggers`),await Ta();return}let s=await M.startWorkflow(e.logicalWorkflow,n,t);o(`start-run-input`).value=`{}`,a(`start-run-dialog`).close(),s.duplicate&&window.alert(`This request identity had already started a run; showing the existing run.`),s.runId!==null&&(F(`runs`),await ua({workflowId:s.workflowId,runId:s.runId,workflowType:e.logicalWorkflow,status:null,startTime:new Date().toISOString(),closeTime:null}))}catch(e){window.alert(_(e))}}function _o(e){let r=N();n(`workflow-detail-start`).hidden=r?.workflow_start!==!0&&r?.scheduled_start_create!==!0,t(`workflow-detail-name`).textContent=e.logicalWorkflow,t(`workflow-detail-description`).textContent=e.description.length===0?`No description is configured.`:e.description,t(`workflow-detail-digest`).textContent=h(e.activeDefinitionDigest),zo(e);let i=t(`workflow-detail-metadata`);c(i);let a=[[`Workflow name`,e.logicalWorkflow],[`Input parameters`,e.referencedGlobals.length>0?e.referencedGlobals.join(`, `):`—`],[`Active definition`,h(e.activeDefinitionDigest)],[`Retained versions`,String(e.retainedDefinitionCount)],[`Engine ABI`,e.requiredEngineWorkflowAbi],[`Configured steps`,String(e.graphNodes.length)]];for(let[e,t]of a){let n=document.createElement(`div`);n.className=`metadata-field`,n.append(l(`span`,e),l(`strong`,t)),i.appendChild(n)}Ho(e.logicalWorkflow)}function vo(e){return e===`interactive`||e===`standard`||e===`batch`}async function yo(){let e=Q;if(e===null)return;So(e);let t=[];try{t=await Vo(e.logicalWorkflow)}catch{}Co(e,t),wo(e),Lo(e.definitions)}var bo=3,xo=4;function So(e){let n=t(`workflow-input-list`);c(n),e.referencedGlobals.length===0&&d(n,bo,`This workflow references no input parameters.`);for(let t of e.referencedGlobals){let e=document.createElement(`tr`);f(e,t,`cell-primary`),f(e,`trigger global`),f(e,`\${${t}}`,`mono`),n.appendChild(e)}let r=t(`workflow-input-contract`);r.textContent=e.inputSchema===null?e.hasInputContract?`Inputs are validated against the workflow's declared contract.`:"No input contract is declared; parameters above come from ${…} references.":`Inputs are validated against the inline schema below.`;let i=t(`workflow-input-schema`);i.hidden=e.inputSchema===null,i.textContent=e.inputSchema===null?``:JSON.stringify(e.inputSchema,null,2)}function Co(e,n){let r=t(`workflow-start-sources`);c(r);let i=document.createElement(`tr`);f(i,`Control API`,`cell-primary`);let a=N()?.workflow_start===!0,o=ka(e.logicalWorkflow).find(e=>e.kind===`api`),s=o?.state===`active`;p(i,o===void 0?v(`Not declared`,`none`):s?a?v(`Active`,`active`):v(`Not permitted`,`none`):v(`Inactive`,`none`)),f(i,o===void 0?`This workflow does not declare an API trigger.`:s?a?`Start by name with a JSON input matching the parameters above.`:`This session lacks the workflow_start capability.`:`The API trigger is disabled in the declared configuration.`),r.appendChild(i);let l=Oa(e.logicalWorkflow),u=new Set(l.map(e=>e.name)),d=n.filter(e=>!u.has(e.name)),m=document.createElement(`tr`);f(m,`Schedule triggers`,`cell-primary`);let ee=l.filter(e=>e.state===`active`);p(m,ee.length>0?v(`${ee.length} active`,`active`):l.length+d.length>0?v(`Inactive`,`none`):v(`None`,`none`));let te=[...l.map(e=>e.state===`inactive`?`${e.name} (inactive)`:e.name),...d.map(e=>`${e.name} (inactive)`)];f(m,te.length>0?te.join(`, `):`No schedule trigger targets this workflow.`),r.appendChild(m);for(let t of ka(e.logicalWorkflow).filter(e=>e.kind!==`api`&&e.kind!==`schedule`)){let e=document.createElement(`tr`);f(e,`${t.kind} · ${t.name}`,`cell-primary`),p(e,Fa(t.state===`active`)),f(e,`State reflects the declared trigger; provider readiness remains an independent runtime concern.`),r.appendChild(e)}}function wo(e){let n=t(`workflow-step-list`);c(n),e.stepBindings.length===0&&d(n,xo,`This definition declares no step bindings.`);for(let t of e.stepBindings){let e=document.createElement(`tr`);if(f(e,t.operation,`cell-primary`),f(e,t.service??(t.subworkflow===null?`—`:`workflow: ${t.subworkflow}`),t.service===null?void 0:`mono`),f(e,t.action??`—`,t.action===null?void 0:`mono`),t.resources.length===0)f(e,`—`);else{let n=document.createElement(`span`);n.className=`capability-chips`;for(let e of t.resources)n.appendChild(l(`span`,e,`capability-chip`));p(e,n)}n.appendChild(e)}let r=t(`workflow-archival-note`);r.hidden=e.archival===null,r.textContent=e.archival===null?``:`On completion, results are archived to ${e.archival.resource} (retention: ${e.archival.retentionPolicy}).`}var To=null;function Eo(){return To??=Jt(o(`workflow-declaration`)),To}async function Do(){To=await qt(`workflow-declaration`,()=>{}),To.setReadOnly(!0)}async function Oo(e){let r=t(`workflow-declaration-note`),i=t(`workflow-declaration-editor`),a=t(`workflow-declaration-tabs`),o=n(`workflow-declaration-copy`);if(N()?.configuration_view!==!0){r.textContent=`Viewing the declaration requires configuration view permission.`,i.hidden=!0,a.hidden=!0,o.hidden=!0;return}if(Ya!==e){r.textContent=`Loading the active declaration…`;try{let t=await M.workflowDefinition(e);if(Z!==e)return;Ya=e,Mo=t.document,Fo(Ao),i.hidden=!1,o.hidden=!1,r.textContent=`Read-only YAML from immutable definition ${h(t.definitionDigest)} — never the draft.`}catch(e){r.textContent=_(e),i.hidden=!0,a.hidden=!0,o.hidden=!0}}}var ko=new Set([`steps`,`flow`]),Ao=`general`,jo=`full YAML`,Mo=null;function No(e){let t=[],n=null;for(let r of e.split(`
12
+ `)){let e=/^([A-Za-z_][A-Za-z0-9_]*):/.exec(r)?.[1];e===void 0?n!==null&&(n.text+=`\n${r}`):(n!==null&&t.push(n),n={key:e,text:r})}return n!==null&&t.push(n),t}function Po(e){let t=Mo??``;if(e===jo)return t;let n=No(t);return(e===Ao?n.filter(e=>!ko.has(e.key)):n.filter(t=>t.key===e)).map(e=>e.text).join(`
13
+ `).trimEnd()}function Fo(e){let n=t(`workflow-declaration-tabs`);c(n);let r=document.createElement(`legend`);r.className=`sr-only`,r.textContent=`Declaration sections`,n.appendChild(r);let i=[Ao,...No(Mo??``).map(e=>e.key).filter(e=>ko.has(e)),jo];for(let t of i){let r=document.createElement(`button`);r.type=`button`,r.className=t===e?`filter-tab is-active`:`filter-tab`,r.setAttribute(`aria-pressed`,String(t===e)),r.textContent=t,r.addEventListener(`click`,()=>Fo(t)),n.appendChild(r)}n.hidden=!1,Eo().setValue(Po(e))}async function Io(){Mo!==null&&await navigator.clipboard.writeText(Mo)}function Lo(e){let n=t(`workflow-definition-list`);if(c(n),e.length===0){d(n,Ua,`No retained definitions are available.`);return}for(let t of e){let e=document.createElement(`tr`);f(e,h(t.definitionDigest),`mono`),p(e,v(t.active?`Active`:`Retained`)),n.appendChild(e)}}function Ro(e){let t=Wo(e.logicalWorkflow);return{version:1,title:`${e.logicalWorkflow} workflow steps`,nodes:e.graphNodes.map(e=>({id:e.nodeId,label:e.label,kind:e.kind,group:e.group,failed:e.label===t||e.nodeId===t,metadata:e.metadata})),edges:e.graphEdges.map(e=>({source:e.source,target:e.target,label:e.label,dashed:e.dashed}))}}function zo(e){let n=Ro(e);qa===null&&(qa=Pr(t(`workflow-graph`))),qa.render(n),Fr(t(`workflow-graph-table`),n)}function Bo(){let e=t(`workflow-run-list`),r=Xa.items;if(n(`load-more-workflow-runs`).hidden=!Xa.hasMore,c(e),r.length===0){d(e,Wa,`No visible runs target this workflow.`);return}for(let t of r){let n=document.createElement(`tr`);n.className=`interactive-row`,n.addEventListener(`click`,()=>void ua(t)),p(n,v(t.status)),f(n,Xi(t),`cell-primary`),f(n,h(t.workflowId),`mono`),f(n,h(t.runId),`mono`),f(n,g(t.startTime)),f(n,oe(t)),f(n,Ji(ae(t))?.failedStep??`—`),e.appendChild(n)}}async function Vo(e){return(await Aa()).filter(t=>t.workflow===e)}async function Ho(e){let n=t(`workflow-schedule-list`),r=t(`workflow-schedule-note`),i=Oa(e),a=[],o=null;try{a=await Vo(e)}catch(e){o=_(e)}let s=new Set(i.map(e=>e.name)),l=a.filter(e=>!s.has(e.name));c(n),i.length===0&&l.length===0&&d(n,Ga,`No schedule trigger targets this workflow.`);for(let e of i){let t=document.createElement(`tr`);f(t,e.name,`cell-primary`),p(t,sr(e.name,e.state===`active`)),f(t,g(e.nextRunTimes[0]??null)),n.appendChild(t)}for(let e of l){let t=document.createElement(`tr`);f(t,e.name,`cell-primary`),p(t,sr(e.name,!1)),f(t,`—`),n.appendChild(t)}r.hidden=o===null,r.textContent=o===null?``:`Declared triggers could not be loaded: ${o}`}function Uo(e){let t=`${e}${Va}`;return Zi().filter(n=>n.workflowType===e||n.workflowType.startsWith(t))}function Wo(e){for(let t of Uo(e)){let e=Ji(ae(t))?.failedStep;if(e!=null)return e}return null}function Go(e){let n=t(`metrics-links`);c(n);for(let t of e){let e=document.createElement(`a`);e.href=t.url,e.rel=`noopener noreferrer`,e.target=`_blank`,e.textContent=t.label,n.appendChild(e)}}function Ko(e,n){t(`workflow-count`).textContent=String(ro()),t(`live-run-count`).textContent=String(Gi()),t(`failed-run-count`).textContent=String(Ki()),t(`schedule-count`).textContent=String(Da()),t(`nav-run-count`).textContent=String(Gi());let r=t(`runtime-status`);r.textContent=e?`Runtime ready`:`Needs attention`,r.className=e?`status-badge status-ready`:`status-badge status-unavailable`;let i=t(`overview-runtime-summary`);c(i);let a=n.filter(e=>e.required),o=a.filter(e=>e.status===`ready`).length;i.append(l(`p`,a.length===0?`No component health is available.`:`${o} of ${a.length} required components are ready.`,`empty-state`)),qo()}function qo(){let e=t(`failure-list`);c(e);let n=qi();if(n.length===0){e.appendChild(l(`p`,`No failed runs in the loaded results.`,`empty-state`));return}for(let t of n){let n=document.createElement(`button`);n.className=`compact-row`,n.type=`button`,n.addEventListener(`click`,()=>{F(`runs`),ua(t)});let r=document.createElement(`div`),i=Ji(ae(t));r.append(l(`strong`,t.workflowId),l(`span`,i?.failedStep===null||i?.failedStep===void 0?g(t.closeTime):`Failed at ${i.failedStep} · ${g(t.closeTime)}`)),n.append(r,v(t.status)),e.appendChild(n)}}var Jo=`Not configured (optional)`;function Yo(e,n){let r=t(`system-runtime-status`);r.textContent=e?`Runtime ready`:`Needs attention`,r.className=e?`status-badge status-ready`:`status-badge status-unavailable`,n.some(e=>e.component===`trigger_consumer`&&e.status===`ready`);let i=t(`health-components`);c(i),n.length===0&&i.appendChild(l(`p`,`No component health is available.`,`empty-state`));for(let e of n){let t=!e.required&&e.status===`unavailable`,n=document.createElement(`div`);n.className=`health-row is-${t?`optional`:e.status}`,n.appendChild(l(`span`,e.status===`ready`?`✓`:t?`–`:`!`,`health-icon`));let r=document.createElement(`div`);r.append(l(`strong`,e.component.replaceAll(`_`,` `)),l(`span`,e.required?`Required component`:`Optional component`)),n.append(r,t?v(Jo,`unknown`):v(e.status)),i.appendChild(n)}}var Xo=30,Zo=12;async function Qo(){n(`refresh-dashboard`).disabled=!0;try{let[e,t,n]=await Promise.all([M.overview(),M.runs(`running`,Xo),M.runs(`failed`,Zo)]);Wi(t.runs,n.runs);let r=[eo(),ta(),Ta()];sn()&&r.push(un()),await Promise.all(r),await $i(),ce(!0),Go(e.metricsLinks),Ko(e.ready,e.components),Yo(e.ready,e.components),ra();let i=$();i!==null&&await po(i,!1)}finally{n(`refresh-dashboard`).disabled=!1}}function $o(e){return e===`releases`&&!sn()?`workflows`:e===`workflow-editor`&&!gi()?`editor`:e}async function es(){ao(Ht()),F(Bt(),!1,$());try{let e=await M.capabilities();jt(e),t(`scope-label`).textContent=`${e.scope.tenant} / ${e.scope.application} / ${e.scope.environment}`,Tr(e),Tn(e),Di();let n=$o(Bt());F(n,!1,$()),await Promise.all([yr(),Qo()]),e.configuration_view&&await br();let r=$();n===`workflow-editor`&&r!==null&&await bi(r,!1)}catch(e){ce(!1),y(_(e),`is-error`)}}function ts(){Nt(Qo),In(io),Ln(_i),ja(po),Qi(oo);for(let e of document.querySelectorAll(`[data-view]`))e.addEventListener(`click`,()=>{let t=e.dataset.view;t!==void 0&&zt(t)&&(ao(null),F(t))});for(let e of document.querySelectorAll(`[data-view-link]`))e.addEventListener(`click`,()=>{let t=e.dataset.viewLink;t!==void 0&&zt(t)&&F(t)});for(let e of document.querySelectorAll(`[data-edit-draft]`))e.addEventListener(`click`,()=>void fr(`triggers`));for(let e of document.querySelectorAll(`[data-run-filter]`))e.addEventListener(`click`,()=>{let t=e.dataset.runFilter;if(!(t===void 0||!ki.some(e=>e===t))){for(let t of document.querySelectorAll(`[data-run-filter]`))t.classList.toggle(`is-active`,t===e),t.setAttribute(`aria-pressed`,String(t===e));ea(t)}});for(let e of document.querySelectorAll(`[data-workflow-tab]`))e.addEventListener(`click`,()=>{let t=e.dataset.workflowTab;(t===`overview`||t===`definition`||t===`runs`||t===`triggers`)&&co(t)});n(`workflow-declaration-copy`).addEventListener(`click`,()=>void Io()),n(`load-more-workflow-runs`).addEventListener(`click`,()=>void fo()),n(`load-more-runs`).addEventListener(`click`,()=>void na()),n(`load-more-scheduled-starts`).addEventListener(`click`,()=>void Ea()),n(`load-more-workflows`).addEventListener(`click`,()=>void to()),n(`load-more-revisions`).addEventListener(`click`,()=>void dn()),n(`load-more-activations`).addEventListener(`click`,()=>void fn()),r(`workflow-search`).addEventListener(`input`,so),r(`run-search`).addEventListener(`input`,ra),n(`refresh-dashboard`).addEventListener(`click`,()=>void Qo()),n(`new-workflow-draft`).addEventListener(`click`,()=>void yi()),n(`new-schedule`).addEventListener(`click`,()=>_r()),n(`editor-add-schedule`).addEventListener(`click`,()=>_r()),n(`workflow-detail-schedule`).addEventListener(`click`,()=>{let e=$();e!==null&&_r(e)}),n(`workflow-inline-schedule`).addEventListener(`click`,()=>{let e=$();e!==null&&_r(e)}),n(`workflow-detail-edit`).addEventListener(`click`,()=>{let e=$();e!==null&&_i(e)}),n(`editor-open-components`).addEventListener(`click`,()=>void Hr()),r(`component-search`).addEventListener(`input`,Wr),n(`back-to-editor-workflows`).addEventListener(`click`,()=>{ao(null),F(`workflows`)}),n(`fragment-reload`).addEventListener(`click`,()=>void xi()),n(`fragment-preview-run`).addEventListener(`click`,()=>void fi()),n(`fragment-save`).addEventListener(`click`,()=>void Ci()),n(`fragment-validate`).addEventListener(`click`,()=>void Ti()),n(`fragment-retire`).addEventListener(`click`,()=>void wi()),n(`fragment-open-full`).addEventListener(`click`,()=>void Ei()),n(`back-to-workflows`).addEventListener(`click`,()=>{ao(null),F(`workflows`)}),n(`workflow-detail-start`).addEventListener(`click`,mo),i(`start-run-mode`).addEventListener(`change`,ho),s(`start-run-form`).addEventListener(`submit`,e=>{e.preventDefault(),go()}),n(`refresh-run-detail`).addEventListener(`click`,()=>void aa()),r(`watch-run-toggle`).addEventListener(`change`,()=>{sa(r(`watch-run-toggle`).checked)}),n(`close-run-inspector`).addEventListener(`click`,da),n(`inspector-scrim`).addEventListener(`click`,da),n(`load-draft`).addEventListener(`click`,()=>void br()),n(`save-draft`).addEventListener(`click`,()=>void xr()),n(`schedules-reload`).addEventListener(`click`,()=>void Yn(!0)),n(`schedules-save`).addEventListener(`click`,()=>void Xn()),n(`validate-draft`).addEventListener(`click`,()=>void Sr()),n(`discard-draft`).addEventListener(`click`,()=>void wr()),n(`apply-draft`).addEventListener(`click`,()=>void Cr()),n(`activate-revision`).addEventListener(`click`,()=>void vn()),n(`compare-revisions`).addEventListener(`click`,()=>void wn()),s(`workflow-form`).addEventListener(`submit`,e=>{e.preventDefault(),hr()}),s(`schedule-form`).addEventListener(`submit`,e=>{e.preventDefault(),vr()});for(let e of document.querySelectorAll(`[data-close-dialog]`))e.addEventListener(`click`,()=>{let t=e.dataset.closeDialog;t!==void 0&&a(t).close()});i(`schedule-kind`).addEventListener(`change`,()=>{let e=i(`schedule-kind`).value===`cron`;t(`schedule-cron-field`).hidden=!e,t(`schedule-interval-field`).hidden=e,r(`schedule-cron`).required=e,r(`schedule-interval`).required=!e}),window.addEventListener(`popstate`,()=>{ao(Ht());let e=$o(Bt());F(e,!1,$());let t=$();e===`workflow`&&t!==null&&po(t,!1),e===`workflow-editor`&&t!==null&&bi(t,!1)}),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&fa()&&da()}),Un(),mi(),Do();for(let e of document.querySelectorAll(`[data-draft-tab]`))e.addEventListener(`click`,()=>{let t=e.dataset.draftTab??``;Bn(t)&&(Vn(t),t===`triggers`&&Yn())});Jn(),window.addEventListener(`beforeunload`,e=>{(Zn()||hi())&&e.preventDefault()})}function ns(){ts(),es()}ns();
@@ -0,0 +1 @@
1
+ :root{color:#171a22;font-synthesis:none;text-rendering:optimizelegibility;--canvas:#f7f8fa;--surface:#fff;--surface-subtle:#fafbfc;--ink:#171a22;--muted:#687082;--faint:#8d95a5;--line:#e4e7ec;--line-strong:#d4d8e0;--accent:#5746dc;--accent-dark:#4637c5;--accent-soft:#eeecff;--success:#178557;--success-soft:#eaf7f1;--danger:#c63f4b;--danger-dark:#a92f3a;--danger-soft:#fff0f1;--warning:#a55b12;--warning-soft:#fff7e8;--running:#2869cc;--running-soft:#edf4ff;--sidebar-width:232px;--topbar-height:56px;--radius:8px;--shadow-raised:0 12px 40px #1a1e2a1f;background:#f7f8fa;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}html{min-width:320px;min-height:100%}body{background:var(--canvas);min-width:320px;min-height:100vh;margin:0}[hidden]{display:none!important}button,input,select,textarea{color:inherit;font:inherit}button,a,input,select,textarea{outline-offset:2px}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--accent)}button{border:0}svg{display:block}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.app-shell{min-height:100vh}.sidebar{z-index:20;width:var(--sidebar-width);border-right:1px solid var(--line);background:var(--surface);flex-direction:column;display:flex;position:fixed;inset:0 auto 0 0}.brand{height:var(--topbar-height);color:var(--ink);align-items:center;gap:10px;padding:0 18px;text-decoration:none;display:flex}.brand-mark{background:var(--accent);color:#fff;letter-spacing:-.04em;border-radius:7px;place-items:center;width:28px;height:28px;font-size:14px;font-weight:760;display:grid}.brand-name{letter-spacing:-.02em;font-size:16px;font-weight:680}.primary-nav{gap:3px;padding:18px 12px;display:grid}.nav-item{color:#535b6c;cursor:pointer;text-align:left;background:0 0;border-radius:6px;align-items:center;gap:11px;min-height:40px;padding:0 11px;font-size:14px;font-weight:540;display:flex}.nav-item:hover{color:var(--ink);background:#f4f5f8}.nav-item.is-active{background:var(--accent-soft);color:var(--accent-dark);font-weight:650}.nav-item svg{fill:currentColor;flex:0 0 18px;width:18px;height:18px}.nav-count{color:#656d7c;text-align:center;background:#eef0f4;border-radius:999px;min-width:22px;margin-left:auto;padding:1px 6px;font-size:11px;font-weight:700}.nav-item.is-active .nav-count{color:var(--accent-dark);background:#dad6ff}.sidebar-footer{border-top:1px solid var(--line);align-items:center;gap:10px;margin-top:auto;padding:16px 19px;display:flex}.sidebar-footer div{gap:2px;min-width:0;display:grid}.sidebar-footer strong{font-size:12px;font-weight:650}.sidebar-footer span:last-child{color:var(--muted);font-size:11px}.connection-dot{background:var(--faint);border-radius:50%;flex:0 0 8px;width:8px;height:8px;box-shadow:0 0 0 3px #eef0f3}.connection-dot.is-connected{background:var(--success);box-shadow:0 0 0 3px var(--success-soft)}.connection-dot.is-unavailable{background:var(--danger);box-shadow:0 0 0 3px var(--danger-soft)}.workspace{min-height:100vh;margin-left:var(--sidebar-width)}.topbar{z-index:10;height:var(--topbar-height);border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#fffffff0;justify-content:space-between;align-items:center;padding:0 28px;display:flex;position:sticky;top:0}.breadcrumb{color:var(--muted);align-items:center;gap:8px;font-size:13px;display:flex}.breadcrumb svg{fill:none;stroke:#a0a7b4;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px;width:12px;height:12px}.breadcrumb strong{color:var(--ink);font-weight:620}.topbar-actions,.metrics-links{align-items:center;gap:8px;display:flex}.metrics-links a{color:var(--accent-dark);font-size:12px;font-weight:600;text-decoration:none}.metrics-links a:hover{text-decoration:underline}.content{width:min(100%,1480px);margin:0 auto;padding:30px 34px 64px}.page-heading{justify-content:space-between;align-items:flex-start;gap:24px;min-height:54px;margin-bottom:24px;display:flex}.page-heading h1,.surface-heading h2,.inspector-header h2{color:var(--ink);letter-spacing:-.025em;margin:0}.page-heading h1{font-size:27px;font-weight:680;line-height:1.2}.page-heading p,.surface-heading p{color:var(--muted);margin:6px 0 0;font-size:13px;line-height:1.45}.button{cursor:pointer;white-space:nowrap;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;gap:7px;min-height:34px;padding:0 12px;font-size:12px;font-weight:650;line-height:1;display:inline-flex}.button svg{fill:currentColor;width:15px;height:15px}.button-primary{border-color:var(--accent);background:var(--accent);color:#fff}.button-primary:hover:not(:disabled){border-color:var(--accent-dark);background:var(--accent-dark)}.button-secondary{border-color:var(--line-strong);background:var(--surface);color:#424958}.button-secondary:hover:not(:disabled){background:#f8f9fb;border-color:#bfc4ce}.button-danger{background:var(--surface);color:var(--danger-dark);border-color:#e5a8ae}.button-danger:hover:not(:disabled){border-color:var(--danger);background:var(--danger-soft)}.button:disabled{cursor:not-allowed;opacity:.48}.button-full{width:100%}.text-button{color:var(--accent-dark);cursor:pointer;background:0 0;padding:0;font-size:12px;font-weight:650}.text-button:hover{text-decoration:underline}.stat-grid{grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin-bottom:20px;display:grid}.stat-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);align-content:start;min-height:126px;padding:18px;display:grid}.stat-card>span{color:var(--muted);font-size:12px;font-weight:580}.stat-card strong{letter-spacing:-.03em;margin-top:10px;font-size:27px;font-weight:680}.stat-card small{color:var(--faint);align-self:end;margin-top:8px;font-size:11px}.overview-grid{grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);gap:16px;display:grid}.surface{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface)}.surface-heading{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:16px;min-height:68px;padding:14px 18px;display:flex}.surface-heading h2,.inspector-header h2{font-size:15px;font-weight:670}.health-list,.compact-list{min-height:222px}.health-row,.compact-row{border-bottom:1px solid var(--line);align-items:center;gap:12px;min-height:55px;padding:9px 18px;display:flex}.health-row:last-child,.compact-row:last-child{border-bottom:0}.health-icon{background:var(--success-soft);width:28px;height:28px;color:var(--success);border-radius:50%;flex:0 0 28px;place-items:center;font-size:13px;font-weight:800;display:grid}.health-row.is-unavailable .health-icon{background:var(--danger-soft);color:var(--danger)}.health-row div,.compact-row div{gap:3px;min-width:0;display:grid}.health-row strong,.compact-row strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:620;overflow:hidden}.health-row span,.compact-row span{color:var(--muted);font-size:11px}.compact-row{cursor:pointer;text-align:left;background:0 0;width:100%}.compact-row:hover{background:var(--surface-subtle)}.status-badge{color:#555d6d;letter-spacing:.025em;text-transform:uppercase;white-space:nowrap;background:#eef0f3;border-radius:999px;align-items:center;gap:6px;width:fit-content;min-height:22px;padding:2px 8px;font-size:10px;font-weight:720;line-height:1;display:inline-flex}.status-badge:before{content:"";background:currentColor;border-radius:50%;width:6px;height:6px}.status-running,.status-open{background:var(--running-soft);color:var(--running)}.status-failed,.status-terminated,.status-canceled,.status-unavailable{background:var(--danger-soft);color:var(--danger)}.status-completed,.status-active,.status-applied,.status-ready{background:var(--success-soft);color:var(--success)}.status-paused,.status-waiting_for_readiness,.status-pending,.status-running-activation{background:var(--warning-soft);color:var(--warning)}.compact-row .status-badge{margin-left:auto}.notice{border:1px solid var(--line);border-radius:var(--radius);align-items:flex-start;gap:11px;margin-bottom:16px;padding:12px 14px;font-size:12px;line-height:1.5;display:flex}.notice svg{fill:currentColor;flex:0 0 17px;width:17px;height:17px;margin-top:1px}.notice div{gap:1px;display:grid}.notice strong{color:var(--ink)}.notice-neutral{color:#625a8a;background:#f8f7ff;border-color:#dcd9f5}.notice-warning{background:var(--warning-soft);color:#84501a;border-color:#efd7b6}.table-surface{overflow:hidden}.table-toolbar{border-bottom:1px solid var(--line);align-items:center;gap:10px;min-height:54px;padding:9px 12px;display:flex}.search-field{align-items:center;width:min(320px,100%);display:flex;position:relative}.search-field svg{width:15px;height:15px;fill:var(--faint);pointer-events:none;position:absolute;left:10px}.search-field input{border:1px solid var(--line-strong);background:var(--surface);border-radius:6px;width:100%;height:34px;padding:0 11px 0 32px;font-size:12px}.search-field input::placeholder{color:var(--faint)}.result-count{color:var(--muted);margin-left:auto;font-size:11px}.table-scroll{overflow-x:auto}table{border-collapse:collapse;table-layout:auto;width:100%}th{border-bottom:1px solid var(--line);background:var(--surface-subtle);color:#757d8c;letter-spacing:.045em;text-align:left;text-transform:uppercase;white-space:nowrap;height:38px;padding:0 14px;font-size:10px;font-weight:700}td{border-bottom:1px solid var(--line);color:#3a414e;vertical-align:middle;height:56px;padding:9px 14px;font-size:12px}tbody tr:last-child td{border-bottom:0}tbody tr.interactive-row{cursor:pointer}tbody tr.interactive-row:hover td{background:#fafaff}td:last-child,th:last-child{text-align:right}td:first-child,th:first-child{text-align:left}.cell-primary{color:var(--ink);font-weight:620}.cell-stack{gap:3px;display:grid}.cell-stack small{color:var(--muted);font-size:10px}.mono,code,textarea{font-family:SFMono-Regular,Consolas,Liberation Mono,monospace}.mono{color:#4f5664;font-size:11px}.row-actions{justify-content:flex-end;align-items:center;gap:6px;display:inline-flex}.row-action{border:1px solid var(--line-strong);background:var(--surface);color:#4f5664;cursor:pointer;border-radius:5px;min-height:30px;padding:0 9px;font-size:11px;font-weight:620}.row-action:hover:not(:disabled){color:var(--ink);background:#f8f9fa;border-color:#b6bbc7}.row-action.is-danger{color:var(--danger-dark);border-color:#ebc2c6}.row-action.is-danger:hover:not(:disabled){background:var(--danger-soft);border-color:#dda0a6}.row-action:disabled{cursor:not-allowed;opacity:.5}.definition-surface{margin-top:16px}.filter-tabs{border:1px solid var(--line);background:#f5f6f8;border-radius:6px;padding:2px;display:inline-flex}.filter-tab{min-height:28px;color:var(--muted);cursor:pointer;background:0 0;border-radius:4px;padding:0 10px;font-size:11px;font-weight:620}.filter-tab.is-active{background:var(--surface);color:var(--ink);box-shadow:0 1px 2px #1018281a}.run-toolbar .search-field{margin-left:auto}.run-toolbar .result-count{margin-left:0}.inspector-scrim{z-index:30;cursor:default;background:#14171f33;position:fixed;inset:0}.inspector{z-index:40;border-left:1px solid var(--line);background:var(--surface);width:min(600px,92vw);box-shadow:var(--shadow-raised);position:fixed;top:0;bottom:0;right:0;overflow-y:auto}.inspector-header{z-index:1;border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#fffffff5;justify-content:space-between;align-items:center;gap:16px;min-height:74px;padding:14px 20px;display:flex;position:sticky;top:0}.section-label{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;margin-bottom:4px;font-size:9px;font-weight:730;display:block}.icon-button{width:32px;height:32px;color:var(--muted);cursor:pointer;background:0 0;border-radius:5px;place-items:center;display:grid}.icon-button:hover{color:var(--ink);background:#f1f2f5}.icon-button svg{fill:currentColor;width:17px;height:17px}.inspector-body{padding:22px 20px 40px}.run-summary{gap:16px;display:grid}.run-title-block{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.run-title-block h3{letter-spacing:-.02em;overflow-wrap:anywhere;margin:0 0 5px;font-size:17px;font-weight:670}.run-title-block code{color:var(--muted);overflow-wrap:anywhere;font-size:10px}.run-controls{border-bottom:1px solid var(--line);gap:8px;padding-bottom:16px;display:flex}.run-control-note{color:var(--muted);margin:-6px 0 0;font-size:11px;line-height:1.45}.detail-section{border-bottom:1px solid var(--line);padding:4px 0 16px}.detail-section h4,.provenance-panel h4{letter-spacing:.04em;text-transform:uppercase;margin:0 0 12px;font-size:11px;font-weight:720}.detail-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 24px;display:grid}.detail-field{gap:4px;display:grid}.detail-field span{color:var(--muted);font-size:10px}.detail-field strong,.detail-field code{color:#343a46;overflow-wrap:anywhere;font-size:11px;font-weight:580}.provenance-panel{background:#faf9ff;border:1px solid #dedbf5;border-radius:7px;padding:16px}.provenance-rail{grid-template-columns:repeat(3,minmax(0,1fr));gap:0;display:grid}.provenance-node{gap:4px;padding-right:18px;display:grid;position:relative}.provenance-node:not(:last-child):after{content:"";border-top:1px solid #9992cf;border-right:1px solid #9992cf;width:8px;height:8px;position:absolute;top:8px;right:7px;transform:rotate(45deg)}.provenance-node span{color:#777093;letter-spacing:.04em;text-transform:uppercase;font-size:9px;font-weight:700}.provenance-node code{color:#443d71;overflow-wrap:anywhere;font-size:10px}.back-link{color:var(--muted);cursor:pointer;background:0 0;align-items:center;gap:6px;margin:0 0 16px;padding:0;font-size:12px;font-weight:620;display:inline-flex}.back-link:hover{color:var(--accent-dark)}.back-link svg{fill:currentColor;width:15px;height:15px}.workflow-heading{align-items:flex-end}.eyebrow-row,.heading-actions,.graph-legend{align-items:center;display:flex}.eyebrow-row{gap:9px;margin-bottom:9px}.eyebrow-row code{color:var(--muted);font-size:10px}.heading-actions{gap:8px}.workflow-detail-grid{grid-template-columns:minmax(0,1fr) 280px;gap:16px;display:grid}.graph-surface{min-width:0;overflow:hidden}.graph-legend{color:var(--muted);flex-wrap:wrap;justify-content:flex-end;gap:12px;font-size:9px}.graph-legend span{align-items:center;gap:5px;display:inline-flex}.legend-node{background:var(--accent-soft);border:1px solid #8d86d0;border-radius:2px;width:13px;height:8px}.legend-node.is-terminal{background:var(--success-soft);border-color:#72aa91;border-radius:999px}.legend-node.is-failed{background:var(--danger-soft);border-color:#df8c95}.workflow-graph{background-color:#fbfbfd;background-image:radial-gradient(circle,#dfe2e9 .8px,#0000 .8px);background-size:18px 18px;min-height:330px;padding:18px;overflow:auto}.workflow-graph svg{width:100%;min-width:620px;min-height:292px}.graph-edge{fill:none;stroke:#a6acb8;stroke-width:1.5px}.graph-edge.is-dashed{stroke-dasharray:5 5}#graph-arrow path{fill:#8b92a0}.graph-edge-label{fill:var(--muted);text-anchor:middle;font-size:9px}.graph-node rect{fill:#fff;stroke:#8d86d0;stroke-width:1.5px}.graph-node text{fill:#38324f;text-anchor:middle;font-size:11px;font-weight:650}.graph-node.is-terminal rect{fill:var(--success-soft);stroke:#72aa91}.graph-node.is-failed rect{fill:var(--danger-soft);stroke:var(--danger);stroke-width:2px}.graph-node.is-failed text{fill:var(--danger-dark)}.workflow-metadata{align-self:start}.metadata-stack{padding:6px 18px 12px;display:grid}.metadata-field{border-bottom:1px solid var(--line);gap:4px;padding:12px 0;display:grid}.metadata-field:last-child{border-bottom:0}.metadata-field span{color:var(--muted);font-size:10px}.metadata-field strong{color:#343a46;overflow-wrap:anywhere;font-size:11px;font-weight:620}.workflow-bottom-grid{grid-template-columns:minmax(0,1.35fr) minmax(360px,.65fr);gap:16px;margin-top:16px;display:grid}.authoring-dialog{border:1px solid var(--line-strong);background:var(--surface);width:min(620px,100vw - 32px);max-height:calc(100vh - 48px);color:var(--ink);box-shadow:var(--shadow-raised);border-radius:10px;padding:0;overflow:auto}.authoring-dialog::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#14171f6b}.authoring-dialog form{gap:10px;padding:20px;display:grid}.dialog-heading{justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:4px;display:flex}.dialog-heading h2{letter-spacing:-.02em;margin:0;font-size:19px}.dialog-heading p{color:var(--muted);margin:6px 0 0;font-size:11px;line-height:1.5}.authoring-dialog input,.authoring-dialog select,.authoring-dialog textarea{border:1px solid var(--line-strong);background:var(--surface);border-radius:6px;width:100%;margin:0;font-size:12px}.authoring-dialog input,.authoring-dialog select{height:36px;padding:0 10px}.authoring-dialog textarea{resize:vertical;padding:9px 10px;line-height:1.5}.form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 14px;display:grid}.form-grid label{min-width:0}.dialog-actions{border-top:1px solid var(--line);justify-content:flex-end;gap:8px;margin-top:8px;padding-top:14px;display:flex}.empty-state{color:var(--muted);text-align:center;margin:0;padding:30px 18px;font-size:12px;line-height:1.5}.surface-footnote{color:var(--muted);margin:10px 18px 14px;font-size:12px;line-height:1.5}.section-stack{gap:16px;display:grid}.scheduled-starts-section{margin-top:24px}.declaration-tabs{margin:14px 18px 0}.declaration-editor{border-top:1px solid var(--line);margin-top:12px}.editor-surface.declaration-editor .cm-editor{border-bottom:0;min-height:200px}.draft-feedback{padding:0 18px 14px}.state-cell,.declared-control{align-items:center;gap:8px;display:inline-flex}.state-select{appearance:none;cursor:pointer;letter-spacing:.4px;text-transform:uppercase;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath fill='%23687082' d='M2.5 4.5 6 8l3.5-3.5z'/%3E%3C/svg%3E");background-position:right 6px center;background-repeat:no-repeat;border:1px solid #0000;border-radius:999px;padding:3px 22px 3px 12px;font-size:10px;font-weight:700}.state-select.is-active{background-color:var(--success-soft);color:#177245}.state-select.is-inactive{color:var(--muted);background-color:#eef0f4}.action-entry{flex-wrap:wrap;align-items:baseline;gap:8px;padding:2px 0;display:flex}.fragment-components-grid{padding:14px 18px}td.empty-cell{height:110px;color:var(--muted);text-align:center}.revision-chip{border:1px solid var(--line);background:var(--surface);color:#555c69;border-radius:6px;align-items:center;min-height:30px;padding:0 10px;font-family:SFMono-Regular,Consolas,monospace;font-size:10px;display:inline-flex}.release-flow{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 16px;padding:0;list-style:none;display:grid;overflow:hidden}.release-flow li{border-right:1px solid var(--line);align-items:center;gap:10px;min-height:68px;padding:12px 16px;display:flex;position:relative}.release-flow li:last-child{border-right:0}.release-flow li>span{background:var(--accent-soft);width:24px;height:24px;color:var(--accent-dark);border-radius:50%;flex:0 0 24px;place-items:center;font-size:10px;font-weight:750;display:grid}.release-flow div{gap:3px;display:grid}.release-flow strong{font-size:11px;font-weight:670}.release-flow small{color:var(--muted);font-size:9px}.configuration-grid{grid-template-columns:minmax(0,1fr) 292px;gap:16px;display:grid}.editor-surface{min-width:0;overflow:hidden}.editor-heading{min-height:70px}.health-row.is-optional .health-icon{color:var(--muted)}.compare-documents{grid-template-columns:1fr 1fr;gap:14px;padding:14px 18px 18px;display:grid}.inspector-controls{align-items:center;gap:12px;margin-left:auto;margin-right:10px;display:flex}.watch-toggle{color:var(--muted);cursor:pointer;align-items:center;gap:5px;font-size:12px;font-weight:650;display:inline-flex}.send-event-form{border:1px solid var(--line);background:var(--surface-subtle);border-radius:6px;gap:8px;padding:12px;display:grid}.send-event-form textarea{border:1px solid var(--line);background:var(--surface);resize:vertical;border-radius:5px;min-height:70px;padding:8px;font-family:SF Mono,ui-monospace,Menlo,monospace;font-size:12px}.send-event-form input{border:1px solid var(--line);background:var(--surface);border-radius:5px;padding:7px 9px;font-size:12px}.workflow-tabs{margin-bottom:20px}.declaration-view{border-top:1px solid var(--line);background:#fcfcfd;max-height:480px;margin:0;padding:16px 18px;font-family:SF Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;overflow:auto}.compare-documents .declaration-view{border:1px solid var(--line);border-radius:6px;max-height:380px}.graph-frame{border:0;width:100%;min-height:420px;display:block}.graph-fallback{border-top:1px solid var(--line);padding:8px 18px 14px;font-size:12px}.graph-fallback summary{color:var(--muted);cursor:pointer;font-weight:650}.graph-node-list{margin:10px 0 0;padding-left:18px}.graph-node-list>li{margin-bottom:6px}.graph-node-kind{color:var(--muted);margin-left:8px;font-size:11px}.advanced-editor{padding:0}.advanced-editor>summary{color:var(--muted);cursor:pointer;padding:14px 18px;font-size:13px;font-weight:650}.reference-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:10px;padding:8px 2px;font-size:12px;display:flex}.reference-row:last-child{border-bottom:0}.capability-chips{flex-wrap:wrap;justify-content:flex-end;gap:4px;display:flex}.capability-chip{border:1px solid var(--line);background:var(--surface-subtle);color:var(--muted);border-radius:999px;padding:2px 7px;font-size:10px;font-weight:650}.capability-chip.is-empty{border-style:dashed}.load-more-row{justify-content:center;padding:10px 0 14px;display:flex}.load-more-row button[hidden]{display:none}.restart-chip{border-color:var(--warning,#b45309);color:var(--warning,#b45309)}.validation-issues{gap:8px;padding:12px 18px 18px;display:grid}.validation-issue{border:1px solid var(--line);border-left:3px solid var(--danger);background:#fcfcfd;border-radius:6px;grid-template-columns:auto auto 1fr;align-items:baseline;gap:4px 10px;padding:10px 12px;font-size:12px;display:grid}.validation-issue.is-warning{border-left-color:var(--warning,#b45309)}.validation-issue .issue-severity{text-transform:uppercase;color:var(--danger);font-size:10px;font-weight:680}.validation-issue .issue-severity.is-warning{color:var(--warning,#b45309)}.validation-issue .issue-category{text-transform:uppercase;color:var(--muted);font-size:10px;font-weight:680}.validation-issue code{color:var(--muted);font-size:11px}.validation-issue p{color:var(--ink);grid-column:1/-1;margin:0}.editor-surface .cm-editor{border-bottom:1px solid var(--line);background:#fcfcfd;min-height:450px;max-height:70vh;font-size:12.5px}.editor-surface .cm-editor .cm-scroller{font-family:SF Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;line-height:1.55}.editor-surface .cm-editor.cm-focused{outline:none}#configuration-editor,#fragment-editor,#workflow-declaration{resize:vertical;border:0;border-bottom:1px solid var(--line);color:#313643;tab-size:2;background:#fcfcfd;width:100%;min-height:450px;padding:18px;font-size:12px;line-height:1.65;display:block}#configuration-editor:focus{z-index:1;outline-offset:-2px;position:relative}.editor-actions{justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}.editor-actions>div{gap:7px;display:flex}.action-status{min-height:40px;color:var(--muted);padding:0 14px 12px;font-size:11px;line-height:1.45}.action-status:empty{min-height:0;padding-bottom:0}.action-status.is-success{color:var(--success)}.action-status.is-error{color:var(--danger-dark)}.configuration-sidebar{align-content:start;gap:16px;display:grid}.activation-card,.compare-card{padding-bottom:16px}.activation-card .surface-heading,.compare-card .surface-heading{margin-bottom:14px}.field-label{color:var(--muted);margin:10px 16px 5px;font-size:10px;font-weight:650;display:block}.authoring-dialog .field-label{margin:4px 0 2px}select{border:1px solid var(--line-strong);background:var(--surface);border-radius:6px;width:calc(100% - 32px);height:34px;margin:0 16px 10px;padding:0 9px;font-family:SFMono-Regular,Consolas,monospace;font-size:10px}.activation-card .button,.compare-card .button{width:calc(100% - 32px);margin:4px 16px 0}.diff-result{color:var(--muted);margin:12px 16px 0;font-size:10px;line-height:1.5}.history-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:16px;display:grid}@media (width<=1050px){:root{--sidebar-width:204px}.stat-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.overview-grid,.history-grid,.workflow-bottom-grid{grid-template-columns:1fr}.configuration-grid{grid-template-columns:minmax(0,1fr) 260px}.workflow-detail-grid{grid-template-columns:minmax(0,1fr) 240px}.compare-documents{grid-template-columns:1fr}}@media (width<=800px){:root{--topbar-height:52px}.sidebar{border-right:0;border-bottom:1px solid var(--line);width:100%;height:auto;position:static}.brand{height:50px}.primary-nav{gap:4px;padding:7px 12px 10px;display:flex;overflow-x:auto}.nav-item{flex:none;min-height:34px;padding:0 10px}.nav-item svg,.nav-count,.sidebar-footer{display:none}.workspace{margin-left:0}.topbar{padding:0 18px;top:0}.content{padding:24px 18px 48px}.configuration-grid,.workflow-detail-grid{grid-template-columns:1fr}.configuration-sidebar,.release-flow{grid-template-columns:repeat(2,minmax(0,1fr))}.release-flow li:nth-child(2n){border-right:0}.release-flow li:nth-child(-n+4){border-bottom:1px solid var(--line)}}@media (width<=580px){.workflow-tabs,.filter-tabs{flex-wrap:wrap}.content,.topbar{padding-inline:12px}.breadcrumb span,.breadcrumb svg,.metrics-links{display:none}.page-heading{flex-direction:column;align-items:stretch;gap:14px}.page-heading .button{align-self:flex-start}.workflow-heading{align-items:stretch}.heading-actions{flex-wrap:wrap}.stat-grid,.configuration-sidebar,.detail-grid,.form-grid{grid-template-columns:1fr}.run-toolbar{flex-direction:column;align-items:stretch}.run-toolbar .search-field{width:100%;margin-left:0}.run-toolbar .result-count{align-self:flex-end}.release-flow{grid-template-columns:1fr}.release-flow li{border-right:0;border-bottom:1px solid var(--line)}.release-flow li:nth-child(3){border-bottom:1px solid var(--line)}.release-flow li:last-child{border-bottom:0}.editor-actions,.editor-actions>div{flex-direction:column;align-items:stretch}.editor-actions .button{width:100%}.provenance-rail{grid-template-columns:1fr;gap:14px}.provenance-node:not(:last-child):after{display:none}}@media (prefers-reduced-motion:no-preference){.inspector{animation:.16s ease-out inspector-enter}@keyframes inspector-enter{0%{opacity:0;transform:translate(24px)}}}
@@ -0,0 +1 @@
1
+ import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _}from"./editor-DkOyhQUn.js";function v(v,y){let b=new e,x=!1,S=new l({state:_.create({doc:v.value,extensions:[a(),d(),g(),i(),n(),f(c),h(),u({top:!0}),s(),o.of([...t,...m,...p,...r]),b.of(_.readOnly.of(v.readOnly)),l.updateListener.of(e=>{e.docChanged&&!x&&y()})]})});return S.dom.classList.add(`code-editor`),S.dom.setAttribute(`aria-label`,v.getAttribute(`aria-label`)??`Editor`),v.insertAdjacentElement(`afterend`,S.dom),v.hidden=!0,{value:()=>S.state.doc.toString(),setValue:e=>{x=!0;try{S.dispatch({changes:{from:0,to:S.state.doc.length,insert:e}})}finally{x=!1}},setReadOnly:e=>{S.dispatch({effects:b.reconfigure(_.readOnly.of(e))})},focus:()=>S.focus()}}export{v as mountCodeMirror};