@jterrats/open-orchestra 1.0.16 → 1.0.18

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 (313) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CLAUDE.md +25 -2
  3. package/README.md +32 -9
  4. package/dist/active-runtime-store.d.ts +18 -0
  5. package/dist/active-runtime-store.js +75 -0
  6. package/dist/active-runtime-store.js.map +1 -0
  7. package/dist/benchmark.js +65 -27
  8. package/dist/benchmark.js.map +1 -1
  9. package/dist/chat-api-errors.d.ts +7 -0
  10. package/dist/chat-api-errors.js +15 -0
  11. package/dist/chat-api-errors.js.map +1 -0
  12. package/dist/chat-api-message-persistence.d.ts +12 -0
  13. package/dist/chat-api-message-persistence.js +125 -0
  14. package/dist/chat-api-message-persistence.js.map +1 -0
  15. package/dist/chat-api-records.d.ts +35 -0
  16. package/dist/chat-api-records.js +94 -0
  17. package/dist/chat-api-records.js.map +1 -0
  18. package/dist/chat-api-service.d.ts +32 -0
  19. package/dist/chat-api-service.js +120 -0
  20. package/dist/chat-api-service.js.map +1 -0
  21. package/dist/chat-api-storage.d.ts +1 -0
  22. package/dist/chat-api-storage.js +14 -0
  23. package/dist/chat-api-storage.js.map +1 -0
  24. package/dist/chat-api-types.d.ts +81 -0
  25. package/dist/chat-api-types.js +2 -0
  26. package/dist/chat-api-types.js.map +1 -0
  27. package/dist/chat-compliance-service.d.ts +60 -0
  28. package/dist/chat-compliance-service.js +241 -0
  29. package/dist/chat-compliance-service.js.map +1 -0
  30. package/dist/chat-event-stream.d.ts +13 -0
  31. package/dist/chat-event-stream.js +124 -0
  32. package/dist/chat-event-stream.js.map +1 -0
  33. package/dist/chat-pagination.d.ts +6 -0
  34. package/dist/chat-pagination.js +64 -0
  35. package/dist/chat-pagination.js.map +1 -0
  36. package/dist/chat-storage-actor-validation.d.ts +4 -0
  37. package/dist/chat-storage-actor-validation.js +65 -0
  38. package/dist/chat-storage-actor-validation.js.map +1 -0
  39. package/dist/chat-storage-content-policy.d.ts +6 -0
  40. package/dist/chat-storage-content-policy.js +84 -0
  41. package/dist/chat-storage-content-policy.js.map +1 -0
  42. package/dist/chat-storage-errors.d.ts +20 -0
  43. package/dist/chat-storage-errors.js +17 -0
  44. package/dist/chat-storage-errors.js.map +1 -0
  45. package/dist/chat-storage-local-files.d.ts +17 -0
  46. package/dist/chat-storage-local-files.js +78 -0
  47. package/dist/chat-storage-local-files.js.map +1 -0
  48. package/dist/chat-storage-local-paths.d.ts +6 -0
  49. package/dist/chat-storage-local-paths.js +124 -0
  50. package/dist/chat-storage-local-paths.js.map +1 -0
  51. package/dist/chat-storage-local-projection.d.ts +10 -0
  52. package/dist/chat-storage-local-projection.js +55 -0
  53. package/dist/chat-storage-local-projection.js.map +1 -0
  54. package/dist/chat-storage-local-records.d.ts +13 -0
  55. package/dist/chat-storage-local-records.js +56 -0
  56. package/dist/chat-storage-local-records.js.map +1 -0
  57. package/dist/chat-storage-local.d.ts +6 -0
  58. package/dist/chat-storage-local.js +114 -0
  59. package/dist/chat-storage-local.js.map +1 -0
  60. package/dist/chat-storage-validation.d.ts +10 -0
  61. package/dist/chat-storage-validation.js +100 -0
  62. package/dist/chat-storage-validation.js.map +1 -0
  63. package/dist/chat-storage.d.ts +16 -0
  64. package/dist/chat-storage.js +4 -0
  65. package/dist/chat-storage.js.map +1 -0
  66. package/dist/chat-workflow-timeline.d.ts +17 -0
  67. package/dist/chat-workflow-timeline.js +210 -0
  68. package/dist/chat-workflow-timeline.js.map +1 -0
  69. package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
  70. package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
  71. package/dist/claude-settings.js.map +1 -0
  72. package/dist/command-init.d.ts +2 -0
  73. package/dist/command-init.js +150 -0
  74. package/dist/command-init.js.map +1 -0
  75. package/dist/command-manifest.js +1 -1
  76. package/dist/command-manifest.js.map +1 -1
  77. package/dist/commands.d.ts +1 -1
  78. package/dist/commands.js +1 -140
  79. package/dist/commands.js.map +1 -1
  80. package/dist/constants.d.ts +1 -0
  81. package/dist/constants.js +1 -0
  82. package/dist/constants.js.map +1 -1
  83. package/dist/context-runtime-preprocessor.d.ts +41 -0
  84. package/dist/context-runtime-preprocessor.js +199 -0
  85. package/dist/context-runtime-preprocessor.js.map +1 -0
  86. package/dist/cursor-settings.d.ts +25 -0
  87. package/dist/cursor-settings.js +72 -0
  88. package/dist/cursor-settings.js.map +1 -0
  89. package/dist/health-commands.js +43 -3
  90. package/dist/health-commands.js.map +1 -1
  91. package/dist/metrics-commands.js +3 -0
  92. package/dist/metrics-commands.js.map +1 -1
  93. package/dist/model-aliases.d.ts +5 -0
  94. package/dist/model-aliases.js +37 -0
  95. package/dist/model-aliases.js.map +1 -0
  96. package/dist/ollama-provider.js +25 -0
  97. package/dist/ollama-provider.js.map +1 -1
  98. package/dist/phase-playbooks.js +11 -0
  99. package/dist/phase-playbooks.js.map +1 -1
  100. package/dist/provider-agent-wrapper.js +14 -0
  101. package/dist/provider-agent-wrapper.js.map +1 -1
  102. package/dist/runtime-adapters.js +56 -0
  103. package/dist/runtime-adapters.js.map +1 -1
  104. package/dist/runtime-bootstrap.js +34 -11
  105. package/dist/runtime-bootstrap.js.map +1 -1
  106. package/dist/runtime-capacity-policy.d.ts +38 -0
  107. package/dist/runtime-capacity-policy.js +117 -0
  108. package/dist/runtime-capacity-policy.js.map +1 -0
  109. package/dist/runtime-capacity-scheduler-helpers.d.ts +40 -0
  110. package/dist/runtime-capacity-scheduler-helpers.js +111 -0
  111. package/dist/runtime-capacity-scheduler-helpers.js.map +1 -0
  112. package/dist/runtime-capacity-scheduler-state.d.ts +44 -0
  113. package/dist/runtime-capacity-scheduler-state.js +128 -0
  114. package/dist/runtime-capacity-scheduler-state.js.map +1 -0
  115. package/dist/runtime-capacity-scheduler.d.ts +34 -0
  116. package/dist/runtime-capacity-scheduler.js +193 -0
  117. package/dist/runtime-capacity-scheduler.js.map +1 -0
  118. package/dist/runtime-capacity-snapshot.d.ts +14 -0
  119. package/dist/runtime-capacity-snapshot.js +87 -0
  120. package/dist/runtime-capacity-snapshot.js.map +1 -0
  121. package/dist/runtime-child-prompt.d.ts +2 -1
  122. package/dist/runtime-child-prompt.js +12 -1
  123. package/dist/runtime-child-prompt.js.map +1 -1
  124. package/dist/runtime-claude-native-bridge.js +2 -1
  125. package/dist/runtime-claude-native-bridge.js.map +1 -1
  126. package/dist/runtime-commands.js +6 -0
  127. package/dist/runtime-commands.js.map +1 -1
  128. package/dist/runtime-context-manifest.d.ts +4 -1
  129. package/dist/runtime-context-manifest.js +59 -3
  130. package/dist/runtime-context-manifest.js.map +1 -1
  131. package/dist/runtime-execution-adapters.js +19 -0
  132. package/dist/runtime-execution-adapters.js.map +1 -1
  133. package/dist/runtime-execution-renderer.js +4 -0
  134. package/dist/runtime-execution-renderer.js.map +1 -1
  135. package/dist/runtime-execution.js +13 -82
  136. package/dist/runtime-execution.js.map +1 -1
  137. package/dist/runtime-hooks.d.ts +46 -0
  138. package/dist/runtime-hooks.js +95 -0
  139. package/dist/runtime-hooks.js.map +1 -0
  140. package/dist/runtime-lifecycle-watch.d.ts +5 -2
  141. package/dist/runtime-lifecycle-watch.js +19 -3
  142. package/dist/runtime-lifecycle-watch.js.map +1 -1
  143. package/dist/runtime-load-balancer.d.ts +12 -0
  144. package/dist/runtime-load-balancer.js +106 -0
  145. package/dist/runtime-load-balancer.js.map +1 -0
  146. package/dist/runtime-parent-actions.js +5 -0
  147. package/dist/runtime-parent-actions.js.map +1 -1
  148. package/dist/runtime-spawn-bridge.js +24 -0
  149. package/dist/runtime-spawn-bridge.js.map +1 -1
  150. package/dist/runtime-spawn-guidance.js +15 -46
  151. package/dist/runtime-spawn-guidance.js.map +1 -1
  152. package/dist/runtime-worker-registry.d.ts +19 -0
  153. package/dist/runtime-worker-registry.js +84 -0
  154. package/dist/runtime-worker-registry.js.map +1 -0
  155. package/dist/security/chat-guardrail-policy.d.ts +7 -0
  156. package/dist/security/chat-guardrail-policy.js +61 -0
  157. package/dist/security/chat-guardrail-policy.js.map +1 -0
  158. package/dist/security/chat-guardrail-types.d.ts +65 -0
  159. package/dist/security/chat-guardrail-types.js +2 -0
  160. package/dist/security/chat-guardrail-types.js.map +1 -0
  161. package/dist/security/chat-guardrail-validation.d.ts +9 -0
  162. package/dist/security/chat-guardrail-validation.js +64 -0
  163. package/dist/security/chat-guardrail-validation.js.map +1 -0
  164. package/dist/security/chat-guardrails.d.ts +3 -0
  165. package/dist/security/chat-guardrails.js +136 -0
  166. package/dist/security/chat-guardrails.js.map +1 -0
  167. package/dist/security/content-classifier.d.ts +2 -0
  168. package/dist/security/content-classifier.js +179 -0
  169. package/dist/security/content-classifier.js.map +1 -0
  170. package/dist/security/operation-contract-types.d.ts +28 -0
  171. package/dist/security/operation-contract-types.js +2 -0
  172. package/dist/security/operation-contract-types.js.map +1 -0
  173. package/dist/security/operation-contract.d.ts +2 -0
  174. package/dist/security/operation-contract.js +169 -0
  175. package/dist/security/operation-contract.js.map +1 -0
  176. package/dist/security/payment-card-detection.d.ts +3 -0
  177. package/dist/security/payment-card-detection.js +48 -0
  178. package/dist/security/payment-card-detection.js.map +1 -0
  179. package/dist/security/policy-engine.d.ts +2 -0
  180. package/dist/security/policy-engine.js +142 -0
  181. package/dist/security/policy-engine.js.map +1 -0
  182. package/dist/security/policy-types.d.ts +79 -0
  183. package/dist/security/policy-types.js +7 -0
  184. package/dist/security/policy-types.js.map +1 -0
  185. package/dist/security/prompt-intake.d.ts +13 -0
  186. package/dist/security/prompt-intake.js +33 -0
  187. package/dist/security/prompt-intake.js.map +1 -0
  188. package/dist/security/provider-egress-policy.d.ts +27 -0
  189. package/dist/security/provider-egress-policy.js +72 -0
  190. package/dist/security/provider-egress-policy.js.map +1 -0
  191. package/dist/security/public-api-auth.d.ts +20 -0
  192. package/dist/security/public-api-auth.js +55 -0
  193. package/dist/security/public-api-auth.js.map +1 -0
  194. package/dist/security/public-api-policy.d.ts +8 -0
  195. package/dist/security/public-api-policy.js +40 -0
  196. package/dist/security/public-api-policy.js.map +1 -0
  197. package/dist/security/redaction.d.ts +3 -0
  198. package/dist/security/redaction.js +95 -0
  199. package/dist/security/redaction.js.map +1 -0
  200. package/dist/security/restricted-content-quarantine.d.ts +17 -0
  201. package/dist/security/restricted-content-quarantine.js +50 -0
  202. package/dist/security/restricted-content-quarantine.js.map +1 -0
  203. package/dist/security/restricted-data-classifier.d.ts +9 -0
  204. package/dist/security/restricted-data-classifier.js +254 -0
  205. package/dist/security/restricted-data-classifier.js.map +1 -0
  206. package/dist/security/sink-encoding.d.ts +6 -0
  207. package/dist/security/sink-encoding.js +40 -0
  208. package/dist/security/sink-encoding.js.map +1 -0
  209. package/dist/skills-render.js +7 -14
  210. package/dist/skills-render.js.map +1 -1
  211. package/dist/sprint-commands.js +33 -22
  212. package/dist/sprint-commands.js.map +1 -1
  213. package/dist/telemetry-redaction.d.ts +2 -0
  214. package/dist/telemetry-redaction.js +25 -2
  215. package/dist/telemetry-redaction.js.map +1 -1
  216. package/dist/transcription-failures.d.ts +2 -0
  217. package/dist/transcription-failures.js +4 -0
  218. package/dist/transcription-failures.js.map +1 -0
  219. package/dist/transcription-media-preflight.d.ts +9 -0
  220. package/dist/transcription-media-preflight.js +147 -0
  221. package/dist/transcription-media-preflight.js.map +1 -0
  222. package/dist/transcription-request.d.ts +13 -0
  223. package/dist/transcription-request.js +150 -0
  224. package/dist/transcription-request.js.map +1 -0
  225. package/dist/transcription-source-policy.d.ts +4 -0
  226. package/dist/transcription-source-policy.js +43 -0
  227. package/dist/transcription-source-policy.js.map +1 -0
  228. package/dist/transcription-types.d.ts +161 -0
  229. package/dist/transcription-types.js +2 -0
  230. package/dist/transcription-types.js.map +1 -0
  231. package/dist/types/chat.d.ts +203 -0
  232. package/dist/types/chat.js +10 -0
  233. package/dist/types/chat.js.map +1 -0
  234. package/dist/types/model-config.d.ts +4 -0
  235. package/dist/types/public-api.d.ts +75 -0
  236. package/dist/types/public-api.js +2 -0
  237. package/dist/types/public-api.js.map +1 -0
  238. package/dist/types/restricted-data.d.ts +69 -0
  239. package/dist/types/restricted-data.js +8 -0
  240. package/dist/types/restricted-data.js.map +1 -0
  241. package/dist/types/restricted-fragment.d.ts +82 -0
  242. package/dist/types/restricted-fragment.js +14 -0
  243. package/dist/types/restricted-fragment.js.map +1 -0
  244. package/dist/types/runtime.d.ts +159 -0
  245. package/dist/types.d.ts +9 -1
  246. package/dist/types.js +1 -0
  247. package/dist/types.js.map +1 -1
  248. package/dist/web-api.js +24 -0
  249. package/dist/web-api.js.map +1 -1
  250. package/dist/web-artifact-parsers.d.ts +6 -0
  251. package/dist/web-artifact-parsers.js +244 -0
  252. package/dist/web-artifact-parsers.js.map +1 -0
  253. package/dist/web-artifact-types.d.ts +76 -0
  254. package/dist/web-artifact-types.js +2 -0
  255. package/dist/web-artifact-types.js.map +1 -0
  256. package/dist/web-artifacts.d.ts +2 -43
  257. package/dist/web-artifacts.js +73 -58
  258. package/dist/web-artifacts.js.map +1 -1
  259. package/dist/web-chat-route-inputs.d.ts +11 -0
  260. package/dist/web-chat-route-inputs.js +156 -0
  261. package/dist/web-chat-route-inputs.js.map +1 -0
  262. package/dist/web-chat-routes.d.ts +7 -0
  263. package/dist/web-chat-routes.js +213 -0
  264. package/dist/web-chat-routes.js.map +1 -0
  265. package/dist/web-console/assets/index-CJup1cIA.css +1 -0
  266. package/dist/web-console/assets/index-CVDOfipu.js +11 -0
  267. package/dist/web-console/index.html +2 -2
  268. package/dist/web-evidence.d.ts +1 -1
  269. package/dist/web-evidence.js +9 -2
  270. package/dist/web-evidence.js.map +1 -1
  271. package/dist/web-public-route-inputs.d.ts +14 -0
  272. package/dist/web-public-route-inputs.js +136 -0
  273. package/dist/web-public-route-inputs.js.map +1 -0
  274. package/dist/web-public-routes.d.ts +6 -0
  275. package/dist/web-public-routes.js +194 -0
  276. package/dist/web-public-routes.js.map +1 -0
  277. package/dist/web-public-service.d.ts +16 -0
  278. package/dist/web-public-service.js +154 -0
  279. package/dist/web-public-service.js.map +1 -0
  280. package/dist/workflow-phase-planner.js +5 -3
  281. package/dist/workflow-phase-planner.js.map +1 -1
  282. package/dist/workflow-phases.js +5 -0
  283. package/dist/workflow-phases.js.map +1 -1
  284. package/dist/workflow-run-commands.js +89 -10
  285. package/dist/workflow-run-commands.js.map +1 -1
  286. package/dist/workflow-services.js +5 -0
  287. package/dist/workflow-services.js.map +1 -1
  288. package/dist/workspace-runtime-bootstrap.js +15 -4
  289. package/dist/workspace-runtime-bootstrap.js.map +1 -1
  290. package/docs/audio-video-transcription-skill.md +102 -70
  291. package/docs/chat-audit-retention.md +76 -0
  292. package/docs/chat-provider-provenance-ledger.md +75 -0
  293. package/docs/context-runtime-preprocessing.md +37 -0
  294. package/docs/orchestra-mvp.md +8 -2
  295. package/docs/public-api-contract.md +43 -0
  296. package/docs/release-test-matrix.md +14 -14
  297. package/docs/restricted-fragment-storage-contract.md +147 -0
  298. package/docs/runtime-adapters.md +47 -7
  299. package/docs/runtime-capacity.md +57 -0
  300. package/docs/security-saas-orchestrator.md +368 -0
  301. package/docs/site-manifest.json +128 -30
  302. package/package.json +5 -2
  303. package/site/dist/_headers +9 -0
  304. package/site/dist/_redirects +2 -0
  305. package/site/dist/architecture.mmd +61 -0
  306. package/site/dist/assets/index-Bi8l6tCE.js +10 -0
  307. package/site/dist/assets/index-BsCLqY__.css +1 -0
  308. package/site/dist/favicon.svg +19 -0
  309. package/site/dist/index.html +28 -0
  310. package/site/package.json +19 -0
  311. package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
  312. package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
  313. package/dist/workspace-claude-settings.js.map +0 -1
@@ -0,0 +1,213 @@
1
+ import { createLocalChatStorage } from "./chat-storage-local.js";
2
+ import { ChatApiService } from "./chat-api-service.js";
3
+ import { ChatApiError } from "./chat-api-errors.js";
4
+ import { ChatComplianceService } from "./chat-compliance-service.js";
5
+ import { enforceRestrictedIngressQuarantine } from "./security/restricted-content-quarantine.js";
6
+ import { errorStreamEvents, renderServerSentEvents, } from "./chat-event-stream.js";
7
+ import { apiError, createThreadInput, listInput, messageInput, messagesInput, requestId, safeJsonBody, threadInput, } from "./web-chat-route-inputs.js";
8
+ export async function handleWebChatRoute(request, root, url) {
9
+ if (!url.pathname.startsWith("/api/chat"))
10
+ return null;
11
+ const storage = createLocalChatStorage({ workspaceRoot: root });
12
+ const service = new ChatApiService({
13
+ storage,
14
+ root,
15
+ });
16
+ const compliance = new ChatComplianceService({
17
+ workspaceRoot: root,
18
+ storage,
19
+ });
20
+ try {
21
+ return await dispatchChatRoute(request, url, service, compliance, root);
22
+ }
23
+ catch (error) {
24
+ return errorResult(error);
25
+ }
26
+ }
27
+ async function dispatchChatRoute(request, url, service, compliance, root) {
28
+ const parts = url.pathname.split("/").filter(Boolean);
29
+ if (request.method === "GET" && url.pathname === "/api/chat/threads") {
30
+ return json(200, await service.listThreads(listInput(url)));
31
+ }
32
+ if (request.method === "POST" && url.pathname === "/api/chat/threads") {
33
+ const input = createThreadInput(await safeJsonBody(request), requestId(url));
34
+ await quarantineChatThreadInput(root, input);
35
+ return json(200, await service.createThread(input));
36
+ }
37
+ if (request.method === "POST" && url.pathname === "/api/chat/export") {
38
+ return json(200, await compliance.exportEvidence(complianceInput(await safeJsonBody(request))));
39
+ }
40
+ if (request.method === "POST" && url.pathname === "/api/chat/delete") {
41
+ return json(200, await compliance.deleteScope(deleteInput(await safeJsonBody(request))));
42
+ }
43
+ if (parts.length >= 4 && parts[0] === "api" && parts[1] === "chat") {
44
+ const threadId = parts[3];
45
+ if (!threadId)
46
+ throw apiError("invalid_request", "threadId is required", 400);
47
+ return dispatchThreadRoute(request, url, service, parts, threadId, root);
48
+ }
49
+ throw apiError("not_found", "unknown chat endpoint", 404);
50
+ }
51
+ async function dispatchThreadRoute(request, url, service, parts, threadId, root) {
52
+ if (request.method === "GET" && parts.length === 4) {
53
+ return json(200, await service.getThread(threadInput(url, threadId)));
54
+ }
55
+ if (request.method === "GET" && parts[4] === "messages") {
56
+ return json(200, await service.listMessages(messagesInput(url, threadId)));
57
+ }
58
+ if (request.method === "POST" && parts[4] === "messages") {
59
+ const input = messageInput(await safeJsonBody(request), request.headers["idempotency-key"], threadId, requestId(url));
60
+ await quarantineChatMessageInput(root, input);
61
+ return json(200, await service.createMessage(input));
62
+ }
63
+ if (request.method === "POST" && parts[4] === "send") {
64
+ const input = messageInput(await safeJsonBody(request), request.headers["idempotency-key"], threadId, requestId(url));
65
+ await quarantineChatMessageInput(root, input);
66
+ return json(200, await service.send(input));
67
+ }
68
+ if (request.method === "GET" && parts[4] === "stream") {
69
+ return streamResult(service, url, threadId);
70
+ }
71
+ throw apiError("not_found", "unknown chat endpoint", 404);
72
+ }
73
+ async function streamResult(service, url, threadId) {
74
+ const input = messagesInput(url, threadId);
75
+ try {
76
+ const stream = await service.stream(input);
77
+ return sse(200, stream.data.events);
78
+ }
79
+ catch (error) {
80
+ if (error instanceof ChatApiError) {
81
+ return sse(error.status, errorStreamEvents({
82
+ requestId: error.requestId,
83
+ threadId,
84
+ scope: input.scope,
85
+ code: error.code,
86
+ message: error.message,
87
+ retryable: error.retryable,
88
+ }));
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ function errorResult(error) {
94
+ const requestId = error instanceof ChatApiError ? error.requestId : "chat-request";
95
+ const body = {
96
+ error: {
97
+ code: error instanceof ChatApiError ? error.code : "internal_error",
98
+ message: error instanceof ChatApiError
99
+ ? safeErrorMessage(error.message)
100
+ : "chat request failed",
101
+ requestId,
102
+ retryable: error instanceof ChatApiError ? error.retryable : false,
103
+ },
104
+ };
105
+ return json(error instanceof ChatApiError ? error.status : 500, body);
106
+ }
107
+ function json(status, body) {
108
+ return { status, body, contentType: "application/json" };
109
+ }
110
+ function sse(status, events) {
111
+ return {
112
+ status,
113
+ body: renderServerSentEvents(events),
114
+ contentType: "text/event-stream",
115
+ };
116
+ }
117
+ async function quarantineChatThreadInput(root, input) {
118
+ await enforceRestrictedIngressQuarantine({
119
+ root,
120
+ requestId: input.requestId ?? "chat-request",
121
+ boundary: "chat_ingress",
122
+ fields: [{ name: "title", text: input.title }],
123
+ actorId: actorId(input.actor),
124
+ tenantId: input.scope.tenantId,
125
+ workspaceId: input.scope.workspaceId,
126
+ taskId: input.scope.taskId,
127
+ });
128
+ }
129
+ async function quarantineChatMessageInput(root, input) {
130
+ await enforceRestrictedIngressQuarantine({
131
+ root,
132
+ requestId: input.requestId ?? "chat-request",
133
+ boundary: "chat_ingress",
134
+ fields: [{ name: "text", text: input.text }],
135
+ actorId: actorId(input.actor),
136
+ tenantId: input.scope.tenantId,
137
+ workspaceId: input.scope.workspaceId,
138
+ taskId: input.scope.taskId,
139
+ threadId: input.threadId,
140
+ });
141
+ }
142
+ function actorId(input) {
143
+ return input.actorId;
144
+ }
145
+ function safeErrorMessage(message) {
146
+ return message.replace(/\/Users\/[^ ]+/gu, "[path]").slice(0, 240);
147
+ }
148
+ function complianceInput(body) {
149
+ const input = objectBody(body);
150
+ return {
151
+ selection: selectionInput(input.selection),
152
+ actor: actorInput(input.actor),
153
+ includeTombstoned: input.includeTombstoned === true,
154
+ };
155
+ }
156
+ function deleteInput(body) {
157
+ const input = objectBody(body);
158
+ return {
159
+ selection: selectionInput(input.selection),
160
+ actor: actorInput(input.actor),
161
+ reasonCode: requiredString(input.reasonCode, "reasonCode"),
162
+ };
163
+ }
164
+ function selectionInput(value) {
165
+ const selection = objectBody(value);
166
+ const kind = requiredString(selection.kind, "selection.kind");
167
+ if (kind === "thread") {
168
+ return {
169
+ kind,
170
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
171
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
172
+ threadId: requiredString(selection.threadId, "selection.threadId"),
173
+ };
174
+ }
175
+ if (kind === "task") {
176
+ return {
177
+ kind,
178
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
179
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
180
+ taskId: requiredString(selection.taskId, "selection.taskId"),
181
+ };
182
+ }
183
+ if (kind === "run") {
184
+ return {
185
+ kind,
186
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
187
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
188
+ taskId: requiredString(selection.taskId, "selection.taskId"),
189
+ runId: requiredString(selection.runId, "selection.runId"),
190
+ };
191
+ }
192
+ throw apiError("invalid_request", "selection.kind is invalid", 400);
193
+ }
194
+ function actorInput(value) {
195
+ const actor = objectBody(value);
196
+ return {
197
+ actorId: requiredString(actor.actorId, "actor.actorId"),
198
+ role: requiredString(actor.role, "actor.role"),
199
+ };
200
+ }
201
+ function objectBody(value) {
202
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
203
+ throw apiError("invalid_request", "JSON object body is required", 400);
204
+ }
205
+ return value;
206
+ }
207
+ function requiredString(value, field) {
208
+ if (typeof value !== "string" || value.trim() === "") {
209
+ throw apiError("invalid_request", `${field} is required`, 400);
210
+ }
211
+ return value.trim();
212
+ }
213
+ //# sourceMappingURL=web-chat-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-chat-routes.js","sourceRoot":"","sources":["../src/web-chat-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#17202a;--muted:#5f6b7a;--line:#d8dee6;--accent:#146c94;--ok:#137a44;--warn:#a35f00;--focus:#146c9440}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111418;--panel:#1a2027;--ink:#edf1f5;--muted:#aab5c2;--line:#313b46;--accent:#6fb6d8;--ok:#68d391;--warn:#f0b45b;--focus:#6fb6d852}}*{box-sizing:border-box}html,body{max-width:100%;overflow-x:hidden}body{background:var(--bg);min-width:320px;color:var(--ink);margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.45}a,code,pre,span,strong{overflow-wrap:anywhere}button,input,select,textarea{font:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible{outline:3px solid var(--focus);outline-offset:-2px}.app-shell{grid-template-rows:auto 1fr;min-height:100vh;display:grid}.topbar{border-bottom:1px solid var(--line);background:var(--panel)}.topbar-inner,main{width:min(1180px,100%);margin:0 auto;padding:16px}.brand-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand h1{letter-spacing:0;margin:0;font-size:1.15rem;font-weight:750}.brand p,.guide-card p,.empty-state p{color:var(--muted);margin:2px 0 0;font-size:.92rem}.refresh-button,.text-button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:6px;min-height:38px;padding:0 12px}.text-button.secondary{border-color:var(--line);background:var(--panel);color:var(--ink)}.text-button:disabled{cursor:not-allowed;opacity:.55}main{gap:16px;display:grid}.section-nav{z-index:5;background:color-mix(in srgb, var(--bg) 94%, transparent);gap:8px;padding:8px 0;display:flex;position:sticky;top:0;overflow-x:auto}.section-tab{border:1px solid var(--line);background:var(--panel);min-width:0;color:var(--ink);text-align:left;cursor:pointer;border-radius:8px;flex:0 0 170px;gap:2px;padding:10px 12px;display:grid}.section-tab.active{border-color:color-mix(in srgb, var(--accent) 56%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.section-tab strong{font-size:.9rem}.section-tab span,.section-heading p,.muted-copy{color:var(--muted);font-size:.84rem}.console-section,.overview-layout,.overview-column,.operations-layout,.section-column,.settings-layout,.tasks-layout{gap:12px;display:grid}.section-column{align-content:start}.section-column>*{align-self:start;width:100%}.section-heading{gap:2px;display:grid}.section-heading h2,.section-heading p{margin:0}.section-heading h2{font-size:1.08rem}.status-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:.92rem;display:flex}.pill,.tag{border:1px solid var(--line);color:var(--muted);border-radius:999px;align-items:center;display:inline-flex}.pill{background:var(--panel);min-height:28px;padding:0 10px}.tag{padding:2px 8px;font-size:.78rem}.pill.ok,.tag.ok{color:var(--ok);border-color:#137a4459}.pill.warn,.tag.warn{color:var(--warn);border-color:#a35f0059}.pill.accent,.tag.accent{border-color:color-mix(in srgb, var(--accent) 35%, var(--line));color:var(--accent)}.grid,.guide-grid{grid-template-columns:1fr;align-items:start;gap:12px;display:grid}.grid>*,.guide-grid>*,.control-row>*,.metric-grid>*,.chart-grid>*{min-width:0}.panel,.guide-card,.subpanel{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px}.panel h2,.guide-card h2,.subpanel h3{letter-spacing:0;margin:0 0 10px;font-size:1rem}.subpanel{margin-top:12px}.warning-panel{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));margin-bottom:12px}.compact-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.compact-list li{gap:3px;display:grid}.compact-list span{color:var(--muted);overflow-wrap:anywhere}.metric-grid,.chart-grid,.control-row{grid-template-columns:1fr;gap:10px;display:grid}.control-row.compact{grid-template-columns:minmax(140px,1fr) auto;align-items:end;margin-top:8px}.chart-grid{margin-top:12px}.cost-detail-grid{grid-template-columns:1fr;gap:10px;display:grid}.compact-subpanel{min-height:0;margin-top:12px}.compact-chart-grid .chart-card{min-height:0}.compact-chart-grid .chart-frame{min-height:90px}.compact-chart-grid .chart-frame canvas{height:90px}.settings-layout #cost-view .metric strong{overflow-wrap:anywhere;font-size:1.2rem}.chart-card,.metric,.list-item{border:1px solid var(--line);border-radius:6px;padding:10px}.chart-card{min-height:180px}.chart-card h3{letter-spacing:0;margin:0 0 8px;font-size:.9rem}.chart-frame{min-height:130px;position:relative}.chart-frame canvas{width:100%;height:130px}.metric{min-height:76px}.metric strong{font-size:1.45rem;line-height:1.1;display:block}.metric span,.list-item span{color:var(--muted);margin-top:4px;font-size:.85rem;display:block}.step-list,.command-list,.list,.detail-grid,.delivery-grid,.release-check-list,.release-detail-grid{gap:8px;display:grid}.step-list,.release-check-list,.list{margin:0;padding:0;list-style:none}.step-list{margin-top:12px}.step-list li{grid-template-columns:28px 1fr;align-items:start;gap:8px;display:grid}.step-list b{background:color-mix(in srgb, var(--accent) 18%, var(--panel));width:28px;height:28px;color:var(--accent);border-radius:999px;justify-content:center;align-items:center;font-size:.84rem;display:inline-flex}.command-chip{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));color:var(--ink);white-space:normal;word-break:break-word;border-radius:6px;padding:9px 10px;font:.84rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;display:block}.command-disclosure{margin-top:10px}.command-disclosure summary{cursor:pointer;color:var(--accent);font-size:.9rem;font-weight:650}.command-disclosure .command-list{margin-top:8px}.detail-disclosure summary{cursor:pointer;color:var(--ink);font-weight:700}.detail-disclosure>.list,.detail-disclosure>.preview,.detail-disclosure>.markdown-summary,.detail-disclosure>.text-button{margin-top:10px}.markdown-summary{border:1px solid var(--line);background:#fff;border-radius:8px;gap:8px;max-height:320px;padding:12px;display:grid;overflow:auto}.markdown-summary h4,.markdown-summary p,.markdown-summary ul{margin:0}.markdown-summary h4{font-size:.95rem}.markdown-summary ul{padding-left:18px}.markdown-summary code{overflow-wrap:anywhere;border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));border-radius:6px;padding:8px;display:block}.preview{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));max-height:220px;color:var(--ink);white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.field{gap:4px;display:grid}.field span{color:var(--muted);font-size:.82rem}.field-label{align-items:center;gap:6px;display:inline-flex}.help-tooltip{border:1px solid var(--line);width:18px;height:18px;color:var(--ink);cursor:help;background:#fff;border-radius:50%;place-items:center;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid;position:relative}.tooltip-bubble{z-index:20;color:#f8fafc;text-align:left;white-space:normal;background:#0f172a;border:1px solid #0f172a;border-radius:8px;width:min(260px,72vw);padding:8px 10px;font-size:.78rem;font-weight:500;line-height:1.4;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 14px 36px #0f172a52}.field .tooltip-bubble{color:#f8fafc;font-size:.78rem}.tooltip-bubble:after{content:"";background:#0f172a;border-bottom:1px solid #0f172a;border-right:1px solid #0f172a;width:10px;height:10px;position:absolute;top:100%;left:50%;transform:translate(-50%,-5px)rotate(45deg)}.help-tooltip:hover .tooltip-bubble,.help-tooltip:focus .tooltip-bubble,.help-tooltip:focus-within .tooltip-bubble{display:block}.field input,.field select,.field textarea{border:1px solid var(--line);background:var(--panel);width:100%;min-width:0;color:var(--ink);border-radius:6px}.field input,.field select{min-height:38px;padding:0 10px}.field textarea{resize:vertical;min-height:120px;padding:10px}.workspace-selector{gap:10px;margin-bottom:12px;display:grid}.workspace-selector-actions{flex-wrap:wrap;gap:8px;display:flex}.inline-error{color:var(--warn);margin:8px 0 0;font-size:.85rem}.inline-status,.muted-copy{color:var(--muted);margin:8px 0 0;font-size:.85rem}.tag-row{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.repair-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.check-field{color:var(--muted);align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.task-filters{grid-template-columns:1fr;gap:8px;display:grid}.task-filters>*{min-width:0}.task-internals-toggle{margin-top:10px}.artifact-list{color:var(--muted);margin:8px 0 0;padding-left:18px;font-size:.84rem}.review-copy{color:var(--muted);margin:8px 0 0;font-size:.86rem}.phase-timeline{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.gate-history{border-top:1px solid var(--line);gap:6px;margin-top:10px;padding-top:8px;font-size:.84rem;display:grid}.gate-history>strong{font-size:.86rem}.gate-history ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.gate-history li{color:var(--muted);grid-template-columns:minmax(80px,1fr) minmax(72px,.7fr) minmax(88px,.8fr) minmax(120px,1.4fr);gap:8px;display:grid}.phase-timeline li{border-top:1px solid var(--line);grid-template-columns:minmax(56px,.7fr) minmax(110px,1fr) minmax(88px,.8fr) minmax(72px,.8fr);align-items:center;gap:8px;padding-top:6px;font-size:.83rem;display:grid}.phase-timeline span,.phase-timeline time{color:var(--muted)}.detail-block{border-top:1px solid var(--line);padding-top:10px}.detail-block h3{letter-spacing:0;margin:0 0 6px;font-size:.9rem}.detail-block ul{color:var(--muted);margin:0;padding-left:18px}.empty-state{border:1px dashed var(--line);background:color-mix(in srgb, var(--panel) 85%, var(--bg));border-radius:8px;padding:18px}.empty-state strong{margin-bottom:4px;display:block}.artifact-canvas{margin:18px 0}.chat-layout{gap:12px;display:grid}.chat-controls-panel,.chat-thread-panel,.chat-timeline-panel{align-content:start}.chat-scope-copy,.chat-composer-actions{flex-wrap:wrap;gap:8px;display:flex}.chat-thread-list,.chat-message-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.chat-thread-list{max-height:560px;overflow:auto}.chat-thread-button{border:1px solid var(--line);background:var(--panel);width:100%;min-height:72px;color:var(--ink);text-align:left;border-radius:6px;gap:4px;padding:10px;display:grid}.chat-thread-button.selected{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.chat-thread-button span,.chat-thread-button small{color:var(--muted)}.chat-message-card{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 88%, var(--bg));border-radius:6px;gap:10px;padding:12px;display:grid}.chat-message-card.tone-ok{border-color:#137a4459}.chat-message-card.tone-warn{border-color:#a35f0059}.chat-message-card.tone-accent{border-color:color-mix(in srgb, var(--accent) 40%, var(--line))}.chat-message-header{flex-wrap:wrap;justify-content:space-between;align-items:start;gap:10px;display:flex}.chat-message-heading{gap:6px;display:grid}.chat-message-content{gap:8px;display:grid}.chat-message-content h3,.chat-message-content p,.chat-message-content ul,.chat-message-content pre{margin:0}.chat-message-content ul{padding-left:18px}.chat-message-content pre{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 80%, var(--bg));white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.chat-event-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;display:grid}.chat-event-grid div{min-width:0}.chat-event-grid dt{color:var(--muted);font-size:.8rem}.chat-event-grid dd{margin:2px 0 0}.chat-event-wide{grid-column:1/-1}.chat-composer{border-top:1px solid var(--line);gap:10px;margin-top:12px;padding-top:12px;display:grid}.panel-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.compact-heading{align-items:center;margin-bottom:12px}.compact-heading h2{margin-bottom:0}.event-list-panel .list{gap:12px}.release-events-grid{align-items:stretch}.release-events-grid .event-list-panel{grid-template-rows:auto 1fr auto;display:grid}.release-events-grid .event-list-panel .list{align-content:start}.workflow-control-row{align-items:end}.workflow-rationale-row{grid-template-columns:1fr}.workflow-rationale-row .field{width:100%}.event-list-panel .list-item{padding:12px}.event-list-panel .list-item strong{line-height:1.3}.event-list-panel .list-item span{margin-top:6px;line-height:1.45}.list-count{color:var(--muted);white-space:nowrap;font-size:.82rem}.pagination-controls{color:var(--muted);grid-template-columns:minmax(92px,auto) 1fr minmax(72px,auto);align-items:center;gap:8px;margin-top:12px;font-size:.85rem;display:grid}.pagination-controls span{text-align:center}.release-check-list{gap:6px;margin-top:12px}.release-summary-card{align-content:start}.release-summary-metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.release-summary-metrics .metric{min-height:58px;padding:8px}.release-summary-metrics .metric strong{font-size:1.1rem}.release-check-row{border:1px solid var(--line);border-radius:6px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.release-check-row strong,.release-check-row span{display:block}.release-check-row strong{line-height:1.25}.release-check-row div>span{color:var(--muted);margin-top:2px;font-size:.82rem}.compact-role-list{max-height:320px;margin-top:10px;overflow:auto}.playwright-plan-list,#qa-automation-planner .subpanel{margin-top:14px}.artifact-layout{gap:16px;min-height:420px;display:grid}.artifact-actions{flex-wrap:wrap;justify-content:flex-start;gap:8px;display:flex}.artifact-actions .disabled{pointer-events:none;opacity:.55}.artifact-index{align-content:start;gap:8px;max-height:520px;display:grid;overflow:auto}.artifact-group{gap:6px;display:grid}.artifact-group header{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 84%, var(--bg));border-radius:6px;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 8px;font-size:.8rem;display:flex}.artifact-group header span{color:var(--muted)}.artifact-group ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.artifact-index button{text-align:left;border:1px solid var(--line);width:100%;min-height:58px;color:var(--text);background:#fff;gap:4px;display:grid}.artifact-index button.selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, #fff)}.artifact-index span,.artifact-preview pre{overflow-wrap:anywhere}.artifact-preview{border:1px solid var(--line);background:#fff;border-radius:8px;min-height:420px;overflow:hidden}.artifact-preview.error,.artifact-preview.source,.artifact-preview.state,.artifact-preview.unsupported{padding:16px;overflow:auto}.artifact-preview.unsupported{border-color:color-mix(in srgb, var(--warn) 48%, var(--line))}.artifact-preview pre{white-space:pre-wrap;margin:0}.artifact-preview.media{place-items:center;padding:12px;display:grid}.artifact-preview img{max-width:100%;max-height:520px}.canvas-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:8px;padding:10px;display:flex}.canvas-frame{cursor:grab;height:460px;overflow:hidden}.canvas-frame svg{background:#f8fafc;width:100%;height:100%}.canvas-frame line{stroke:#64748b;stroke-width:2px}.canvas-frame marker path{fill:#64748b}.canvas-node{cursor:move}.canvas-node rect{stroke:#334155;stroke-width:1.4px}.canvas-node text{fill:#111827;pointer-events:none;font-size:13px}.erd-preview{padding:14px;overflow:auto}.erd-heading{flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:12px;display:flex}.erd-heading span,.erd-table span,.erd-table small,.erd-relationships small{color:var(--muted)}.erd-layout,.erd-tables{gap:12px;display:grid}.erd-table{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-table h3,.erd-relationships h3{background:color-mix(in srgb, var(--accent) 8%, var(--panel));margin:0;padding:8px 10px;font-size:.9rem}.erd-table ul,.erd-relationships ul{gap:0;margin:0;padding:0;list-style:none;display:grid}.erd-table li,.erd-relationships li{border-top:1px solid var(--line);grid-template-columns:minmax(120px,1fr) minmax(80px,.7fr) auto;align-items:center;gap:8px;padding:8px 10px;font-size:.84rem;display:grid}.erd-table em{border:1px solid var(--line);color:var(--accent);border-radius:999px;justify-self:start;padding:1px 7px;font-size:.74rem;font-style:normal}.erd-relationships{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-relationships li{grid-template-columns:minmax(120px,1fr) auto minmax(120px,1fr)}.inline-success{color:#166534;font-weight:600}@media (width>=760px){.topbar-inner,main{padding:20px 24px}.grid{grid-template-columns:minmax(0,1.5fr) minmax(300px,.9fr)}.section-nav{grid-template-columns:repeat(8,minmax(0,1fr));display:grid;overflow-x:visible}.section-tab{flex-basis:auto}.guide-grid,.overview-layout,.operations-layout,.settings-layout{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.tasks-layout{grid-template-columns:minmax(0,1.2fr) minmax(320px,.8fr)}.chat-layout{grid-template-columns:minmax(260px,.8fr) minmax(280px,.9fr) minmax(0,1.4fr);align-items:start}.tasks-layout .panel:first-child{grid-row:span 2}.workflow-rationale-row .field{grid-column:1/-1;max-width:none}.cost-detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.chart-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.control-row{grid-template-columns:repeat(4,minmax(0,1fr));align-items:end}.task-filters{grid-template-columns:minmax(220px,1fr) minmax(140px,.45fr) minmax(140px,.45fr);align-items:end}.artifact-layout{grid-template-columns:minmax(220px,320px) 1fr}.erd-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}}