@worca/app 1.3.0 → 1.4.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -6
- package/agents/clarify.meta.json +1 -0
- package/agents/memoryDefragmenter.meta.json +2 -1
- package/agents/reviewer.meta.json +60 -0
- package/agents/worca-cc-code-reviewer.md +33 -0
- package/agents/worca-cc-memory-defragmenter.md +5 -3
- package/agents/workspaceScanner.meta.json +1 -0
- package/package.json +14 -10
- package/scripts/git-diff.mjs +25 -0
- package/scripts/gitDiff.meta.json +18 -0
- package/scripts/js-inline.mjs +11 -0
- package/scripts/js.meta.json +22 -0
- package/scripts/py-inline.py +27 -0
- package/scripts/py.meta.json +22 -0
- package/scripts/shell.meta.json +24 -0
- package/skills/worca/SKILL.md +3 -2
- package/src/cli/models.mjs +247 -0
- package/src/cli/render.mjs +72 -4
- package/src/cli/schedule.mjs +494 -0
- package/src/cli/worca-cc.mjs +1001 -22
- package/src/core/agent-registry.mjs +75 -23
- package/src/core/agent-store.mjs +51 -2
- package/src/core/artifacts.mjs +73 -10
- package/src/core/ask/events.mjs +119 -1
- package/src/core/ask/limits.mjs +32 -4
- package/src/core/ask/mcp-stdio.mjs +12 -0
- package/src/core/ask/model-deps.mjs +126 -0
- package/src/core/ask/model-proposal.mjs +370 -0
- package/src/core/ask/models.mjs +12 -0
- package/src/core/ask/policy-deps.mjs +124 -0
- package/src/core/ask/policy-proposal.mjs +363 -0
- package/src/core/ask/prompt.mjs +74 -9
- package/src/core/ask/proposal.mjs +54 -5
- package/src/core/ask/schedule-deps.mjs +83 -0
- package/src/core/ask/schedule-spec.mjs +310 -0
- package/src/core/ask/script-deps.mjs +357 -0
- package/src/core/ask/source-deps.mjs +52 -0
- package/src/core/ask/source-spec.mjs +157 -0
- package/src/core/ask/spawn.mjs +1 -0
- package/src/core/ask/store.mjs +6 -3
- package/src/core/ask/tool-deps.mjs +4 -0
- package/src/core/ask/tools.mjs +657 -37
- package/src/core/ask/turn.mjs +109 -2
- package/src/core/ask-files.mjs +406 -0
- package/src/core/ask-forms.mjs +195 -0
- package/src/core/ask-projection.mjs +72 -0
- package/src/core/bridge/errors.mjs +84 -0
- package/src/core/bridge/provider-ops.mjs +281 -0
- package/src/core/bridge/providers/copilot.mjs +269 -0
- package/src/core/bridge/providers/endpoint.mjs +257 -0
- package/src/core/bridge/registry.mjs +88 -0
- package/src/core/bridge/semaphore.mjs +73 -0
- package/src/core/bridge/server.mjs +184 -0
- package/src/core/bridge/telemetry.mjs +53 -0
- package/src/core/bridge/translate/request.mjs +252 -0
- package/src/core/bridge/translate/response.mjs +82 -0
- package/src/core/bridge/translate/stream.mjs +242 -0
- package/src/core/bridge/upstream.mjs +209 -0
- package/src/core/chat/command-router.mjs +58 -4
- package/src/core/chat/notifier.mjs +14 -1
- package/src/core/chat/renderers.mjs +35 -0
- package/src/core/claude-runner.mjs +126 -19
- package/src/core/config.mjs +212 -31
- package/src/core/cost-budget.mjs +3 -2
- package/src/core/db.mjs +169 -15
- package/src/core/failure-policy.mjs +10 -0
- package/src/core/fs-browse.mjs +16 -4
- package/src/core/git-info.mjs +22 -0
- package/src/core/graph/builtin-workflows.mjs +3 -1
- package/src/core/graph/exec-io.mjs +71 -0
- package/src/core/graph/executor.mjs +139 -70
- package/src/core/graph/human-evidence.mjs +131 -0
- package/src/core/graph/python-probe.mjs +172 -0
- package/src/core/graph/registry-ports.mjs +10 -6
- package/src/core/graph/scheduler.mjs +39 -24
- package/src/core/graph/script-child.mjs +81 -0
- package/src/core/graph/script-runner.mjs +597 -0
- package/src/core/graph/worca_script.py +207 -0
- package/src/core/guardrail-store.mjs +16 -0
- package/src/core/human-backfill.mjs +108 -0
- package/src/core/human-rate.mjs +17 -0
- package/src/core/index-html.mjs +6 -2
- package/src/core/memory-defrag-model.mjs +112 -0
- package/src/core/memory-store.mjs +70 -18
- package/src/core/memory-sync.mjs +22 -11
- package/src/core/metrics/read.mjs +4 -1
- package/src/core/metrics/record.mjs +50 -2
- package/src/core/metrics/sync.mjs +6 -4
- package/src/core/model-env.mjs +149 -0
- package/src/core/model-test.mjs +14 -1
- package/src/core/notifications.mjs +128 -0
- package/src/core/onboarding.mjs +8 -2
- package/src/core/orchestrator.mjs +357 -26
- package/src/core/phases.mjs +95 -6
- package/src/core/plugin-api.mjs +24 -7
- package/src/core/plugin-manifest.mjs +184 -18
- package/src/core/plugin-models.mjs +1 -0
- package/src/core/plugin-script-cases.mjs +118 -0
- package/src/core/plugin-store.mjs +163 -17
- package/src/core/plugin-workflows.mjs +71 -17
- package/src/core/policy/cache.mjs +116 -0
- package/src/core/policy/effective.mjs +175 -0
- package/src/core/policy/gate.mjs +91 -0
- package/src/core/policy/local.mjs +145 -0
- package/src/core/policy/registry.mjs +330 -0
- package/src/core/policy/scope.mjs +61 -0
- package/src/core/policy/state.mjs +79 -0
- package/src/core/policy/sync.mjs +513 -0
- package/src/core/protocol.mjs +43 -0
- package/src/core/run-harness.mjs +421 -72
- package/src/core/scheduler.mjs +980 -0
- package/src/core/script-bench.mjs +628 -0
- package/src/core/script-registry.mjs +116 -0
- package/src/core/script-store.mjs +563 -0
- package/src/core/settings.mjs +489 -14
- package/src/core/stats.mjs +33 -2
- package/src/core/workflow-export.mjs +94 -3
- package/src/core/workflow-share.mjs +67 -18
- package/src/core/workflows.mjs +47 -11
- package/src/core/workspaces.mjs +18 -12
- package/src/shared/forms/answer.mjs +164 -0
- package/src/shared/forms/catalog.mjs +91 -0
- package/src/shared/forms/form-def.mjs +290 -0
- package/src/shared/forms/layout.mjs +67 -0
- package/src/shared/forms/paths.mjs +47 -0
- package/src/shared/forms/project.mjs +309 -0
- package/src/shared/forms/schema.mjs +205 -0
- package/src/shared/graph/agent-meta.mjs +55 -5
- package/src/shared/graph/constants.mjs +14 -2
- package/src/shared/graph/flow-layout.mjs +2 -1
- package/src/shared/graph/isomorphic.mjs +5 -3
- package/src/shared/graph/manifest.mjs +22 -13
- package/src/shared/graph/ports.mjs +45 -19
- package/src/shared/graph/script-cases.mjs +257 -0
- package/src/shared/graph/script-icons.mjs +46 -0
- package/src/shared/graph/script-infer.mjs +259 -0
- package/src/shared/graph/script-meta.mjs +408 -0
- package/src/shared/graph/script-templates.mjs +201 -0
- package/src/shared/graph/template.mjs +4 -4
- package/src/shared/graph/validate.mjs +89 -16
- package/src/shared/human-estimate.mjs +100 -0
- package/src/shared/schedule/recurrence.mjs +353 -0
- package/src/shared/team-metrics/aggregate.mjs +51 -11
- package/{scripts → tools}/install.mjs +3 -3
- package/ui/public/app.js +4390 -683
- package/ui/public/artifact-picker.mjs +189 -0
- package/ui/public/ask/dom.mjs +121 -0
- package/ui/public/ask/form-preview.mjs +55 -0
- package/ui/public/ask/form-renderer.mjs +250 -0
- package/ui/public/ask/registry.mjs +53 -0
- package/ui/public/ask/widgets-display.mjs +370 -0
- package/ui/public/ask/widgets-input.mjs +624 -0
- package/ui/public/ask/widgets-layout.mjs +90 -0
- package/ui/public/ask-panel.mjs +401 -27
- package/ui/public/ask-run-card.mjs +1 -1
- package/ui/public/bridge-view.mjs +694 -0
- package/ui/public/chat-settings-view.mjs +24 -0
- package/ui/public/code-editor.mjs +181 -0
- package/ui/public/getting-started.mjs +34 -7
- package/ui/public/graph/composer.mjs +138 -10
- package/ui/public/graph/inspector.mjs +61 -58
- package/ui/public/graph/palette.mjs +27 -9
- package/ui/public/graph/run-decor.mjs +34 -17
- package/ui/public/graph/run-hosts.mjs +7 -1
- package/ui/public/graph/save-dialog.mjs +3 -0
- package/ui/public/graph/view.mjs +23 -7
- package/ui/public/guardrails-view.mjs +15 -3
- package/ui/public/guide-spot.mjs +87 -9
- package/ui/public/index.html +480 -141
- package/ui/public/memory-view.mjs +22 -4
- package/ui/public/models-view.mjs +162 -17
- package/ui/public/node-tunables.mjs +33 -4
- package/ui/public/plugins-view.mjs +23 -1
- package/ui/public/results-view.mjs +4 -2
- package/ui/public/schedule-sheet.mjs +430 -0
- package/ui/public/schedules-view.mjs +432 -0
- package/ui/public/script-bench-view.mjs +1154 -0
- package/ui/public/script-forms.mjs +282 -0
- package/ui/public/script-wizard.mjs +529 -0
- package/ui/public/scripts-view.mjs +868 -0
- package/ui/public/stats-view.mjs +159 -52
- package/ui/public/style.css +1461 -44
- package/ui/public/team-metrics-surfaces.mjs +77 -16
- package/ui/public/team-metrics-view.mjs +68 -5
- package/ui/public/team-policy-view.mjs +1402 -0
- package/ui/public/ui-level.mjs +237 -0
- package/ui/server.mjs +1827 -73
package/ui/public/index.html
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
</div>
|
|
20
20
|
|
|
21
21
|
<nav class="nav" aria-label="Primary">
|
|
22
|
-
<button type="button" class="active nav-cta" data-nav="new">
|
|
22
|
+
<button type="button" class="active nav-cta" data-nav="new" data-min-level="simple">
|
|
23
23
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
24
24
|
<span>New pipeline</span>
|
|
25
25
|
</button>
|
|
26
26
|
|
|
27
27
|
<div class="nav-sect">Activity</div>
|
|
28
|
-
<button type="button" data-nav="running">
|
|
28
|
+
<button type="button" data-nav="running" data-min-level="simple">
|
|
29
29
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><circle cx="12" cy="12" r="8"></circle><path d="M12 8v4l3 2"></path></svg>
|
|
30
30
|
<span>Running</span>
|
|
31
31
|
<span class="nav-rollup" id="nav-running-rollup" hidden title="A pipeline needs your input"></span>
|
|
@@ -35,44 +35,75 @@
|
|
|
35
35
|
<span class="nav-count n-paused" id="nav-paused-badge" hidden title="Paused pipelines"><span id="nav-paused-count">0</span><svg class="pause-flag" viewBox="0 0 10 10" aria-hidden="true"><rect x="2.2" y="2" width="2" height="6" rx="1"></rect><rect x="5.8" y="2" width="2" height="6" rx="1"></rect></svg></span>
|
|
36
36
|
</button>
|
|
37
37
|
<div class="nav-children" id="nav-running-children"></div>
|
|
38
|
-
<button type="button" data-nav="
|
|
38
|
+
<button type="button" data-nav="schedules" data-min-level="advanced">
|
|
39
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="5" width="17" height="15.5" rx="3"></rect><path d="M3.5 10h17M8 3v4M16 3v4"></path><path d="M12 13.2v2.6l1.8 1.1"></path></svg>
|
|
40
|
+
<span>Schedules</span>
|
|
41
|
+
<!-- Waiting runs + active repeating schedules (grey: waiting is the resting state);
|
|
42
|
+
the amber twin counts UNREAD PROBLEMS in the activity feed. -->
|
|
43
|
+
<span class="nav-count n-grey" id="nav-schedules-count">0</span>
|
|
44
|
+
<span class="nav-count n-amber" id="nav-schedules-unread" hidden title="Scheduled runs that need a look">0</span>
|
|
45
|
+
</button>
|
|
46
|
+
<button type="button" data-nav="history" data-min-level="simple">
|
|
39
47
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M3 12a9 9 0 1 0 3-6.7"></path><path d="M3 4v4h4"></path></svg>
|
|
40
48
|
<span>History</span>
|
|
41
|
-
<span class="nav-count n-grey" id="nav-history-count">0</span>
|
|
42
49
|
</button>
|
|
43
|
-
<button type="button" data-nav="stats">
|
|
50
|
+
<button type="button" data-nav="stats" data-min-level="advanced">
|
|
44
51
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M5 20v-7M12 20V4M19 20v-11"></path></svg>
|
|
45
52
|
<span>Statistics</span>
|
|
46
53
|
</button>
|
|
47
|
-
<button type="button" data-nav="team-metrics">
|
|
54
|
+
<button type="button" data-nav="team-metrics" data-min-level="expert">
|
|
48
55
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19h16"></path><path d="M6 15l4-5 4 3 4-6"></path><circle cx="6" cy="15" r="1.2"></circle><circle cx="10" cy="10" r="1.2"></circle><circle cx="14" cy="13" r="1.2"></circle><circle cx="18" cy="7" r="1.2"></circle></svg>
|
|
49
56
|
<span>Team metrics</span>
|
|
50
57
|
</button>
|
|
51
58
|
|
|
52
|
-
<div class="nav-sect">Build</div>
|
|
53
|
-
<button type="button" data-nav="composer">
|
|
59
|
+
<div class="nav-sect" data-min-level="advanced">Build</div>
|
|
60
|
+
<button type="button" data-nav="composer" data-min-level="advanced">
|
|
54
61
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="9" width="6" height="6" rx="1.6"></rect><rect x="15" y="4" width="6" height="5.5" rx="1.6"></rect><rect x="15" y="14.5" width="6" height="5.5" rx="1.6"></rect><path d="M9 12h2.5M11.5 12V6.8H15M11.5 12v5.3H15"></path></svg>
|
|
55
62
|
<span>Workflow Composer</span>
|
|
56
63
|
</button>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
<!-- Nodes: the two composer node types. A disclosure, not a route — it carries no
|
|
65
|
+
data-nav, so the router never marks it active; app.js#setNodesCollapsed owns
|
|
66
|
+
aria-expanded + the box's .collapsed and remembers a fold. The children keep their
|
|
67
|
+
own data-nav: the `.nav button[data-nav]` snapshot reaches nested buttons. -->
|
|
68
|
+
<button type="button" class="nav-group" data-nav-group="nodes" data-min-level="expert" aria-expanded="true" aria-controls="nav-nodes-children">
|
|
69
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="2.4"></circle><circle cx="18" cy="6" r="2.4"></circle><circle cx="12" cy="18" r="2.4"></circle><path d="M8.4 6h7.2M7.2 8.1l3.6 7.6M16.8 8.1l-3.6 7.6"></path></svg>
|
|
70
|
+
<span>Nodes</span>
|
|
71
|
+
<svg class="nav-group-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"></path></svg>
|
|
60
72
|
</button>
|
|
73
|
+
<div class="nav-children nav-group-children" id="nav-nodes-children" data-min-level="expert">
|
|
74
|
+
<button type="button" class="nav-child" data-nav="agents" data-min-level="expert">
|
|
75
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="8" r="3.2"></circle><path d="M3.5 19c.6-3 2.8-4.6 5.5-4.6S13.9 16 14.5 19"></path><circle cx="17.5" cy="9.5" r="2.4"></circle><path d="M15.5 14.6c2.7 0 4.4 1.4 5 4.4"></path></svg>
|
|
76
|
+
<span>Agents</span>
|
|
77
|
+
</button>
|
|
78
|
+
<button type="button" class="nav-child" data-nav="scripts" data-min-level="expert">
|
|
79
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M4 17l6-5-6-5"></path><path d="M12 19h8"></path></svg>
|
|
80
|
+
<span>Scripts</span>
|
|
81
|
+
</button>
|
|
82
|
+
</div>
|
|
61
83
|
|
|
62
84
|
<div class="nav-sect">Manage</div>
|
|
63
|
-
<button type="button" data-nav="projects">
|
|
85
|
+
<button type="button" data-nav="projects" data-min-level="simple">
|
|
64
86
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7.5A1.5 1.5 0 0 1 4.5 6h4l2 2.2H19.5A1.5 1.5 0 0 1 21 9.7v8.3A1.5 1.5 0 0 1 19.5 19.5h-15A1.5 1.5 0 0 1 3 18z"></path></svg>
|
|
65
87
|
<span>Projects</span>
|
|
66
|
-
<span class="nav-count n-grey" id="nav-projects-count">0</span>
|
|
67
88
|
</button>
|
|
68
|
-
<button type="button" data-nav="workspaces">
|
|
89
|
+
<button type="button" data-nav="workspaces" data-min-level="advanced">
|
|
69
90
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1.6"></rect><rect x="14" y="3" width="7" height="7" rx="1.6"></rect><rect x="3" y="14" width="7" height="7" rx="1.6"></rect><path d="M14 17.5h7M17.5 14v7"></path></svg>
|
|
70
91
|
<span>Workspaces</span>
|
|
71
|
-
|
|
92
|
+
</button>
|
|
93
|
+
<button type="button" data-nav="team-policy" data-min-level="expert">
|
|
94
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l8 3v6c0 4.5-3.4 7.6-8 9-4.6-1.4-8-4.5-8-9V6l8-3z"></path><path d="M9 12l2 2 4-4"></path></svg>
|
|
95
|
+
<span>Team policy</span>
|
|
72
96
|
</button>
|
|
73
97
|
|
|
74
98
|
<div class="nav-sep" aria-hidden="true"></div>
|
|
75
|
-
|
|
99
|
+
<!-- Interface mode (docs/ui-levels.md): an ACTION, not a view, so it carries no data-nav
|
|
100
|
+
and never takes the dark "active" fill. The icon is the state readout: ui-level.mjs
|
|
101
|
+
repaints it, and on the collapsed rail it is all that shows. -->
|
|
102
|
+
<button type="button" class="nav-mode" id="nav-mode" data-mode-open="full" data-min-level="simple" aria-haspopup="dialog">
|
|
103
|
+
<i class="lv-icon-slot"><svg class="lv-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="M3 12.5l9 5 9-5"></path><path d="M3 17l9 5 9-5"></path></svg></i>
|
|
104
|
+
<span class="lv-name">Expert</span>
|
|
105
|
+
</button>
|
|
106
|
+
<button type="button" data-nav="settings" data-min-level="simple">
|
|
76
107
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path></svg>
|
|
77
108
|
<span>Settings</span>
|
|
78
109
|
</button>
|
|
@@ -92,22 +123,34 @@
|
|
|
92
123
|
<main class="main">
|
|
93
124
|
<!-- compact top-nav (shown <1080px, where the sidebar is hidden) -->
|
|
94
125
|
<nav class="topnav" aria-label="Primary compact">
|
|
95
|
-
<button type="button" class="active" data-nav="new">New</button>
|
|
96
|
-
<span class="topnav-sep" aria-hidden="true"></span>
|
|
97
|
-
<button type="button" data-nav="running">Running<span class="nav-rollup" id="topnav-running-rollup" hidden></span></button>
|
|
98
|
-
<button type="button" data-nav="history">History</button>
|
|
99
|
-
<button type="button" data-nav="stats">Stats<span class="topnav-amt mono" id="topnav-spend" hidden></span></button>
|
|
100
|
-
<button type="button" data-nav="team-metrics">Team metrics</button>
|
|
126
|
+
<button type="button" class="active" data-nav="new" data-min-level="simple">New</button>
|
|
101
127
|
<span class="topnav-sep" aria-hidden="true"></span>
|
|
102
|
-
<button type="button" data-nav="
|
|
103
|
-
<button type="button" data-nav="
|
|
128
|
+
<button type="button" data-nav="running" data-min-level="simple">Running<span class="nav-rollup" id="topnav-running-rollup" hidden></span></button>
|
|
129
|
+
<button type="button" data-nav="schedules" data-min-level="advanced">Schedules</button>
|
|
130
|
+
<button type="button" data-nav="history" data-min-level="simple">History</button>
|
|
131
|
+
<button type="button" data-nav="stats" data-min-level="advanced">Stats<span class="topnav-amt mono" id="topnav-spend" hidden></span></button>
|
|
132
|
+
<button type="button" data-nav="team-metrics" data-min-level="expert">Team metrics</button>
|
|
133
|
+
<span class="topnav-sep" aria-hidden="true" data-min-level="advanced"></span>
|
|
134
|
+
<button type="button" data-nav="composer" data-min-level="advanced">Composer</button>
|
|
135
|
+
<button type="button" data-nav="agents" data-min-level="expert">Agents</button>
|
|
136
|
+
<button type="button" data-nav="scripts" data-min-level="expert">Scripts</button>
|
|
104
137
|
<span class="topnav-sep" aria-hidden="true"></span>
|
|
105
|
-
<button type="button" data-nav="projects">Projects</button>
|
|
106
|
-
<button type="button" data-nav="workspaces">Workspaces</button>
|
|
138
|
+
<button type="button" data-nav="projects" data-min-level="simple">Projects</button>
|
|
139
|
+
<button type="button" data-nav="workspaces" data-min-level="advanced">Workspaces</button>
|
|
140
|
+
<button type="button" data-nav="team-policy" data-min-level="expert">Team policy</button>
|
|
107
141
|
<span class="topnav-sep" aria-hidden="true"></span>
|
|
108
|
-
<button type="button" data-
|
|
142
|
+
<button type="button" class="topnav-mode" data-mode-open="short" data-min-level="simple" aria-haspopup="dialog"><i class="lv-icon-slot"><svg class="lv-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 3 8l9 5 9-5-9-5z"></path><path d="M3 12.5l9 5 9-5"></path><path d="M3 17l9 5 9-5"></path></svg></i><span class="lv-name">Expert</span></button>
|
|
143
|
+
<button type="button" data-nav="settings" data-min-level="simple">Settings</button>
|
|
109
144
|
</nav>
|
|
110
145
|
|
|
146
|
+
<!-- Shown when the open page sits above the interface mode (a deep link, a guide, or a
|
|
147
|
+
mode change while on it). app.js#paintLevelBanner fills and toggles it. -->
|
|
148
|
+
<div id="level-banner" class="level-banner" role="status" hidden>
|
|
149
|
+
<span class="lv-pill" id="level-banner-pill"></span>
|
|
150
|
+
<span class="level-banner-text" id="level-banner-text"></span>
|
|
151
|
+
<button type="button" class="btn btn-ghost btn-mini" id="level-banner-switch" data-mode-set=""></button>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
111
154
|
<!-- ===== VIEW: NEW PIPELINE ===== -->
|
|
112
155
|
<section class="view" data-view="new">
|
|
113
156
|
<div class="topbar">
|
|
@@ -123,7 +166,7 @@
|
|
|
123
166
|
<!-- Target switch and the thing it selects share one row: they are one
|
|
124
167
|
decision, and the switch is only meaningful next to its picker. -->
|
|
125
168
|
<div class="split-row">
|
|
126
|
-
<div class="field field-compact">
|
|
169
|
+
<div class="field field-compact" id="target-field" data-min-level="advanced">
|
|
127
170
|
<label>Target</label>
|
|
128
171
|
<div class="seg" id="target-seg">
|
|
129
172
|
<button type="button" data-target="project" class="on" aria-pressed="true">Project</button>
|
|
@@ -205,7 +248,7 @@
|
|
|
205
248
|
</div>
|
|
206
249
|
|
|
207
250
|
<!-- Memory defragment only (agent memory §7.3 / B11): the scope the run restructures. -->
|
|
208
|
-
<div class="field field-compact" id="memory-scope-row" hidden>
|
|
251
|
+
<div class="field field-compact" id="memory-scope-row" data-min-level="expert" hidden>
|
|
209
252
|
<label>Memory scope</label>
|
|
210
253
|
<div class="seg" id="memory-scope-seg" role="group" aria-label="Memory scope">
|
|
211
254
|
<button type="button" data-scope="global" class="on" aria-pressed="true">Global</button>
|
|
@@ -215,7 +258,7 @@
|
|
|
215
258
|
</div>
|
|
216
259
|
|
|
217
260
|
<!-- Task source switch; the panes below span the full width. -->
|
|
218
|
-
<div class="field field-compact">
|
|
261
|
+
<div class="field field-compact" id="source-field" data-min-level="advanced">
|
|
219
262
|
<label>Task source</label>
|
|
220
263
|
<div class="seg" id="source-seg">
|
|
221
264
|
<button type="button" data-src="prompt" class="on" aria-pressed="true">Prompt</button>
|
|
@@ -262,7 +305,7 @@
|
|
|
262
305
|
</div>
|
|
263
306
|
|
|
264
307
|
<!-- Branch pair: one decision (from → into), so one compact row. -->
|
|
265
|
-
<div class="field-grid-2">
|
|
308
|
+
<div class="field-grid-2" id="branch-fields" data-min-level="advanced">
|
|
266
309
|
<div class="field field-compact">
|
|
267
310
|
<label for="sourceBranch">Source branch</label>
|
|
268
311
|
<div class="select-wrap" id="sourceBranchWrap">
|
|
@@ -270,6 +313,10 @@
|
|
|
270
313
|
</div>
|
|
271
314
|
<!-- Workspace mode: one source-branch dropdown per member project. -->
|
|
272
315
|
<div class="ws-source-branches hidden" id="ws-source-branches"></div>
|
|
316
|
+
<div class="switch-row ws-src-prev hidden" id="ws-source-previous-row">
|
|
317
|
+
<div class="switch" id="ws-source-previous" role="switch" tabindex="0" aria-checked="false" aria-label="Branch off the run before it"></div>
|
|
318
|
+
<span class="txt">Branch off the run before it</span>
|
|
319
|
+
</div>
|
|
273
320
|
<small class="hint" id="sourceBranchHint">The worktree branches off this. Defaults to the current branch.</small>
|
|
274
321
|
</div>
|
|
275
322
|
|
|
@@ -284,7 +331,7 @@
|
|
|
284
331
|
A workflow ships tuned, so its per-agent knobs belong here with
|
|
285
332
|
guardrails and mock mode; the workflow PICKER stays above.
|
|
286
333
|
Collapsed unless something inside is already non-default. -->
|
|
287
|
-
<details class="advanced" id="advanced-config">
|
|
334
|
+
<details class="advanced" id="advanced-config" data-min-level="advanced">
|
|
288
335
|
<summary>
|
|
289
336
|
<span class="adv-chev" aria-hidden="true"></span>
|
|
290
337
|
<span>Advanced</span>
|
|
@@ -303,12 +350,12 @@
|
|
|
303
350
|
<span class="agents-wf" id="agentsWorkflow"></span>
|
|
304
351
|
<span class="agents-summary" id="agentsSummary">all defaults</span>
|
|
305
352
|
<span class="agents-actions">
|
|
306
|
-
<button type="button" id="agentsPromote" class="btn-ghost btn-mini" hidden>Save as workflow defaults</button>
|
|
353
|
+
<button type="button" id="agentsPromote" class="btn-ghost btn-mini" data-min-level="expert" hidden>Save as workflow defaults</button>
|
|
307
354
|
<button type="button" id="agentsReset" class="btn-ghost btn-mini" hidden>Reset</button>
|
|
308
355
|
</span>
|
|
309
356
|
</div>
|
|
310
357
|
<div id="agents-rows"></div>
|
|
311
|
-
<div id="wf-feedback-config" class="agent-row-body-inner" hidden></div>
|
|
358
|
+
<div id="wf-feedback-config" class="agent-row-body-inner" data-min-level="expert" hidden></div>
|
|
312
359
|
</div>
|
|
313
360
|
</div>
|
|
314
361
|
|
|
@@ -335,21 +382,54 @@
|
|
|
335
382
|
<small class="hint" id="guardrailsHint">Applies to every agent this run spawns. Permissive = no restrictions (the legacy default).</small>
|
|
336
383
|
</div>
|
|
337
384
|
|
|
338
|
-
<div class="switch-row">
|
|
339
|
-
<div class="switch" id="mock-switch" role="switch" aria-checked="false" tabindex="0"></div>
|
|
340
|
-
<span class="txt">Mock mode — no Claude calls, offline dry run</span>
|
|
341
|
-
</div>
|
|
342
|
-
<input id="mock" type="checkbox" hidden />
|
|
343
385
|
</div>
|
|
344
386
|
</details>
|
|
345
387
|
|
|
388
|
+
<!-- Mock mode sits OUTSIDE Advanced (docs/ui-levels.md): onboarding sends first-time
|
|
389
|
+
users to it, and it is the one switch that makes a run free and harmless. -->
|
|
390
|
+
<div class="switch-row mock-row" id="mock-row" data-min-level="simple">
|
|
391
|
+
<div class="switch" id="mock-switch" role="switch" aria-checked="false" tabindex="0"></div>
|
|
392
|
+
<span class="txt">Mock mode — try it offline: no Claude calls, no cost</span>
|
|
393
|
+
</div>
|
|
394
|
+
<input id="mock" type="checkbox" hidden />
|
|
395
|
+
|
|
396
|
+
<!-- Settings the current mode hides but this run still uses (app.js#paintHiddenSettings). -->
|
|
397
|
+
<div class="level-hidden-note" id="level-hidden-note" hidden>
|
|
398
|
+
<span id="level-hidden-text"></span>
|
|
399
|
+
<button type="button" class="link-btn" id="level-hidden-show" data-mode-set=""></button>
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
<!-- Team policy notes (design board 8): in the main column, never inside Advanced,
|
|
403
|
+
and never gated — a team cap applies in every interface mode. -->
|
|
404
|
+
<div id="policyLine" hidden></div>
|
|
405
|
+
|
|
346
406
|
<!-- Actions -->
|
|
347
407
|
<div class="hint err" id="newBlockedNote" hidden></div>
|
|
348
408
|
<div class="actions" style="justify-content:flex-end">
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
409
|
+
<!-- A time picked BEFORE the task (Schedules › Schedule a run, or Change… here):
|
|
410
|
+
it waits on the form and Start run becomes Schedule. -->
|
|
411
|
+
<div class="ask-card-sched new-sched" id="new-sched" hidden>
|
|
412
|
+
<span class="badge grey" id="new-sched-badge">Scheduled</span>
|
|
413
|
+
<span class="ask-card-sched-text" id="new-sched-text"></span>
|
|
414
|
+
<button type="button" class="link-btn" id="new-sched-change">Change…</button>
|
|
415
|
+
<button type="button" class="link-btn" id="new-sched-clear" title="Drop the time and start the run right away">Start now instead</button>
|
|
416
|
+
</div>
|
|
417
|
+
<!-- Split button: Start run stays the primary action; the caret opens the
|
|
418
|
+
other way to start — Schedule… (once, later, or on a repeat). -->
|
|
419
|
+
<div class="btn-split" id="start-split">
|
|
420
|
+
<button type="submit" id="start-btn" class="btn-go">
|
|
421
|
+
<svg id="start-btn-play" width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M6 4l14 8-14 8V4Z"></path></svg>
|
|
422
|
+
<svg id="start-btn-clock" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" hidden><path d="M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18ZM12 7.5V12l3 2"></path></svg>
|
|
423
|
+
<span id="start-btn-label">Start run</span>
|
|
424
|
+
</button>
|
|
425
|
+
<button type="button" id="start-more" class="btn-split-more" data-min-level="advanced" aria-haspopup="menu" aria-expanded="false" aria-controls="start-menu" title="More ways to start" aria-label="More ways to start">
|
|
426
|
+
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg>
|
|
427
|
+
</button>
|
|
428
|
+
<div class="btn-split-menu" id="start-menu" role="menu" hidden>
|
|
429
|
+
<button type="button" role="menuitem" id="start-menu-now"><b>Start run now</b><small>Begins immediately</small></button>
|
|
430
|
+
<button type="button" role="menuitem" id="start-menu-schedule"><b>Schedule…</b><small>Run once later, or on a repeat</small></button>
|
|
431
|
+
</div>
|
|
432
|
+
</div>
|
|
353
433
|
</div>
|
|
354
434
|
<p id="form-msg" class="form-msg" aria-live="polite"></p>
|
|
355
435
|
</form>
|
|
@@ -366,7 +446,7 @@
|
|
|
366
446
|
<div class="topbar">
|
|
367
447
|
<div>
|
|
368
448
|
<h1>Getting started</h1>
|
|
369
|
-
<div class="sub">
|
|
449
|
+
<div class="sub">Nine things to do with Worca, in order · each tile opens a guided tour of the real controls</div>
|
|
370
450
|
</div>
|
|
371
451
|
</div>
|
|
372
452
|
<div id="getting-started-host" class="gs-host" hidden></div>
|
|
@@ -382,7 +462,7 @@
|
|
|
382
462
|
<div class="sub" id="running-sub">0 pipelines executing · 0 need your input</div>
|
|
383
463
|
</div>
|
|
384
464
|
<span class="pill-run amber hidden" id="running-status-pill" style="box-shadow:var(--shadow-soft)"><span class="pdot"></span> 0 needs input</span>
|
|
385
|
-
<div class="run-density" role="group" aria-label="List density">
|
|
465
|
+
<div class="run-density" role="group" data-min-level="advanced" aria-label="List density">
|
|
386
466
|
<button type="button" class="rc-dseg" data-density="compact" aria-pressed="false" title="Compact — three runs per screen">
|
|
387
467
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><rect x="3" y="5" width="18" height="3" rx="1.5"></rect><rect x="3" y="10.5" width="18" height="3" rx="1.5"></rect><rect x="3" y="16" width="18" height="3" rx="1.5"></rect></svg>
|
|
388
468
|
</button>
|
|
@@ -402,6 +482,16 @@
|
|
|
402
482
|
|
|
403
483
|
<div class="run-list" id="run-list"></div>
|
|
404
484
|
|
|
485
|
+
<!-- Runs that start within 24 hours (tickets, not pipelines). The full list,
|
|
486
|
+
repeating schedules and the activity feed live in the Schedules view. -->
|
|
487
|
+
<div class="run-scheduled" id="run-scheduled" hidden>
|
|
488
|
+
<div class="run-scheduled-head">
|
|
489
|
+
<div class="sched-group-title">Scheduled · next 24 hours</div>
|
|
490
|
+
<a href="#schedules">All schedules →</a>
|
|
491
|
+
</div>
|
|
492
|
+
<div class="sched-list" id="run-scheduled-list"></div>
|
|
493
|
+
</div>
|
|
494
|
+
|
|
405
495
|
<!-- clone target for one run card (Task 3 fills it) -->
|
|
406
496
|
<template id="run-card-tpl">
|
|
407
497
|
<section class="card run-card" data-run-id="" data-density="detailed">
|
|
@@ -419,11 +509,11 @@
|
|
|
419
509
|
<div class="rc-meta">
|
|
420
510
|
<span class="rc-status-word"></span>
|
|
421
511
|
<span class="rc-seg"><span class="rc-dot">·</span><span class="rm-text"></span></span>
|
|
422
|
-
<span class="rc-seg rc-prog" hidden><span class="rc-dot">·</span><span class="rc-prog-text"></span></span>
|
|
512
|
+
<span class="rc-seg rc-prog" hidden data-min-level="advanced"><span class="rc-dot">·</span><span class="rc-prog-text"></span></span>
|
|
423
513
|
<span class="rc-seg"><span class="rc-dot">·</span><span class="run-time mono"></span></span>
|
|
424
514
|
<span class="rc-seg"><span class="rc-dot">·</span><span class="run-cost mono"></span></span>
|
|
425
515
|
</div>
|
|
426
|
-
<span class="rc-branch mono" hidden>
|
|
516
|
+
<span class="rc-branch mono" hidden data-min-level="advanced">
|
|
427
517
|
<span class="rc-base" hidden></span>
|
|
428
518
|
<button type="button" class="rc-branch-copy" title="Copy branch name" aria-label="Copy branch name">
|
|
429
519
|
<span class="rc-branch-name"></span>
|
|
@@ -443,19 +533,20 @@
|
|
|
443
533
|
<button type="button" class="btn-resume" title="Resume — restart this paused pipeline where it left off" aria-label="Resume" hidden><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M7 5l12 7-12 7z"></path></svg></button>
|
|
444
534
|
<button type="button" class="btn-pause" title="Pause — gracefully stop the session so it can be resumed" aria-label="Pause"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="5" width="4" height="14" rx="1.5"></rect><rect x="14" y="5" width="4" height="14" rx="1.5"></rect></svg></button>
|
|
445
535
|
<button type="button" class="btn-stop" title="Stop this pipeline" aria-label="Stop"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="6" width="12" height="12" rx="2"></rect></svg></button>
|
|
536
|
+
<button type="button" class="rc-after" title="Schedule a run after this" aria-label="Schedule a run after this" data-min-level="advanced" hidden><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h12"></path><path d="M13 6l6 6-6 6"></path></svg></button>
|
|
446
537
|
<button type="button" class="rc-open" title="Open run" aria-label="Open run"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"><path d="M9 6l6 6-6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg></button>
|
|
447
538
|
</div>
|
|
448
539
|
</div>
|
|
449
540
|
<div class="rc-compact">
|
|
450
541
|
<span class="rc-step-chip"></span>
|
|
451
542
|
<span class="rc-step-name"></span>
|
|
452
|
-
<span class="rc-step-model mono" hidden></span>
|
|
543
|
+
<span class="rc-step-model mono" hidden data-min-level="advanced"></span>
|
|
453
544
|
</div>
|
|
454
545
|
<div class="cost-banner" hidden></div>
|
|
455
546
|
<div class="rc-detailed">
|
|
456
547
|
<div class="run-flow-wrap"><div class="run-flow"></div></div>
|
|
457
|
-
<div class="run-log">
|
|
458
|
-
<div class="run-log-head"><span class="ll-label">Live log</span><div class="log-filters"><select class="log-f log-f-source" title="Filter by source" aria-label="Filter by source"></select><select class="log-f log-f-level" title="Filter by level" aria-label="Filter by level"></select><select class="log-f log-f-step" title="Filter by step" aria-label="Filter by step"></select><select class="log-f log-f-cycle" title="Filter by cycle" aria-label="Filter by cycle"></select><button type="button" class="log-f log-f-exec" hidden title="Showing one execution — click to clear"><span class="lfe-text"></span><span class="lfe-x" aria-hidden="true">×</span></button><input type="search" class="log-f log-search" placeholder="search" title="Search the log text" aria-label="Search the log text"><button type="button" class="log-f log-copy" title="Copy the visible log lines" aria-label="Copy the visible log lines">copy</button></div><div class="switch-row"><div class="switch on autoscroll" role="switch" aria-checked="true" tabindex="0"></div><span class="txt">Auto-scroll</span></div></div>
|
|
548
|
+
<div class="run-log" data-min-level="advanced">
|
|
549
|
+
<div class="run-log-head"><span class="ll-label">Live log</span><div class="log-filters"><select class="log-f log-f-source" data-min-level="expert" title="Filter by source" aria-label="Filter by source"></select><select class="log-f log-f-level" data-min-level="expert" title="Filter by level" aria-label="Filter by level"></select><select class="log-f log-f-step" data-min-level="expert" title="Filter by step" aria-label="Filter by step"></select><select class="log-f log-f-cycle" data-min-level="expert" title="Filter by cycle" aria-label="Filter by cycle"></select><button type="button" class="log-f log-f-exec" hidden title="Showing one execution — click to clear"><span class="lfe-text"></span><span class="lfe-x" aria-hidden="true">×</span></button><input type="search" class="log-f log-search" placeholder="search" title="Search the log text" aria-label="Search the log text"><button type="button" class="log-f log-copy" title="Copy the visible log lines" aria-label="Copy the visible log lines">copy</button></div><div class="switch-row"><div class="switch on autoscroll" role="switch" aria-checked="true" tabindex="0"></div><span class="txt">Auto-scroll</span></div></div>
|
|
459
550
|
<div class="log"></div>
|
|
460
551
|
</div>
|
|
461
552
|
</div><!-- /.rc-detailed -->
|
|
@@ -481,8 +572,8 @@
|
|
|
481
572
|
</div>
|
|
482
573
|
<div class="rd-meta mono"></div>
|
|
483
574
|
<div class="rd-row3">
|
|
484
|
-
<span class="rd-base mono" hidden></span>
|
|
485
|
-
<button type="button" class="rd-branch-copy mono" hidden title="Copy branch name" aria-label="Copy branch name">
|
|
575
|
+
<span class="rd-base mono" hidden data-min-level="advanced"></span>
|
|
576
|
+
<button type="button" class="rd-branch-copy mono" hidden data-min-level="advanced" title="Copy branch name" aria-label="Copy branch name">
|
|
486
577
|
<span class="rd-branch-name"></span>
|
|
487
578
|
<svg class="ico-copy" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="12" height="12" rx="2.5"></rect><path d="M5 15H4.5A1.5 1.5 0 0 1 3 13.5v-9A1.5 1.5 0 0 1 4.5 3h9A1.5 1.5 0 0 1 15 4.5V5" stroke-linecap="round"></path></svg>
|
|
488
579
|
<svg class="ico-check" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M4 12.5l5.5 5.5L20 6.5" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
@@ -508,12 +599,6 @@
|
|
|
508
599
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="6" width="12" height="12" rx="2"></rect></svg>
|
|
509
600
|
<span class="rd-btn-label">Stop</span>
|
|
510
601
|
</button>
|
|
511
|
-
<!-- Report this run: hidden until the run reaches a terminal state
|
|
512
|
-
(paintRdTerminal), because a mid-flight run has no totals to
|
|
513
|
-
report. paintRdTerminal appends .rd-history-link after this
|
|
514
|
-
button, so the painted row reads
|
|
515
|
-
Stop · Report this run · View in History. -->
|
|
516
|
-
<button type="button" class="rd-report btn-ghost" hidden>Report this run</button>
|
|
517
602
|
</div>
|
|
518
603
|
<!-- Inline error slot for failed actions, on the HEADER so it is never
|
|
519
604
|
pushed below the fold by the graph or a tab body (mirrors .hd-error). -->
|
|
@@ -580,17 +665,17 @@
|
|
|
580
665
|
<span class="hm-seg hist-clock-seg"><span class="hm-dot">·</span><span class="hist-clock"></span></span>
|
|
581
666
|
<span class="hm-seg hist-time-seg"><span class="hm-dot">·</span><span class="hist-time mono"></span></span>
|
|
582
667
|
<span class="hm-seg hist-total-seg"><span class="hm-dot">·</span><span class="hist-total mono"></span></span>
|
|
583
|
-
<span class="hist-diff-pill" hidden>
|
|
668
|
+
<span class="hist-diff-pill" hidden data-min-level="advanced">
|
|
584
669
|
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M6 3h8l4 4v14H6z" stroke-linejoin="round"></path><path d="M14 3v4h4" stroke-linejoin="round"></path></svg>
|
|
585
670
|
<span class="hist-diff mono" aria-label="lines changed"></span>
|
|
586
671
|
<span class="hist-nodiff mono" hidden>no diff</span>
|
|
587
672
|
</span>
|
|
588
|
-
<span class="hist-cmt-pill" hidden>
|
|
673
|
+
<span class="hist-cmt-pill" hidden data-min-level="advanced">
|
|
589
674
|
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M21 12a8 8 0 0 1-8 8H7l-4 3v-6.5A8 8 0 0 1 11 4h2a8 8 0 0 1 8 8z" stroke-linejoin="round"></path></svg>
|
|
590
675
|
<span class="hist-cmt-count mono" aria-label="unresolved diff comments"></span>
|
|
591
676
|
</span>
|
|
592
677
|
</div>
|
|
593
|
-
<span class="hist-branch mono" hidden>
|
|
678
|
+
<span class="hist-branch mono" hidden data-min-level="advanced">
|
|
594
679
|
<span class="hist-branch-src" hidden></span>
|
|
595
680
|
<svg class="hist-branch-arrow" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-label="into" role="img" hidden><path d="M4 12h15M13 6l6 6-6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
596
681
|
<span class="hist-branch-dst"></span>
|
|
@@ -608,7 +693,7 @@
|
|
|
608
693
|
<span class="hist-pausenote" hidden></span>
|
|
609
694
|
</div>
|
|
610
695
|
<div class="hist-aside">
|
|
611
|
-
<button type="button" class="hist-pr btn-ghost" hidden>Create PR</button>
|
|
696
|
+
<button type="button" class="hist-pr btn-ghost" hidden data-min-level="advanced">Create PR</button>
|
|
612
697
|
<button type="button" class="hist-open" aria-label="Open run details">
|
|
613
698
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M9 6l6 6-6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
614
699
|
</button>
|
|
@@ -631,9 +716,10 @@
|
|
|
631
716
|
</button>
|
|
632
717
|
<h1 class="hd-title"></h1>
|
|
633
718
|
<span class="auto-badge" hidden></span>
|
|
634
|
-
<span class="hist-merge" hidden></span>
|
|
635
|
-
<button type="button" class="hd-pr" hidden>Create PR</button>
|
|
636
|
-
<a class="hd-pr-link" hidden target="_blank" rel="noopener"></a>
|
|
719
|
+
<span class="hist-merge" hidden data-min-level="expert"></span>
|
|
720
|
+
<button type="button" class="hd-pr" hidden data-min-level="advanced">Create PR</button>
|
|
721
|
+
<a class="hd-pr-link" hidden data-min-level="advanced" target="_blank" rel="noopener"></a>
|
|
722
|
+
<button type="button" class="hd-after btn-ghost" hidden data-min-level="advanced">Schedule a run after this</button>
|
|
637
723
|
</div>
|
|
638
724
|
<!-- Status pip leads the META line, not row 1: it reads as the icon
|
|
639
725
|
for the status WORD it now sits next to (same pairing the list
|
|
@@ -648,8 +734,8 @@
|
|
|
648
734
|
<div class="hd-meta mono"></div>
|
|
649
735
|
</div>
|
|
650
736
|
<div class="hd-row3">
|
|
651
|
-
<span class="hd-base mono"></span>
|
|
652
|
-
<button type="button" class="hd-branch-copy mono" hidden title="Copy branch name" aria-label="Copy branch name">
|
|
737
|
+
<span class="hd-base mono" data-min-level="advanced"></span>
|
|
738
|
+
<button type="button" class="hd-branch-copy mono" hidden data-min-level="advanced" title="Copy branch name" aria-label="Copy branch name">
|
|
653
739
|
<span class="hd-branch-name"></span>
|
|
654
740
|
<svg class="ico-copy" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="12" height="12" rx="2.5"></rect><path d="M5 15H4.5A1.5 1.5 0 0 1 3 13.5v-9A1.5 1.5 0 0 1 4.5 3h9A1.5 1.5 0 0 1 15 4.5V5" stroke-linecap="round"></path></svg>
|
|
655
741
|
<svg class="ico-check" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M4 12.5l5.5 5.5L20 6.5" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
@@ -675,7 +761,7 @@
|
|
|
675
761
|
still-live row also appears here, so setupHdActions unhides both
|
|
676
762
|
only for a deletable entry, and hides the trigger when neither is
|
|
677
763
|
offered rather than opening onto an empty menu. -->
|
|
678
|
-
<span class="hd-more-wrap">
|
|
764
|
+
<span class="hd-more-wrap" data-min-level="advanced">
|
|
679
765
|
<button type="button" class="hd-more" hidden aria-haspopup="menu" aria-expanded="false" title="More actions" aria-label="More actions">
|
|
680
766
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="1.8"></circle><circle cx="12" cy="12" r="1.8"></circle><circle cx="19" cy="12" r="1.8"></circle></svg>
|
|
681
767
|
</button>
|
|
@@ -713,6 +799,32 @@
|
|
|
713
799
|
<!-- /view history -->
|
|
714
800
|
|
|
715
801
|
<!-- ===== VIEW: STATISTICS ===== -->
|
|
802
|
+
<section class="view hidden" data-view="schedules">
|
|
803
|
+
<div class="topbar">
|
|
804
|
+
<div>
|
|
805
|
+
<h1>Schedules</h1>
|
|
806
|
+
<div class="sub" id="schedules-sub">Runs that start later — once, or on a repeat</div>
|
|
807
|
+
</div>
|
|
808
|
+
<a class="btn-go" href="#new/schedule" id="schedules-new" style="padding:11px 20px;text-decoration:none">
|
|
809
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
810
|
+
Schedule a run
|
|
811
|
+
</a>
|
|
812
|
+
</div>
|
|
813
|
+
<p id="schedules-msg" class="form-msg" aria-live="polite"></p>
|
|
814
|
+
<!-- Tabs, the Statistics .seg idiom: #schedules/<tab> routes them (activity | once | repeating). -->
|
|
815
|
+
<div class="sched-tabs">
|
|
816
|
+
<div class="seg" id="schedules-tabs" role="group" aria-label="Schedules">
|
|
817
|
+
<button type="button" data-tab="activity">Activity</button>
|
|
818
|
+
<button type="button" data-tab="once">Once</button>
|
|
819
|
+
<button type="button" data-tab="repeating">Repeating</button>
|
|
820
|
+
</div>
|
|
821
|
+
</div>
|
|
822
|
+
<section class="card sched-feed sched-pane" id="schedules-feed" data-pane="activity" aria-label="Activity"></section>
|
|
823
|
+
<div class="sched-list sched-pane" id="schedules-once" data-pane="once" hidden><small class="hint">Loading…</small></div>
|
|
824
|
+
<div class="sched-list sched-pane" id="schedules-repeating" data-pane="repeating" hidden><small class="hint">Loading…</small></div>
|
|
825
|
+
</section>
|
|
826
|
+
<!-- /view schedules -->
|
|
827
|
+
|
|
716
828
|
<section class="view hidden" data-view="stats">
|
|
717
829
|
<div class="topbar">
|
|
718
830
|
<div>
|
|
@@ -730,7 +842,7 @@
|
|
|
730
842
|
</div>
|
|
731
843
|
<div id="stats-body"><small class="hint">Loading…</small></div>
|
|
732
844
|
<div id="stats-tip" class="chart-tip" hidden></div>
|
|
733
|
-
<a class="hint tm-stats-hint" id="stats-tm-hint" href="#team-metrics" hidden>Team-wide view →</a>
|
|
845
|
+
<a class="hint tm-stats-hint" id="stats-tm-hint" href="#team-metrics" data-min-level="expert" hidden>Team-wide view →</a>
|
|
734
846
|
</section>
|
|
735
847
|
<!-- /view stats -->
|
|
736
848
|
|
|
@@ -763,60 +875,82 @@
|
|
|
763
875
|
</section>
|
|
764
876
|
<!-- /view team-metrics -->
|
|
765
877
|
|
|
766
|
-
<!-- ===== VIEW:
|
|
767
|
-
<section class="view hidden" data-view="
|
|
878
|
+
<!-- ===== VIEW: TEAM POLICY (team-policy design §11, boards 4–5) ===== -->
|
|
879
|
+
<section class="view hidden" data-view="team-policy">
|
|
768
880
|
<div class="topbar">
|
|
769
881
|
<div>
|
|
770
|
-
<h1>
|
|
771
|
-
<div class="sub">
|
|
882
|
+
<h1>Team policy</h1>
|
|
883
|
+
<div class="sub">Shared from the <code>worca-policy</code> branch · soft: you can go past a cap, and the team sees it</div>
|
|
772
884
|
</div>
|
|
773
|
-
<
|
|
774
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
775
|
-
Create workspace
|
|
776
|
-
</button>
|
|
885
|
+
<div class="sync-chip" id="tp-sync" hidden></div>
|
|
777
886
|
</div>
|
|
887
|
+
<div class="tm-filter">
|
|
888
|
+
<div class="select-wrap tm-scope-wrap"><select id="tp-scope" class="select" aria-label="Scope"></select></div>
|
|
889
|
+
</div>
|
|
890
|
+
<div id="tp-body"><small class="hint">Loading…</small></div>
|
|
891
|
+
</section>
|
|
892
|
+
<!-- /view team-policy -->
|
|
778
893
|
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
894
|
+
<!-- ===== VIEW: WORKSPACES ===== -->
|
|
895
|
+
<section class="view hidden" data-view="workspaces">
|
|
896
|
+
<!-- Two-screen slide track, twin of the Projects #proj-shell: the list and the workspace
|
|
897
|
+
page (#workspaces/<id>[/team]) are sibling screens; .detail-open slides. -->
|
|
898
|
+
<div class="ws-shell" id="ws-shell">
|
|
899
|
+
<div class="ws-screen ws-screen-list">
|
|
900
|
+
<div class="topbar">
|
|
901
|
+
<div>
|
|
902
|
+
<h1>Workspaces</h1>
|
|
903
|
+
<div class="sub">Named sets of 2+ projects with an AI-generated interconnection description. Open one for its projects, description and team setup.</div>
|
|
904
|
+
</div>
|
|
905
|
+
<button type="button" id="ws-create-btn" class="btn btn-primary btn-mini">
|
|
906
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
907
|
+
Create workspace
|
|
908
|
+
</button>
|
|
909
|
+
</div>
|
|
910
|
+
<p id="ws-msg" class="form-msg" aria-live="polite"></p>
|
|
911
|
+
<div class="run-list" id="ws-list"></div>
|
|
912
|
+
</div>
|
|
913
|
+
<div class="ws-screen ws-screen-detail" id="ws-detail" aria-hidden="true"></div>
|
|
914
|
+
</div>
|
|
782
915
|
|
|
783
|
-
<!-- clone target for
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
916
|
+
<!-- clone target for the workspace page (#workspaces/<id>). A SCREEN inside this
|
|
917
|
+
section, never a routed view of its own: the page's view count is pinned. It rides
|
|
918
|
+
the project page's pd- classes so the two pages are laid out the same way. -->
|
|
919
|
+
<template id="ws-detail-tpl">
|
|
920
|
+
<div class="pd wd">
|
|
921
|
+
<header class="pd-header">
|
|
922
|
+
<div class="pd-row1">
|
|
923
|
+
<button type="button" class="pd-back btn-ghost" aria-label="Back to workspaces">
|
|
924
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M15 6l-6 6 6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
925
|
+
Back
|
|
926
|
+
</button>
|
|
927
|
+
<h1 class="pd-title ws-name"></h1>
|
|
789
928
|
<span class="ws-stale badge red" hidden>missing projects</span>
|
|
790
|
-
<small class="ws-projects"></small>
|
|
791
929
|
</div>
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
<span class="
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
930
|
+
<!-- One row under the title: the summary on the left, the actions on the right. This
|
|
931
|
+
page configures and tracks a workspace; runs start from New pipeline. -->
|
|
932
|
+
<div class="wd-row2">
|
|
933
|
+
<div class="pd-meta"><small class="ws-projects"></small></div>
|
|
934
|
+
<div class="pd-actions">
|
|
935
|
+
<button type="button" class="ws-rescan btn-ghost" title="Re-scan the project set and regenerate the description">
|
|
936
|
+
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 12a8 8 0 1 1-2.3-5.7"></path><path d="M20 4v5h-5"></path></svg>
|
|
937
|
+
Re-scan
|
|
938
|
+
</button>
|
|
939
|
+
<span class="pd-spacer"></span>
|
|
940
|
+
<button type="button" class="pd-remove ws-delete">
|
|
941
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13M10 11v6M14 11v6"></path></svg>
|
|
942
|
+
<span class="pd-btn-label">Delete</span>
|
|
943
|
+
</button>
|
|
805
944
|
</div>
|
|
806
|
-
<div class="ws-desc-edit" hidden>
|
|
807
|
-
<div class="md-tabs" role="tablist" aria-label="Description editor">
|
|
808
|
-
<button type="button" class="md-tab ws-desc-tab" role="tab" data-mode="text" aria-selected="true">Text</button>
|
|
809
|
-
<button type="button" class="md-tab ws-desc-tab" role="tab" data-mode="preview" aria-selected="false">Preview</button>
|
|
810
|
-
</div>
|
|
811
|
-
<textarea class="ws-desc-input textarea" rows="10" spellcheck="false"></textarea>
|
|
812
|
-
<div class="ws-desc-preview md-preview viewer" hidden></div>
|
|
813
|
-
<div class="actions" style="justify-content:flex-end;margin-top:10px">
|
|
814
|
-
<button type="button" class="ws-desc-cancel btn btn-ghost btn-mini">Cancel</button>
|
|
815
|
-
<button type="button" class="ws-desc-save btn btn-primary btn-mini">Save</button>
|
|
816
|
-
</div>
|
|
817
945
|
</div>
|
|
946
|
+
<!-- On the HEADER (like .pd-error): a delete failure must not sit below a long tab. -->
|
|
947
|
+
<div class="pd-error" hidden></div>
|
|
948
|
+
</header>
|
|
949
|
+
<div class="pd-body">
|
|
950
|
+
<div class="pd-tabs" role="tablist"></div>
|
|
951
|
+
<div class="pd-sections"></div>
|
|
818
952
|
</div>
|
|
819
|
-
</
|
|
953
|
+
</div>
|
|
820
954
|
</template>
|
|
821
955
|
</section>
|
|
822
956
|
<!-- /view workspaces -->
|
|
@@ -947,6 +1081,7 @@
|
|
|
947
1081
|
</div>
|
|
948
1082
|
<div class="agent-detail" hidden>
|
|
949
1083
|
<pre class="agent-md-view viewer"></pre>
|
|
1084
|
+
<div class="agent-forms-view" hidden></div>
|
|
950
1085
|
<div class="agent-edit-pane" hidden>
|
|
951
1086
|
<div class="agent-form"></div>
|
|
952
1087
|
<p class="agent-edit-msg form-msg" aria-live="polite"></p>
|
|
@@ -961,6 +1096,13 @@
|
|
|
961
1096
|
</section>
|
|
962
1097
|
<!-- /view agents -->
|
|
963
1098
|
|
|
1099
|
+
<!-- ===== VIEW: SCRIPTS ===== -->
|
|
1100
|
+
<section class="view hidden" data-view="scripts">
|
|
1101
|
+
<div id="scripts-msg" class="form-msg" aria-live="polite"></div>
|
|
1102
|
+
<div id="scripts-host" class="scripts-host"></div>
|
|
1103
|
+
</section>
|
|
1104
|
+
<!-- /view scripts -->
|
|
1105
|
+
|
|
964
1106
|
<!-- ===== VIEW: PROJECTS ===== -->
|
|
965
1107
|
<section class="view hidden" data-view="projects">
|
|
966
1108
|
<!-- Two-screen slide track, twin of History's #hist-shell: the list and the project
|
|
@@ -1129,6 +1271,11 @@
|
|
|
1129
1271
|
<input id="gv-agent-filter" class="pal-filter" type="search" placeholder="Filter agents…" aria-label="Filter agents by name or ports">
|
|
1130
1272
|
</div>
|
|
1131
1273
|
<div class="gv-palette" id="gv-palette"></div>
|
|
1274
|
+
<!-- The advanced door to the agent wizard (the Agents page is expert, docs/ui-levels.md). -->
|
|
1275
|
+
<button type="button" class="pal-create" id="gv-create-agent" data-min-level="advanced">
|
|
1276
|
+
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M12 5v14M5 12h14"></path></svg>
|
|
1277
|
+
Create agent…
|
|
1278
|
+
</button>
|
|
1132
1279
|
</div>
|
|
1133
1280
|
<div class="gv-ins-pane gv-ins-body" id="gv-ins-body"></div>
|
|
1134
1281
|
</div>
|
|
@@ -1148,7 +1295,7 @@
|
|
|
1148
1295
|
<!-- The key belongs to the whole editor, canvas AND rail — not to a
|
|
1149
1296
|
palette card that no longer exists. -->
|
|
1150
1297
|
<div class="gv-foot">
|
|
1151
|
-
<span class="gv-legend" id="gv-legend">grey = data · amber = loop · ◆ = conditional · ○ = gate · ⤫N = fan-out</span>
|
|
1298
|
+
<span class="gv-legend" id="gv-legend" data-min-level="expert">grey = data · amber = loop · ◆ = conditional · ○ = gate · ⤫N = fan-out</span>
|
|
1152
1299
|
</div>
|
|
1153
1300
|
</section>
|
|
1154
1301
|
|
|
@@ -1167,7 +1314,7 @@
|
|
|
1167
1314
|
Rendered by gvRenderSaved(); hidden while the library is empty. -->
|
|
1168
1315
|
<div class="gv-saved-tabs" id="gv-saved-tabs" role="tablist" aria-label="Pipeline domains" hidden></div>
|
|
1169
1316
|
<div class="saved-list" id="gv-saved-list"></div>
|
|
1170
|
-
<div class="gv-archived" id="gv-archived" hidden></div>
|
|
1317
|
+
<div class="gv-archived" id="gv-archived" data-min-level="expert" hidden></div>
|
|
1171
1318
|
<!-- A refused DELETE (the built-in, a 404, a 500) has to land
|
|
1172
1319
|
SOMEWHERE: same .form-msg line every other list view uses. -->
|
|
1173
1320
|
<p id="gv-saved-msg" class="form-msg" aria-live="polite"></p>
|
|
@@ -1187,11 +1334,12 @@
|
|
|
1187
1334
|
literal routing attribute name, so never spell it out in a comment. -->
|
|
1188
1335
|
<section class="view hidden" data-view="settings">
|
|
1189
1336
|
<div class="seg settings-tabs" id="settings-tabs" role="group" aria-label="Settings section">
|
|
1190
|
-
<button type="button" class="on" data-tab="general" aria-pressed="true">General</button>
|
|
1191
|
-
<button type="button" data-tab="guardrails" aria-pressed="false">Guardrails</button>
|
|
1192
|
-
<button type="button" data-tab="models" aria-pressed="false">Models</button>
|
|
1193
|
-
<button type="button" data-tab="
|
|
1194
|
-
<button type="button" data-tab="
|
|
1337
|
+
<button type="button" class="on" data-tab="general" data-min-level="simple" aria-pressed="true">General</button>
|
|
1338
|
+
<button type="button" data-tab="guardrails" data-min-level="advanced" aria-pressed="false">Guardrails</button>
|
|
1339
|
+
<button type="button" data-tab="models" data-min-level="expert" aria-pressed="false">Models</button>
|
|
1340
|
+
<button type="button" data-tab="providers" data-min-level="expert" aria-pressed="false">Providers</button>
|
|
1341
|
+
<button type="button" data-tab="plugins" data-min-level="advanced" aria-pressed="false">Plugins</button>
|
|
1342
|
+
<button type="button" data-tab="memory" data-min-level="advanced" aria-pressed="false">Memory</button>
|
|
1195
1343
|
</div>
|
|
1196
1344
|
|
|
1197
1345
|
<section class="settings-pane" data-tab="general">
|
|
@@ -1202,7 +1350,7 @@
|
|
|
1202
1350
|
</div>
|
|
1203
1351
|
</div>
|
|
1204
1352
|
|
|
1205
|
-
<section class="card settings-card" id="appearance-card">
|
|
1353
|
+
<section class="card settings-card" id="appearance-card" data-min-level="simple">
|
|
1206
1354
|
<div class="card-head">
|
|
1207
1355
|
<div class="label-row">
|
|
1208
1356
|
<h2>Appearance</h2>
|
|
@@ -1219,7 +1367,28 @@
|
|
|
1219
1367
|
<small class="hint" id="themeMsg"></small>
|
|
1220
1368
|
</section>
|
|
1221
1369
|
|
|
1222
|
-
|
|
1370
|
+
<!-- Interface mode (docs/ui-levels.md): the same setting as the sidebar item, same dialog. -->
|
|
1371
|
+
<section class="card settings-card" id="mode-settings-card" data-min-level="simple">
|
|
1372
|
+
<div class="card-head">
|
|
1373
|
+
<div class="label-row">
|
|
1374
|
+
<h2>Interface mode</h2>
|
|
1375
|
+
<button type="button" class="info-tip" aria-label="About interface mode">i<span class="tip-content hidden">
|
|
1376
|
+
How much of Worca is on screen. Nothing is switched off: a hidden page still opens from a link,
|
|
1377
|
+
and settings made in a higher mode keep applying. The choice applies to every browser that opens this Worca.
|
|
1378
|
+
</span></button>
|
|
1379
|
+
</div>
|
|
1380
|
+
</div>
|
|
1381
|
+
<div class="mode-current">
|
|
1382
|
+
<span class="mode-current-icon" id="modeSettingsIcon"></span>
|
|
1383
|
+
<div class="mode-current-text">
|
|
1384
|
+
<strong id="modeSettingsName">Expert</strong>
|
|
1385
|
+
<span id="modeSettingsDesc"></span>
|
|
1386
|
+
</div>
|
|
1387
|
+
<button type="button" class="btn btn-ghost btn-mini" id="modeSettingsChange" data-mode-open="button" aria-haspopup="dialog">Change…</button>
|
|
1388
|
+
</div>
|
|
1389
|
+
</section>
|
|
1390
|
+
|
|
1391
|
+
<section class="card settings-card" id="root-settings-card" data-min-level="advanced">
|
|
1223
1392
|
<div class="field">
|
|
1224
1393
|
<div class="label-row">
|
|
1225
1394
|
<label for="settingsRoot">Worca root folder</label>
|
|
@@ -1253,7 +1422,7 @@
|
|
|
1253
1422
|
<small class="hint" id="settingsMsg"></small>
|
|
1254
1423
|
</section>
|
|
1255
1424
|
|
|
1256
|
-
<section class="card settings-card">
|
|
1425
|
+
<section class="card settings-card" id="budget-settings-card" data-min-level="simple">
|
|
1257
1426
|
<div class="card-head">
|
|
1258
1427
|
<div class="label-row">
|
|
1259
1428
|
<h2>Budget & cost limits</h2>
|
|
@@ -1263,6 +1432,8 @@
|
|
|
1263
1432
|
</div>
|
|
1264
1433
|
</div>
|
|
1265
1434
|
<div id="budgetReadout"></div>
|
|
1435
|
+
<!-- Team policy (design board 7): each policy home's caps, read-only context. -->
|
|
1436
|
+
<div id="teamCapsReadout"></div>
|
|
1266
1437
|
<div class="field">
|
|
1267
1438
|
<div class="label-row">
|
|
1268
1439
|
<label for="budgetPerPipeline">Per-pipeline cost limit (USD)</label>
|
|
@@ -1296,6 +1467,12 @@
|
|
|
1296
1467
|
</select>
|
|
1297
1468
|
</div>
|
|
1298
1469
|
</div>
|
|
1470
|
+
<div class="field">
|
|
1471
|
+
<div class="label-row">
|
|
1472
|
+
<label for="budgetHumanRate">Developer rate (USD/h)</label>
|
|
1473
|
+
</div>
|
|
1474
|
+
<input id="budgetHumanRate" class="input" type="number" min="0" step="1" inputmode="decimal" placeholder="35" autocomplete="off" />
|
|
1475
|
+
</div>
|
|
1299
1476
|
<div class="add-project-actions" style="margin-top:14px">
|
|
1300
1477
|
<button type="button" id="budgetReset" class="btn btn-ghost btn-mini">Clear limits</button>
|
|
1301
1478
|
<button type="button" id="budgetSave" class="btn btn-primary btn-mini">Save</button>
|
|
@@ -1306,7 +1483,7 @@
|
|
|
1306
1483
|
<!-- Ask Worca (ask-worca-design §6.9): per-turn guards for the
|
|
1307
1484
|
assistant chat. Read fresh on every turn (D12); a stored null
|
|
1308
1485
|
budget means "no cap". Posted ALONE — never with root/budget keys. -->
|
|
1309
|
-
<section class="card settings-card">
|
|
1486
|
+
<section class="card settings-card" id="ask-settings-card" data-min-level="advanced">
|
|
1310
1487
|
<div class="card-head">
|
|
1311
1488
|
<div class="label-row">
|
|
1312
1489
|
<h2>Ask Worca</h2>
|
|
@@ -1334,6 +1511,9 @@
|
|
|
1334
1511
|
<input id="askMaxBudgetUsd" class="input" type="number" min="0.1" max="100" step="0.1" inputmode="decimal" placeholder="2" autocomplete="off" />
|
|
1335
1512
|
<label class="check-row" for="askNoCap"><input id="askNoCap" type="checkbox" /> No cap</label>
|
|
1336
1513
|
</div>
|
|
1514
|
+
<!-- Scripts workbench W20: the chat's save_script / test_script switch. Body
|
|
1515
|
+
rendered by chat-settings-view.mjs; saved with this card's Save button. -->
|
|
1516
|
+
<div class="field" id="ask-script-tools-host"></div>
|
|
1337
1517
|
<div class="add-project-actions" style="margin-top:14px">
|
|
1338
1518
|
<button type="button" id="askLimitsReset" class="btn btn-ghost btn-mini">Use defaults</button>
|
|
1339
1519
|
<button type="button" id="askLimitsSave" class="btn btn-primary btn-mini">Save</button>
|
|
@@ -1354,12 +1534,63 @@
|
|
|
1354
1534
|
</div>
|
|
1355
1535
|
</section>
|
|
1356
1536
|
|
|
1537
|
+
<!-- Scheduled runs: the defaults a NEW schedule inherits. Each schedule keeps
|
|
1538
|
+
its own copy, so a change here never rewrites an existing one. -->
|
|
1539
|
+
<section class="card settings-card" id="schedule-settings-card" data-min-level="advanced">
|
|
1540
|
+
<div class="card-head">
|
|
1541
|
+
<div class="label-row">
|
|
1542
|
+
<h2>Scheduled runs</h2>
|
|
1543
|
+
<button type="button" class="info-tip" aria-label="About scheduled run defaults">i<span class="tip-content hidden">
|
|
1544
|
+
Defaults for new schedules. A scheduled run starts only while Worca is running and this computer is awake; these settings decide what happens when it was not.
|
|
1545
|
+
</span></button>
|
|
1546
|
+
</div>
|
|
1547
|
+
</div>
|
|
1548
|
+
<div class="field-grid-2">
|
|
1549
|
+
<div class="field">
|
|
1550
|
+
<label for="schedIfMissed">If Worca is not running at that time</label>
|
|
1551
|
+
<div class="select-wrap">
|
|
1552
|
+
<select id="schedIfMissed" class="select">
|
|
1553
|
+
<option value="run">Start it late</option>
|
|
1554
|
+
<option value="skip">Skip it</option>
|
|
1555
|
+
</select>
|
|
1556
|
+
</div>
|
|
1557
|
+
</div>
|
|
1558
|
+
<div class="field">
|
|
1559
|
+
<label for="schedGraceMin">At most this late</label>
|
|
1560
|
+
<div class="select-wrap">
|
|
1561
|
+
<select id="schedGraceMin" class="select">
|
|
1562
|
+
<option value="30">30 minutes</option>
|
|
1563
|
+
<option value="60">1 hour</option>
|
|
1564
|
+
<option value="120">2 hours</option>
|
|
1565
|
+
<option value="360">6 hours</option>
|
|
1566
|
+
<option value="720">12 hours</option>
|
|
1567
|
+
<option value="1440">24 hours</option>
|
|
1568
|
+
</select>
|
|
1569
|
+
</div>
|
|
1570
|
+
</div>
|
|
1571
|
+
</div>
|
|
1572
|
+
<div class="field">
|
|
1573
|
+
<div class="label-row">
|
|
1574
|
+
<label for="schedMaxFailures">Pause a repeating schedule after failures in a row</label>
|
|
1575
|
+
<button type="button" class="info-tip" aria-label="About pausing after failures">i<span class="tip-content hidden">
|
|
1576
|
+
A run that could not start, a missed slot, or a run that ended in an error each count. A successful run resets the count. 0 never pauses a schedule. Every failure is reported in Schedules either way.
|
|
1577
|
+
</span></button>
|
|
1578
|
+
</div>
|
|
1579
|
+
<input id="schedMaxFailures" class="input" type="number" min="0" max="100" step="1" inputmode="numeric" placeholder="3" autocomplete="off" />
|
|
1580
|
+
</div>
|
|
1581
|
+
<div class="add-project-actions" style="margin-top:14px">
|
|
1582
|
+
<button type="button" id="schedDefaultsReset" class="btn btn-ghost btn-mini">Use defaults</button>
|
|
1583
|
+
<button type="button" id="schedDefaultsSave" class="btn btn-primary btn-mini">Save</button>
|
|
1584
|
+
</div>
|
|
1585
|
+
<small class="hint" id="schedDefaultsMsg"></small>
|
|
1586
|
+
</section>
|
|
1587
|
+
|
|
1357
1588
|
<!-- Title generation (#422): which model writes run/chat titles.
|
|
1358
1589
|
Empty = the model of the run or chat itself (title.mjs
|
|
1359
1590
|
resolveTitleModel), so a first-party-free install needs no setup.
|
|
1360
1591
|
The select is built from the project-less catalog; a stored id
|
|
1361
1592
|
that left the catalog paints disabled + "not installed". -->
|
|
1362
|
-
<section class="card settings-card" id="title-model-settings-card">
|
|
1593
|
+
<section class="card settings-card" id="title-model-settings-card" data-min-level="expert">
|
|
1363
1594
|
<div class="card-head">
|
|
1364
1595
|
<div class="label-row">
|
|
1365
1596
|
<h2>Title generation</h2>
|
|
@@ -1389,7 +1620,7 @@
|
|
|
1389
1620
|
|
|
1390
1621
|
<!-- Auto workflow model (spec D14 / §7.7): which model classifies a task into a workflow.
|
|
1391
1622
|
Empty = the Sonnet-class default; WORCA_AUTO_MODEL in the environment wins. -->
|
|
1392
|
-
<section class="card settings-card" id="auto-model-settings-card">
|
|
1623
|
+
<section class="card settings-card" id="auto-model-settings-card" data-min-level="expert">
|
|
1393
1624
|
<div class="card-head">
|
|
1394
1625
|
<div class="label-row">
|
|
1395
1626
|
<h2>Auto workflow model</h2>
|
|
@@ -1419,7 +1650,7 @@
|
|
|
1419
1650
|
a non-empty env var overrides it. This card only flips the gate —
|
|
1420
1651
|
the runner decides what is printable (routing keys readable,
|
|
1421
1652
|
credentials as "<set, N chars>"). -->
|
|
1422
|
-
<section class="card settings-card" id="debug-spawn-settings-card">
|
|
1653
|
+
<section class="card settings-card" id="debug-spawn-settings-card" data-min-level="expert">
|
|
1423
1654
|
<div class="card-head">
|
|
1424
1655
|
<div class="label-row">
|
|
1425
1656
|
<h2>Spawn diagnostics</h2>
|
|
@@ -1446,7 +1677,7 @@
|
|
|
1446
1677
|
<!-- Chat notifications (chat-connectivity-design.md §4.8): which run
|
|
1447
1678
|
events ping which chat channels. Body rendered by
|
|
1448
1679
|
chat-settings-view.mjs; app.js owns fetch/save/Test wiring. -->
|
|
1449
|
-
<section class="card settings-card" id="chat-settings-card">
|
|
1680
|
+
<section class="card settings-card" id="chat-settings-card" data-min-level="advanced">
|
|
1450
1681
|
<div class="label-row">
|
|
1451
1682
|
<h2>Chat notifications</h2>
|
|
1452
1683
|
</div>
|
|
@@ -1460,19 +1691,19 @@
|
|
|
1460
1691
|
<!-- Getting started: the checklist's Hide is undone here. Only the checklist —
|
|
1461
1692
|
the welcome dialog stays seen. No info-tip (the row explains itself);
|
|
1462
1693
|
the .hint is painted by app.js like every other settings status line. -->
|
|
1463
|
-
<section class="card settings-card" id="getting-started-card">
|
|
1694
|
+
<section class="card settings-card" id="getting-started-card" data-min-level="simple">
|
|
1464
1695
|
<div class="label-row">
|
|
1465
1696
|
<h2>Getting started</h2>
|
|
1466
1697
|
</div>
|
|
1467
1698
|
<div class="gs-settings-row">
|
|
1468
|
-
<p class="gs-settings-text">The checklist on New pipeline walks through the first
|
|
1699
|
+
<p class="gs-settings-text">The checklist on New pipeline walks through the first nine things to do with Worca. Hidden it, or want the guided tour back?</p>
|
|
1469
1700
|
<button type="button" id="gsShowAgain" class="btn btn-ghost btn-mini">Show again</button>
|
|
1470
1701
|
</div>
|
|
1471
1702
|
<small class="hint" id="gsSettingsMsg"></small>
|
|
1472
1703
|
</section>
|
|
1473
1704
|
|
|
1474
1705
|
<!-- About: intentionally no info-tip and no .hint (test/ui-settings-tooltips.test.mjs pins both). -->
|
|
1475
|
-
<section class="card settings-card" id="about-card">
|
|
1706
|
+
<section class="card settings-card" id="about-card" data-min-level="simple">
|
|
1476
1707
|
<div class="label-row">
|
|
1477
1708
|
<h2>About</h2>
|
|
1478
1709
|
</div>
|
|
@@ -1516,7 +1747,7 @@
|
|
|
1516
1747
|
<h1>Guardrails</h1>
|
|
1517
1748
|
<div class="sub">Named guardrail policies — built-ins plus your own sets, selected per pipeline run</div>
|
|
1518
1749
|
</div>
|
|
1519
|
-
<button type="button" id="guardrail-create-btn" class="btn-go" style="padding:11px 20px">
|
|
1750
|
+
<button type="button" id="guardrail-create-btn" class="btn-go" data-min-level="expert" style="padding:11px 20px">
|
|
1520
1751
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
1521
1752
|
Create guardrails
|
|
1522
1753
|
</button>
|
|
@@ -1531,11 +1762,12 @@
|
|
|
1531
1762
|
<div class="topbar">
|
|
1532
1763
|
<div>
|
|
1533
1764
|
<h1>Models</h1>
|
|
1534
|
-
<div class="sub">
|
|
1765
|
+
<div class="sub">The global model catalog — available in every project; entries can override built-ins, route through a provider, or carry per-model routing env. Sign-ins and endpoints live on the Providers tab.</div>
|
|
1535
1766
|
</div>
|
|
1536
|
-
<div style="display:flex;gap:8px">
|
|
1537
|
-
<button type="button" id="model-share-btn" class="btn-ghost" style="padding:11px 20px">Share as plugin…</button>
|
|
1538
|
-
<button type="button" id="model-
|
|
1767
|
+
<div style="display:flex;gap:8px;flex:0 0 auto">
|
|
1768
|
+
<button type="button" id="model-share-btn" class="btn-ghost" style="padding:11px 20px;white-space:nowrap">Share as plugin…</button>
|
|
1769
|
+
<button type="button" id="model-import-btn" class="btn-ghost" style="padding:11px 20px;white-space:nowrap">Import models…</button>
|
|
1770
|
+
<button type="button" id="model-create-btn" class="btn-go" style="padding:11px 20px;white-space:nowrap">
|
|
1539
1771
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
1540
1772
|
Add model
|
|
1541
1773
|
</button>
|
|
@@ -1546,6 +1778,21 @@
|
|
|
1546
1778
|
</section>
|
|
1547
1779
|
<!-- /pane models -->
|
|
1548
1780
|
|
|
1781
|
+
<!-- ===== TAB: PROVIDERS (model-bridge-design.md §8.1) =====
|
|
1782
|
+
Split out of Models: the card is account-level setup you touch rarely, and at
|
|
1783
|
+
1000+px it buried the catalog it unlocks. Expert only, like Models. -->
|
|
1784
|
+
<section class="settings-pane hidden" data-tab="providers">
|
|
1785
|
+
<div class="topbar">
|
|
1786
|
+
<div>
|
|
1787
|
+
<h1>Providers</h1>
|
|
1788
|
+
<div class="sub">Sign-ins, endpoints and keys for the models Worca bridges — GitHub Copilot, any OpenAI-compatible server (llama.cpp, Ollama, LM Studio, vLLM), an Anthropic-compatible gateway. The models themselves live on the Models tab.</div>
|
|
1789
|
+
</div>
|
|
1790
|
+
</div>
|
|
1791
|
+
<p id="providers-msg" class="form-msg" aria-live="polite"></p>
|
|
1792
|
+
<div class="run-list" id="providers-list"></div>
|
|
1793
|
+
</section>
|
|
1794
|
+
<!-- /pane providers -->
|
|
1795
|
+
|
|
1549
1796
|
<!-- ===== TAB: PLUGINS (was the top-level Plugins view) ===== -->
|
|
1550
1797
|
<section class="settings-pane hidden" data-tab="plugins">
|
|
1551
1798
|
<div class="topbar">
|
|
@@ -1553,24 +1800,26 @@
|
|
|
1553
1800
|
<h1>Plugins</h1>
|
|
1554
1801
|
<div class="sub">Task sources, agents, skills and workflow packs from your plugin marketplaces</div>
|
|
1555
1802
|
</div>
|
|
1556
|
-
<button type="button" id="plugin-add-btn" class="btn-go" style="padding:11px 20px">
|
|
1803
|
+
<button type="button" id="plugin-add-btn" class="btn-go" data-min-level="expert" style="padding:11px 20px">
|
|
1557
1804
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
1558
1805
|
Add marketplace
|
|
1559
1806
|
</button>
|
|
1560
1807
|
</div>
|
|
1561
1808
|
<p id="plugins-msg" class="form-msg" aria-live="polite"></p>
|
|
1562
|
-
<div class="card hidden" id="marketplace-add-row" style="padding:16px 20px;margin-bottom:14px">
|
|
1809
|
+
<div class="card hidden" id="marketplace-add-row" data-min-level="expert" style="padding:16px 20px;margin-bottom:14px">
|
|
1563
1810
|
<div class="path-row">
|
|
1564
1811
|
<input id="marketplace-url" class="input" type="text" placeholder="https://github.com/owner/repo · owner/repo · /abs/path/to/repo · /path/to/a/plugin-folder" spellcheck="false" />
|
|
1565
1812
|
<button type="button" id="marketplace-add" class="btn btn-primary btn-mini">Add</button>
|
|
1566
1813
|
</div>
|
|
1567
1814
|
</div>
|
|
1815
|
+
<!-- Team policy (design board 10): what a policy home expects on this machine. -->
|
|
1816
|
+
<div id="plugins-policy"></div>
|
|
1568
1817
|
<h3 class="pl-sec-title">Installed</h3>
|
|
1569
1818
|
<div class="run-list" id="plugins-list"></div>
|
|
1570
1819
|
<h3 class="pl-sec-title">Available</h3>
|
|
1571
1820
|
<div class="run-list" id="plugins-available"></div>
|
|
1572
|
-
<h3 class="pl-sec-title">Marketplaces</h3>
|
|
1573
|
-
<div class="run-list" id="marketplaces-list"></div>
|
|
1821
|
+
<h3 class="pl-sec-title" data-min-level="expert">Marketplaces</h3>
|
|
1822
|
+
<div class="run-list" id="marketplaces-list" data-min-level="expert"></div>
|
|
1574
1823
|
</section>
|
|
1575
1824
|
<!-- /pane plugins -->
|
|
1576
1825
|
|
|
@@ -1582,6 +1831,30 @@
|
|
|
1582
1831
|
<div class="sub">What worca remembers across runs and chats — the global rules and preferences every agent sees. A project's own memory lives on its project page (Projects → open a project → Memory).</div>
|
|
1583
1832
|
</div>
|
|
1584
1833
|
</div>
|
|
1834
|
+
<!-- Settings › Memory: the model + effort EVERY Memory defragment run uses (memory-defrag-model.mjs).
|
|
1835
|
+
Expert, like the health card's Defragment. No ⓘ and empty hints: the settings-view census
|
|
1836
|
+
(test/ui-settings-tooltips.test.mjs) pins both. A plain .card like the health card, NOT a
|
|
1837
|
+
.settings-card: that census (About last, twelve cards) counts the General tab's cards. -->
|
|
1838
|
+
<section class="card mem-model-card" id="mem-defrag-model-card" data-min-level="expert">
|
|
1839
|
+
<div class="label-row"><h2>Defragment model</h2></div>
|
|
1840
|
+
<p class="mem-model-text">The model every Memory defragment run uses — from the Defragment button, New pipeline, an Ask Worca card or the CLI. A model named when the run starts (<code>worca --model</code>) still wins.</p>
|
|
1841
|
+
<div class="mem-model-row">
|
|
1842
|
+
<div class="field">
|
|
1843
|
+
<div class="label-row"><label for="memDefragModel">Model</label></div>
|
|
1844
|
+
<select id="memDefragModel" class="select" aria-label="Defragment model"></select>
|
|
1845
|
+
</div>
|
|
1846
|
+
<div class="field">
|
|
1847
|
+
<div class="label-row"><label for="memDefragEffort">Effort</label></div>
|
|
1848
|
+
<select id="memDefragEffort" class="select" aria-label="Defragment effort"></select>
|
|
1849
|
+
</div>
|
|
1850
|
+
</div>
|
|
1851
|
+
<small class="hint" id="memDefragModelNote"></small>
|
|
1852
|
+
<div class="add-project-actions" style="margin-top:14px">
|
|
1853
|
+
<button type="button" id="memDefragModelReset" class="btn btn-ghost btn-mini">Use default</button>
|
|
1854
|
+
<button type="button" id="memDefragModelSave" class="btn btn-primary btn-mini">Save</button>
|
|
1855
|
+
</div>
|
|
1856
|
+
<small class="hint" id="memDefragModelMsg"></small>
|
|
1857
|
+
</section>
|
|
1585
1858
|
<p id="memory-msg" class="form-msg" aria-live="polite"></p>
|
|
1586
1859
|
<div id="memory-host" class="mem-host"></div>
|
|
1587
1860
|
</section>
|
|
@@ -1591,6 +1864,46 @@
|
|
|
1591
1864
|
</main>
|
|
1592
1865
|
</div>
|
|
1593
1866
|
|
|
1867
|
+
<!-- ===== Model editor (configurable-models-design.md §4.10) =====
|
|
1868
|
+
A task, not a page section: it used to render above the catalog, under a Providers card
|
|
1869
|
+
taller than the viewport, so opening it looked like nothing happened. -->
|
|
1870
|
+
<div id="model-editor-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="mv-editor-heading">
|
|
1871
|
+
<div id="mv-editor-host" class="mv-editor-host"></div>
|
|
1872
|
+
</div>
|
|
1873
|
+
|
|
1874
|
+
<!-- ===== Import models (model-bridge-design.md §8.4) =====
|
|
1875
|
+
One dialog for both sources: GitHub Copilot's catalog and any OpenAI-compatible server
|
|
1876
|
+
you run. It lives with the CATALOG (Settings › Models), because what it produces is
|
|
1877
|
+
catalog rows; the Providers tab only links into it with its endpoint filled in. -->
|
|
1878
|
+
<div id="model-import-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="mimp-title">
|
|
1879
|
+
<div class="card mimp">
|
|
1880
|
+
<h3 id="mimp-title" class="mv-editor-title">Import models</h3>
|
|
1881
|
+
<div class="mimp-src">
|
|
1882
|
+
<label class="mv-field mimp-source-field">
|
|
1883
|
+
<span class="mv-field-label">From</span>
|
|
1884
|
+
<select id="mimp-source" class="select"></select>
|
|
1885
|
+
</label>
|
|
1886
|
+
<label class="mv-field mimp-base-field">
|
|
1887
|
+
<span class="mv-field-label">Base URL</span>
|
|
1888
|
+
<!-- The button sits ON the field's line: below the hint it read as unrelated to the URL. -->
|
|
1889
|
+
<span class="mimp-base-row">
|
|
1890
|
+
<input id="mimp-base" class="input" type="text" placeholder="http://127.0.0.1:11434/v1" />
|
|
1891
|
+
<button type="button" id="mimp-list" class="btn-ghost">List models</button>
|
|
1892
|
+
</span>
|
|
1893
|
+
<small class="hint">llama.cpp, Ollama, LM Studio, vLLM or a gateway — on this machine or your network.</small>
|
|
1894
|
+
</label>
|
|
1895
|
+
</div>
|
|
1896
|
+
<p id="mimp-msg" class="form-msg" aria-live="polite"></p>
|
|
1897
|
+
<!-- Copilot lists dozens of models; the filter narrows what is already listed, client-side. -->
|
|
1898
|
+
<input id="mimp-filter" class="input mimp-filter hidden" type="search" placeholder="Filter by model, id or vendor…" aria-label="Filter the listed models" />
|
|
1899
|
+
<div id="mimp-body"></div>
|
|
1900
|
+
<div class="mv-editor-btns mimp-btns">
|
|
1901
|
+
<button type="button" id="mimp-go" class="btn-go" disabled>Import selected</button>
|
|
1902
|
+
<button type="button" id="mimp-cancel" class="btn-ghost">Cancel</button>
|
|
1903
|
+
</div>
|
|
1904
|
+
</div>
|
|
1905
|
+
</div>
|
|
1906
|
+
|
|
1594
1907
|
<!-- ===== Saved-markdown viewer (modal) ===== -->
|
|
1595
1908
|
<div id="viewer-card" class="viewer-modal hidden">
|
|
1596
1909
|
<div class="card">
|
|
@@ -1622,6 +1935,25 @@
|
|
|
1622
1935
|
</div>
|
|
1623
1936
|
</div>
|
|
1624
1937
|
|
|
1938
|
+
<!-- ===== Interface mode (docs/ui-levels.md) ===== -->
|
|
1939
|
+
<!-- Opened by every [data-mode-open]: the sidebar item, its top-nav twin, Settings › General.
|
|
1940
|
+
Choosing a card applies at once, so the app re-lays out behind the dialog as the preview.
|
|
1941
|
+
ui-level.mjs owns the cards, focus and keys. -->
|
|
1942
|
+
<div id="mode-modal" class="viewer-modal mode-modal hidden" role="dialog" aria-modal="true" aria-labelledby="mode-title" aria-describedby="mode-sub">
|
|
1943
|
+
<div class="card">
|
|
1944
|
+
<div class="card-head">
|
|
1945
|
+
<h2 id="mode-title">Interface mode</h2>
|
|
1946
|
+
</div>
|
|
1947
|
+
<p class="mode-sub" id="mode-sub">Choose how much of Worca is on screen. Nothing is switched off, only tidied away, and you can change this at any time.</p>
|
|
1948
|
+
<div class="lv-cards" id="mode-cards" role="radiogroup" aria-labelledby="mode-title"></div>
|
|
1949
|
+
<small class="hint" id="mode-msg" aria-live="polite"></small>
|
|
1950
|
+
<div class="mode-foot">
|
|
1951
|
+
<span class="hint">Applies at once. Runs and saved settings are not affected.</span>
|
|
1952
|
+
<button type="button" id="mode-done" class="btn btn-primary btn-mini">Done</button>
|
|
1953
|
+
</div>
|
|
1954
|
+
</div>
|
|
1955
|
+
</div>
|
|
1956
|
+
|
|
1625
1957
|
<!-- ===== Reusable confirmation modal ===== -->
|
|
1626
1958
|
<div id="confirm-modal" class="viewer-modal confirm-modal hidden" role="dialog" aria-modal="true" aria-labelledby="confirm-title">
|
|
1627
1959
|
<div class="card">
|
|
@@ -1711,8 +2043,8 @@
|
|
|
1711
2043
|
<span class="export-label">Format</span>
|
|
1712
2044
|
<div id="export-format" class="seg" role="group" aria-label="Export format">
|
|
1713
2045
|
<button type="button" class="seg-btn on" data-format="json">JSON file</button>
|
|
1714
|
-
<button type="button" class="seg-btn" data-format="skill">Claude Code skill</button>
|
|
1715
|
-
<button type="button" class="seg-btn" data-format="plugin">Worca plugin</button>
|
|
2046
|
+
<button type="button" class="seg-btn" data-format="skill" data-min-level="expert">Claude Code skill</button>
|
|
2047
|
+
<button type="button" class="seg-btn" data-format="plugin" data-min-level="expert">Worca plugin</button>
|
|
1716
2048
|
</div>
|
|
1717
2049
|
<span id="export-format-hint" class="hint"></span>
|
|
1718
2050
|
</div>
|
|
@@ -1803,6 +2135,13 @@
|
|
|
1803
2135
|
<b class="shipit-branch"></b>
|
|
1804
2136
|
<span class="shipit-arrow">→</span>
|
|
1805
2137
|
<span class="shipit-base"></span>
|
|
2138
|
+
<!-- The base-branch pick, in place of the plain base name once GET
|
|
2139
|
+
/api/pr/remotes names the choices: the run chain (root first, the
|
|
2140
|
+
default) and the base remote's branches. While it is hidden the
|
|
2141
|
+
plain `.shipit-base` text stands and the POST omits baseBranch. -->
|
|
2142
|
+
<span class="select-wrap shipit-base-wrap" hidden>
|
|
2143
|
+
<select id="shipit-base-branch" class="select shipit-base-branch" aria-label="Base branch"></select>
|
|
2144
|
+
</span>
|
|
1806
2145
|
</div>
|
|
1807
2146
|
<!-- Fork support: where the branch is pushed and which repo the PR opens in
|
|
1808
2147
|
(GitHub's "compare across forks"). Filled from GET /api/pr/remotes on
|