yarramate 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catalogues/core-enrichment.yaml +225 -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 +23 -3
- package/dist/adapters/visual/workspace-model.js +52 -2
- package/dist/ask-command.js +29 -13
- 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/concept-drafting.d.ts +13 -2
- package/dist/concept-drafting.js +15 -3
- package/dist/design-command.js +16 -1
- package/dist/evidence.js +25 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/interrogate-command.d.ts +20 -1
- package/dist/interrogate-command.js +23 -4
- 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 +33 -3
- package/dist/subject-references.js +5 -0
- package/dist/visual-app/assets/index-C3i9SxTe.js +394 -0
- package/dist/visual-app/assets/index-Rkq6smL2.css +1 -0
- package/dist/visual-app/index.html +2 -2
- package/dist/visual-app-lib/editor.js +28464 -26953
- 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 +23 -3
- package/dist/visual-app-lib/types/concept-drafting.d.ts +13 -2
- package/dist/visual-app-lib/types/interrogate-command.d.ts +190 -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/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/docs/CONSUMING-YARRAMATE.md +40 -0
- package/package.json +1 -1
- package/schema/yarramate-design-step.schema.json +13 -0
- package/schema/yarramate-interrogation-report.schema.json +13 -0
- package/schema/yarramate-projection.schema.json +9 -0
- package/schema/yarramate-question-catalogue.schema.json +13 -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,37 @@ 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 declare const interrogationOverlayOf: (compiled: {
|
|
53
|
+
readonly graph: SemanticGraph;
|
|
54
|
+
readonly profileContext: ResolvedProfileContext;
|
|
55
|
+
}, catalogue: {
|
|
56
|
+
readonly path: string;
|
|
57
|
+
readonly source: string;
|
|
58
|
+
}) => VisualInterrogationOverlay | undefined;
|
|
44
59
|
/**
|
|
45
60
|
* Rebuilds the shared editor workspace from one successful compile.
|
|
46
61
|
*
|
|
47
62
|
* The caller owns metadata which cannot be inferred from a graph (authority,
|
|
48
63
|
* source revisions, layouts, and initial view); this helper owns all derived
|
|
49
|
-
* canvas, vocabulary,
|
|
64
|
+
* canvas, vocabulary, view-count, and interrogation arithmetic. `catalogue`
|
|
65
|
+
* is the question catalogue's bytes — this module cannot read files, so
|
|
66
|
+
* whoever can hands them over; omitting it ships a model with no overlay.
|
|
50
67
|
*/
|
|
51
68
|
export declare const renderedWorkspaceOf: (compiled: {
|
|
52
69
|
readonly graph: SemanticGraph;
|
|
53
70
|
readonly profileContext: ResolvedProfileContext;
|
|
54
|
-
}, views: readonly VisualViewSummary[], metadata: Omit<VisualRenderedModel, "graph" | "vocabulary"
|
|
71
|
+
}, views: readonly VisualViewSummary[], metadata: Omit<VisualRenderedModel, "graph" | "vocabulary" | "interrogation">, catalogue?: {
|
|
72
|
+
readonly path: string;
|
|
73
|
+
readonly source: string;
|
|
74
|
+
}) => {
|
|
55
75
|
readonly model: VisualRenderedModel;
|
|
56
76
|
readonly views: readonly VisualViewSummary[];
|
|
57
77
|
};
|
|
@@ -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;
|
|
@@ -0,0 +1,190 @@
|
|
|
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
|
+
/**
|
|
92
|
+
* One observation from the workspace's evidence overlay, reduced to what
|
|
93
|
+
* interrogation reads: the result, and whether a search was recorded with
|
|
94
|
+
* it. The only condition that reads the overlay is `unchallenged-evidence`;
|
|
95
|
+
* every other condition reads the compiled graph alone, and the overlay
|
|
96
|
+
* never influences which subjects a selector matches.
|
|
97
|
+
*
|
|
98
|
+
* Shaped structurally rather than importing {@link EvidenceObservation} so
|
|
99
|
+
* the pure engine entry (`./interrogation-entry`) keeps owning its whole
|
|
100
|
+
* input surface: a caller passes
|
|
101
|
+
* `evidenceDocuments.flatMap(({ observations }) => observations)` and the
|
|
102
|
+
* wider evidence shape is never dragged in.
|
|
103
|
+
*/
|
|
104
|
+
export interface CatalogueEvidenceObservation {
|
|
105
|
+
readonly result: 'confirmed' | 'contradicted' | 'unknown' | 'not-observed';
|
|
106
|
+
readonly searched?: readonly unknown[];
|
|
107
|
+
}
|
|
108
|
+
export interface CatalogueQuestion {
|
|
109
|
+
readonly id: string;
|
|
110
|
+
readonly wave: string;
|
|
111
|
+
readonly scope: 'workspace' | 'subject';
|
|
112
|
+
readonly subjects?: CatalogueSelector;
|
|
113
|
+
readonly trigger: readonly CatalogueCondition[];
|
|
114
|
+
readonly question: string;
|
|
115
|
+
readonly askPlain?: string;
|
|
116
|
+
readonly materiality: string;
|
|
117
|
+
readonly resolution: string;
|
|
118
|
+
readonly authority: 'human' | 'agent' | 'either';
|
|
119
|
+
readonly since?: string;
|
|
120
|
+
}
|
|
121
|
+
export interface QuestionCatalogue {
|
|
122
|
+
readonly format: 'yarramate/question-catalogue/v1';
|
|
123
|
+
readonly id: string;
|
|
124
|
+
readonly version: string;
|
|
125
|
+
readonly profile: string;
|
|
126
|
+
readonly presentation?: {
|
|
127
|
+
readonly title?: string;
|
|
128
|
+
readonly description?: string;
|
|
129
|
+
};
|
|
130
|
+
readonly waves: readonly {
|
|
131
|
+
readonly id: string;
|
|
132
|
+
readonly name: string;
|
|
133
|
+
readonly description?: string;
|
|
134
|
+
}[];
|
|
135
|
+
readonly questions: readonly CatalogueQuestion[];
|
|
136
|
+
}
|
|
137
|
+
export interface OpenSubject {
|
|
138
|
+
readonly id: string;
|
|
139
|
+
readonly name?: string;
|
|
140
|
+
readonly question: string;
|
|
141
|
+
}
|
|
142
|
+
export interface ReportQuestion {
|
|
143
|
+
readonly id: string;
|
|
144
|
+
readonly scope: 'workspace' | 'subject';
|
|
145
|
+
readonly authority: 'human' | 'agent' | 'either';
|
|
146
|
+
readonly open: boolean;
|
|
147
|
+
readonly question: string;
|
|
148
|
+
readonly materiality: string;
|
|
149
|
+
readonly resolution: string;
|
|
150
|
+
/**
|
|
151
|
+
* The catalogue trigger, verbatim (#289). The conditions that opened a
|
|
152
|
+
* question are its machine-readable answer shape: a host builds the
|
|
153
|
+
* matching affordance (a prefilled form, an operations skeleton) from
|
|
154
|
+
* them instead of re-deriving the shape from its own catalogue copy and
|
|
155
|
+
* drifting from engine semantics.
|
|
156
|
+
*/
|
|
157
|
+
readonly trigger: readonly CatalogueCondition[];
|
|
158
|
+
readonly since?: string;
|
|
159
|
+
readonly subjects?: readonly OpenSubject[];
|
|
160
|
+
}
|
|
161
|
+
export interface ReportWave {
|
|
162
|
+
readonly id: string;
|
|
163
|
+
readonly name: string;
|
|
164
|
+
readonly questions: readonly ReportQuestion[];
|
|
165
|
+
}
|
|
166
|
+
export interface InterrogationSummary {
|
|
167
|
+
readonly questions: number;
|
|
168
|
+
readonly openQuestions: number;
|
|
169
|
+
readonly open: number;
|
|
170
|
+
}
|
|
171
|
+
export interface InterrogationReport {
|
|
172
|
+
readonly format: 'yarramate/interrogation-report/v1';
|
|
173
|
+
readonly workspace: string;
|
|
174
|
+
readonly catalogue: string;
|
|
175
|
+
/** {@link INTERROGATION_SEMANTICS_VERSION} at the time of evaluation. */
|
|
176
|
+
readonly semantics: string;
|
|
177
|
+
readonly summary: InterrogationSummary;
|
|
178
|
+
readonly waves: readonly ReportWave[];
|
|
179
|
+
}
|
|
180
|
+
export declare const renderQuestion: (template: string, subjectId: string, subjectName: string | undefined, counterparts?: readonly string[]) => string;
|
|
181
|
+
export declare function evaluateCatalogue(catalogue: QuestionCatalogue, graph: SemanticGraph, profileContext?: ResolvedProfileContext, evidence?: readonly CatalogueEvidenceObservation[]): Omit<InterrogationReport, 'workspace'>;
|
|
182
|
+
export type CatalogueLoadResult = {
|
|
183
|
+
readonly ok: true;
|
|
184
|
+
readonly catalogue: QuestionCatalogue;
|
|
185
|
+
} | {
|
|
186
|
+
readonly ok: false;
|
|
187
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
188
|
+
};
|
|
189
|
+
export declare function loadQuestionCatalogue(catalogueSource: WorkspaceSource): CatalogueLoadResult;
|
|
190
|
+
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;
|
|
@@ -33,8 +33,16 @@ export declare const connectableKinds: (graph: CanvasGraph, fromId: string, toId
|
|
|
33
33
|
* relationship kind is a single lowercase word. A collision takes a numeric
|
|
34
34
|
* suffix rather than a hash, because the id is authored text a human will read
|
|
35
35
|
* in a diff.
|
|
36
|
+
*
|
|
37
|
+
* `reserved` carries ids the graph does not know yet: a staged-but-uncommitted
|
|
38
|
+
* draft never enters the rendered graph, so without it a second relationship
|
|
39
|
+
* between the same pair re-proposed the identical id and the editor's
|
|
40
|
+
* replace-by-target staging silently swallowed the first (#306). The schema
|
|
41
|
+
* places no uniqueness on the (from, kind, to) triple - parallel relationships
|
|
42
|
+
* with distinct ids compile cleanly - so the id proposal is the only place the
|
|
43
|
+
* collision can be stepped past.
|
|
36
44
|
*/
|
|
37
|
-
export declare const proposeRelationshipId: (graph: CanvasGraph, fromId: string, kind: RelationshipKind, toId: string) => string;
|
|
45
|
+
export declare const proposeRelationshipId: (graph: CanvasGraph, fromId: string, kind: RelationshipKind, toId: string, reserved?: Iterable<string>) => string;
|
|
38
46
|
/**
|
|
39
47
|
* The operation that lands a drafted relationship, or `null` when the draft is
|
|
40
48
|
* one the table does not permit.
|
|
@@ -47,5 +55,16 @@ export declare const proposeRelationshipId: (graph: CanvasGraph, fromId: string,
|
|
|
47
55
|
* relationship has to live somewhere, both endpoints are equally defensible,
|
|
48
56
|
* and the source is where a reader looking for what this thing does would go
|
|
49
57
|
* first.
|
|
58
|
+
*
|
|
59
|
+
* A caller holding drafts the graph has not landed yet - an editor with a
|
|
60
|
+
* pending changeset - passes their ids as `reserved`, so a second parallel
|
|
61
|
+
* relationship steps to `-2` instead of colliding with the first (#306).
|
|
62
|
+
*/
|
|
63
|
+
export declare const draftRelationship: (graph: CanvasGraph, fromId: string, kind: RelationshipKind, toId: string, reserved?: Iterable<string>) => YarramateOperation | null;
|
|
64
|
+
/**
|
|
65
|
+
* The ids a pending changeset already claims, for `proposeRelationshipId`'s
|
|
66
|
+
* `reserved` parameter. Every operation that names a subject id reserves it -
|
|
67
|
+
* an update's id is already in the graph and reserving it twice is harmless,
|
|
68
|
+
* while an add's id is exactly the one the graph cannot know yet.
|
|
50
69
|
*/
|
|
51
|
-
export declare const
|
|
70
|
+
export declare const stagedSubjectIds: (operations: readonly YarramateOperation[]) => readonly string[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const normalizeLabel: (label: string) => readonly string[];
|
|
2
|
+
export declare const headTokens: (tokens: readonly string[]) => readonly string[];
|
|
3
|
+
export declare const similarity: (left: string, right: string) => number;
|
|
4
|
+
export interface IdentitySubject {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly kind: string;
|
|
7
|
+
readonly labels: readonly string[];
|
|
8
|
+
readonly owner?: string;
|
|
9
|
+
readonly neighbours: ReadonlySet<string>;
|
|
10
|
+
readonly distinctFrom: ReadonlySet<string>;
|
|
11
|
+
}
|
|
12
|
+
export interface NearDuplicatePair {
|
|
13
|
+
readonly left: string;
|
|
14
|
+
readonly right: string;
|
|
15
|
+
readonly score: number;
|
|
16
|
+
readonly corroboration: 'lexical' | 'owner' | 'neighbourhood';
|
|
17
|
+
}
|
|
18
|
+
export declare const strongLexicalThreshold = 0.95;
|
|
19
|
+
export declare const moderateLexicalThreshold = 0.8;
|
|
20
|
+
export declare const lexicalScore: (left: IdentitySubject, right: IdentitySubject) => number;
|
|
21
|
+
/**
|
|
22
|
+
* Every candidate near-duplicate pair, sorted by subject id. Only subjects
|
|
23
|
+
* of the same qualified kind are compared: kind is the cheapest structural
|
|
24
|
+
* disagreement there is, and it also bounds the pairwise cost to the square
|
|
25
|
+
* of the largest kind bucket rather than of the whole model.
|
|
26
|
+
*/
|
|
27
|
+
export declare const findNearDuplicates: (subjects: readonly IdentitySubject[]) => readonly NearDuplicatePair[];
|
|
28
|
+
/**
|
|
29
|
+
* Both members of every candidate pair, mapped to their counterparts. The
|
|
30
|
+
* question attaches to both sides deliberately: `ask --advise` filters open
|
|
31
|
+
* questions to the subjects in a slice, so a finding recorded only against
|
|
32
|
+
* the lexically-first member would vanish from a slice seeded on the other.
|
|
33
|
+
*/
|
|
34
|
+
export declare const nearDuplicateIndex: (subjects: readonly IdentitySubject[]) => ReadonlyMap<string, readonly string[]>;
|