@growthub/cli 0.13.9 → 0.14.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/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/env-status/route.js +31 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/apply/route.js +227 -5
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/helper/query/route.js +1 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/api/workspace/sandbox-run/route.js +70 -9
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceActivationPanel.jsx +17 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/components/WorkspaceHelperSetupModal.jsx +6 -3
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/AgentSwarmPanel.jsx +61 -35
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ApiRegistryCreationCockpit.jsx +200 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/DataModelShell.jsx +414 -9
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/HelperSidecar.jsx +339 -77
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationGraphCanvas.jsx +81 -10
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/OrchestrationNodeConfigPanel.jsx +70 -85
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/ReferencePicker.jsx +2 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SidecarExpandView.jsx +37 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/SwarmRunCockpit.jsx +625 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/data-model/components/helper-commands.js +150 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css +229 -9
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/workflows/WorkflowSurface.jsx +224 -14
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/integrations/resolver-loader.js +2 -4
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/default-local-agent-host.js +139 -4
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/adapters/sandboxes/default-local-intelligence.js +4 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/api-registry-creation-flow.js +317 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/api-response-profile.js +207 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/creation-error-recovery.js +103 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/env-status.js +100 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-agent-swarm.js +246 -4
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-graph.js +69 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/orchestration-run-console.js +411 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/sandbox-serverless-flow.js +215 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/server-resolver-write.js +67 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/serverless-upgrade.js +89 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-activation.js +11 -4
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-data-model.js +8 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-helper.js +30 -1
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-metadata-store.js +8 -6
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-resolver-proposal.js +200 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/lib/workspace-swarm-proposal.js +551 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper slash-command registry (SWARM_RUN_CONTRACT_V1, Phase 6).
|
|
3
|
+
*
|
|
4
|
+
* Pure module — no React, no fetch, no config writes. The HelperSidecar
|
|
5
|
+
* composer consumes this registry to render the "/" menu; unit tests assert
|
|
6
|
+
* its governance invariants.
|
|
7
|
+
*
|
|
8
|
+
* Governance rules encoded here:
|
|
9
|
+
* - read-only commands (mutates: false) may switch the sidecar view or
|
|
10
|
+
* seed a prompt — they never create proposals or patch config.
|
|
11
|
+
* - mutating commands (mutates: true) only ever SEED a helper proposal
|
|
12
|
+
* request (intent + prompt template). The proposal still travels the
|
|
13
|
+
* full governed chain: helper query → review → helper/apply → receipt.
|
|
14
|
+
* - no command executes sandbox-run directly and no command patches
|
|
15
|
+
* workspace config directly.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const HELPER_COMMANDS = [
|
|
19
|
+
{
|
|
20
|
+
name: "/goal",
|
|
21
|
+
label: "Goal",
|
|
22
|
+
description: "Set a verifiable goal for this helper session",
|
|
23
|
+
scope: "chat",
|
|
24
|
+
mutates: false,
|
|
25
|
+
promptTemplate: "Set a verifiable goal for this helper session:"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "/loop",
|
|
29
|
+
label: "Loop",
|
|
30
|
+
description: "Propose a governed recurring loop — reviewed before anything runs",
|
|
31
|
+
scope: "workspace",
|
|
32
|
+
mutates: true,
|
|
33
|
+
promptTemplate: "Propose a governed loop:"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "/workflows",
|
|
37
|
+
label: "Workflows",
|
|
38
|
+
description: "Open the background tasks list — read-only, no writes",
|
|
39
|
+
scope: "workspace",
|
|
40
|
+
mutates: false,
|
|
41
|
+
view: "swarm-list"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "/swarm",
|
|
45
|
+
label: "Swarm",
|
|
46
|
+
description: "Propose a governed agent swarm — you review and apply before any run",
|
|
47
|
+
scope: "swarm",
|
|
48
|
+
mutates: true,
|
|
49
|
+
intent: "swarm",
|
|
50
|
+
promptTemplate: "Propose a governed agent swarm:"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "/register-api",
|
|
54
|
+
label: "Register API",
|
|
55
|
+
description: "Draft an API Registry entry as a reviewable proposal",
|
|
56
|
+
scope: "workspace",
|
|
57
|
+
mutates: true,
|
|
58
|
+
intent: "register_api"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "/create-object",
|
|
62
|
+
label: "Create object",
|
|
63
|
+
description: "Translate a plain-language description into a new business object",
|
|
64
|
+
scope: "workspace",
|
|
65
|
+
mutates: true,
|
|
66
|
+
intent: "create_object"
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
// The full behavioral surface a command may declare. Anything outside this
|
|
71
|
+
// list (execute hooks, patch fields, fetch targets…) is a governance
|
|
72
|
+
// violation — commands are a keyboard front-end to the existing pill
|
|
73
|
+
// intent system, never an action runner.
|
|
74
|
+
export const HELPER_COMMAND_ALLOWED_KEYS = [
|
|
75
|
+
"name",
|
|
76
|
+
"label",
|
|
77
|
+
"description",
|
|
78
|
+
"scope",
|
|
79
|
+
"mutates",
|
|
80
|
+
"promptTemplate",
|
|
81
|
+
"view",
|
|
82
|
+
"intent"
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Pure governance validator for one command entry. Used by the unit suite
|
|
87
|
+
* against the live registry AND against forged entries (proving the
|
|
88
|
+
* invariant bites). Returns { ok, error }.
|
|
89
|
+
*/
|
|
90
|
+
export function isGovernedHelperCommand(cmd) {
|
|
91
|
+
if (!cmd || typeof cmd !== "object") return { ok: false, error: "command must be an object" };
|
|
92
|
+
if (typeof cmd.name !== "string" || !cmd.name.startsWith("/")) {
|
|
93
|
+
return { ok: false, error: "command name must start with /" };
|
|
94
|
+
}
|
|
95
|
+
if (typeof cmd.label !== "string" || !cmd.label) return { ok: false, error: `${cmd.name}: label required` };
|
|
96
|
+
if (typeof cmd.mutates !== "boolean") return { ok: false, error: `${cmd.name}: mutates must be declared` };
|
|
97
|
+
for (const key of Object.keys(cmd)) {
|
|
98
|
+
if (!HELPER_COMMAND_ALLOWED_KEYS.includes(key)) {
|
|
99
|
+
return { ok: false, error: `${cmd.name}: behavior key "${key}" is outside the governed surface` };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (cmd.mutates) {
|
|
103
|
+
if (!cmd.intent && !cmd.promptTemplate) {
|
|
104
|
+
return { ok: false, error: `${cmd.name}: mutating commands must seed a governed proposal request` };
|
|
105
|
+
}
|
|
106
|
+
if (cmd.view) {
|
|
107
|
+
return { ok: false, error: `${cmd.name}: mutating commands must not switch views directly` };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { ok: true, error: null };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Fuzzy-filter the registry against what the user typed after "/".
|
|
115
|
+
* Matches subsequences against the command name and label so "/wf" hits
|
|
116
|
+
* "/workflows" and "swm" hits "/swarm". Empty query returns everything.
|
|
117
|
+
*/
|
|
118
|
+
export function matchHelperCommands(query, commands = HELPER_COMMANDS) {
|
|
119
|
+
const text = String(query || "").trim().toLowerCase().replace(/^\//, "");
|
|
120
|
+
if (!text) return commands.slice();
|
|
121
|
+
const isSubsequence = (needle, haystack) => {
|
|
122
|
+
let i = 0;
|
|
123
|
+
for (const ch of haystack) {
|
|
124
|
+
if (ch === needle[i]) i += 1;
|
|
125
|
+
if (i >= needle.length) return true;
|
|
126
|
+
}
|
|
127
|
+
return needle.length === 0;
|
|
128
|
+
};
|
|
129
|
+
return commands.filter((cmd) => {
|
|
130
|
+
const name = cmd.name.toLowerCase().replace(/^\//, "");
|
|
131
|
+
const label = cmd.label.toLowerCase();
|
|
132
|
+
return name.includes(text) || label.includes(text)
|
|
133
|
+
|| isSubsequence(text, name) || isSubsequence(text, label);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Parse a composer value into a slash-menu state. The menu only engages
|
|
139
|
+
* when "/" is the FIRST character of the prompt — a slash mid-sentence
|
|
140
|
+
* (URLs, paths) never hijacks typing.
|
|
141
|
+
*/
|
|
142
|
+
export function parseSlashInput(value) {
|
|
143
|
+
const text = String(value || "");
|
|
144
|
+
if (!text.startsWith("/")) return { active: false, query: "", matches: [] };
|
|
145
|
+
// Once whitespace follows the command token the user is writing the
|
|
146
|
+
// body — keep the menu closed.
|
|
147
|
+
const token = text.slice(1);
|
|
148
|
+
if (/\s/.test(token)) return { active: false, query: "", matches: [] };
|
|
149
|
+
return { active: true, query: token, matches: matchHelperCommands(token) };
|
|
150
|
+
}
|
package/assets/worker-kits/growthub-custom-workspace-starter-v1/apps/workspace/app/globals.css
CHANGED
|
@@ -5030,7 +5030,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5030
5030
|
.dm-db-status.warn { border-color: #fde68a; background: #fffbeb; color: #92400e; }
|
|
5031
5031
|
.dm-db-status.warn span { background: #f59e0b; }
|
|
5032
5032
|
.dm-record-backdrop { position: fixed; inset: 0; z-index: 80; background: rgba(15,23,42,.12); }
|
|
5033
|
-
.dm-record-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 81; display: flex; flex-direction: column; width: min(440px, 100vw); background: #fff; border-left: 1px solid #dfe3e8; box-shadow: -10px 0 34px rgba(15,23,42,.16); }
|
|
5033
|
+
.dm-record-drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 81; display: flex; flex-direction: column; min-height: 0; width: min(440px, 100vw); background: #fff; border-left: 1px solid #dfe3e8; box-shadow: -10px 0 34px rgba(15,23,42,.16); overflow: hidden; }
|
|
5034
5034
|
.dm-record-drawer-wide { width: min(780px, 100vw); }
|
|
5035
5035
|
.dm-api-action-card {
|
|
5036
5036
|
display: grid;
|
|
@@ -5070,6 +5070,59 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5070
5070
|
.dm-api-action-card-body h3 { margin: 0; font-size: 14px; font-weight: 650; color: #111827; }
|
|
5071
5071
|
.dm-api-action-card-body p { margin: 0; font-size: 12px; line-height: 1.45; color: #4b5563; }
|
|
5072
5072
|
.dm-api-action-card-cta { flex-shrink: 0; align-self: center; }
|
|
5073
|
+
|
|
5074
|
+
/* Governed creation cockpit — vertical journey inside the api-registry drawer.
|
|
5075
|
+
Overrides the action-card 3-col grid and reuses the workspace's own status
|
|
5076
|
+
chip (.dm-db-status) + dm-btn-* buttons. No new colors, no new primitive. */
|
|
5077
|
+
.dm-cockpit { display: block; grid-template-columns: none; transition: box-shadow .14s, background .14s; }
|
|
5078
|
+
.dm-cockpit.is-collapsed { padding-bottom: 12px; }
|
|
5079
|
+
.dm-cockpit-head { width: 100%; display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; border: 0; background: transparent; padding: 0; text-align: left; cursor: pointer; }
|
|
5080
|
+
.dm-cockpit-head:hover .dm-api-action-card-body h3 { color: #000; }
|
|
5081
|
+
.dm-cockpit-head:focus-visible { outline: 2px solid #bfdbfe; outline-offset: 4px; border-radius: 6px; }
|
|
5082
|
+
.dm-cockpit-count { flex-shrink: 0; font-size: 11px; font-weight: 700; color: #94a3b8; font-variant-numeric: tabular-nums; padding-top: 2px; }
|
|
5083
|
+
.dm-cockpit-steps { list-style: none; margin: 10px 0 0; padding: 0; }
|
|
5084
|
+
.dm-cockpit-step { display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: start; padding: 10px 0; border-top: 1px solid #edf0f3; }
|
|
5085
|
+
.dm-cockpit-step:first-child { border-top: 0; }
|
|
5086
|
+
.dm-cockpit-step-chip { flex-shrink: 0; align-self: start; margin-top: 1px; min-width: 64px; justify-content: center; }
|
|
5087
|
+
.dm-cockpit-step-body { min-width: 0; display: grid; gap: 2px; }
|
|
5088
|
+
.dm-cockpit-step-label { margin: 0; font-size: 13px; font-weight: 600; color: #111827; }
|
|
5089
|
+
.dm-cockpit-step-desc { margin: 0; font-size: 12px; line-height: 1.45; color: #64748b; }
|
|
5090
|
+
.dm-cockpit-step-hint { margin: 0; font-size: 11px; line-height: 1.4; color: #94a3b8; }
|
|
5091
|
+
.dm-cockpit-step button { flex-shrink: 0; align-self: center; }
|
|
5092
|
+
.dm-cockpit-step-muted .dm-cockpit-step-label,
|
|
5093
|
+
.dm-cockpit-step-muted .dm-cockpit-step-desc { color: #94a3b8; }
|
|
5094
|
+
.dm-cockpit-step-next { background: #f8fafc; margin: 0 -14px; padding-left: 14px; padding-right: 14px; border-radius: 6px; }
|
|
5095
|
+
.dm-cockpit-shape { margin-top: 12px; padding-top: 12px; border-top: 1px solid #edf0f3; display: grid; gap: 6px; }
|
|
5096
|
+
.dm-cockpit-shape-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
|
|
5097
|
+
.dm-cockpit-shape-head .dm-api-action-card-eyebrow { margin: 0; }
|
|
5098
|
+
.dm-cockpit-fields { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
|
|
5099
|
+
.dm-cockpit-field { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: #475569; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; padding: 2px 8px; }
|
|
5100
|
+
.dm-cockpit-field b { font-weight: 700; color: #94a3b8; text-transform: uppercase; font-size: 10px; letter-spacing: .03em; }
|
|
5101
|
+
.dm-cockpit-receipts { margin-top: 12px; padding-top: 12px; border-top: 1px solid #edf0f3; }
|
|
5102
|
+
.dm-cockpit-receipts ul { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 6px; }
|
|
5103
|
+
.dm-cockpit-receipt { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: start; }
|
|
5104
|
+
.dm-cockpit-receipt-chip { align-self: start; }
|
|
5105
|
+
.dm-cockpit-receipt-text { font-size: 12px; color: #64748b; line-height: 1.4; }
|
|
5106
|
+
|
|
5107
|
+
/* Serverless upgrade — toolbar button, one-time nudge, and cockpit panel. */
|
|
5108
|
+
.dm-workflow-upgrade-btn { position: relative; }
|
|
5109
|
+
.dm-workflow-upgrade-btn.is-serverless { color: #166534; }
|
|
5110
|
+
.dm-workflow-upgrade-btn.is-pulse { color: #111827; }
|
|
5111
|
+
.dm-workflow-upgrade-btn[data-tooltip]:hover::after {
|
|
5112
|
+
content: attr(data-tooltip); position: absolute; top: 100%; right: 0; margin-top: 6px;
|
|
5113
|
+
white-space: nowrap; background: #111827; color: #fff; font-size: 11px; font-weight: 500;
|
|
5114
|
+
padding: 5px 8px; border-radius: 6px; z-index: 40; box-shadow: 0 4px 12px rgba(15,23,42,.18);
|
|
5115
|
+
}
|
|
5116
|
+
.dm-workflow-upgrade-nudge { align-items: center; justify-content: space-between; gap: 16px; padding: 10px 16px; }
|
|
5117
|
+
.dm-workflow-upgrade-nudge > div:first-child { min-width: 0; padding-right: 10px; }
|
|
5118
|
+
.dm-workflow-upgrade-nudge strong,
|
|
5119
|
+
.dm-workflow-upgrade-nudge span { line-height: 1.35; }
|
|
5120
|
+
.dm-workflow-upgrade-nudge-actions { display: inline-flex; align-items: center; gap: 8px; }
|
|
5121
|
+
.dm-workflow-upgrade-panel { width: auto; margin: 12px 8px 16px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; box-shadow: 0 2px 8px rgba(15,23,42,.06); }
|
|
5122
|
+
.dm-workflow-upgrade-panel-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px 0; }
|
|
5123
|
+
.dm-workflow-upgrade-panel-head .dm-api-action-card-eyebrow { margin: 0; }
|
|
5124
|
+
.dm-workflow-upgrade-panel .dm-api-action-card { margin: 8px; box-shadow: none; }
|
|
5125
|
+
|
|
5073
5126
|
.dm-api-review-banner {
|
|
5074
5127
|
display: grid;
|
|
5075
5128
|
grid-template-columns: auto 1fr auto;
|
|
@@ -5223,6 +5276,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5223
5276
|
display: flex;
|
|
5224
5277
|
align-items: center;
|
|
5225
5278
|
gap: 6px;
|
|
5279
|
+
padding-left: 16px;
|
|
5226
5280
|
min-width: max-content;
|
|
5227
5281
|
flex: 1 0 auto;
|
|
5228
5282
|
color: #8b8b91;
|
|
@@ -5276,6 +5330,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5276
5330
|
display: flex;
|
|
5277
5331
|
align-items: center;
|
|
5278
5332
|
gap: 6px;
|
|
5333
|
+
padding-right: 16px;
|
|
5279
5334
|
flex: 0 1 auto;
|
|
5280
5335
|
min-width: 0;
|
|
5281
5336
|
max-width: 58vw;
|
|
@@ -5380,7 +5435,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5380
5435
|
min-height: 520px;
|
|
5381
5436
|
align-items: center;
|
|
5382
5437
|
justify-content: center;
|
|
5383
|
-
padding:
|
|
5438
|
+
padding: 96px 24px;
|
|
5384
5439
|
border: 0;
|
|
5385
5440
|
border-radius: 0;
|
|
5386
5441
|
background-color: #fff;
|
|
@@ -5388,6 +5443,12 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5388
5443
|
background-size: 20px 20px;
|
|
5389
5444
|
box-shadow: none;
|
|
5390
5445
|
overflow: hidden;
|
|
5446
|
+
cursor: grab;
|
|
5447
|
+
touch-action: none;
|
|
5448
|
+
user-select: none;
|
|
5449
|
+
}
|
|
5450
|
+
.dm-workflow-orchestration .dm-orchestration-canvas:active {
|
|
5451
|
+
cursor: grabbing;
|
|
5391
5452
|
}
|
|
5392
5453
|
.dm-workflow-orchestration .dm-orchestration-canvas__badge {
|
|
5393
5454
|
top: 16px;
|
|
@@ -5443,8 +5504,11 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5443
5504
|
display: flex;
|
|
5444
5505
|
flex-direction: column;
|
|
5445
5506
|
align-items: center;
|
|
5446
|
-
|
|
5507
|
+
padding: 96px 0;
|
|
5508
|
+
transform-origin: center center;
|
|
5447
5509
|
transition: transform .12s ease;
|
|
5510
|
+
will-change: transform;
|
|
5511
|
+
cursor: default;
|
|
5448
5512
|
}
|
|
5449
5513
|
.dm-workflow-orchestration .dm-orchestration-canvas__step {
|
|
5450
5514
|
width: 173px;
|
|
@@ -5682,6 +5746,58 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
5682
5746
|
padding: 7px 9px;
|
|
5683
5747
|
box-sizing: border-box;
|
|
5684
5748
|
}
|
|
5749
|
+
.dm-workflow-orchestration .dm-orchestration-config__field input[type="number"]::-webkit-outer-spin-button,
|
|
5750
|
+
.dm-workflow-orchestration .dm-orchestration-config__field input[type="number"]::-webkit-inner-spin-button {
|
|
5751
|
+
-webkit-appearance: none;
|
|
5752
|
+
margin: 0;
|
|
5753
|
+
}
|
|
5754
|
+
.dm-workflow-orchestration .dm-orchestration-config__field input[type="number"] {
|
|
5755
|
+
appearance: textfield;
|
|
5756
|
+
-moz-appearance: textfield;
|
|
5757
|
+
}
|
|
5758
|
+
.dm-workflow-orchestration .dm-workflow-check {
|
|
5759
|
+
width: fit-content;
|
|
5760
|
+
display: inline-flex;
|
|
5761
|
+
grid-template-columns: none;
|
|
5762
|
+
align-items: center;
|
|
5763
|
+
gap: 7px;
|
|
5764
|
+
min-height: 26px;
|
|
5765
|
+
cursor: pointer;
|
|
5766
|
+
}
|
|
5767
|
+
.dm-workflow-orchestration .dm-workflow-check input[type="checkbox"] {
|
|
5768
|
+
position: absolute;
|
|
5769
|
+
width: 1px;
|
|
5770
|
+
height: 1px;
|
|
5771
|
+
opacity: 0;
|
|
5772
|
+
pointer-events: none;
|
|
5773
|
+
}
|
|
5774
|
+
.dm-workflow-orchestration .dm-workflow-check__box {
|
|
5775
|
+
width: 16px;
|
|
5776
|
+
height: 16px;
|
|
5777
|
+
display: inline-grid;
|
|
5778
|
+
place-items: center;
|
|
5779
|
+
flex: 0 0 16px;
|
|
5780
|
+
border: 1px solid #d1d5db;
|
|
5781
|
+
border-radius: 4px;
|
|
5782
|
+
background: #f8fafc;
|
|
5783
|
+
color: #111827;
|
|
5784
|
+
box-sizing: border-box;
|
|
5785
|
+
}
|
|
5786
|
+
.dm-workflow-orchestration .dm-workflow-check:hover .dm-workflow-check__box {
|
|
5787
|
+
border-color: #9ca3af;
|
|
5788
|
+
background: #fff;
|
|
5789
|
+
}
|
|
5790
|
+
.dm-workflow-orchestration .dm-workflow-check input[type="checkbox"]:checked + .dm-workflow-check__box {
|
|
5791
|
+
border-color: #111827;
|
|
5792
|
+
background: #fff;
|
|
5793
|
+
}
|
|
5794
|
+
.dm-workflow-orchestration .dm-workflow-check input[type="checkbox"]:focus-visible + .dm-workflow-check__box {
|
|
5795
|
+
outline: 2px solid #d1d5db;
|
|
5796
|
+
outline-offset: 2px;
|
|
5797
|
+
}
|
|
5798
|
+
.dm-workflow-orchestration .dm-workflow-check input[type="checkbox"]:disabled + .dm-workflow-check__box {
|
|
5799
|
+
opacity: .55;
|
|
5800
|
+
}
|
|
5685
5801
|
.dm-workflow-orchestration .dm-orchestration-config__field input:focus,
|
|
5686
5802
|
.dm-workflow-orchestration .dm-orchestration-config__field textarea:focus,
|
|
5687
5803
|
.dm-workflow-orchestration .dm-orchestration-config__field select:focus {
|
|
@@ -6013,6 +6129,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6013
6129
|
.dm-orch-modal-summary span { display: block; font-size: 10px; font-weight: 700; text-transform: uppercase; color: #6b7280; margin-bottom: 4px; }
|
|
6014
6130
|
.dm-orch-modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: 1px solid #edf0f3; }
|
|
6015
6131
|
.dm-record-drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px; border-bottom: 1px solid #edf0f3; }
|
|
6132
|
+
.dm-record-drawer-head > div:first-child { min-width: 0; flex: 1 1 auto; }
|
|
6016
6133
|
.dm-record-drawer-actions { display: inline-flex; align-items: center; gap: 8px; }
|
|
6017
6134
|
.dm-record-head-run { min-height: 30px; padding: 0 11px; }
|
|
6018
6135
|
.dm-record-drawer-actions { display: inline-flex; align-items: center; gap: 8px; }
|
|
@@ -6024,7 +6141,8 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6024
6141
|
.dm-drawer-hidden-fields > span { color: #64748b; font-size: 12px; font-weight: 600; }
|
|
6025
6142
|
.dm-drawer-hidden-list { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
6026
6143
|
.dm-record-drawer-head p { margin: 0 0 3px; color: #94a3b8; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; }
|
|
6027
|
-
.dm-record-drawer-head h2 { margin: 0; color: #111827; font-size: 16px; font-weight: 650; }
|
|
6144
|
+
.dm-record-drawer-head h2 { margin: 0; color: #111827; font-size: 16px; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
6145
|
+
.dm-record-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-gutter: stable; padding: 0 0 28px; }
|
|
6028
6146
|
.dm-record-testbar { display: flex; align-items: center; gap: 8px; padding: 10px 18px; border-bottom: 1px solid #edf0f3; background: #fbfdff; }
|
|
6029
6147
|
.dm-record-testbar > span:last-child { min-width: 0; color: #64748b; font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
6030
6148
|
.dm-record-testbar[data-panel="sandbox-agent-auth"] {
|
|
@@ -6114,7 +6232,7 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6114
6232
|
white-space: pre-wrap;
|
|
6115
6233
|
word-break: break-word;
|
|
6116
6234
|
}
|
|
6117
|
-
.dm-record-fields { display: grid; gap: 8px; padding: 14px 16px
|
|
6235
|
+
.dm-record-fields { display: grid; align-content: start; gap: 8px; min-height: 0; padding: 14px 16px 0; }
|
|
6118
6236
|
.dm-record-field { display: grid; gap: 5px; }
|
|
6119
6237
|
.dm-record-field span { color: #475569; font-size: 11px; font-weight: 650; }
|
|
6120
6238
|
.dm-record-field input,
|
|
@@ -6132,12 +6250,13 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6132
6250
|
.dm-drawer-section.open .dm-drawer-section-toggle svg { transform: rotate(90deg); }
|
|
6133
6251
|
.dm-drawer-section-body { display: grid; gap: 10px; padding: 11px; }
|
|
6134
6252
|
.dm-sandbox-config { display: grid; gap: 8px; }
|
|
6253
|
+
.dm-sandbox-config > .dm-cockpit { width: 100%; margin: 12px 0 8px; box-sizing: border-box; }
|
|
6135
6254
|
.dm-radio-row { display: grid; gap: 8px; }
|
|
6136
6255
|
.dm-radio-row label, .dm-check-row { display: grid; grid-template-columns: 16px minmax(0,1fr); align-items: start; column-gap: 8px; color: #1f2937; font-size: 12px; line-height: 1.35; }
|
|
6137
6256
|
.dm-radio-row input[type="radio"], .dm-check-row input[type="checkbox"] { width: 14px; height: 14px; margin: 1px 0 0; padding: 0; box-shadow: none; accent-color: #111827; }
|
|
6138
6257
|
.dm-radio-row span, .dm-check-row span { color: #1f2937; font-size: 12px; font-weight: 500; }
|
|
6139
6258
|
.dm-check-row { cursor: pointer; }
|
|
6140
|
-
.dm-select { position: relative; width: 100%; min-width:
|
|
6259
|
+
.dm-select { position: relative; width: 100%; min-width: 0; font-size: 11px; }
|
|
6141
6260
|
.dm-select-trigger { width: 100%; min-height: 32px; display: flex; align-items: center; justify-content: space-between; gap: 8px; border: 1px solid #cbd5e1; border-radius: 7px; background: #fff; color: #111827; box-shadow: 0 1px 2px rgba(15,23,42,.05); font: inherit; font-size: 11px; padding: 6px 10px; text-align: left; cursor: pointer; transition: border-color .12s, box-shadow .12s, background .12s; }
|
|
6142
6261
|
.dm-select-trigger:hover:not(:disabled) { border-color: #94a3b8; box-shadow: 0 2px 8px rgba(15,23,42,.08); }
|
|
6143
6262
|
.dm-select.open .dm-select-trigger { border-color: #64748b; box-shadow: 0 0 0 3px rgba(100,116,139,.12), 0 2px 8px rgba(15,23,42,.08); }
|
|
@@ -6162,8 +6281,12 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6162
6281
|
.dm-select-pager button { height: 26px; border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; color: #334155; font: inherit; font-size: 12px; padding: 0 8px; cursor: pointer; }
|
|
6163
6282
|
.dm-select-pager button:disabled { opacity: .45; cursor: not-allowed; }
|
|
6164
6283
|
.dm-select-pager span { color: #64748b; font-size: 12px; font-weight: 650; }
|
|
6165
|
-
.dm-
|
|
6166
|
-
.dm-
|
|
6284
|
+
.dm-reference-picker { display: grid; gap: 6px; width: min(240px, 100%); min-width: 0; }
|
|
6285
|
+
.dm-reference-picker-warning { display: inline-flex; align-items: center; gap: 5px; max-width: 100%; margin: 0; padding: 5px 7px; border: 1px solid #fde68a; border-radius: 6px; background: #fffbeb; color: #92400e; font-size: 11px; line-height: 1.25; }
|
|
6286
|
+
.dm-reference-picker-warning svg { flex: 0 0 auto; }
|
|
6287
|
+
.dm-reference-picker-warning span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
6288
|
+
.dm-db-grid td:has(.dm-select) { overflow: visible; padding-top: 5px; padding-bottom: 5px; vertical-align: top; }
|
|
6289
|
+
.dm-db-grid td .dm-select { min-width: 0; }
|
|
6167
6290
|
.dm-json-field { position: relative; }
|
|
6168
6291
|
.dm-json-field > span { padding-right: 34px; }
|
|
6169
6292
|
.dm-json-expand { position: absolute; top: 0; right: 0; display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 24px; border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; color: #64748b; box-shadow: 0 1px 2px rgba(15,23,42,.05); opacity: 0; cursor: pointer; transition: opacity .12s, border-color .12s, color .12s, box-shadow .12s; }
|
|
@@ -6607,6 +6730,40 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
6607
6730
|
background: #f5f5f5;
|
|
6608
6731
|
border-color: #9ca3af;
|
|
6609
6732
|
}
|
|
6733
|
+
.dm-helper-run-meta {
|
|
6734
|
+
display: flex;
|
|
6735
|
+
align-items: center;
|
|
6736
|
+
justify-content: space-between;
|
|
6737
|
+
gap: 12px;
|
|
6738
|
+
padding-top: 8px;
|
|
6739
|
+
border-top: 1px solid #e5e7eb;
|
|
6740
|
+
color: #6b7280;
|
|
6741
|
+
font-size: 12px;
|
|
6742
|
+
line-height: 1.3;
|
|
6743
|
+
}
|
|
6744
|
+
.dm-helper-proposal-card-row {
|
|
6745
|
+
grid-template-columns: 18px 1fr;
|
|
6746
|
+
}
|
|
6747
|
+
.dm-helper-proposal-card-row input[type=checkbox] {
|
|
6748
|
+
width: 14px;
|
|
6749
|
+
height: 14px;
|
|
6750
|
+
margin: 0;
|
|
6751
|
+
accent-color: #111827;
|
|
6752
|
+
}
|
|
6753
|
+
.dm-helper-proposal-card-toggle {
|
|
6754
|
+
display: grid;
|
|
6755
|
+
grid-template-columns: minmax(0, max-content) minmax(0, 1fr) auto;
|
|
6756
|
+
align-items: center;
|
|
6757
|
+
gap: 6px;
|
|
6758
|
+
width: 100%;
|
|
6759
|
+
padding: 0;
|
|
6760
|
+
border: 0;
|
|
6761
|
+
background: transparent;
|
|
6762
|
+
color: inherit;
|
|
6763
|
+
font: inherit;
|
|
6764
|
+
text-align: left;
|
|
6765
|
+
cursor: pointer;
|
|
6766
|
+
}
|
|
6610
6767
|
|
|
6611
6768
|
.dm-helper-typing {
|
|
6612
6769
|
display: inline-flex;
|
|
@@ -8652,6 +8809,10 @@ body.workspace-rail-collapsed .workspace-builder.dm-workflow-page {
|
|
|
8652
8809
|
.dm-run-console__tree-dot[data-variant="fail"] { background: #dc2626; }
|
|
8653
8810
|
.dm-run-console__tree-dot[data-variant="active"] { background: #2563eb; }
|
|
8654
8811
|
.dm-run-console__tree-dot[data-variant="canceled"] { background: #9ca3af; }
|
|
8812
|
+
/* Pending (hollow) — the ONE sanctioned swarm-cockpit grammar addition:
|
|
8813
|
+
"declared but not started" reads as an outline in the SAME grey token the
|
|
8814
|
+
canceled/base dot already uses. No new color values. */
|
|
8815
|
+
.dm-run-console__tree-dot[data-variant="pending"] { background: transparent; border: 1px solid #9ca3af; }
|
|
8655
8816
|
.dm-run-console__tree-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
8656
8817
|
.dm-run-console__tree-meta { color: #6b7280; font-size: 10px; font-variant-numeric: tabular-nums; }
|
|
8657
8818
|
.dm-run-console__tree-bar { display: block; width: 56px; height: 4px; background: #e5e7eb; border-radius: 999px; overflow: hidden; }
|
|
@@ -8960,7 +9121,7 @@ body.workspace-rail-collapsed .workspace-builder.workspace-lens-page,
|
|
|
8960
9121
|
.workspace-lens-helper-callout-btn { flex-shrink: 0; font-size: 12px; font-weight: 600; color: #111827; background: #ffffff; border: 1px solid #d1d5db; border-radius: 6px; padding: 7px 12px; cursor: pointer; }
|
|
8961
9122
|
.workspace-lens-helper-callout-btn:hover:not(:disabled) { background: #f3f4f6; }
|
|
8962
9123
|
.workspace-lens-helper-callout-btn:disabled { opacity: 0.6; cursor: default; }
|
|
8963
|
-
.workspace-helper-setup-modal-backdrop { position: fixed; inset: 0; z-index:
|
|
9124
|
+
.workspace-helper-setup-modal-backdrop { position: fixed; inset: 0; z-index: 5100; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(17, 24, 39, 0.42); backdrop-filter: blur(3px); }
|
|
8964
9125
|
.workspace-helper-setup-modal { position: relative; width: min(620px, 100%); max-height: min(720px, calc(100vh - 48px)); overflow: auto; background: #ffffff; border: 1px solid #d1d5db; border-radius: 8px; box-shadow: 0 24px 70px rgba(17, 24, 39, 0.28); padding: 18px; }
|
|
8965
9126
|
.workspace-helper-setup-modal-close { position: absolute; top: 12px; right: 12px; width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid #e5e7eb; border-radius: 6px; background: #fff; color: #6b7280; cursor: pointer; }
|
|
8966
9127
|
.workspace-helper-setup-modal-close:hover { background: #f9fafb; color: #111827; }
|
|
@@ -9020,3 +9181,62 @@ body.workspace-rail-collapsed .workspace-builder.workspace-lens-page,
|
|
|
9020
9181
|
.workspace-template-context-banner { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 6px; background: #eff6ff; border: 1px solid #bfdbfe; color: #1e40af; font-size: 12px; margin: 0 0 12px; }
|
|
9021
9182
|
.workspace-template-context-banner.is-warn { background: #fffbeb; border-color: #fde68a; color: #92400e; }
|
|
9022
9183
|
.workspace-template-context-banner .workspace-template-context-link { color: inherit; text-decoration: underline; font-weight: 600; margin-left: auto; }
|
|
9184
|
+
|
|
9185
|
+
/* ---------------------------------------------------------------------------
|
|
9186
|
+
Governed Swarm Cockpit (SWARM_RUN_CONTRACT_V1) — structural layout ONLY.
|
|
9187
|
+
No new colors, borders, backgrounds, icons, or motion: every visual
|
|
9188
|
+
treatment comes from existing primitives composed in the JSX —
|
|
9189
|
+
dm-helper-toolcall(-row/-title/-chevron/-body/-json), dm-helper-stream,
|
|
9190
|
+
dm-helper-error, dm-run-console__hint, dm-run-console__tree-dot,
|
|
9191
|
+
dm-btn-ghost, dm-sidecar-header, dm-helper-pill-menu. The dm-swarm-*
|
|
9192
|
+
classes below carry layout, spacing, grid, overflow, and typography
|
|
9193
|
+
weight/size exclusively. */
|
|
9194
|
+
|
|
9195
|
+
/* Slash command menu — same dm-helper-pill-menu primitive, anchored above
|
|
9196
|
+
the composer textarea instead of below a pill. */
|
|
9197
|
+
.dm-helper-composer-input { position: relative; }
|
|
9198
|
+
.dm-helper-slash-menu { bottom: calc(100% + 6px); top: auto; left: 0; right: 0; }
|
|
9199
|
+
.dm-helper-slash-menu .dm-helper-pill-menu-item { justify-content: space-between; gap: 10px; }
|
|
9200
|
+
.dm-helper-slash-menu .dm-field-hint { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9201
|
+
.dm-helper-slash-name { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
|
|
9202
|
+
|
|
9203
|
+
/* Cockpit body — scrolling list inside the existing sidecar body. */
|
|
9204
|
+
.dm-swarm-body { display: flex; flex-direction: column; min-height: 0; }
|
|
9205
|
+
.dm-swarm-cockpit { flex: 1; min-height: 0; overflow-y: auto; padding: 12px 14px 16px; display: flex; flex-direction: column; gap: 10px; }
|
|
9206
|
+
.dm-swarm-cockpit-list { display: flex; flex-direction: column; gap: 8px; }
|
|
9207
|
+
.dm-swarm-section-row { display: flex; align-items: center; justify-content: space-between; margin-top: 4px; }
|
|
9208
|
+
|
|
9209
|
+
/* Run card — surface chrome comes from dm-helper-toolcall in the JSX. */
|
|
9210
|
+
.dm-swarm-card { padding: 10px 12px; display: flex; flex-direction: column; gap: 6px; }
|
|
9211
|
+
.dm-swarm-card-head { display: flex; align-items: center; gap: 8px; }
|
|
9212
|
+
.dm-swarm-card-title { flex: 1; }
|
|
9213
|
+
.dm-swarm-card-action { height: 24px; padding: 0 7px; }
|
|
9214
|
+
.dm-swarm-card-meta { display: flex; align-items: center; gap: 10px; }
|
|
9215
|
+
.dm-swarm-card-meta .dm-run-console__hint { font-size: 12px; }
|
|
9216
|
+
.dm-swarm-card-kind { font-weight: 600; }
|
|
9217
|
+
.dm-swarm-card-desc { font-size: 12px; padding: 7px 9px; }
|
|
9218
|
+
|
|
9219
|
+
/* Phase groups — dm-helper-toolcall card + dm-helper-toolcall-row head. */
|
|
9220
|
+
.dm-swarm-phases { display: flex; flex-direction: column; gap: 6px; margin-top: 2px; }
|
|
9221
|
+
.dm-swarm-phase { display: flex; flex-direction: column; }
|
|
9222
|
+
.dm-swarm-phase-head { grid-template-columns: 1fr auto; min-height: 30px; padding: 6px 10px; }
|
|
9223
|
+
.dm-swarm-dotstrip { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; padding: 0 10px 8px; }
|
|
9224
|
+
|
|
9225
|
+
/* Agent table — Agent | Tokens | Tools | Time, inside dm-helper-toolcall-body. */
|
|
9226
|
+
.dm-swarm-agent-table { display: flex; flex-direction: column; gap: 1px; }
|
|
9227
|
+
.dm-swarm-agent-row { display: grid; grid-template-columns: minmax(0, 1fr) 56px 44px 48px; align-items: center; gap: 6px; padding: 3px 4px; font: inherit; font-size: 12px; background: transparent; border: 0; cursor: pointer; text-align: left; }
|
|
9228
|
+
.dm-swarm-agent-header { cursor: default; }
|
|
9229
|
+
.dm-swarm-agent-name { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9230
|
+
.dm-swarm-agent-cell { text-align: right; font-variant-numeric: tabular-nums; }
|
|
9231
|
+
|
|
9232
|
+
/* Transcript drill-in — existing tool-call JSON pre is the output frame. */
|
|
9233
|
+
.dm-swarm-transcript { display: flex; flex-direction: column; gap: 4px; margin-top: 6px; }
|
|
9234
|
+
.dm-swarm-transcript-head { display: flex; align-items: center; justify-content: space-between; }
|
|
9235
|
+
.dm-swarm-transcript-expand { align-self: flex-end; margin-top: 4px; }
|
|
9236
|
+
|
|
9237
|
+
/* Expand view — full-width takeover within the same sidecar shell; the
|
|
9238
|
+
head reuses dm-sidecar-header chrome. */
|
|
9239
|
+
.dm-swarm-expand { display: flex; flex-direction: column; min-height: 0; flex: 1; }
|
|
9240
|
+
.dm-swarm-expand-head { justify-content: flex-start; gap: 8px; }
|
|
9241
|
+
.dm-swarm-expand-body { flex: 1; min-height: 0; overflow-y: auto; padding: 12px 14px; }
|
|
9242
|
+
.dm-swarm-expand-body .dm-helper-toolcall-json { max-height: none; }
|