yarramate 1.2.0 → 1.4.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.
- package/catalogues/core-enrichment.yaml +237 -2
- package/dist/adapters/visual/session-server.js +16 -1
- package/dist/adapters/visual/view-identity.d.ts +1 -1
- package/dist/adapters/visual/view-identity.js +61 -3
- package/dist/adapters/visual/wire.d.ts +30 -0
- package/dist/adapters/visual/workspace-model.d.ts +35 -3
- package/dist/adapters/visual/workspace-model.js +62 -2
- package/dist/ask-command.js +37 -14
- package/dist/cli-support.d.ts +1 -1
- package/dist/cli-support.js +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +26 -5
- package/dist/compiler.d.ts +13 -1
- package/dist/compiler.js +646 -0
- package/dist/concept-drafting.d.ts +13 -2
- package/dist/concept-drafting.js +15 -3
- package/dist/design-command.js +30 -4
- package/dist/evidence.js +25 -0
- package/dist/graph-projection.d.ts +10 -0
- package/dist/graph-projection.js +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/interrogate-command.d.ts +37 -1
- package/dist/interrogate-command.js +93 -42
- package/dist/interrogation-entry.d.ts +1 -1
- package/dist/layout-direction.d.ts +14 -0
- package/dist/layout-direction.js +5 -0
- package/dist/projection.d.ts +22 -6
- package/dist/projection.js +23 -2
- package/dist/relationship-drafting.d.ts +21 -2
- package/dist/relationship-drafting.js +49 -4
- package/dist/subject-references.js +5 -0
- package/dist/visual-app/assets/index-Rkq6smL2.css +1 -0
- package/dist/visual-app/assets/index-yCHtmQUH.js +394 -0
- package/dist/visual-app/index.html +2 -2
- package/dist/visual-app-lib/editor.js +29639 -27514
- package/dist/visual-app-lib/styles.css +1 -1
- package/dist/visual-app-lib/types/adapters/visual/view-identity.d.ts +1 -1
- package/dist/visual-app-lib/types/adapters/visual/wire.d.ts +30 -0
- package/dist/visual-app-lib/types/adapters/visual/workspace-model.d.ts +35 -3
- package/dist/visual-app-lib/types/compiler.d.ts +13 -1
- package/dist/visual-app-lib/types/concept-drafting.d.ts +13 -2
- package/dist/visual-app-lib/types/graph-projection.d.ts +10 -0
- package/dist/visual-app-lib/types/interrogate-command.d.ts +207 -0
- package/dist/visual-app-lib/types/layout-direction.d.ts +14 -0
- package/dist/visual-app-lib/types/projection.d.ts +22 -6
- package/dist/visual-app-lib/types/relationship-drafting.d.ts +21 -2
- package/dist/visual-app-lib/types/subject-identity.d.ts +34 -0
- package/dist/visual-app-lib/types/visual-app/App.d.ts +27 -2
- package/dist/visual-app-lib/types/visual-app/badges.d.ts +1 -0
- package/dist/visual-app-lib/types/visual-app/connection-panel.d.ts +9 -1
- package/dist/visual-app-lib/types/visual-app/context-menu-model.d.ts +15 -6
- package/dist/visual-app-lib/types/visual-app/graph-canvas.d.ts +77 -6
- package/dist/visual-app-lib/types/visual-app/kind-palette.d.ts +37 -0
- package/dist/visual-app-lib/types/visual-app/local-host.d.ts +42 -0
- package/dist/visual-app-lib/types/visual-app/mount.d.ts +73 -2
- package/dist/visual-app-lib/types/visual-app/open-questions.d.ts +15 -0
- package/dist/visual-app-lib/types/visual-app/query-fields.d.ts +3 -2
- package/dist/visual-app-lib/types/visual-app/query-panel.d.ts +8 -1
- package/dist/visual-app-lib/types/visual-app/save-view.d.ts +11 -5
- package/dist/visual-app-lib/types/visual-app/shipped-catalogue.d.ts +10 -0
- package/dist/visual-app-lib/types/visual-app/state.d.ts +15 -4
- package/dist/visual-app-lib/types/visual-app/subject-draft-panel.d.ts +13 -1
- package/dist/visual-app-lib/types/visual-app/subject-filter.d.ts +35 -0
- package/dist/visual-app-lib/types/visual-app/subject-form.d.ts +8 -0
- package/dist/visual-app-lib/types/visual-app/view-tree-model.d.ts +42 -9
- package/dist/visual-app-lib/types/visual-app/view-tree.d.ts +11 -2
- package/dist/visual-app-lib/types/visual-app/workspace-state.d.ts +81 -11
- package/dist/visual-app-lib/types/workspace.d.ts +2 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.js +1 -0
- package/docs/CONSUMING-YARRAMATE.md +81 -0
- package/package.json +2 -1
- package/schema/yarramate-design-step.schema.json +26 -0
- package/schema/yarramate-document.schema.json +14 -0
- package/schema/yarramate-interrogation-report.schema.json +31 -0
- package/schema/yarramate-pattern.schema.json +133 -0
- package/schema/yarramate-projection.schema.json +9 -0
- package/schema/yarramate-question-catalogue.schema.json +34 -0
- package/schema/yarramate-visual-graph.schema.json +9 -0
- package/schema/yarramate-workspace.schema.json +4 -0
- package/skills/yarramate-architecture/SKILL.md +5 -0
- package/dist/visual-app/assets/index-CcmfL3oY.js +0 -394
- package/dist/visual-app/assets/index-DLutIWES.css +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:root{--paper:#e8eef0;--ink:#182228;--eucalyptus:#416f65;--ochre:#8c4d18;--cobalt:#2457a6;--failure:#a3403a;--sheet:color-mix(in oklab, var(--paper) 55%, white);--rule:color-mix(in oklab, var(--ink) 16%, transparent);--rule-firm:color-mix(in oklab, var(--ink) 34%, transparent);--quiet:color-mix(in oklab, var(--ink) 62%, var(--paper));--display:"Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, serif;--body:"Avenir Next", Avenir, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--utility:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--step:.5rem;--rail-width:264px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--paper);color:var(--ink);font-family:var(--body);-webkit-font-smoothing:antialiased;font-size:15px;line-height:1.5}:focus-visible{outline:3px solid var(--cobalt);outline-offset:2px}.offscreen{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visual-shell{background:var(--paper);min-width:0;height:100dvh;color:var(--ink);grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.command-strip{z-index:10;justify-content:space-between;align-items:center;gap:calc(var(--step) * 2);min-height:48px;padding:calc(var(--step) * .75) calc(var(--step) * 2);border-bottom:1px solid var(--rule);background:var(--sheet);flex-wrap:wrap;display:flex;position:relative}.command-identity,.command-actions{align-items:center;gap:var(--step);min-width:0;display:flex}.session-description{min-width:0;color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;overflow:hidden}.command-identity{flex:10rem}.command-actions{flex-wrap:wrap;flex:0 auto;justify-content:flex-end}.command-identity h1{min-width:8ch;font-family:var(--display);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:15px;line-height:1.2;overflow:hidden}.command-actions select,.command-actions button,.command-actions .quick-filter{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:0 .7rem;font-size:12px}.command-actions select{text-overflow:ellipsis;max-width:12rem}.command-actions .quick-filter{cursor:text;width:160px}.command-actions .quick-filter::placeholder{color:var(--quiet)}.command-actions select{padding-right:.35rem}.command-actions select:hover:enabled,.command-actions button:hover:enabled,.command-actions .quick-filter:hover,.command-actions .quick-filter:focus{border-color:var(--cobalt)}.command-actions select:disabled,.command-actions button:disabled{color:var(--quiet);border-color:var(--rule);cursor:not-allowed;background:0 0}.command-actions button[aria-expanded=true]{color:var(--paper);background:var(--cobalt);border-color:var(--cobalt)}.command-actions .end-session:hover:enabled{color:var(--paper);background:var(--failure);border-color:var(--failure)}.connection-state{font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--quiet);flex:none;font-size:11px}.end-transition-status{max-width:28rem;font-family:var(--utility);color:var(--quiet);font-size:11px;line-height:1.25}.end-transition-status:empty{display:none}.direction-notice{max-width:16rem;font-family:var(--utility);color:var(--quiet);font-size:11px;line-height:1.25}.direction-notice:empty{display:none}.authority{white-space:nowrap;font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--eucalyptus);flex:none;margin:0;font-size:11px}.authority:before{content:"";vertical-align:0;background:currentColor;width:.5rem;height:.5rem;margin-right:.5rem;display:inline-block}.beta-badge{font-family:var(--utility);letter-spacing:.1em;text-transform:uppercase;color:var(--ochre);border:1px solid var(--ochre);flex:none;padding:.05rem .4rem;font-size:10px;font-weight:600}.session-details{align-items:flex-start;gap:calc(var(--step) * 2);padding:var(--step) calc(var(--step) * 2) calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);background:var(--sheet);display:flex;position:absolute;top:100%;left:0;right:0;box-shadow:0 12px 28px #1323391f}.session-details[hidden]{display:none}.session-details p{max-width:90ch;color:var(--quiet);margin:0}.details-close{min-height:28px;font-family:var(--utility);letter-spacing:.08em;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;flex:none;margin-left:auto;padding:0 .6rem;font-size:11px}.details-close:hover{border-color:var(--cobalt)}.attention-count{background:var(--cobalt);color:#fff;text-align:center;border-radius:999px;min-width:1.25rem;padding:0 .35rem;font-size:11px}.workspace{grid-template-columns:var(--rail-width) minmax(0, 1fr) auto var(--conversation-width);min-width:0;min-height:0;display:grid;overflow:hidden}.view-tree{border-right:1px solid var(--rule);background:var(--sheet);grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0;display:grid}.view-tree-head{align-items:center;gap:calc(var(--step) * 1);padding:var(--step) calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);display:flex}.view-tree-filter{min-width:0;min-height:1.75rem;font-family:var(--utility);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:0;flex:1;padding:0 .5rem;font-size:12px}.view-tree-new{width:1.75rem;height:1.75rem;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;flex:none;place-items:center;padding:0;display:grid}.view-tree-new:hover{border-color:var(--cobalt);color:var(--cobalt)}.view-tree-body{padding:var(--step) 0 calc(var(--step) * 2);overflow:auto}.tree-list{margin:0;padding:0;list-style:none}.tree-row{align-items:center;gap:calc(var(--step) * .75);width:100%;padding:.3rem calc(var(--step) * 1.5);font:inherit;text-align:left;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:0;font-size:13px;display:flex}.tree-row:hover{background:color-mix(in oklab, var(--cobalt) 10%, transparent)}.tree-branch{font-family:var(--utility);color:var(--quiet);font-size:12px}.tree-depth-0{letter-spacing:.08em;text-transform:uppercase;color:var(--quiet)}.tree-depth-1{padding-left:calc(var(--step) * 3)}.tree-depth-2{padding-left:calc(var(--step) * 5.5)}.tree-row-active,.tree-row-active:hover{background:var(--cobalt);color:var(--paper)}.tree-row-quiet{color:var(--quiet)}.tree-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.tree-count{font-family:var(--utility);color:var(--quiet);flex:none;font-size:10px}.tree-row-active .tree-count{color:inherit;opacity:.75}.tree-swatch{background:var(--paper);border:1px solid var(--rule-firm);flex:none;width:.625rem;height:.625rem}.tree-empty{padding:.3rem calc(var(--step) * 3);color:var(--quiet);font-size:12px}.diagram-workspace{background:var(--paper);grid-template-rows:minmax(0,1fr) auto;min-width:0;min-height:0;display:grid;position:relative;overflow:hidden}.canvas-controls{inset:var(--step) var(--step) auto auto;z-index:5;align-items:center;gap:var(--step);display:flex;position:absolute}.canvas{width:100%;min-width:0;height:100%;min-height:0;position:relative}.diagram-workspace>.faults{z-index:4;max-height:50%;position:absolute;inset:auto 0 0;overflow:auto}.diagram-workspace>.filter-pill{inset:var(--step) auto auto var(--step);z-index:4;align-items:center;gap:var(--step);max-width:min(52ch, calc(100% - var(--step) * 2));border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute}.filter-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.filter-pill code{font-weight:700}.filter-pill button{color:var(--cobalt);font-family:inherit;font-size:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;text-decoration:underline}.filter-pill button:hover{color:var(--ink)}.conversation-separator{z-index:3;cursor:col-resize;touch-action:none;width:10px;height:100%;position:relative}.conversation-separator:before{background:var(--rule);content:"";width:1px;position:absolute;inset:0 auto 0 4px}.conversation-separator:hover:before,.conversation-separator:focus-visible:before{background:var(--cobalt);width:2px}.waiting{padding:calc(var(--step) * 4);font-family:var(--utility);letter-spacing:.1em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:12px}.section-stack{border-left:1px solid var(--rule);background:var(--sheet);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.stack-section{grid-template-rows:auto minmax(0,1fr);min-height:0;display:grid;overflow:hidden}.stack-section-properties{flex:auto}.stack-section-changes{flex:0 0 var(--changes-height,200px)}.stack-section-chat{flex:0 0 var(--chat-height,300px)}.section-stack>.stack-section:first-child{flex:auto}.section-head{align-items:center;gap:var(--step);min-height:32px;padding-right:calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);font-size:inherit;margin:0;font-weight:400;display:flex}.section-toggle{align-items:center;gap:calc(var(--step) * .75);min-height:32px;padding:0 calc(var(--step) * 1.5);color:var(--ink);cursor:pointer;font-family:var(--utility);letter-spacing:.08em;background:0 0;border:none;font-size:12px;display:flex}.section-chevron{color:var(--quiet);font-size:10px}.section-meta{font-family:var(--utility);color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;font-size:11px;overflow:hidden}.section-body{min-height:0;overflow:auto}.section-body[hidden]{display:none}.section-empty{padding:calc(var(--step) * 1.5);color:var(--quiet);margin:0;font-size:13px}.section-splitter{cursor:row-resize;background:0 0;border:none;flex:0 0 7px;height:7px;position:relative}.section-splitter:after{content:"";background:var(--rule);position:absolute;inset:3px 0}.section-splitter:hover:after,.section-splitter:focus-visible:after{background:var(--cobalt);inset:2px 0}.section-splitter:focus-visible{outline:none}.talk{background:var(--sheet);grid-template-rows:minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;min-height:0;display:grid;overflow:hidden}.session-foot{align-items:center;gap:var(--step);padding:0 calc(var(--step) * 1.5) calc(var(--step) * 1.5);display:flex}.session-foot .end-session{margin-left:auto}.talk[hidden]{display:none}.conversation-scroll{min-width:0;min-height:0;overflow:auto}.subject-inspector{min-width:0;padding:calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);background:color-mix(in srgb, var(--sheet) 92%, var(--cobalt) 8%)}.subject-heading-row{justify-content:space-between;align-items:flex-start;gap:var(--step);min-width:0;display:flex}.subject-heading-row>:first-child,.subject-heading-row h2{min-width:0}.subject-type{margin:0 0 calc(var(--step) * .25);color:var(--quiet);letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:700}.subject-heading-row h2{font-family:var(--display);overflow-wrap:anywhere;margin:0;font-size:16px;line-height:1.25}.subject-facts{gap:calc(var(--step) * .5);margin:var(--step) 0;display:grid}.subject-facts>div{gap:var(--step);grid-template-columns:minmax(5.5rem,auto) minmax(0,1fr);display:grid}.subject-facts dt{color:var(--quiet);font-size:11px}.subject-facts dd{overflow-wrap:anywhere;min-width:0;margin:0}.subject-description p{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.description-clamped{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.subject-description button,.subject-navigate,.subject-clear{margin-top:calc(var(--step) * .5);min-height:28px}.subject-connect{margin-top:calc(var(--step) * .5);margin-right:calc(var(--step) * .5);min-height:28px}.connection-panel{z-index:2;top:calc(var(--step) * 1.5);max-width:min(560px, calc(100% - var(--step) * 4));padding:calc(var(--step) * 1.5) calc(var(--step) * 2);border:1px solid var(--rule);background:var(--sheet);border-radius:4px;position:absolute;left:50%;transform:translate(-50%);box-shadow:0 2px 12px #0000001f}.connection-prompt{margin:0 0 calc(var(--step) * 1.5)}.connection-empty{margin:0 0 calc(var(--step) * 1.5);color:var(--quiet)}.changeset-fault-summary{margin:calc(var(--step) * 1.5) calc(var(--step) * 2.5) 0;color:var(--failure);font-weight:600}.subject-delete{margin-top:calc(var(--step) * .5);margin-right:calc(var(--step) * .5);min-height:28px}.subject-draft-open{border:1px solid var(--rule-firm);background:var(--sheet);min-height:28px;color:var(--ink);cursor:pointer;font-family:var(--utility);letter-spacing:.08em;border-radius:0;padding:0 .7rem;font-size:12px}.subject-draft-open:hover{border-color:var(--cobalt)}.canvas-controls .quick-filter{border:1px solid var(--rule-firm);background:var(--sheet);width:min(220px,30vw);min-height:28px;color:var(--ink);font-family:var(--utility);border-radius:0;padding:0 .6rem;font-size:12px}.canvas-controls .quick-filter::placeholder{color:var(--quiet)}.subject-draft-panel{z-index:3;top:calc(var(--step) * 1.5);right:calc(var(--step) * 1.5);width:min(340px, calc(100% - var(--step) * 4));padding:calc(var(--step) * 1.5) calc(var(--step) * 2);border:1px solid var(--rule);background:var(--sheet);border-radius:4px;position:absolute;box-shadow:0 2px 12px #0000001f}.subject-draft-field{margin-bottom:calc(var(--step) * 1.5);display:block}.subject-draft-field>span{margin-bottom:calc(var(--step) * .5);display:block}.subject-draft-field>input,.subject-draft-field>select{width:100%}.subject-draft-id{margin:0 0 calc(var(--step) * 1.5);color:var(--quiet)}.connection-kinds{gap:calc(var(--step) * .75);margin:0 0 calc(var(--step) * 1.5);flex-wrap:wrap;padding:0;list-style:none;display:flex}.ledger{padding:calc(var(--step) * 2) calc(var(--step) * 2.5);min-height:0;margin:0;list-style:none;overflow:visible}.ledger .empty p{color:var(--quiet);font-family:var(--utility);margin:0;font-size:12px}.said{padding:0 0 calc(var(--step) * 1.75) calc(var(--step) * 1.5);border-left:2px solid var(--rule)}.said+.said{padding-top:calc(var(--step) * 1.75)}.said-reviewer{border-left-color:var(--cobalt)}.said-agent{border-left-color:var(--eucalyptus)}.said-session{border-left-color:var(--ochre)}.who{font-family:var(--utility);letter-spacing:.16em;text-transform:uppercase;color:var(--quiet);margin:0 0 .15rem;font-size:10px}.words{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.faults{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--failure);background:color-mix(in oklab, var(--failure) 8%, var(--sheet))}.faults-title{margin:0 0 var(--step);color:var(--failure);font-size:13px}.faults ul{font-family:var(--utility);margin:0;padding-left:1.1rem;font-size:11px;line-height:1.6}.faults .code{font-weight:700}.faults .where{color:var(--quiet);margin-left:.4rem}.choices{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--rule)}.question{margin:0 0 var(--step);font-family:var(--display);font-size:1.05rem}.choices ul{gap:var(--step);margin:0;padding:0;list-style:none;display:grid}.choices button{text-align:left;width:100%;font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:.5rem .7rem;font-size:14px;display:block}.choices button:hover:enabled{border-color:var(--cobalt)}.choices button:disabled{color:var(--quiet);cursor:not-allowed}.choices .detail{color:var(--quiet);font-size:12px;display:block}.composer{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5) calc(var(--step) * 2);border-top:1px solid var(--rule)}.composer textarea{resize:vertical;width:100%;font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:0;padding:.55rem .65rem;font-size:14px;display:block}.composer textarea:disabled{color:var(--quiet);background:color-mix(in oklab, var(--paper) 70%, var(--sheet));cursor:not-allowed}.composer-foot{justify-content:space-between;align-items:center;gap:var(--step);margin-top:var(--step);display:flex}.agent-status{align-items:center;gap:calc(var(--step) * .5);font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:10px;display:flex}.agent-spinner{border:1px solid;border-right-color:#0000;border-radius:50%;flex:none;width:.75rem;height:.75rem;animation:.7s linear infinite agent-spinner-turn}@keyframes agent-spinner-turn{to{transform:rotate(1turn)}}.composer button{font-family:var(--utility);letter-spacing:.08em;color:var(--paper);background:var(--cobalt);border:1px solid var(--cobalt);cursor:pointer;border-radius:0;padding:.45rem 1.1rem;font-size:12px}.composer button:disabled{color:var(--quiet);border-color:var(--rule-firm);cursor:not-allowed;background:0 0}.subject-chip{justify-content:space-between;align-items:center;gap:var(--step);margin-bottom:calc(var(--step) * .75);padding:calc(var(--step) * .5) calc(var(--step) * .75);border:1px solid var(--cobalt);color:var(--cobalt);border-radius:999px;display:flex}.subject-chip span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.subject-chip button{min-height:24px;padding:0 calc(var(--step) * .5);color:inherit;background:0 0;border:0;flex:none}.filter-grid{gap:calc(var(--step) * 1.5);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.filter-field{gap:calc(var(--step) * .75);flex-direction:column;display:flex}.filter-field>label,.filter-field legend{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:11px}.tag-input{align-items:center;gap:var(--step);padding:calc(var(--step) * .5);border:1px solid var(--rule-firm);background:var(--paper);border-radius:2px;flex-wrap:wrap;display:flex}.tag-input input{min-width:80px;font:inherit;background:0 0;border:none;flex:1;font-size:15px}.tag-input input:focus{outline:none}.tag-chip{background:var(--cobalt);color:var(--paper);border-radius:2px;align-items:center;gap:.4rem;padding:.2rem .6rem;font-size:13px;display:inline-flex}.tag-chip button{color:currentColor;cursor:pointer;background:0 0;border:none;min-width:0;min-height:0;margin:0;padding:0;font-size:16px;line-height:1;display:inline}.tag-chip button:hover{opacity:.8}.filter-field select{font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:.4rem .7rem;font-size:15px}.filter-field select:hover{border-color:var(--cobalt)}.filter-checkbox-group{border:none;margin:0;padding:0}.filter-checkbox-option{cursor:pointer;align-items:center;gap:.5rem;padding:.4rem 0;font-size:15px;display:flex}.filter-checkbox-option input{cursor:pointer}.bottom-panel{border-top:1px solid var(--rule-firm);background:var(--sheet);flex-direction:column;min-height:0;display:flex}.bottom-panel-tabs{align-items:stretch;gap:0;min-height:32px;display:flex}.bottom-panel-tab{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--quiet);border:none;border-right:1px solid var(--rule);cursor:pointer;background:0 0;border-bottom:2px solid #0000;padding:0 .9rem;font-size:12px}.bottom-panel-tab:hover{color:var(--ink)}.bottom-panel-tab[aria-selected=true]{color:var(--ink);background:var(--paper);border-bottom-color:var(--cobalt)}.bottom-panel-summary{font-family:var(--utility);color:var(--quiet);align-items:center;padding-inline:.9rem;font-size:12px;display:flex}.bottom-panel-collapse{min-width:32px;min-height:32px;color:var(--quiet);border:none;border-left:1px solid var(--rule);cursor:pointer;background:0 0;margin-left:auto;font-size:12px}.bottom-panel-collapse:hover{color:var(--ink)}.bottom-panel-body{border-top:1px solid var(--rule);background:var(--paper);min-height:0;max-height:42dvh;overflow:auto}.query-tab{gap:calc(var(--step) * 2);padding:calc(var(--step) * 1.5);grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);display:grid}.query-tab>div{min-width:0}.query-tab h3{margin:0 0 var(--step);font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:11px;font-weight:400}.query-tab-fields{gap:calc(var(--step) * 1.5);flex-direction:column;display:flex}.query-tab-outcome>h3:not(:first-child){margin-top:calc(var(--step) * 2)}.query-match-count{font-family:var(--display);margin:0;font-size:15px}.query-match-count strong{font-size:28px;font-weight:400;line-height:1}.query-outcome-stale,.query-outcome-note{margin:var(--step) 0 0;color:var(--quiet);font-size:13px}.query-outcome-empty{margin:var(--step) 0 0;color:var(--ochre);font-size:13px}.query-exclusions{margin:0;padding:0;list-style:none}.query-exclusions>li+li{margin-top:var(--step)}.query-exclusions ul{margin:calc(var(--step) * .5) 0 0;padding-left:calc(var(--step) * 2);color:var(--quiet);font-size:13px;list-style:none}.query-exclusion-facet{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);font-size:11px}.query-exclusion-count{font-family:var(--utility);color:var(--quiet);font-size:11px}.query-exclusion-more{font-style:italic}.query-tab-document{flex-direction:column;min-height:0;display:flex}.query-document{min-height:0;max-height:22dvh;padding:var(--step);border:1px solid var(--rule);background:var(--sheet);font-family:var(--utility);flex:1;margin:0;font-size:12px;line-height:1.5;overflow:auto}.query-tab-actions{align-items:center;gap:var(--step);margin-top:var(--step);display:flex}.query-tab-actions button{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--paper);background:var(--cobalt);border:1px solid var(--cobalt);cursor:pointer;border-radius:0;padding:0 .7rem;font-size:12px}.query-tab-actions button:disabled{color:var(--quiet);background:var(--paper);border-color:var(--rule-firm);cursor:default}.query-stage-status{color:var(--quiet);font-size:13px}@media (max-width:899px){.command-strip{gap:calc(var(--step) * .5);padding-inline:var(--step)}.command-identity,.command-actions{gap:calc(var(--step) * .5)}.workspace{grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-height:0}.view-tree{border-right:0;border-bottom:1px solid var(--rule);max-height:34dvh}.conversation-separator{display:none}.query-tab{grid-template-columns:minmax(0,1fr)}.bottom-panel-body{max-height:30dvh}.section-stack{border-top:1px solid var(--rule);border-left:0;max-height:56dvh}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.save-view-control{display:contents}.save-view-toggle{padding:0 calc(var(--step) * .75rem);border:1px solid var(--rule-firm);background:var(--paper);height:32px;color:var(--ink);cursor:pointer;border-radius:2px;font-size:13px}.save-view-toggle:hover:not(:disabled){border-color:var(--rule);background:color-mix(in oklab, var(--paper) 90%, var(--ink))}.save-view-toggle:disabled{opacity:.5;cursor:not-allowed}.save-view-control{z-index:20;background:color-mix(in oklab, var(--ink) 22%, transparent);place-items:center;display:grid;position:fixed;inset:0}.save-view-panel{background:var(--sheet);border:1px solid var(--rule-firm);border-radius:4px;box-shadow:0 8px 28px #1323392e}.save-view-panel-body{padding:calc(var(--step) * 1.5);min-width:300px}.save-view-form{gap:calc(var(--step) * 1);flex-direction:column;display:flex}.save-view-form div{gap:calc(var(--step) * .5);flex-direction:column;display:flex}.save-view-form label{color:var(--ink);font-size:12px;font-weight:500}.save-view-form input,.save-view-form textarea{padding:calc(var(--step) * .5);border:1px solid var(--rule);font-family:var(--body);border-radius:2px;font-size:13px}.save-view-actions{gap:calc(var(--step) * 1);margin-top:calc(var(--step) * .5);display:flex}.save-view-actions button{padding:calc(var(--step) * .5) calc(var(--step) * 1);border:1px solid var(--rule-firm);background:var(--paper);color:var(--ink);cursor:pointer;border-radius:2px;flex:1;font-size:13px}.save-view-actions button:hover:not(:disabled){background:color-mix(in oklab, var(--paper) 85%, var(--ink))}.save-view-notice{align-items:center;gap:calc(var(--step) * .75);padding:calc(var(--step) * .75) calc(var(--step) * 1.5);background:color-mix(in oklab, var(--eucalyptus) 15%, var(--sheet));border:1px solid var(--eucalyptus);color:var(--ink);border-radius:4px;font-size:13px;display:flex}.save-view-notice button{padding:0 calc(var(--step) * .5);color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;margin-left:auto;font-size:11px;text-decoration:underline}.confirm-dialog-backdrop{z-index:1000;background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.confirm-dialog{background:var(--sheet);border:1px solid var(--rule-firm);padding:calc(var(--step) * 2);text-align:center;border-radius:8px;max-width:400px;box-shadow:0 8px 24px #00000029}.confirm-dialog h2{margin:0 0 calc(var(--step) * 1) 0;font-size:16px}.confirm-dialog p{margin:0 0 calc(var(--step) * 1.5) 0;color:var(--quiet);font-size:13px}.confirm-dialog-actions{gap:calc(var(--step) * 1);display:flex}.confirm-dialog-actions button{padding:calc(var(--step) * .75);border:1px solid var(--rule-firm);background:var(--paper);color:var(--ink);cursor:pointer;border-radius:2px;flex:1;font-size:13px}.confirm-dialog-actions button:hover{background:color-mix(in oklab, var(--paper) 85%, var(--ink))}.changeset-tray{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--rule);background:color-mix(in srgb, var(--sheet) 92%, var(--cobalt) 8%)}.changeset-heading-row{justify-content:space-between;align-items:baseline;gap:var(--step);display:flex}.changeset-heading-row h2{font-family:var(--display);margin:0;font-size:15px}.changeset-discard-all{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.changeset-history-controls{align-items:baseline;gap:var(--step);display:flex}.changeset-undo,.changeset-redo{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.changeset-undo:disabled,.changeset-redo:disabled{color:var(--quiet);cursor:not-allowed;text-decoration:none}.changeset-rows{margin:var(--step) 0 0;gap:calc(var(--step) * .75);padding:0;list-style:none;display:grid}.changeset-row{padding:calc(var(--step) * .75);border:1px solid var(--rule-firm);background:var(--paper);border-radius:2px}.changeset-row.conflicted{border-color:var(--ochre);background:color-mix(in oklab, var(--ochre) 6%, var(--paper))}.changeset-row-conflict{margin:calc(var(--step) * .5) 0 0;font-family:var(--utility);color:var(--ochre);font-size:11px}.changeset-row-line{justify-content:space-between;align-items:center;gap:var(--step);display:flex}.changeset-row-label{overflow-wrap:anywhere;min-width:0;font-family:var(--utility);color:var(--ink);font-size:12px}.changeset-row-discard{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-size:11px;text-decoration:underline}.changeset-row-diagnostics,.changeset-batch-diagnostics{margin:calc(var(--step) * .5) 0 0;font-family:var(--utility);color:var(--failure);padding-left:1.1rem;font-size:11px}.changeset-batch-diagnostics{margin:0 0 var(--step)}.changeset-row-diagnostics .code,.changeset-batch-diagnostics .code{font-weight:700}.changeset-row-diagnostics .where,.changeset-batch-diagnostics .where{color:var(--quiet);margin-left:.4rem}.changeset-actions{margin-top:var(--step)}.changeset-commit{width:100%;padding:calc(var(--step) * .75);border:1px solid var(--cobalt);background:var(--cobalt);color:var(--paper);cursor:pointer;border-radius:2px;font-size:13px}.changeset-commit:disabled{border-color:var(--rule-firm);color:var(--quiet);cursor:not-allowed;background:0 0}.changeset-notice{margin-top:var(--step);padding:calc(var(--step) * .75) calc(var(--step) * 1);border:1px solid var(--eucalyptus);background:color-mix(in oklab, var(--eucalyptus) 15%, var(--sheet));color:var(--ink);border-radius:4px;font-size:12px}.changeset-notice p{margin:0 0 calc(var(--step) * .25);font-weight:700}.changeset-notice ul{font-family:var(--utility);margin:0;padding-left:1.1rem}.layout-notice-pill{inset:var(--step) var(--step) auto auto;z-index:4;align-items:center;gap:var(--step);max-width:calc(100% - var(--step) * 2);border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute}.layout-notice-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.subject-form{gap:calc(var(--step) * 1.25);margin:calc(var(--step) * 1) 0;flex-direction:column;display:flex}.subject-form-field{gap:calc(var(--step) * .35);flex-direction:column;display:flex}.subject-form-label{font-family:var(--utility);letter-spacing:.02em;text-transform:uppercase;color:var(--quiet);font-size:11px}.subject-form-field input[type=text],.subject-form-field select{border:1px solid var(--rule-firm);border-radius:calc(var(--step) * .5);background:var(--paper);font-family:var(--body);color:var(--ink);padding:.35rem .5rem;font-size:13px}.subject-form-list{border-top:1px solid var(--rule);padding-top:calc(var(--step) * .75)}.subject-form-row{align-items:flex-start;gap:calc(var(--step) * .5);margin-bottom:calc(var(--step) * .5);display:flex}.subject-form-row-body{align-items:center;gap:calc(var(--step) * .5);flex-wrap:wrap;flex:1;display:flex}.subject-form-toggle{align-items:center;gap:calc(var(--step) * .35);font-family:var(--utility);color:var(--quiet);font-size:12px;display:flex}.subject-form-row-add,.subject-form-row-remove{border:1px solid var(--rule-firm);border-radius:calc(var(--step) * .5);background:var(--sheet);font-family:var(--utility);cursor:pointer;padding:.25rem .6rem;font-size:12px}.context-menu{z-index:1100;min-width:184px;max-width:280px;max-height:70vh;padding:calc(var(--step) * .5) 0;background:var(--sheet);border:1px solid var(--rule-firm);border-radius:2px;position:fixed;overflow-y:auto;box-shadow:0 8px 24px #00000029}.context-menu:focus{outline:none}.context-menu ul{margin:0;padding:0;list-style:none}.context-menu-group+.context-menu-group{margin-top:calc(var(--step) * .5);padding-top:calc(var(--step) * .5);border-top:1px solid var(--rule)}.context-menu-destructive{margin-top:calc(var(--step) * .5);padding-top:calc(var(--step) * .5);border-top:1px solid var(--rule-firm)}.context-menu-heading{padding:calc(var(--step) * .5) calc(var(--step) * 1.5);font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:10px}.context-menu-item{align-items:center;gap:calc(var(--step) * .75);width:100%;padding:.3rem calc(var(--step) * 1.5);font:inherit;text-align:left;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:0;font-size:13px;display:flex}.context-menu-item:hover{background:color-mix(in oklab, var(--cobalt) 10%, transparent)}.context-menu-destructive .context-menu-item{color:var(--failure)}.context-menu-destructive .context-menu-item:hover{background:color-mix(in oklab, var(--failure) 12%, transparent)}.context-menu-tick{width:8px;font-family:var(--utility);color:var(--cobalt);flex:none;font-size:12px}.context-menu-label{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.changeset-row-scope{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;padding:0 calc(var(--step) * .5);border:1px solid var(--rule);color:var(--quiet);border-radius:2px;flex:none;font-size:10px}.changeset-scope-view{color:var(--cobalt);border-color:color-mix(in oklab, var(--cobalt) 40%, transparent)}.prompt-dialog-form{gap:calc(var(--step) * .75);text-align:left;flex-direction:column;display:flex}.prompt-dialog-form label{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:10px}.prompt-dialog-form input{padding:calc(var(--step) * .75);font:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:2px;font-size:13px}.prompt-dialog-form input:focus{border-color:var(--cobalt)}.prompt-dialog-form .confirm-dialog-actions{margin-top:calc(var(--step) * .5)}
|
|
1
|
+
:root{--paper:#e8eef0;--ink:#182228;--eucalyptus:#416f65;--ochre:#8c4d18;--cobalt:#2457a6;--failure:#a3403a;--sheet:color-mix(in oklab, var(--paper) 55%, white);--rule:color-mix(in oklab, var(--ink) 16%, transparent);--rule-firm:color-mix(in oklab, var(--ink) 34%, transparent);--quiet:color-mix(in oklab, var(--ink) 62%, var(--paper));--display:"Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, serif;--body:"Avenir Next", Avenir, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--utility:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--step:.5rem;--rail-width:264px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box}html,body{margin:0;padding:0}body{background:var(--paper);color:var(--ink);font-family:var(--body);-webkit-font-smoothing:antialiased;font-size:15px;line-height:1.5}:focus-visible{outline:3px solid var(--cobalt);outline-offset:2px}.offscreen{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visual-shell{background:var(--paper);min-width:0;height:100dvh;color:var(--ink);grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.command-strip{z-index:10;justify-content:space-between;align-items:center;gap:calc(var(--step) * 2);min-height:48px;padding:calc(var(--step) * .75) calc(var(--step) * 2);border-bottom:1px solid var(--rule);background:var(--sheet);flex-wrap:wrap;display:flex;position:relative}.command-identity,.command-actions{align-items:center;gap:var(--step);min-width:0;display:flex}.session-description{min-width:0;color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;overflow:hidden}.command-identity{flex:10rem}.command-actions{flex-wrap:wrap;flex:0 auto;justify-content:flex-end}.command-identity h1{min-width:8ch;font-family:var(--display);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:15px;line-height:1.2;overflow:hidden}.command-actions select,.command-actions button,.command-actions .quick-filter{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:0 .7rem;font-size:12px}.command-actions select{text-overflow:ellipsis;max-width:12rem}.command-actions .quick-filter{cursor:text;width:160px}.command-actions .quick-filter::placeholder{color:var(--quiet)}.command-actions select{padding-right:.35rem}.command-actions select:hover:enabled,.command-actions button:hover:enabled,.command-actions .quick-filter:hover,.command-actions .quick-filter:focus{border-color:var(--cobalt)}.command-actions select:disabled,.command-actions button:disabled{color:var(--quiet);border-color:var(--rule);cursor:not-allowed;background:0 0}.command-actions button[aria-expanded=true]{color:var(--paper);background:var(--cobalt);border-color:var(--cobalt)}.command-actions .end-session:hover:enabled{color:var(--paper);background:var(--failure);border-color:var(--failure)}.connection-state{font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--quiet);flex:none;font-size:11px}.end-transition-status{max-width:28rem;font-family:var(--utility);color:var(--quiet);font-size:11px;line-height:1.25}.end-transition-status:empty{display:none}.direction-notice{max-width:16rem;font-family:var(--utility);color:var(--quiet);font-size:11px;line-height:1.25}.direction-notice:empty{display:none}.authority{white-space:nowrap;font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--eucalyptus);flex:none;margin:0;font-size:11px}.authority:before{content:"";vertical-align:0;background:currentColor;width:.5rem;height:.5rem;margin-right:.5rem;display:inline-block}.beta-badge{font-family:var(--utility);letter-spacing:.1em;text-transform:uppercase;color:var(--ochre);border:1px solid var(--ochre);flex:none;padding:.05rem .4rem;font-size:10px;font-weight:600}.session-details{align-items:flex-start;gap:calc(var(--step) * 2);padding:var(--step) calc(var(--step) * 2) calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);background:var(--sheet);display:flex;position:absolute;top:100%;left:0;right:0;box-shadow:0 12px 28px #1323391f}.session-details[hidden]{display:none}.session-details p{max-width:90ch;color:var(--quiet);margin:0}.details-close{min-height:28px;font-family:var(--utility);letter-spacing:.08em;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;flex:none;margin-left:auto;padding:0 .6rem;font-size:11px}.details-close:hover{border-color:var(--cobalt)}.attention-count{background:var(--cobalt);color:#fff;text-align:center;border-radius:999px;min-width:1.25rem;padding:0 .35rem;font-size:11px}.workspace{grid-template-columns:var(--rail-width) minmax(0, 1fr) auto var(--conversation-width);min-width:0;min-height:0;display:grid;overflow:hidden}.view-tree{border-right:1px solid var(--rule);background:var(--sheet);grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0;display:grid}.view-tree-head{align-items:center;gap:calc(var(--step) * 1);padding:var(--step) calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);display:flex}.view-tree-filter{min-width:0;min-height:1.75rem;font-family:var(--utility);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:0;flex:1;padding:0 .5rem;font-size:12px}.view-tree-new{width:1.75rem;height:1.75rem;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;flex:none;place-items:center;padding:0;display:grid}.view-tree-new:hover{border-color:var(--cobalt);color:var(--cobalt)}.view-tree-body{padding:var(--step) 0 calc(var(--step) * 2);overflow:auto}.tree-list{margin:0;padding:0;list-style:none}.tree-row{align-items:center;gap:calc(var(--step) * .75);width:100%;padding:.3rem calc(var(--step) * 1.5);font:inherit;text-align:left;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:0;font-size:13px;display:flex}.tree-row:hover{background:color-mix(in oklab, var(--cobalt) 10%, transparent)}.tree-branch{font-family:var(--utility);color:var(--quiet);font-size:12px}.tree-depth-0{letter-spacing:.08em;text-transform:uppercase;color:var(--quiet)}.tree-depth-1{padding-left:calc(var(--step) * 3)}.tree-depth-2{padding-left:calc(var(--step) * 5.5)}.tree-row-active,.tree-row-active:hover{background:var(--cobalt);color:var(--paper)}.tree-row-quiet{color:var(--quiet)}.tree-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.tree-count{font-family:var(--utility);color:var(--quiet);flex:none;font-size:10px}.tree-row-active .tree-count{color:inherit;opacity:.75}.tree-swatch{background:var(--paper);border:1px solid var(--rule-firm);flex:none;width:.625rem;height:.625rem}.tree-empty{padding:.3rem calc(var(--step) * 3);color:var(--quiet);font-size:12px}.diagram-workspace{background:var(--paper);grid-template-rows:minmax(0,1fr) auto;min-width:0;min-height:0;display:grid;position:relative;overflow:hidden}.canvas-controls{inset:var(--step) var(--step) auto auto;z-index:5;align-items:center;gap:var(--step);display:flex;position:absolute}.canvas{width:100%;min-width:0;height:100%;min-height:0;position:relative}.diagram-workspace>.faults{z-index:4;max-height:50%;position:absolute;inset:auto 0 0;overflow:auto}.diagram-workspace>.filter-pill{inset:var(--step) auto auto var(--step);z-index:4;align-items:center;gap:var(--step);max-width:min(52ch, calc(100% - var(--step) * 2));border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute}.filter-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.filter-pill code{font-weight:700}.filter-pill button{color:var(--cobalt);font-family:inherit;font-size:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;text-decoration:underline}.filter-pill button:hover{color:var(--ink)}.canvas>.filter-empty-pill{z-index:4;align-items:center;gap:var(--step);max-width:min(52ch, calc(100% - var(--step) * 2));border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.filter-empty-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.filter-empty-pill code{font-weight:700}.filter-empty-pill button{color:var(--cobalt);font-family:inherit;font-size:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;text-decoration:underline}.filter-empty-pill button:hover{color:var(--ink)}.conversation-separator{z-index:3;cursor:col-resize;touch-action:none;width:10px;height:100%;position:relative}.conversation-separator:before{background:var(--rule);content:"";width:1px;position:absolute;inset:0 auto 0 4px}.conversation-separator:hover:before,.conversation-separator:focus-visible:before{background:var(--cobalt);width:2px}.waiting{padding:calc(var(--step) * 4);font-family:var(--utility);letter-spacing:.1em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:12px}.section-stack{border-left:1px solid var(--rule);background:var(--sheet);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.stack-rim{border-bottom:1px solid var(--rule);flex:none;justify-content:flex-end;display:flex}.conversation-hide{min-height:22px;padding:0 calc(var(--step) * 1.5);color:var(--quiet);cursor:pointer;background:0 0;border:none;font-size:12px;line-height:1}.conversation-hide:hover,.conversation-hide:focus-visible{color:var(--cobalt)}.conversation-reopen{align-items:center;gap:var(--step);width:22px;height:100%;padding:calc(var(--step) * 1.5) 0;border:none;border-left:1px solid var(--rule);background:var(--sheet);color:var(--quiet);cursor:pointer;flex-direction:column;font-size:12px;display:flex}.conversation-reopen:hover,.conversation-reopen:focus-visible{color:var(--cobalt)}.attention-choice{border:1px solid var(--cobalt);min-width:1.25rem;color:var(--cobalt);text-align:center;border-radius:999px;padding:0 .35rem;font-size:11px}.stack-section{grid-template-rows:auto minmax(0,1fr);min-height:0;display:grid;overflow:hidden}.stack-section-properties{flex:auto}.stack-section-changes{flex:0 0 var(--changes-height,200px)}.stack-section-chat{flex:0 0 var(--chat-height,300px)}.section-stack:not(:has(>.stack-section-properties))>.stack-section:nth-child(1 of .stack-section:not(.stack-section-palette)){flex:auto}.section-stack>.stack-section-palette:only-child{flex:auto;max-height:none}.stack-section-palette{flex:0 auto;max-height:45%}.kind-palette{padding:calc(var(--step) * .5) 0 calc(var(--step) * .75)}.kind-palette-layer-name{padding:calc(var(--step) * .75) calc(var(--step) * 1.5) calc(var(--step) * .25);font-family:var(--utility);letter-spacing:.08em;color:var(--quiet);margin:0;font-size:11px}.kind-palette-rows{margin:0;padding:0;list-style:none}.kind-palette-row{align-items:center;gap:calc(var(--step) * .75);width:100%;padding:.3rem calc(var(--step) * 1.5);font:inherit;text-align:left;color:var(--ink);cursor:grab;background:0 0;border:0;border-radius:0;font-size:13px;display:flex}.kind-palette-row:hover,.kind-palette-row:focus-visible{background:color-mix(in oklab, var(--cobalt) 10%, transparent)}.kind-palette-row img{flex:none}.section-head{align-items:center;gap:var(--step);min-height:32px;padding-right:calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);font-size:inherit;margin:0;font-weight:400;display:flex}.section-toggle{align-items:center;gap:calc(var(--step) * .75);min-height:32px;padding:0 calc(var(--step) * 1.5);color:var(--ink);cursor:pointer;font-family:var(--utility);letter-spacing:.08em;background:0 0;border:none;font-size:12px;display:flex}.section-chevron{color:var(--quiet);font-size:10px}.section-meta{font-family:var(--utility);color:var(--quiet);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;font-size:11px;overflow:hidden}.section-body{min-height:0;overflow:auto}.section-body[hidden]{display:none}.section-empty{padding:calc(var(--step) * 1.5);color:var(--quiet);margin:0;font-size:13px}.section-splitter{cursor:row-resize;background:0 0;border:none;flex:0 0 7px;height:7px;position:relative}.section-splitter:after{content:"";background:var(--rule);position:absolute;inset:3px 0}.section-splitter:hover:after,.section-splitter:focus-visible:after{background:var(--cobalt);inset:2px 0}.section-splitter:focus-visible{outline:none}.talk{background:var(--sheet);grid-template-rows:minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;min-height:0;display:grid;overflow:hidden}.session-foot{align-items:center;gap:var(--step);padding:0 calc(var(--step) * 1.5) calc(var(--step) * 1.5);display:flex}.session-foot .end-session{margin-left:auto}.talk[hidden]{display:none}.conversation-scroll{min-width:0;min-height:0;overflow:auto}.subject-inspector{min-width:0;padding:calc(var(--step) * 1.5);border-bottom:1px solid var(--rule);background:color-mix(in srgb, var(--sheet) 92%, var(--cobalt) 8%)}.subject-heading-row{justify-content:space-between;align-items:flex-start;gap:var(--step);min-width:0;display:flex}.subject-heading-row>:first-child,.subject-heading-row h2{min-width:0}.subject-type{margin:0 0 calc(var(--step) * .25);color:var(--quiet);letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:700}.subject-heading-row h2{font-family:var(--display);overflow-wrap:anywhere;margin:0;font-size:16px;line-height:1.25}.subject-facts{gap:calc(var(--step) * .5);margin:var(--step) 0;display:grid}.subject-facts>div{gap:var(--step);grid-template-columns:minmax(5.5rem,auto) minmax(0,1fr);display:grid}.subject-facts dt{color:var(--quiet);font-size:11px}.subject-facts dd{overflow-wrap:anywhere;min-width:0;margin:0}.subject-description p{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.description-clamped{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.subject-description button,.subject-navigate,.subject-clear{margin-top:calc(var(--step) * .5);min-height:28px}.subject-connect{margin-top:calc(var(--step) * .5);margin-right:calc(var(--step) * .5);min-height:28px}.connection-panel{z-index:2;top:calc(var(--step) * 1.5);max-width:min(560px, calc(100% - var(--step) * 4));padding:calc(var(--step) * 1.5) calc(var(--step) * 2);border:1px solid var(--rule);background:var(--sheet);border-radius:4px;position:absolute;left:50%;transform:translate(-50%);box-shadow:0 2px 12px #0000001f}.connection-prompt{margin:0 0 calc(var(--step) * 1.5)}.connection-empty{margin:0 0 calc(var(--step) * 1.5);color:var(--quiet)}.changeset-fault-summary{margin:calc(var(--step) * 1.5) calc(var(--step) * 2.5) 0;color:var(--failure);font-weight:600}.subject-delete{margin-top:calc(var(--step) * .5);margin-right:calc(var(--step) * .5);min-height:28px}.subject-draft-open{border:1px solid var(--rule-firm);background:var(--sheet);min-height:28px;color:var(--ink);cursor:pointer;font-family:var(--utility);letter-spacing:.08em;border-radius:0;padding:0 .7rem;font-size:12px}.subject-draft-open:hover{border-color:var(--cobalt)}.canvas-controls .quick-filter{border:1px solid var(--rule-firm);background:var(--sheet);width:min(220px,30vw);min-height:28px;color:var(--ink);font-family:var(--utility);border-radius:0;padding:0 .6rem;font-size:12px}.canvas-controls .quick-filter::placeholder{color:var(--quiet)}.subject-draft-panel{z-index:6;top:calc(var(--step) * 2 + 28px);right:calc(var(--step) * 1.5);width:min(340px, calc(100% - var(--step) * 4));padding:calc(var(--step) * 1.5) calc(var(--step) * 2);border:1px solid var(--rule);background:var(--sheet);border-radius:4px;position:absolute;box-shadow:0 2px 12px #0000001f}.subject-draft-field{margin-bottom:calc(var(--step) * 1.5);display:block}.subject-draft-field>span{margin-bottom:calc(var(--step) * .5);display:block}.subject-draft-field>input,.subject-draft-field>select{width:100%}.subject-draft-id{margin:0 0 calc(var(--step) * 1.5);color:var(--quiet)}.connection-kinds{gap:calc(var(--step) * .75);margin:0 0 calc(var(--step) * 1.5);flex-wrap:wrap;padding:0;list-style:none;display:flex}.ledger{padding:calc(var(--step) * 2) calc(var(--step) * 2.5);min-height:0;margin:0;list-style:none;overflow:visible}.ledger .empty p{color:var(--quiet);font-family:var(--utility);margin:0;font-size:12px}.said{padding:0 0 calc(var(--step) * 1.75) calc(var(--step) * 1.5);border-left:2px solid var(--rule)}.said+.said{padding-top:calc(var(--step) * 1.75)}.said-reviewer{border-left-color:var(--cobalt)}.said-agent{border-left-color:var(--eucalyptus)}.said-session{border-left-color:var(--ochre)}.who{font-family:var(--utility);letter-spacing:.16em;text-transform:uppercase;color:var(--quiet);margin:0 0 .15rem;font-size:10px}.words{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.faults{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--failure);background:color-mix(in oklab, var(--failure) 8%, var(--sheet))}.faults-title{margin:0 0 var(--step);color:var(--failure);font-size:13px}.faults ul{font-family:var(--utility);margin:0;padding-left:1.1rem;font-size:11px;line-height:1.6}.faults .code{font-weight:700}.faults .where{color:var(--quiet);margin-left:.4rem}.choices{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--rule)}.question{margin:0 0 var(--step);font-family:var(--display);font-size:1.05rem}.choices ul{gap:var(--step);margin:0;padding:0;list-style:none;display:grid}.choices button{text-align:left;width:100%;font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:.5rem .7rem;font-size:14px;display:block}.choices button:hover:enabled{border-color:var(--cobalt)}.choices button:disabled{color:var(--quiet);cursor:not-allowed}.choices .detail{color:var(--quiet);font-size:12px;display:block}.composer{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5) calc(var(--step) * 2);border-top:1px solid var(--rule)}.composer textarea{resize:vertical;width:100%;font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:0;padding:.55rem .65rem;font-size:14px;display:block}.composer textarea:disabled{color:var(--quiet);background:color-mix(in oklab, var(--paper) 70%, var(--sheet));cursor:not-allowed}.composer-foot{justify-content:space-between;align-items:center;gap:var(--step);margin-top:var(--step);display:flex}.agent-status{align-items:center;gap:calc(var(--step) * .5);font-family:var(--utility);letter-spacing:.14em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:10px;display:flex}.agent-spinner{border:1px solid;border-right-color:#0000;border-radius:50%;flex:none;width:.75rem;height:.75rem;animation:.7s linear infinite agent-spinner-turn}@keyframes agent-spinner-turn{to{transform:rotate(1turn)}}.composer button{font-family:var(--utility);letter-spacing:.08em;color:var(--paper);background:var(--cobalt);border:1px solid var(--cobalt);cursor:pointer;border-radius:0;padding:.45rem 1.1rem;font-size:12px}.composer button:disabled{color:var(--quiet);border-color:var(--rule-firm);cursor:not-allowed;background:0 0}.subject-chip{justify-content:space-between;align-items:center;gap:var(--step);margin-bottom:calc(var(--step) * .75);padding:calc(var(--step) * .5) calc(var(--step) * .75);border:1px solid var(--cobalt);color:var(--cobalt);border-radius:999px;display:flex}.subject-chip span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.subject-chip button{min-height:24px;padding:0 calc(var(--step) * .5);color:inherit;background:0 0;border:0;flex:none}.filter-grid{gap:calc(var(--step) * 1.5);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.filter-field{gap:calc(var(--step) * .75);flex-direction:column;display:flex}.filter-field>label,.filter-field legend{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:11px}.tag-input{align-items:center;gap:var(--step);padding:calc(var(--step) * .5);border:1px solid var(--rule-firm);background:var(--paper);border-radius:2px;flex-wrap:wrap;display:flex}.tag-input input{min-width:80px;font:inherit;background:0 0;border:none;flex:1;font-size:15px}.tag-input input:focus{outline:none}.tag-chip{background:var(--cobalt);color:var(--paper);border-radius:2px;align-items:center;gap:.4rem;padding:.2rem .6rem;font-size:13px;display:inline-flex}.tag-chip button{color:currentColor;cursor:pointer;background:0 0;border:none;min-width:0;min-height:0;margin:0;padding:0;font-size:16px;line-height:1;display:inline}.tag-chip button:hover{opacity:.8}.filter-field select{font-family:var(--body);color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);cursor:pointer;border-radius:0;padding:.4rem .7rem;font-size:15px}.filter-field select:hover{border-color:var(--cobalt)}.filter-checkbox-group{border:none;margin:0;padding:0}.filter-checkbox-option{cursor:pointer;align-items:center;gap:.5rem;padding:.4rem 0;font-size:15px;display:flex}.filter-checkbox-option input{cursor:pointer}.bottom-panel{border-top:1px solid var(--rule-firm);background:var(--sheet);flex-direction:column;min-height:0;display:flex}.bottom-panel-tabs{align-items:stretch;gap:0;min-height:32px;display:flex}.bottom-panel-tab{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--quiet);border:none;border-right:1px solid var(--rule);cursor:pointer;background:0 0;border-bottom:2px solid #0000;padding:0 .9rem;font-size:12px}.bottom-panel-tab:hover{color:var(--ink)}.bottom-panel-tab[aria-selected=true]{color:var(--ink);background:var(--paper);border-bottom-color:var(--cobalt)}.bottom-panel-summary{font-family:var(--utility);color:var(--quiet);align-items:center;padding-inline:.9rem;font-size:12px;display:flex}.bottom-panel-collapse{min-width:32px;min-height:32px;color:var(--quiet);border:none;border-left:1px solid var(--rule);cursor:pointer;background:0 0;margin-left:auto;font-size:12px}.bottom-panel-collapse:hover{color:var(--ink)}.bottom-panel-body{border-top:1px solid var(--rule);background:var(--paper);min-height:0;max-height:42dvh;overflow:auto}.query-tab{gap:calc(var(--step) * 2);padding:calc(var(--step) * 1.5);grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);display:grid}.query-tab>div{min-width:0}.query-tab h3{margin:0 0 var(--step);font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:11px;font-weight:400}.query-tab-fields{gap:calc(var(--step) * 1.5);flex-direction:column;display:flex}.query-tab-outcome>h3:not(:first-child){margin-top:calc(var(--step) * 2)}.query-match-count{font-family:var(--display);margin:0;font-size:15px}.query-match-count strong{font-size:28px;font-weight:400;line-height:1}.query-outcome-stale,.query-outcome-note{margin:var(--step) 0 0;color:var(--quiet);font-size:13px}.query-outcome-empty{margin:var(--step) 0 0;color:var(--ochre);font-size:13px}.query-exclusions{margin:0;padding:0;list-style:none}.query-exclusions>li+li{margin-top:var(--step)}.query-exclusions ul{margin:calc(var(--step) * .5) 0 0;padding-left:calc(var(--step) * 2);color:var(--quiet);font-size:13px;list-style:none}.query-exclusion-facet{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);font-size:11px}.query-exclusion-count{font-family:var(--utility);color:var(--quiet);font-size:11px}.query-exclusion-more{font-style:italic}.query-tab-document{flex-direction:column;min-height:0;display:flex}.query-document{min-height:0;max-height:22dvh;padding:var(--step);border:1px solid var(--rule);background:var(--sheet);font-family:var(--utility);flex:1;margin:0;font-size:12px;line-height:1.5;overflow:auto}.query-tab-actions{align-items:center;gap:var(--step);margin-top:var(--step);display:flex}.query-tab-actions button{min-height:32px;font-family:var(--utility);letter-spacing:.08em;color:var(--paper);background:var(--cobalt);border:1px solid var(--cobalt);cursor:pointer;border-radius:0;padding:0 .7rem;font-size:12px}.query-tab-actions button:disabled{color:var(--quiet);background:var(--paper);border-color:var(--rule-firm);cursor:default}.query-stage-status{color:var(--quiet);font-size:13px}@media (max-width:899px){.command-strip{gap:calc(var(--step) * .5);padding-inline:var(--step)}.command-identity,.command-actions{gap:calc(var(--step) * .5)}.workspace{grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-height:0}.view-tree{border-right:0;border-bottom:1px solid var(--rule);max-height:34dvh}.conversation-separator{display:none}.query-tab{grid-template-columns:minmax(0,1fr)}.bottom-panel-body{max-height:30dvh}.section-stack{border-top:1px solid var(--rule);border-left:0;max-height:56dvh}.conversation-reopen{border-left:0;border-top:1px solid var(--rule);flex-direction:row;justify-content:center;width:auto;height:auto;min-height:24px;padding:0}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.save-view-control{display:contents}.save-view-toggle{padding:0 calc(var(--step) * .75rem);border:1px solid var(--rule-firm);background:var(--paper);height:32px;color:var(--ink);cursor:pointer;border-radius:2px;font-size:13px}.save-view-toggle:hover:not(:disabled){border-color:var(--rule);background:color-mix(in oklab, var(--paper) 90%, var(--ink))}.save-view-toggle:disabled{opacity:.5;cursor:not-allowed}.save-view-control{z-index:20;background:color-mix(in oklab, var(--ink) 22%, transparent);place-items:center;display:grid;position:fixed;inset:0}.save-view-panel{background:var(--sheet);border:1px solid var(--rule-firm);border-radius:4px;box-shadow:0 8px 28px #1323392e}.save-view-panel-body{padding:calc(var(--step) * 1.5);min-width:300px}.save-view-form{gap:calc(var(--step) * 1);flex-direction:column;display:flex}.save-view-form div{gap:calc(var(--step) * .5);flex-direction:column;display:flex}.save-view-form label{color:var(--ink);font-size:12px;font-weight:500}.save-view-form input,.save-view-form textarea{padding:calc(var(--step) * .5);border:1px solid var(--rule);font-family:var(--body);border-radius:2px;font-size:13px}.save-view-actions{gap:calc(var(--step) * 1);margin-top:calc(var(--step) * .5);display:flex}.save-view-actions button{padding:calc(var(--step) * .5) calc(var(--step) * 1);border:1px solid var(--rule-firm);background:var(--paper);color:var(--ink);cursor:pointer;border-radius:2px;flex:1;font-size:13px}.save-view-actions button:hover:not(:disabled){background:color-mix(in oklab, var(--paper) 85%, var(--ink))}.save-view-notice{align-items:center;gap:calc(var(--step) * .75);padding:calc(var(--step) * .75) calc(var(--step) * 1.5);background:color-mix(in oklab, var(--eucalyptus) 15%, var(--sheet));border:1px solid var(--eucalyptus);color:var(--ink);border-radius:4px;font-size:13px;display:flex}.save-view-notice button{padding:0 calc(var(--step) * .5);color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;margin-left:auto;font-size:11px;text-decoration:underline}.confirm-dialog-backdrop{z-index:1000;background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.confirm-dialog{background:var(--sheet);border:1px solid var(--rule-firm);padding:calc(var(--step) * 2);text-align:center;border-radius:8px;max-width:400px;box-shadow:0 8px 24px #00000029}.confirm-dialog h2{margin:0 0 calc(var(--step) * 1) 0;font-size:16px}.confirm-dialog p{margin:0 0 calc(var(--step) * 1.5) 0;color:var(--quiet);font-size:13px}.confirm-dialog-actions{gap:calc(var(--step) * 1);display:flex}.confirm-dialog-actions button{padding:calc(var(--step) * .75);border:1px solid var(--rule-firm);background:var(--paper);color:var(--ink);cursor:pointer;border-radius:2px;flex:1;font-size:13px}.confirm-dialog-actions button:hover{background:color-mix(in oklab, var(--paper) 85%, var(--ink))}.changeset-tray{padding:calc(var(--step) * 1.5) calc(var(--step) * 2.5);border-top:1px solid var(--rule);background:color-mix(in srgb, var(--sheet) 92%, var(--cobalt) 8%)}.changeset-heading-row{justify-content:space-between;align-items:baseline;gap:var(--step);display:flex}.changeset-heading-row h2{font-family:var(--display);margin:0;font-size:15px}.changeset-discard-all{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.changeset-history-controls{align-items:baseline;gap:var(--step);display:flex}.changeset-undo,.changeset-redo{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;text-decoration:underline}.changeset-undo:disabled,.changeset-redo:disabled{color:var(--quiet);cursor:not-allowed;text-decoration:none}.changeset-rows{margin:var(--step) 0 0;gap:calc(var(--step) * .75);padding:0;list-style:none;display:grid}.changeset-row{padding:calc(var(--step) * .75);border:1px solid var(--rule-firm);background:var(--paper);border-radius:2px}.changeset-row.conflicted{border-color:var(--ochre);background:color-mix(in oklab, var(--ochre) 6%, var(--paper))}.changeset-row-conflict{margin:calc(var(--step) * .5) 0 0;font-family:var(--utility);color:var(--ochre);font-size:11px}.changeset-row-line{justify-content:space-between;align-items:center;gap:var(--step);display:flex}.changeset-row-label{overflow-wrap:anywhere;min-width:0;font-family:var(--utility);color:var(--ink);font-size:12px}.changeset-row-discard{color:var(--eucalyptus);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-size:11px;text-decoration:underline}.changeset-row-diagnostics,.changeset-batch-diagnostics{margin:calc(var(--step) * .5) 0 0;font-family:var(--utility);color:var(--failure);padding-left:1.1rem;font-size:11px}.changeset-batch-diagnostics{margin:0 0 var(--step)}.changeset-row-diagnostics .code,.changeset-batch-diagnostics .code{font-weight:700}.changeset-row-diagnostics .where,.changeset-batch-diagnostics .where{color:var(--quiet);margin-left:.4rem}.changeset-actions{margin-top:var(--step)}.changeset-commit{width:100%;padding:calc(var(--step) * .75);border:1px solid var(--cobalt);background:var(--cobalt);color:var(--paper);cursor:pointer;border-radius:2px;font-size:13px}.changeset-commit:disabled{border-color:var(--rule-firm);color:var(--quiet);cursor:not-allowed;background:0 0}.changeset-notice{margin-top:var(--step);padding:calc(var(--step) * .75) calc(var(--step) * 1);border:1px solid var(--eucalyptus);background:color-mix(in oklab, var(--eucalyptus) 15%, var(--sheet));color:var(--ink);border-radius:4px;font-size:12px}.changeset-notice p{margin:0 0 calc(var(--step) * .25);font-weight:700}.changeset-notice ul{font-family:var(--utility);margin:0;padding-left:1.1rem}.layout-notice-pill{inset:var(--step) var(--step) auto auto;z-index:4;align-items:center;gap:var(--step);max-width:calc(100% - var(--step) * 2);border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute}.layout-notice-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.subject-form{gap:calc(var(--step) * 1.25);margin:calc(var(--step) * 1) 0;flex-direction:column;display:flex}.subject-form-field{gap:calc(var(--step) * .35);flex-direction:column;display:flex}.subject-form-label{font-family:var(--utility);letter-spacing:.02em;text-transform:uppercase;color:var(--quiet);font-size:11px}.subject-form-field input[type=text],.subject-form-field select{border:1px solid var(--rule-firm);border-radius:calc(var(--step) * .5);background:var(--paper);font-family:var(--body);color:var(--ink);padding:.35rem .5rem;font-size:13px}.subject-fact-value{font-family:var(--body);color:var(--ink);overflow-wrap:anywhere;font-size:13px}.subject-form-list{border-top:1px solid var(--rule);padding-top:calc(var(--step) * .75)}.subject-form-row{align-items:flex-start;gap:calc(var(--step) * .5);margin-bottom:calc(var(--step) * .5);display:flex}.subject-form-row-body{align-items:center;gap:calc(var(--step) * .5);flex-wrap:wrap;flex:1;display:flex}.subject-form-toggle{align-items:center;gap:calc(var(--step) * .35);font-family:var(--utility);color:var(--quiet);font-size:12px;display:flex}.subject-form-row-add,.subject-form-row-remove{border:1px solid var(--rule-firm);border-radius:calc(var(--step) * .5);background:var(--sheet);font-family:var(--utility);cursor:pointer;padding:.25rem .6rem;font-size:12px}.context-menu{z-index:1100;min-width:184px;max-width:280px;max-height:70vh;padding:calc(var(--step) * .5) 0;background:var(--sheet);border:1px solid var(--rule-firm);border-radius:2px;position:fixed;overflow-y:auto;box-shadow:0 8px 24px #00000029}.context-menu:focus{outline:none}.context-menu ul{margin:0;padding:0;list-style:none}.context-menu-group+.context-menu-group{margin-top:calc(var(--step) * .5);padding-top:calc(var(--step) * .5);border-top:1px solid var(--rule)}.context-menu-destructive{margin-top:calc(var(--step) * .5);padding-top:calc(var(--step) * .5);border-top:1px solid var(--rule-firm)}.context-menu-heading{padding:calc(var(--step) * .5) calc(var(--step) * 1.5);font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);margin:0;font-size:10px}.context-menu-item{align-items:center;gap:calc(var(--step) * .75);width:100%;padding:.3rem calc(var(--step) * 1.5);font:inherit;text-align:left;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:0;font-size:13px;display:flex}.context-menu-item:hover{background:color-mix(in oklab, var(--cobalt) 10%, transparent)}.context-menu-destructive .context-menu-item{color:var(--failure)}.context-menu-destructive .context-menu-item:hover{background:color-mix(in oklab, var(--failure) 12%, transparent)}.context-menu-tick{width:8px;font-family:var(--utility);color:var(--cobalt);flex:none;font-size:12px}.context-menu-label{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.changeset-row-scope{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;padding:0 calc(var(--step) * .5);border:1px solid var(--rule);color:var(--quiet);border-radius:2px;flex:none;font-size:10px}.changeset-scope-view{color:var(--cobalt);border-color:color-mix(in oklab, var(--cobalt) 40%, transparent)}.prompt-dialog-form{gap:calc(var(--step) * .75);text-align:left;flex-direction:column;display:flex}.prompt-dialog-form label{font-family:var(--utility);letter-spacing:.08em;text-transform:uppercase;color:var(--quiet);font-size:10px}.prompt-dialog-form input{padding:calc(var(--step) * .75);font:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--rule-firm);border-radius:2px;font-size:13px}.prompt-dialog-form input:focus{border-color:var(--cobalt)}.prompt-dialog-form .confirm-dialog-actions{margin-top:calc(var(--step) * .5)}.open-questions{gap:var(--step);padding:var(--step) 0;flex-direction:column;display:flex}.open-questions-scope,.open-questions-catalogue{color:var(--quiet);margin:0;font-size:.78rem}.question-list{gap:calc(var(--step) * .75);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.question-row{gap:calc(var(--step) * .25);flex-direction:column;display:flex}.question-text{font-size:.85rem;line-height:1.35}.question-meta{gap:var(--step);align-items:baseline;display:flex}.question-authority{letter-spacing:.04em;text-transform:uppercase;color:var(--quiet);border:1px solid var(--quiet);padding:0 calc(var(--step) * .75);border-radius:999px;font-size:.68rem;font-weight:600}.question-since{color:var(--quiet);font-size:.72rem}.saved-layout-pill{inset:auto auto var(--step) var(--step);z-index:4;align-items:center;gap:var(--step);max-width:calc(100% - var(--step) * 2);border:1px solid var(--rule-firm);background:var(--sheet);font-family:var(--utility);color:var(--ink);border-radius:999px;padding:.35rem .7rem;font-size:12px;display:flex;position:absolute}.saved-layout-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.saved-layout-pill button{color:var(--cobalt);font-family:inherit;font-size:inherit;cursor:pointer;background:0 0;border:none;flex:none;padding:0;text-decoration:underline}.saved-layout-pill button:hover{color:var(--ink)}.zoom-controls{inset:auto var(--step) var(--step) auto;z-index:4;border:1px solid var(--rule-firm);border-radius:calc(var(--step) * .75);background:var(--sheet);align-items:stretch;display:flex;position:absolute;overflow:hidden}.zoom-controls button{color:var(--ink);font-family:var(--utility);cursor:pointer;background:0 0;border:none;padding:.3rem .6rem;font-size:13px;line-height:1}.zoom-controls button+button{border-left:1px solid var(--rule)}.zoom-controls button:hover{background:var(--paper)}.tree-row-staged .tree-label{font-style:italic}.tree-row-staged-delete .tree-label{text-decoration:line-through}.tree-staged{font-family:var(--utility);letter-spacing:.06em;text-transform:uppercase;color:var(--quiet);border:1px solid var(--rule-firm);border-radius:2px;flex:none;padding:0 .3em;font-size:9px}.tree-row-active .tree-staged{color:inherit;opacity:.75;border-color:currentColor}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -59,7 +59,7 @@ export declare const declaredFolder: (view: {
|
|
|
59
59
|
*
|
|
60
60
|
* Every other presentation field the view declared is carried through by
|
|
61
61
|
* `composeProjection`, so a rename cannot quietly drop a nesting vocabulary or
|
|
62
|
-
*
|
|
62
|
+
* the direction the view runs.
|
|
63
63
|
*/
|
|
64
64
|
export declare const renameView: (view: SavedView, title: string) => {
|
|
65
65
|
readonly path: string;
|
|
@@ -10,11 +10,41 @@ import type { VISUAL_PROTOCOL_VERSION, VisualApplyResultPayload, VisualAuthority
|
|
|
10
10
|
* that serves it — this module holds types only, and every dependency it has on
|
|
11
11
|
* the protocol is type-only too.
|
|
12
12
|
*/
|
|
13
|
+
/** One open question, as the question panel and a node's chip read it. */
|
|
14
|
+
export interface VisualQuestionEntry {
|
|
15
|
+
readonly questionId: string;
|
|
16
|
+
/** Rendered phrasing — per-subject questions arrive already interpolated. */
|
|
17
|
+
readonly question: string;
|
|
18
|
+
readonly authority: 'human' | 'agent' | 'either';
|
|
19
|
+
readonly since?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The interrogation report, folded for drawing (#292).
|
|
23
|
+
*
|
|
24
|
+
* Derived per successful recompile from the same compile the graph came
|
|
25
|
+
* from, and never stored — the stateless-interview rule as the canvas sees
|
|
26
|
+
* it. Optional on the model: a host that computes no overlay ships none,
|
|
27
|
+
* and the app draws no chips rather than zeros.
|
|
28
|
+
*/
|
|
29
|
+
export interface VisualInterrogationOverlay {
|
|
30
|
+
/** `id@version` of the catalogue that asked. */
|
|
31
|
+
readonly catalogue: string;
|
|
32
|
+
/** Engine condition-semantics version (ADR 0106), carried so a consumer
|
|
33
|
+
* can tell "the model moved" from "the engine moved". */
|
|
34
|
+
readonly semantics: string;
|
|
35
|
+
/** Workspace-scoped open questions — they name no subject, so they are
|
|
36
|
+
* shown when nothing is selected rather than pinned to a node. */
|
|
37
|
+
readonly workspace: readonly VisualQuestionEntry[];
|
|
38
|
+
/** Open questions per qualified subject id — `CanvasNode.id`'s space. */
|
|
39
|
+
readonly subjects: Readonly<Record<string, readonly VisualQuestionEntry[]>>;
|
|
40
|
+
}
|
|
13
41
|
/** The resolved graph a session renders, as the browser receives it. */
|
|
14
42
|
export interface VisualRenderedModel {
|
|
15
43
|
readonly authority: VisualAuthority;
|
|
16
44
|
readonly initialView: string;
|
|
17
45
|
readonly graph: CanvasGraph;
|
|
46
|
+
/** Present only when the host evaluated the catalogue for this compile. */
|
|
47
|
+
readonly interrogation?: VisualInterrogationOverlay;
|
|
18
48
|
/** Manifest-relative document paths — the add-concept target dropdown. */
|
|
19
49
|
readonly documents: readonly string[];
|
|
20
50
|
readonly vocabulary: {
|
|
@@ -5,7 +5,7 @@ import type { VisualDiagnostic, VisualViewOperation } from "./protocol-contract.
|
|
|
5
5
|
import type { ProjectionDefinition, ProjectionExclusion, ProjectionQuery } from "../../projection.js";
|
|
6
6
|
import type { ResolvedProfileContext, SemanticGraph } from "../../compiler.js";
|
|
7
7
|
import type { VisualKindOption, VisualViewSummary } from "./protocol-contract.js";
|
|
8
|
-
import type { VisualRenderedModel } from "./wire.js";
|
|
8
|
+
import type { VisualInterrogationOverlay, VisualRenderedModel } from "./wire.js";
|
|
9
9
|
/**
|
|
10
10
|
* What a workspace looks like to the editor, however the editor is being run
|
|
11
11
|
* (#252).
|
|
@@ -41,17 +41,49 @@ export declare const kindOptionsOf: (lineages: ReadonlyMap<string, readonly stri
|
|
|
41
41
|
* them would read as five, and the reviewer counting boxes would find three.
|
|
42
42
|
*/
|
|
43
43
|
export declare const conceptCountOf: (graph: SemanticGraph, query: ProjectionQuery, profileContext: ResolvedProfileContext) => number;
|
|
44
|
+
/**
|
|
45
|
+
* Folds one interrogation report into what the canvas draws (#292).
|
|
46
|
+
*
|
|
47
|
+
* Undefined — never a throw — when the catalogue does not load: the overlay
|
|
48
|
+
* is a garnish on the model, and a model frame must not be blocked by it.
|
|
49
|
+
* Subject ids come from the same compiled graph as `CanvasNode.id`, so the
|
|
50
|
+
* join in the browser is a plain lookup.
|
|
51
|
+
*/
|
|
52
|
+
export interface DismissedQuestion {
|
|
53
|
+
readonly questionId: string;
|
|
54
|
+
/** Absent dismisses the question wherever it appears. */
|
|
55
|
+
readonly subject?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare const interrogationOverlayOf: (compiled: {
|
|
58
|
+
readonly graph: SemanticGraph;
|
|
59
|
+
readonly profileContext: ResolvedProfileContext;
|
|
60
|
+
}, catalogue: {
|
|
61
|
+
readonly path: string;
|
|
62
|
+
readonly source: string;
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* What the host has already dealt with (#328). Evaluation is unchanged and
|
|
66
|
+
* the model is untouched: this decides only what the pane draws, because a
|
|
67
|
+
* question set aside in the host's own product should not be asked again by
|
|
68
|
+
* a pane embedded in it.
|
|
69
|
+
*/
|
|
70
|
+
dismissed?: readonly DismissedQuestion[]) => VisualInterrogationOverlay | undefined;
|
|
44
71
|
/**
|
|
45
72
|
* Rebuilds the shared editor workspace from one successful compile.
|
|
46
73
|
*
|
|
47
74
|
* The caller owns metadata which cannot be inferred from a graph (authority,
|
|
48
75
|
* source revisions, layouts, and initial view); this helper owns all derived
|
|
49
|
-
* canvas, vocabulary,
|
|
76
|
+
* canvas, vocabulary, view-count, and interrogation arithmetic. `catalogue`
|
|
77
|
+
* is the question catalogue's bytes — this module cannot read files, so
|
|
78
|
+
* whoever can hands them over; omitting it ships a model with no overlay.
|
|
50
79
|
*/
|
|
51
80
|
export declare const renderedWorkspaceOf: (compiled: {
|
|
52
81
|
readonly graph: SemanticGraph;
|
|
53
82
|
readonly profileContext: ResolvedProfileContext;
|
|
54
|
-
}, views: readonly VisualViewSummary[], metadata: Omit<VisualRenderedModel, "graph" | "vocabulary"
|
|
83
|
+
}, views: readonly VisualViewSummary[], metadata: Omit<VisualRenderedModel, "graph" | "vocabulary" | "interrogation">, catalogue?: {
|
|
84
|
+
readonly path: string;
|
|
85
|
+
readonly source: string;
|
|
86
|
+
}, dismissed?: readonly DismissedQuestion[]) => {
|
|
55
87
|
readonly model: VisualRenderedModel;
|
|
56
88
|
readonly views: readonly VisualViewSummary[];
|
|
57
89
|
};
|
|
@@ -74,6 +74,18 @@ export interface ResolvedProfileContext {
|
|
|
74
74
|
/** Kind identity -> the core kind it resolves to through lineage. */
|
|
75
75
|
readonly conceptKindCoreAncestors: ReadonlyMap<string, CoreConceptKindId>;
|
|
76
76
|
readonly relationshipKindCoreAncestors: ReadonlyMap<string, RelationshipKind>;
|
|
77
|
+
/**
|
|
78
|
+
* The core relationship kinds a pattern PORTS for a concept kind (#268
|
|
79
|
+
* phase 3, ADR 0124), keyed by kind identity. Only kinds that have a
|
|
80
|
+
* pattern with ports appear.
|
|
81
|
+
*
|
|
82
|
+
* A macro edge needs both ends to port its kind, so a consumer offering a
|
|
83
|
+
* palette between two instances intersects the two sets. Two raw groupings
|
|
84
|
+
* permit ten of the eleven kinds, which is no narrowing at all; the ports
|
|
85
|
+
* are what restore the guidance the relationship table gives everywhere
|
|
86
|
+
* else.
|
|
87
|
+
*/
|
|
88
|
+
readonly patternPortKinds: ReadonlyMap<string, readonly RelationshipKind[]>;
|
|
77
89
|
/**
|
|
78
90
|
* The core relationship kinds the ArchiMate table permits between two
|
|
79
91
|
* concept kind identities, resolved through lineage; undefined when either
|
|
@@ -104,7 +116,7 @@ export type ContextualCompilationResult = {
|
|
|
104
116
|
*/
|
|
105
117
|
export interface ParsedWorkspaceSource {
|
|
106
118
|
readonly source: string;
|
|
107
|
-
readonly kind: 'profile' | 'document';
|
|
119
|
+
readonly kind: 'profile' | 'document' | 'pattern';
|
|
108
120
|
readonly value: unknown;
|
|
109
121
|
readonly schemaDiagnostics: readonly Diagnostic[];
|
|
110
122
|
/**
|
|
@@ -9,8 +9,14 @@ import type { YarramateOperation } from './operations.js';
|
|
|
9
9
|
* about a name produces worse ids than a transliteration of the name does.
|
|
10
10
|
* Returning null rather than a placeholder keeps a subject called `"???"` from
|
|
11
11
|
* landing as `subject-1`, which nothing could later be traced back from.
|
|
12
|
+
*
|
|
13
|
+
* `reserved` carries ids the graph does not know yet: a staged-but-uncommitted
|
|
14
|
+
* draft never enters the rendered graph, so without it a second subject whose
|
|
15
|
+
* name slugs to the same id re-proposed it and the editor's replace-by-target
|
|
16
|
+
* staging silently swallowed the first (#315) - the identical blind spot
|
|
17
|
+
* `proposeRelationshipId` had before #306's fix, and the identical way out.
|
|
12
18
|
*/
|
|
13
|
-
export declare const proposeConceptId: (graph: CanvasGraph, name: string) => string | null;
|
|
19
|
+
export declare const proposeConceptId: (graph: CanvasGraph, name: string, reserved?: Iterable<string>) => string | null;
|
|
14
20
|
/**
|
|
15
21
|
* The operation that lands a new subject, or `null` when the draft is one no
|
|
16
22
|
* document could accept.
|
|
@@ -19,9 +25,14 @@ export declare const proposeConceptId: (graph: CanvasGraph, name: string) => str
|
|
|
19
25
|
* a kind outside it here, rather than trusting the caller's palette, is the
|
|
20
26
|
* same posture `draftRelationship` takes: the guarantee has to hold for any
|
|
21
27
|
* caller, not only one that filtered first.
|
|
28
|
+
*
|
|
29
|
+
* A caller holding drafts the graph has not landed yet - an editor with a
|
|
30
|
+
* pending changeset - passes their ids as `reserved`, so a second subject
|
|
31
|
+
* slugging to a taken id steps to `-2` instead of colliding with the first
|
|
32
|
+
* (#315).
|
|
22
33
|
*/
|
|
23
34
|
export declare const draftConcept: (graph: CanvasGraph, input: {
|
|
24
35
|
readonly name: string;
|
|
25
36
|
readonly kind: string;
|
|
26
37
|
readonly document: string;
|
|
27
|
-
}, kinds: readonly string[]) => YarramateOperation | null;
|
|
38
|
+
}, kinds: readonly string[], reserved?: Iterable<string>) => YarramateOperation | null;
|
|
@@ -14,6 +14,16 @@ export interface CanvasNode {
|
|
|
14
14
|
* profile kind it was authored as.
|
|
15
15
|
*/
|
|
16
16
|
readonly coreKindLabel: string;
|
|
17
|
+
/**
|
|
18
|
+
* The core relationship kinds this node's PATTERN ports, or `[]` where its
|
|
19
|
+
* kind has no pattern with ports (#268 phase 3, ADR 0124).
|
|
20
|
+
*
|
|
21
|
+
* A macro edge needs both ends to port its kind, so an editor offering a
|
|
22
|
+
* palette between two instances intersects the two lists. Two raw groupings
|
|
23
|
+
* permit ten of the eleven kinds, which is no guidance at all; this is what
|
|
24
|
+
* restores the narrowing the relationship table gives everywhere else.
|
|
25
|
+
*/
|
|
26
|
+
readonly portKinds: readonly string[];
|
|
17
27
|
readonly layer: Layer | null;
|
|
18
28
|
readonly aspect: Aspect | null;
|
|
19
29
|
readonly name: string;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { Diagnostic, ResolvedProfileContext, SemanticGraph, WorkspaceSource } from './compiler.js';
|
|
2
|
+
/**
|
|
3
|
+
* The version of condition evaluation itself, not of the package.
|
|
4
|
+
*
|
|
5
|
+
* A report says which catalogue asked its questions. It could not say which
|
|
6
|
+
* engine answered them, so a consumer holding stored answers could tell a
|
|
7
|
+
* model change from a catalogue deepening (via `since`) but not from a change
|
|
8
|
+
* in what a condition means. ADR 0097 replaced four aspect rules with the
|
|
9
|
+
* ArchiMate 3.2 table and flipped `missing-relationship` answers for unchanged
|
|
10
|
+
* models and unchanged questions; ADR 0083's `unconstrained-kind` goes
|
|
11
|
+
* near-empty under that same table. Neither was visible in any report.
|
|
12
|
+
*
|
|
13
|
+
* **Bump this when an existing question's answer can change for an unchanged
|
|
14
|
+
* model.** Do not bump it for anything else: not a release, not a new
|
|
15
|
+
* condition, not a catalogue edit, not a rendering change. A version that
|
|
16
|
+
* moves when answers did not is a version consumers learn to ignore.
|
|
17
|
+
*
|
|
18
|
+
* `test/interrogation-semantics.test.ts` fingerprints every condition against
|
|
19
|
+
* a fixture and fails if evaluation moves without this bumping, so the rule is
|
|
20
|
+
* enforced rather than remembered.
|
|
21
|
+
*/
|
|
22
|
+
export declare const INTERROGATION_SEMANTICS_VERSION = "1";
|
|
23
|
+
export interface CatalogueSelector {
|
|
24
|
+
/**
|
|
25
|
+
* Kinds to select. Absent selects every concept, which is what a
|
|
26
|
+
* kind-agnostic condition wants: succession can be declared on any subject,
|
|
27
|
+
* so enumerating the kinds that may carry it would be a list nobody can keep
|
|
28
|
+
* right rather than a constraint (ADR 0109).
|
|
29
|
+
*/
|
|
30
|
+
readonly kinds?: readonly string[];
|
|
31
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
32
|
+
readonly statuses?: readonly string[];
|
|
33
|
+
readonly documents?: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
export type CatalogueCondition = {
|
|
36
|
+
readonly condition: 'missing-claim';
|
|
37
|
+
readonly predicate: string;
|
|
38
|
+
} | {
|
|
39
|
+
readonly condition: 'missing-relationship';
|
|
40
|
+
readonly kinds: readonly string[];
|
|
41
|
+
readonly direction: 'incoming' | 'outgoing' | 'any';
|
|
42
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
43
|
+
} | {
|
|
44
|
+
readonly condition: 'isolated';
|
|
45
|
+
} | {
|
|
46
|
+
readonly condition: 'no-subject-of-kind';
|
|
47
|
+
readonly kinds: readonly string[];
|
|
48
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
49
|
+
} | {
|
|
50
|
+
readonly condition: 'no-state-defined';
|
|
51
|
+
} | {
|
|
52
|
+
readonly condition: 'missing-linkage';
|
|
53
|
+
readonly kinds: readonly string[];
|
|
54
|
+
readonly direction: 'incoming' | 'outgoing';
|
|
55
|
+
readonly counterpartKinds: readonly string[];
|
|
56
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
57
|
+
} | {
|
|
58
|
+
readonly condition: 'has-linkage';
|
|
59
|
+
readonly kinds: readonly string[];
|
|
60
|
+
readonly direction: 'incoming' | 'outgoing' | 'either';
|
|
61
|
+
readonly counterpartKinds: readonly string[];
|
|
62
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
63
|
+
} | {
|
|
64
|
+
readonly condition: 'exists-linkage';
|
|
65
|
+
readonly kinds: readonly string[];
|
|
66
|
+
readonly direction: 'incoming' | 'outgoing' | 'either';
|
|
67
|
+
readonly counterpartKinds: readonly string[];
|
|
68
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
69
|
+
} | {
|
|
70
|
+
readonly condition: 'missing-constraint';
|
|
71
|
+
readonly kinds: readonly string[];
|
|
72
|
+
readonly kindMatching?: 'exact' | 'descendants';
|
|
73
|
+
} | {
|
|
74
|
+
readonly condition: 'missing-flow-content';
|
|
75
|
+
} | {
|
|
76
|
+
readonly condition: 'missing-reference';
|
|
77
|
+
readonly predicate: string;
|
|
78
|
+
readonly direction: 'incoming' | 'outgoing';
|
|
79
|
+
} | {
|
|
80
|
+
readonly condition: 'missing-attestation';
|
|
81
|
+
readonly topic: string;
|
|
82
|
+
} | {
|
|
83
|
+
readonly condition: 'near-duplicate';
|
|
84
|
+
} | {
|
|
85
|
+
readonly condition: 'unconstrained-kind';
|
|
86
|
+
} | {
|
|
87
|
+
readonly condition: 'unscoped-succession';
|
|
88
|
+
} | {
|
|
89
|
+
readonly condition: 'unchallenged-evidence';
|
|
90
|
+
} | {
|
|
91
|
+
readonly condition: 'has-any-subject';
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* One observation from the workspace's evidence overlay, reduced to what
|
|
95
|
+
* interrogation reads: the result, and whether a search was recorded with
|
|
96
|
+
* it. The only condition that reads the overlay is `unchallenged-evidence`;
|
|
97
|
+
* every other condition reads the compiled graph alone, and the overlay
|
|
98
|
+
* never influences which subjects a selector matches.
|
|
99
|
+
*
|
|
100
|
+
* Shaped structurally rather than importing {@link EvidenceObservation} so
|
|
101
|
+
* the pure engine entry (`./interrogation-entry`) keeps owning its whole
|
|
102
|
+
* input surface: a caller passes
|
|
103
|
+
* `evidenceDocuments.flatMap(({ observations }) => observations)` and the
|
|
104
|
+
* wider evidence shape is never dragged in.
|
|
105
|
+
*/
|
|
106
|
+
export interface CatalogueEvidenceObservation {
|
|
107
|
+
readonly result: 'confirmed' | 'contradicted' | 'unknown' | 'not-observed';
|
|
108
|
+
readonly searched?: readonly unknown[];
|
|
109
|
+
}
|
|
110
|
+
export interface CatalogueQuestion {
|
|
111
|
+
readonly id: string;
|
|
112
|
+
readonly wave: string;
|
|
113
|
+
readonly scope: 'workspace' | 'subject';
|
|
114
|
+
readonly subjects?: CatalogueSelector;
|
|
115
|
+
readonly trigger: readonly CatalogueCondition[];
|
|
116
|
+
readonly question: string;
|
|
117
|
+
readonly askPlain?: string;
|
|
118
|
+
readonly materiality: string;
|
|
119
|
+
readonly resolution: string;
|
|
120
|
+
readonly authority: 'human' | 'agent' | 'either';
|
|
121
|
+
readonly since?: string;
|
|
122
|
+
}
|
|
123
|
+
export interface QuestionCatalogue {
|
|
124
|
+
readonly format: 'yarramate/question-catalogue/v1';
|
|
125
|
+
readonly id: string;
|
|
126
|
+
readonly version: string;
|
|
127
|
+
readonly profile: string;
|
|
128
|
+
readonly presentation?: {
|
|
129
|
+
readonly title?: string;
|
|
130
|
+
readonly description?: string;
|
|
131
|
+
};
|
|
132
|
+
readonly waves: readonly {
|
|
133
|
+
readonly id: string;
|
|
134
|
+
readonly name: string;
|
|
135
|
+
readonly description?: string;
|
|
136
|
+
/**
|
|
137
|
+
* Conditions that must all hold before this wave opens (#334, ADR 0125).
|
|
138
|
+
* Absent means always open, which is what every wave did before this.
|
|
139
|
+
*/
|
|
140
|
+
readonly opensWhen?: readonly CatalogueCondition[];
|
|
141
|
+
}[];
|
|
142
|
+
readonly questions: readonly CatalogueQuestion[];
|
|
143
|
+
}
|
|
144
|
+
export interface OpenSubject {
|
|
145
|
+
readonly id: string;
|
|
146
|
+
readonly name?: string;
|
|
147
|
+
readonly question: string;
|
|
148
|
+
}
|
|
149
|
+
export interface ReportQuestion {
|
|
150
|
+
readonly id: string;
|
|
151
|
+
readonly scope: 'workspace' | 'subject';
|
|
152
|
+
readonly authority: 'human' | 'agent' | 'either';
|
|
153
|
+
readonly open: boolean;
|
|
154
|
+
readonly question: string;
|
|
155
|
+
readonly materiality: string;
|
|
156
|
+
readonly resolution: string;
|
|
157
|
+
/**
|
|
158
|
+
* The catalogue trigger, verbatim (#289). The conditions that opened a
|
|
159
|
+
* question are its machine-readable answer shape: a host builds the
|
|
160
|
+
* matching affordance (a prefilled form, an operations skeleton) from
|
|
161
|
+
* them instead of re-deriving the shape from its own catalogue copy and
|
|
162
|
+
* drifting from engine semantics.
|
|
163
|
+
*/
|
|
164
|
+
readonly trigger: readonly CatalogueCondition[];
|
|
165
|
+
readonly since?: string;
|
|
166
|
+
readonly subjects?: readonly OpenSubject[];
|
|
167
|
+
}
|
|
168
|
+
export interface ReportWave {
|
|
169
|
+
readonly id: string;
|
|
170
|
+
readonly name: string;
|
|
171
|
+
/**
|
|
172
|
+
* Whether the wave's gate is met (#334, ADR 0125). A wave with no
|
|
173
|
+
* `opensWhen` is always open.
|
|
174
|
+
*
|
|
175
|
+
* A wave reported `false` carries NO questions and contributes nothing to
|
|
176
|
+
* the summary. Its questions are premature rather than answered, and a
|
|
177
|
+
* progress rail that counted them as answered would flatter itself exactly
|
|
178
|
+
* where someone is most likely to trust it.
|
|
179
|
+
*/
|
|
180
|
+
readonly opened: boolean;
|
|
181
|
+
readonly questions: readonly ReportQuestion[];
|
|
182
|
+
}
|
|
183
|
+
export interface InterrogationSummary {
|
|
184
|
+
readonly questions: number;
|
|
185
|
+
readonly openQuestions: number;
|
|
186
|
+
readonly open: number;
|
|
187
|
+
}
|
|
188
|
+
export interface InterrogationReport {
|
|
189
|
+
readonly format: 'yarramate/interrogation-report/v1';
|
|
190
|
+
readonly workspace: string;
|
|
191
|
+
readonly catalogue: string;
|
|
192
|
+
/** {@link INTERROGATION_SEMANTICS_VERSION} at the time of evaluation. */
|
|
193
|
+
readonly semantics: string;
|
|
194
|
+
readonly summary: InterrogationSummary;
|
|
195
|
+
readonly waves: readonly ReportWave[];
|
|
196
|
+
}
|
|
197
|
+
export declare const renderQuestion: (template: string, subjectId: string, subjectName: string | undefined, counterparts?: readonly string[]) => string;
|
|
198
|
+
export declare function evaluateCatalogue(catalogue: QuestionCatalogue, graph: SemanticGraph, profileContext?: ResolvedProfileContext, evidence?: readonly CatalogueEvidenceObservation[]): Omit<InterrogationReport, 'workspace'>;
|
|
199
|
+
export type CatalogueLoadResult = {
|
|
200
|
+
readonly ok: true;
|
|
201
|
+
readonly catalogue: QuestionCatalogue;
|
|
202
|
+
} | {
|
|
203
|
+
readonly ok: false;
|
|
204
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
205
|
+
};
|
|
206
|
+
export declare function loadQuestionCatalogue(catalogueSource: WorkspaceSource): CatalogueLoadResult;
|
|
207
|
+
export declare function renderInterrogationReport(report: InterrogationReport): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which way a view runs its layers, kept in a module that imports nothing.
|
|
3
|
+
*
|
|
4
|
+
* Here rather than in `projection.ts` for the reason `./nesting.ts` gives: the
|
|
5
|
+
* browser needs the value and not only the type, and `projection.ts` drags Ajv
|
|
6
|
+
* and the projection schema in for one constant. `projection.ts` re-exports
|
|
7
|
+
* both.
|
|
8
|
+
*/
|
|
9
|
+
export type LayoutDirection = 'top-down' | 'left-right';
|
|
10
|
+
/**
|
|
11
|
+
* How a view runs when it does not say. Top-down is the behaviour that
|
|
12
|
+
* shipped, and it is what ArchiMate's layer bands read as (ADR 0121).
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_DIRECTION: LayoutDirection;
|
|
@@ -6,6 +6,16 @@ export interface ProjectionDefinition {
|
|
|
6
6
|
readonly version: string;
|
|
7
7
|
readonly query: {
|
|
8
8
|
readonly subjects?: readonly string[];
|
|
9
|
+
/**
|
|
10
|
+
* Subjects this query would otherwise select and the author has taken out
|
|
11
|
+
* (#267, ADR 0122). A facet view states a rule, and every interesting rule
|
|
12
|
+
* has an exception someone would rather state than abandon the rule for;
|
|
13
|
+
* this is where that exception is written down instead of being the silent
|
|
14
|
+
* absence a hand-enumerated list produces. Applied after every other facet
|
|
15
|
+
* AND after `relationships: connected` expansion, so an excluded subject is
|
|
16
|
+
* out whichever way it would have come back in.
|
|
17
|
+
*/
|
|
18
|
+
readonly exclude?: readonly string[];
|
|
9
19
|
readonly documents?: readonly string[];
|
|
10
20
|
readonly kinds?: readonly string[];
|
|
11
21
|
readonly layers?: readonly string[];
|
|
@@ -24,12 +34,12 @@ export interface ProjectionDefinition {
|
|
|
24
34
|
readonly description?: string;
|
|
25
35
|
readonly layout?: 'layered';
|
|
26
36
|
/**
|
|
27
|
-
* Read by the LikeC4 export for its
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
37
|
+
* Which way this view runs its layers. Read by the LikeC4 export for its
|
|
38
|
+
* `autoLayout` and by the canvas for ELK's `elk.direction` (ADR 0121); a
|
|
39
|
+
* view that says nothing runs `top-down`, which is what ArchiMate's layer
|
|
40
|
+
* bands read as.
|
|
31
41
|
*/
|
|
32
|
-
readonly direction?:
|
|
42
|
+
readonly direction?: LayoutDirection;
|
|
33
43
|
/**
|
|
34
44
|
* The relationship kinds that draw as nesting in this view, in precedence
|
|
35
45
|
* order (ADR 0101). Absent means `['composition']`, which is the behaviour
|
|
@@ -64,6 +74,12 @@ export interface ProjectionDefinition {
|
|
|
64
74
|
*/
|
|
65
75
|
export { DEFAULT_NESTING, type NestingKind } from './nesting.js';
|
|
66
76
|
import type { NestingKind } from './nesting.js';
|
|
77
|
+
/**
|
|
78
|
+
* Which way a view runs, and the default. Split out for the same reason as the
|
|
79
|
+
* nesting vocabulary above, and re-exported here on the same terms (ADR 0121).
|
|
80
|
+
*/
|
|
81
|
+
export { DEFAULT_DIRECTION, type LayoutDirection } from './layout-direction.js';
|
|
82
|
+
import type { LayoutDirection } from './layout-direction.js';
|
|
67
83
|
export type ProjectionQuery = ProjectionDefinition['query'];
|
|
68
84
|
export interface ProjectionResult {
|
|
69
85
|
readonly format: 'yarramate/projection-result/v1';
|
|
@@ -86,7 +102,7 @@ export declare function canonicalProjection(projection: ProjectionDefinition): P
|
|
|
86
102
|
* A facet of a query, named the way the query names it. What
|
|
87
103
|
* {@link explainProjection} reports as the reason a subject is not in a view.
|
|
88
104
|
*/
|
|
89
|
-
export type ConceptFacet = 'states' | 'subjects' | 'documents' | 'kinds' | 'layers' | 'statuses' | 'excludeStatuses' | 'owners' | 'constraints';
|
|
105
|
+
export type ConceptFacet = 'exclude' | 'states' | 'subjects' | 'documents' | 'kinds' | 'layers' | 'statuses' | 'excludeStatuses' | 'owners' | 'constraints';
|
|
90
106
|
/** One subject a query dropped, and the facet that dropped it. */
|
|
91
107
|
export interface ProjectionExclusion {
|
|
92
108
|
readonly id: string;
|