dxcomplete 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/.env.example +0 -7
  2. package/README.md +68 -103
  3. package/dist/cli.js +2 -24
  4. package/dist/validate.js +10 -26
  5. package/docs/cost-model.md +2 -2
  6. package/docs/decision-basis.md +5 -11
  7. package/docs/diagrams.md +3 -3
  8. package/docs/index.md +25 -39
  9. package/docs/model.md +15 -23
  10. package/docs/open-questions.md +1 -1
  11. package/docs/taxonomy.md +7 -8
  12. package/docs/workflows.md +3 -3
  13. package/package.json +24 -24
  14. package/templates/process/README.md +11 -11
  15. package/templates/process/controls.yml +19 -19
  16. package/templates/process/cost-model.yml +3 -3
  17. package/templates/process/decision-basis.yml +4 -4
  18. package/templates/process/diagrams/00-decision-basis.mmd +1 -1
  19. package/templates/process/diagrams/00-overview.mmd +1 -1
  20. package/templates/process/diagrams/01-intake-triage.mmd +4 -4
  21. package/templates/process/diagrams/02-product-definition.mmd +3 -3
  22. package/templates/process/diagrams/03-engineering-execution.mmd +1 -1
  23. package/templates/process/diagrams/04-qa-verification.mmd +1 -1
  24. package/templates/process/diagrams/05-product-validation.mmd +1 -1
  25. package/templates/process/diagrams/06-change-release-control.mmd +1 -1
  26. package/templates/process/diagrams/07-deployment-operations.mmd +1 -1
  27. package/templates/process/diagrams/08-support-incident-management.mmd +1 -1
  28. package/templates/process/diagrams/09-problem-improvement.mmd +1 -1
  29. package/templates/process/diagrams/10-risk-control-management.mmd +1 -1
  30. package/templates/process/diagrams/11-audit-evidence-capture.mmd +1 -1
  31. package/templates/process/roles.yml +6 -6
  32. package/templates/process/taxonomy.yml +46 -46
  33. package/templates/process/workflows.yml +29 -29
  34. package/website/account.html +57 -0
  35. package/website/app.js +177 -0
  36. package/website/flow.html +4 -0
  37. package/website/glossary.html +4 -0
  38. package/website/index.html +4 -0
  39. package/website/objects.html +4 -0
  40. package/website/operating-guide.html +4 -0
  41. package/website/outcomes.html +4 -0
  42. package/website/phase-build.html +4 -0
  43. package/website/phase-elicit.html +4 -0
  44. package/website/phase-go-live.html +4 -0
  45. package/website/phase-measure.html +4 -0
  46. package/website/phase-operate.html +4 -0
  47. package/website/phase-orient.html +4 -0
  48. package/website/phase-weigh.html +4 -0
  49. package/website/roles.html +4 -0
  50. package/website/styles.css +217 -1
  51. package/dist/http/service.d.ts +0 -7
  52. package/dist/http/service.js +0 -725
  53. package/dist/mcp/docs.d.ts +0 -114
  54. package/dist/mcp/docs.js +0 -626
  55. package/dist/mcp/server.d.ts +0 -20
  56. package/dist/mcp/server.js +0 -3059
  57. package/dist/runtime/auth.d.ts +0 -162
  58. package/dist/runtime/auth.js +0 -394
  59. package/dist/runtime/check.d.ts +0 -7
  60. package/dist/runtime/check.js +0 -16
  61. package/dist/runtime/config.d.ts +0 -17
  62. package/dist/runtime/config.js +0 -93
  63. package/dist/runtime/mongo.d.ts +0 -9
  64. package/dist/runtime/mongo.js +0 -56
  65. package/dist/runtime/records.d.ts +0 -427
  66. package/dist/runtime/records.js +0 -2092
  67. package/scripts/check-env-surface.mjs +0 -136
  68. package/scripts/check-public-copy.mjs +0 -263
  69. package/scripts/check-service-boundary.mjs +0 -63
  70. package/scripts/runtime-work-order.mjs +0 -506
  71. package/scripts/smoke-mcp-http.mjs +0 -4026
  72. package/src/cli.ts +0 -268
  73. package/src/http/server.ts +0 -314
  74. package/src/http/service.ts +0 -934
  75. package/src/init.ts +0 -262
  76. package/src/install-manifest.ts +0 -144
  77. package/src/mcp/docs.ts +0 -777
  78. package/src/mcp/server.ts +0 -4580
  79. package/src/package-root.ts +0 -31
  80. package/src/runtime/actor.ts +0 -61
  81. package/src/runtime/auth.ts +0 -673
  82. package/src/runtime/check.ts +0 -18
  83. package/src/runtime/config.ts +0 -128
  84. package/src/runtime/mongo.ts +0 -89
  85. package/src/runtime/records.ts +0 -3205
  86. package/src/runtime/workspace.ts +0 -155
  87. package/src/upgrade.ts +0 -356
  88. package/src/validate.ts +0 -141
  89. package/src/version.ts +0 -16
package/website/app.js CHANGED
@@ -34,3 +34,180 @@ roleButtons.forEach((button, index) => {
34
34
  detailPanel.textContent = detail;
35
35
  });
36
36
  });
37
+
38
+ const accountPanel = document.querySelector("[data-account]");
39
+ let accountState;
40
+
41
+ if (accountPanel) {
42
+ loadAccount();
43
+ }
44
+
45
+ async function loadAccount() {
46
+ accountPanel.innerHTML = `<p>Loading account state...</p>`;
47
+
48
+ try {
49
+ const response = await fetch("/api/dxcomplete/web/session", {
50
+ credentials: "same-origin"
51
+ });
52
+ accountState = await response.json();
53
+ renderAccount();
54
+ } catch {
55
+ accountPanel.innerHTML = `
56
+ <div class="account-message account-message--error">
57
+ Account state could not be loaded. Try again in a moment.
58
+ </div>
59
+ `;
60
+ }
61
+ }
62
+
63
+ function renderAccount(created) {
64
+ const error = new URLSearchParams(window.location.search).get("error");
65
+
66
+ if (!accountState?.authenticated) {
67
+ accountPanel.innerHTML = `
68
+ ${error ? `<div class="account-message account-message--error">Sign in could not be completed.</div>` : ""}
69
+ <div class="account-intro">
70
+ <p>Use Google sign in to create and view your DX Complete workspaces.</p>
71
+ <a class="account-primary" href="${escapeHtml(accountState?.signInUrl || "/api/dxcomplete/web/auth/google/start?returnTo=/account.html")}">Sign in with Google</a>
72
+ </div>
73
+ `;
74
+ return;
75
+ }
76
+
77
+ const workspaces = Array.isArray(accountState.workspaces) ? accountState.workspaces : [];
78
+ accountPanel.innerHTML = `
79
+ <div class="account-bar">
80
+ <div>
81
+ <span>Signed in</span>
82
+ <strong>${escapeHtml(accountState.actor?.email || accountState.actor?.displayName || "Google account")}</strong>
83
+ </div>
84
+ <button class="account-secondary" type="button" data-account-logout>Sign out</button>
85
+ </div>
86
+
87
+ <form class="account-form" data-account-form>
88
+ <label for="workspace-name">Workspace name</label>
89
+ <div class="account-form__row">
90
+ <input id="workspace-name" name="name" type="text" minlength="2" maxlength="120" required autocomplete="organization" />
91
+ <button class="account-primary" type="submit">Create workspace</button>
92
+ </div>
93
+ <p>Use a service or project name that your team will recognize later.</p>
94
+ </form>
95
+
96
+ <div data-account-result>
97
+ ${created ? renderCreatedWorkspace(created) : ""}
98
+ </div>
99
+
100
+ <div class="account-list">
101
+ <h2>Your Workspaces</h2>
102
+ ${workspaces.length ? workspaces.map(renderWorkspaceSummary).join("") : "<p>No workspaces yet.</p>"}
103
+ </div>
104
+ `;
105
+
106
+ accountPanel.querySelector("[data-account-logout]")?.addEventListener("click", logoutAccount);
107
+ accountPanel.querySelector("[data-account-form]")?.addEventListener("submit", createWorkspace);
108
+ }
109
+
110
+ async function createWorkspace(event) {
111
+ event.preventDefault();
112
+ const form = event.currentTarget;
113
+ const result = accountPanel.querySelector("[data-account-result]");
114
+ const button = form.querySelector("button[type='submit']");
115
+ const formData = new FormData(form);
116
+ const name = String(formData.get("name") || "");
117
+
118
+ button.disabled = true;
119
+ result.innerHTML = `<div class="account-message">Creating workspace...</div>`;
120
+
121
+ try {
122
+ const response = await fetch("/api/dxcomplete/web/workspaces", {
123
+ method: "POST",
124
+ credentials: "same-origin",
125
+ headers: {
126
+ "content-type": "application/json",
127
+ "x-dxc-csrf-token": accountState.csrfToken
128
+ },
129
+ body: JSON.stringify({ name })
130
+ });
131
+ const body = await response.json();
132
+
133
+ if (!response.ok) {
134
+ throw new Error(body.error_description || "Workspace could not be created.");
135
+ }
136
+
137
+ form.reset();
138
+ await refreshAccountState();
139
+ renderAccount(body);
140
+ } catch (error) {
141
+ result.innerHTML = `
142
+ <div class="account-message account-message--error">
143
+ ${escapeHtml(error instanceof Error ? error.message : "Workspace could not be created.")}
144
+ </div>
145
+ `;
146
+ } finally {
147
+ button.disabled = false;
148
+ }
149
+ }
150
+
151
+ async function logoutAccount() {
152
+ await fetch("/api/dxcomplete/web/logout", {
153
+ method: "POST",
154
+ credentials: "same-origin",
155
+ headers: {
156
+ "x-dxc-csrf-token": accountState.csrfToken
157
+ }
158
+ }).catch(() => undefined);
159
+
160
+ await loadAccount();
161
+ }
162
+
163
+ async function refreshAccountState() {
164
+ const response = await fetch("/api/dxcomplete/web/session", {
165
+ credentials: "same-origin"
166
+ });
167
+ accountState = await response.json();
168
+ }
169
+
170
+ function renderCreatedWorkspace(created) {
171
+ const env = created.install?.env || {};
172
+ const workspace = created.install?.workspaceConfig || {};
173
+ const envBlock = [
174
+ `DXC_SERVICE_URL=${env.DXC_SERVICE_URL || ""}`,
175
+ `DXC_SERVICE_CLIENT_ID=${env.DXC_SERVICE_CLIENT_ID || ""}`,
176
+ `DXC_SERVICE_CLIENT_SECRET=${env.DXC_SERVICE_CLIENT_SECRET || ""}`
177
+ ].join("\n");
178
+ const workspaceBlock = JSON.stringify(workspace, null, 2);
179
+
180
+ return `
181
+ <div class="account-result">
182
+ <h2>Workspace Created</h2>
183
+ <p>Save these values now. The secret is shown only once.</p>
184
+ <h3>Service Values</h3>
185
+ <pre><code>${escapeHtml(envBlock)}</code></pre>
186
+ <h3>Workspace JSON</h3>
187
+ <pre><code>${escapeHtml(workspaceBlock)}</code></pre>
188
+ </div>
189
+ `;
190
+ }
191
+
192
+ function renderWorkspaceSummary(workspace) {
193
+ const clients = Array.isArray(workspace.serviceClients) ? workspace.serviceClients : [];
194
+ return `
195
+ <article class="account-workspace">
196
+ <h3>${escapeHtml(workspace.name || workspace.workspaceId)}</h3>
197
+ <p>${escapeHtml(workspace.workspaceId || "")}</p>
198
+ <dl>
199
+ <div><dt>Roles</dt><dd>${escapeHtml((workspace.roles || []).join(", ") || "member")}</dd></div>
200
+ <div><dt>Service clients</dt><dd>${clients.length}</dd></div>
201
+ </dl>
202
+ </article>
203
+ `;
204
+ }
205
+
206
+ function escapeHtml(value) {
207
+ return String(value)
208
+ .replace(/&/g, "&amp;")
209
+ .replace(/</g, "&lt;")
210
+ .replace(/>/g, "&gt;")
211
+ .replace(/"/g, "&quot;")
212
+ .replace(/'/g, "&#39;");
213
+ }
package/website/flow.html CHANGED
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -17,6 +17,10 @@
17
17
  <small>Plan, deliver, run, measure</small>
18
18
  </span>
19
19
  </div>
20
+ <div class="topbar__actions">
21
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
22
+ <a class="topbar__link" href="./account.html">Sign in</a>
23
+ </div>
20
24
  </header>
21
25
 
22
26
  <div class="layout">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -13,6 +13,10 @@
13
13
  <span class="brand-mark" aria-hidden="true">DX</span>
14
14
  <span><strong>DX Complete</strong><small>Plan, deliver, run, measure</small></span>
15
15
  </div>
16
+ <div class="topbar__actions">
17
+ <a class="topbar__link" href="https://www.npmjs.com/package/dxcomplete" target="_blank" rel="noreferrer">npm</a>
18
+ <a class="topbar__link" href="./account.html">Sign in</a>
19
+ </div>
16
20
  </header>
17
21
  <div class="layout">
18
22
  <aside class="sidebar" aria-label="Documentation pages">
@@ -59,7 +59,7 @@ a {
59
59
  display: flex;
60
60
  min-height: 72px;
61
61
  align-items: center;
62
- justify-content: flex-start;
62
+ justify-content: space-between;
63
63
  gap: 1.5rem;
64
64
  border-bottom: 1px solid rgb(215 220 226 / 84%);
65
65
  background: rgb(246 247 249 / 92%);
@@ -100,6 +100,211 @@ a {
100
100
  box-shadow: 0 8px 22px rgb(25 32 44 / 7%);
101
101
  }
102
102
 
103
+ .topbar__actions {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 0.65rem;
107
+ }
108
+
109
+ .topbar__link {
110
+ border: 1px solid var(--line);
111
+ border-radius: 6px;
112
+ background: var(--surface);
113
+ color: var(--accent-strong);
114
+ font-size: 0.84rem;
115
+ font-weight: 800;
116
+ line-height: 1;
117
+ padding: 0.62rem 0.78rem;
118
+ text-decoration: none;
119
+ text-transform: uppercase;
120
+ transition:
121
+ border-color 160ms ease,
122
+ color 160ms ease,
123
+ transform 160ms ease;
124
+ white-space: nowrap;
125
+ }
126
+
127
+ .topbar__link:hover,
128
+ .topbar__link:focus {
129
+ border-color: var(--accent);
130
+ color: var(--ink);
131
+ transform: translateY(-1px);
132
+ }
133
+
134
+ .account-panel {
135
+ display: grid;
136
+ gap: 1.25rem;
137
+ margin-top: 2rem;
138
+ }
139
+
140
+ .account-intro,
141
+ .account-bar,
142
+ .account-form,
143
+ .account-result,
144
+ .account-workspace,
145
+ .account-message {
146
+ border: 1px solid var(--line);
147
+ border-radius: var(--radius);
148
+ background: var(--surface);
149
+ box-shadow: 0 12px 34px rgb(25 32 44 / 6%);
150
+ }
151
+
152
+ .account-intro,
153
+ .account-form,
154
+ .account-result,
155
+ .account-workspace,
156
+ .account-message {
157
+ padding: 1.25rem;
158
+ }
159
+
160
+ .account-bar {
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: space-between;
164
+ gap: 1rem;
165
+ padding: 1rem 1.25rem;
166
+ }
167
+
168
+ .account-bar span,
169
+ .account-form label {
170
+ display: block;
171
+ color: var(--muted);
172
+ font-size: 0.78rem;
173
+ font-weight: 800;
174
+ text-transform: uppercase;
175
+ }
176
+
177
+ .account-bar strong {
178
+ display: block;
179
+ margin-top: 0.1rem;
180
+ }
181
+
182
+ .account-primary,
183
+ .account-secondary {
184
+ border: 1px solid transparent;
185
+ border-radius: 6px;
186
+ cursor: pointer;
187
+ display: inline-flex;
188
+ align-items: center;
189
+ justify-content: center;
190
+ font: inherit;
191
+ font-weight: 800;
192
+ line-height: 1;
193
+ min-height: 42px;
194
+ padding: 0.75rem 0.95rem;
195
+ text-decoration: none;
196
+ }
197
+
198
+ .account-primary {
199
+ background: var(--accent);
200
+ color: #ffffff;
201
+ }
202
+
203
+ .account-primary:hover,
204
+ .account-primary:focus {
205
+ background: var(--accent-strong);
206
+ }
207
+
208
+ .account-primary:disabled {
209
+ cursor: progress;
210
+ opacity: 0.72;
211
+ }
212
+
213
+ .account-secondary {
214
+ border-color: var(--line);
215
+ background: var(--surface);
216
+ color: var(--accent-strong);
217
+ }
218
+
219
+ .account-secondary:hover,
220
+ .account-secondary:focus {
221
+ border-color: var(--accent);
222
+ color: var(--ink);
223
+ }
224
+
225
+ .account-form__row {
226
+ display: grid;
227
+ grid-template-columns: minmax(0, 1fr) auto;
228
+ gap: 0.75rem;
229
+ margin-top: 0.5rem;
230
+ }
231
+
232
+ .account-form input {
233
+ width: 100%;
234
+ border: 1px solid var(--line);
235
+ border-radius: 6px;
236
+ color: var(--ink);
237
+ font: inherit;
238
+ min-height: 42px;
239
+ padding: 0.65rem 0.75rem;
240
+ }
241
+
242
+ .account-form p,
243
+ .account-intro p,
244
+ .account-workspace p,
245
+ .account-message {
246
+ color: var(--muted);
247
+ }
248
+
249
+ .account-result {
250
+ border-color: rgb(30 127 117 / 32%);
251
+ background: #f7fbfa;
252
+ }
253
+
254
+ .account-result h2,
255
+ .account-result h3,
256
+ .account-list h2,
257
+ .account-workspace h3 {
258
+ margin: 0;
259
+ }
260
+
261
+ .account-result h3 {
262
+ margin-top: 1.2rem;
263
+ font-size: 0.95rem;
264
+ }
265
+
266
+ .account-result pre {
267
+ overflow: auto;
268
+ border: 1px solid var(--line);
269
+ border-radius: 6px;
270
+ background: #20242b;
271
+ color: #ffffff;
272
+ margin: 0.5rem 0 0;
273
+ padding: 1rem;
274
+ }
275
+
276
+ .account-list {
277
+ display: grid;
278
+ gap: 0.85rem;
279
+ }
280
+
281
+ .account-workspace dl {
282
+ display: grid;
283
+ gap: 0.45rem;
284
+ margin: 1rem 0 0;
285
+ }
286
+
287
+ .account-workspace dl div {
288
+ display: grid;
289
+ grid-template-columns: 150px minmax(0, 1fr);
290
+ gap: 0.75rem;
291
+ }
292
+
293
+ .account-workspace dt {
294
+ color: var(--muted);
295
+ font-weight: 800;
296
+ }
297
+
298
+ .account-workspace dd {
299
+ margin: 0;
300
+ }
301
+
302
+ .account-message--error {
303
+ border-color: rgb(180 98 18 / 34%);
304
+ background: #fff8ef;
305
+ color: #6d3a08;
306
+ }
307
+
103
308
  .layout {
104
309
  display: grid;
105
310
  grid-template-columns: 290px minmax(0, 1fr);
@@ -1099,6 +1304,10 @@ p {
1099
1304
  padding: 18px 20px;
1100
1305
  }
1101
1306
 
1307
+ .topbar__actions {
1308
+ flex-wrap: wrap;
1309
+ }
1310
+
1102
1311
  .layout {
1103
1312
  display: block;
1104
1313
  }
@@ -1148,10 +1357,17 @@ p {
1148
1357
  .record-groups dl div,
1149
1358
  .record-item summary,
1150
1359
  .record-fields div,
1360
+ .account-form__row,
1361
+ .account-workspace dl div,
1151
1362
  .glossary-list div {
1152
1363
  grid-template-columns: 1fr;
1153
1364
  }
1154
1365
 
1366
+ .account-bar {
1367
+ align-items: flex-start;
1368
+ flex-direction: column;
1369
+ }
1370
+
1155
1371
  }
1156
1372
 
1157
1373
  @media (max-width: 520px) {
@@ -1,7 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from "node:http";
2
- export declare function closeDxcompleteServiceRuntime(): Promise<void>;
3
- export declare function closeDxcompleteHttpRuntime(): Promise<void>;
4
- export default function handleDxcompleteServiceRequest(req: IncomingMessage & {
5
- body?: unknown;
6
- query?: Record<string, unknown>;
7
- }, res: ServerResponse): Promise<void>;