diff --git a/AGENTS.md b/AGENTS.md index 8d20957c..32f3f895 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,23 +33,26 @@ discovery document with full JSON Schema input declarations for every tool. https://thhanke.github.io/ontosphere/.well-known/mcp.json ``` -**Key tools** (30+ total — see manifest for full schemas): +**Key tools** (31 total — see manifest for full schemas): | Tool | Purpose | |------|---------| -| `loadOntology` | Load TBox (schema/classes) — no canvas nodes | -| `loadRdf` | Load ABox (individuals) — subjects appear as canvas nodes | +| `loadOntology` | Load TBox (schema/classes) — no canvas nodes. Also search/list registered ontologies | +| `suggestOntologiesForTask` | Suggest ontology packs for a task description | +| `loadRdf` | Load ABox (individuals) or inline Turtle — subjects appear as canvas nodes | | `addNode` / `removeNode` | Add/remove individual canvas nodes | | `addLink` / `removeLink` | Add/remove object-property triples | -| `queryGraph` | SPARQL SELECT / CONSTRUCT against the RDF store | +| `queryGraph` | SPARQL SELECT / CONSTRUCT / UPDATE against the RDF store | | `runReasoning` | OWL-RL inference — inferred triples in `urn:vg:inferred` | | `runLayout` | Layout: `dagre-lr`, `dagre-tb`, `elk-layered`, `elk-force`, … | | `focusNode` / `fitCanvas` | Pan/zoom viewport | -| `exportImage` | Export full canvas as SVG or PNG | +| `exportImage` | Export canvas as SVG or PNG (focused or full) | | `exportGraph` | Export RDF store as Turtle / JSON-LD / RDF-XML | | `getNodes` / `getLinks` | Inspect current canvas state | | `getNeighbors` / `findPath` | Graph traversal queries | | `loadShacl` / `validateGraph` | SHACL constraint validation | +| `setNamespace` / `listNamespaces` | Register/list IRI prefixes (upsert) | +| `expandNode` | Expand one node or all nodes (omit iri) to show properties | | `getCapabilities` / `help` | Discover tools at runtime | ## How to call tools @@ -85,10 +88,25 @@ Full setup: [docs/relay-bridge.md](docs/relay-bridge.md) **Relay starter prompt:** ``` -You are connected to Ontosphere via a relay. A script in this tab intercepts -your JSON-RPC 2.0 tool calls (wrapped in backtick fences), runs them in -Ontosphere, and injects results back as a user message. All computation runs -client-side. Full tool list: https://thhanke.github.io/ontosphere/.well-known/mcp.json +You control Ontosphere (browser-based RDF knowledge graph editor) via this relay. + +CALL FORMAT — single backtick per JSON-RPC object, up to 5 per message: +`{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"TOOLNAME","arguments":ARGS}}` + +Example — layout + fit + export in one message: +`{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr"}}}` +`{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"fitCanvas","arguments":{}}}` +`{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"exportImage","arguments":{"format":"svg"}}}` + +RULES: +1. Single ` NOT triple ```. Increment id per call. +2. Batch up to 5 non-dependent calls. Discovery calls (getNodes, queryGraph) send alone, wait for result. +3. addLink: both nodes must exist first. +4. 5+ individuals: loadRdf(turtle=...) not N×addNode. +5. Tool failed? Call help({tool:"toolname"}) for the exact schema. + +Full docs: call help({}). +Full tool list: https://thhanke.github.io/ontosphere/.well-known/mcp.json ``` ## Graph architecture (read before building) @@ -107,31 +125,51 @@ amber dashed edges. Clear them with `clearInferred`. ## Recommended workflow ``` -loadOntology(url) # TBox — classes/properties searchable, no canvas nodes +suggestOntologiesForTask({ task: '…' }) # discover which ontology packs to use ↓ -getNodes({ labelContains: '…' }) # IRI lookup from TBox +loadOntology({ url: '' }) × N # TBox — classes/properties, no canvas nodes ↓ -addNode × N (typeIri from lookup) # ABox individuals on canvas +setNamespace({ prefix: '…', namespace: '…' }) × N # register short IRIs (upsert) ↓ -addLink × N # subjectIri / predicateIri / objectIri +setViewMode({ mode: 'abox' }) + ↓ +loadRdf({ turtle: '…' }) # preferred for 5+ individuals (one round-trip) + OR +addNode × N → addLink × N # for small numbers of nodes ↓ runLayout({ algorithm: 'dagre-lr' }) ↓ -runReasoning({}) # OWL-RL → urn:vg:inferred +runReasoning({}) # OWL-RL → urn:vg:inferred ↓ -focusNode({ iri }) → browser_take_screenshot # show the user +fitCanvas() + exportImage({ format: 'svg' }) [safe to batch with runLayout] ↓ -exportGraph({ format: 'turtle' }) # persist +exportGraph({ format: 'turtle' }) # persist ``` -**Never call `expandAll` after loading a large ontology** — it floods the -canvas with thousands of TBox nodes. +**Batching guidance:** +- Safe to batch: `loadOntology` × N, `addNode` + `addLink` pairs, `runLayout` + `fitCanvas` + `exportImage` +- Send alone: `getNodes`, `queryGraph`, `getNodeDetails` — you need the result before deciding what to call next + +## Anti-patterns — never do these + +| Wrong | Right | Why | +|-------|-------|-----| +| `addLink({s, p, o})` | `addLink({subjectIri, predicateIri, objectIri})` | Wrong param names | +| `addNode({iri, type})` | `addNode({iri, typeIri})` | `type` is not the canonical name (though accepted as alias) | +| `loadOntology({url:"calendar"})` to search | `loadOntology({query:"calendar"})` | `url` loads by prefix; `query` searches | +| `expandNode` in a loop over every IRI | `expandNode({})` (no iri) | Expands all in one call | +| SPARQL without PREFIX | Add `PREFIX owl: <…>` etc. | No implicit prefixes | +| `addLink` before `addNode` for both endpoints | `addNode` both endpoints first | Canvas links only connect existing nodes | +| N×`addNode` for 5+ individuals | `loadRdf({turtle:"…"})` | One round-trip is far faster | ## Common parameter mistakes | Tool | Wrong | Right | |------|-------|-------| | `addLink` | `{ s, p, o }` | `{ subjectIri, predicateIri, objectIri }` | +| `loadOntology` (search) | `{ url: "calendar" }` | `{ query: "calendar" }` | +| `expandNode` (expand all) | loop over each IRI | call with no `iri`: `expandNode({})` | +| `expandNode` (collapse all) | loop with `expand:false` | `expandNode({expand:false})` — compact canvas before export | | SPARQL | bare `owl:Class` | declare `PREFIX owl: <…>` in every query | ## Example sessions (rendered demos) @@ -180,7 +218,7 @@ SELECT DISTINCT ?prop ?label WHERE { ## SPARQL caveats -- Every query needs explicit `PREFIX` declarations — there are no implicit prefixes. +- All prefixes in your namespace registry (from `loadOntology` or `setNamespace`) are **auto-injected** into every SPARQL query — you do not need to declare them. Only declare prefixes that are not registered. - `FILTER(STRSTARTS(STR(?s), '...'))` in SELECT/CONSTRUCT does **not** reliably filter triples (N3.js limitation) — returns full store. Use named graphs or check `urn:vg:inferred` instead. - Inferred triples are stored in the `urn:vg:inferred` named graph. @@ -208,7 +246,7 @@ Key IRIs for modeling material compositions with PMDCO v3: | iron atom | `http://purl.obolibrary.org/obo/CHEBI_18248` | | carbon atom | `http://purl.obolibrary.org/obo/CHEBI_27594` | -After `loadOntology`, `pmd:` registers as `https://w3id.org/pmd/co/`. Check with `listNamespaces({})`. All SPARQL queries still need full `PREFIX` declarations. +After `loadOntology`, `pmd:` registers as `https://w3id.org/pmd/co/`. Check with `listNamespaces({})`. The `pmd:` prefix is then auto-injected into all SPARQL queries — no explicit PREFIX declaration needed. ## More reading diff --git a/README.md b/README.md index 6a1fac36..62a94a77 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Key capabilities - **Namespace management**: edit namespace URIs directly in the legend panel (rename propagates across all stored triples). Colour-coded namespace badges on nodes and edges. - Export the current graph as Turtle, RDF/XML, or JSON-LD. - **Workflow catalog**: drag reusable workflow template cards from the sidebar onto the canvas to instantiate connected subgraphs. -- **MCP support**: exposes a Model Context Protocol server (via the browser's `navigator.modelContext` API) for AI-agent integration. Tools: `loadRdf`, `loadOntology`, `suggestOntologiesForTask`, `queryGraph`, `exportGraph`, `exportImage`, `addNode`, `removeNode`, `expandNode`, `expandAll`, `getNodes`, `addLink`, `removeLink`, `getLinks`, `runLayout`, `clusterNodes`, `layoutNodes`, `focusNode`, `fitCanvas`, `runReasoning`, `clearInferred`, `getNeighbors`, `findPath`, `getNodeDetails`, `updateNode`, `getGraphState`, `addNamespace`, `updateNamespace`, `removeNamespace`, `listNamespaces`, `loadShacl`, `validateGraph`, `getCapabilities`, `help`. MCP manifest at `/.well-known/mcp.json`. +- **MCP support**: exposes a Model Context Protocol server (via the browser's `navigator.modelContext` API) for AI-agent integration. Tools: `loadRdf`, `loadOntology`, `suggestOntologiesForTask`, `queryGraph`, `exportGraph`, `exportImage`, `addNode`, `removeNode`, `expandNode`, `getNodes`, `addLink`, `removeLink`, `getLinks`, `runLayout`, `clusterNodes`, `layoutNodes`, `focusNode`, `fitCanvas`, `runReasoning`, `clearInferred`, `getNeighbors`, `findPath`, `getNodeDetails`, `updateNode`, `getGraphState`, `setNamespace`, `removeNamespace`, `listNamespaces`, `loadShacl`, `validateGraph`, `getCapabilities`, `help`. MCP manifest at `/.well-known/mcp.json`. Quick start (development) ------------------------- @@ -367,7 +367,7 @@ Ontosphere exposes a full [Model Context Protocol](https://modelcontextprotocol. The app has two coupled layers: - **N3 RDF store** — source of truth. `addNode` / `addLink` write triples here. -- **Reactodia canvas** — visual mirror. Nodes are *not* created automatically from triples; you must call `addNode` to place a subject on canvas. After adding triples, canvas links refresh automatically. Nodes start collapsed — call `expandNode` or `expandAll` to reveal annotation property cards. +- **Reactodia canvas** — visual mirror. Nodes are *not* created automatically from triples; you must call `addNode` to place a subject on canvas. After adding triples, canvas links refresh automatically. Nodes start collapsed — call `expandNode` (with an IRI to expand one node, or no args to expand all) to reveal annotation property cards. OWL-RL reasoning writes inferred triples back to the store and refreshes the canvas. @@ -411,7 +411,7 @@ loadOntology (TBox) → addNode ×N (ABox individuals, rdf:type set) → addLink ×N (object-property triples, edges appear on canvas) → runLayout (dagre-lr recommended) - → expandAll (reveal annotation property cards) + → expandNode (reveal annotation property cards — omit iri to expand all) → runReasoning (infer subClass / domain / range entailments) → fitCanvas + exportImage (SVG snapshot, token-efficient) → exportGraph(turtle) (final deliverable) diff --git a/docs/mcp-demo/foaf-social-network.md b/docs/mcp-demo/foaf-social-network.md index e159868a..2317d7ea 100644 --- a/docs/mcp-demo/foaf-social-network.md +++ b/docs/mcp-demo/foaf-social-network.md @@ -81,7 +81,7 @@ Canvas: 5 nodes, 6 links `{"jsonrpc":"2.0","id":19,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/ex#collaboratesWith","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.org/ex#Employee"}}}` `{"jsonrpc":"2.0","id":20,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/ex#collaboratesWith","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.org/ex#Employee"}}}` `{"jsonrpc":"2.0","id":21,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":22,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":22,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":23,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -105,7 +105,7 @@ Canvas: 5 nodes, 6 links ✓ addLink: s=collaboratesWith p=domain o=Employee ✓ addLink: s=collaboratesWith p=range o=Employee ✓ runLayout: elk-layered -✓ expandAll +✓ expandNode ✓ runLayout: elk-layered Canvas: 12 nodes, 16 links @@ -182,7 +182,7 @@ Canvas: 8 nodes, 0 links `{"jsonrpc":"2.0","id":47,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/eve","predicateIri":"http://xmlns.com/foaf/0.1/member","objectIri":"http://example.org/research"}}}` `{"jsonrpc":"2.0","id":48,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/frank","predicateIri":"http://xmlns.com/foaf/0.1/member","objectIri":"http://example.org/research"}}}` `{"jsonrpc":"2.0","id":49,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":51,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -204,7 +204,7 @@ Canvas: 8 nodes, 0 links ✓ addLink: s=eve p=member o=research ✓ addLink: s=frank p=member o=research ✓ runLayout: dagre-lr -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 8 nodes, 16 links @@ -229,13 +229,13 @@ Canvas: 8 nodes, 16 links 3 tool calls ✓ `{"jsonrpc":"2.0","id":52,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result [Ontosphere — 3 tools ✓] ✓ runReasoning: 10720 triples inferred -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 8 nodes, 17 links diff --git a/docs/mcp-demo/foaf-social-network/01-tbox.svg b/docs/mcp-demo/foaf-social-network/01-tbox.svg index 57c548a7..03b3b409 100644 --- a/docs/mcp-demo/foaf-social-network/01-tbox.svg +++ b/docs/mcp-demo/foaf-social-network/01-tbox.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -68,8 +68,8 @@ --reactodia-color-emphasis-1000: oklch(25% 0.045 256.8); --reactodia-color-gray-900: oklch(28% 0.043 257.0); --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --reactodia-color-info-darkest: #3b8ba5; --reactodia-color-primary-contrast-background: oklch(100% 0 0); + --reactodia-color-info-darkest: #3b8ba5; --reactodia-paper-panning-overlay-z-index: zIndex.$panning-overlay; --reactodia-color-primary: oklch(67.5% 0.123 290.4); --reactodia-button-default-color-focus: oklch(25% 0.045 256.8); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; - --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; + --reactodia-button-border-width: 1px; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -157,8 +157,8 @@ --reactodia-navigator-viewport-stroke-width: 2; --tw-ring-shadow: 0 0 #0000; --text-2xl: 1.5rem; - --reactodia-spacing-horizontal: 5px; --node-leftbar-width: 8px; + --reactodia-spacing-horizontal: 5px; --tw-drop-shadow-alpha: 100%; --text-lg: 1.125rem; --reactodia-color-primary-dark: oklch(60% 0.140 290.4); @@ -187,8 +187,8 @@ --color-red-400: oklch(70.4% 0.191 22.216); --reactodia-color-primary-light: oklch(77% 0.100 290.4); --reactodia-color-danger-lighter: oklch(90% 0.055 9.2); - --reactodia-color-success-darker: #008b00; --reactodia-color-warning-light: #ffc426; + --reactodia-color-success-darker: #008b00; --reactodia-border-color-base: rgba(255, 255, 255, 0.7); --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; @@ -245,9 +245,9 @@ --container-2xl: 42rem; --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; - --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -272,12 +272,12 @@ --secondary: oklch(90.6% 0.035 173.4); --reactodia-navigator-viewport-fill: oklch(44.6% 0.03 256.802); --blur-sm: 8px; - --glass-blur: blur(14px); --reactodia-navigator-overflow-stroke-width: 2; - --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); + --glass-blur: blur(14px); + --reactodia-color-warning-lightest: #ffdd80; --default-mono-font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --reactodia-color-warning-lightest: #ffdd80; + --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-navigator-scrollable-pane-fill: rgba(255, 255, 255, 0.55); --toast-icon-margin-start: ; --toast-icon-margin-end: ; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
A
Agent
IRI
http://xmlns.com/foaf/0.1/Agent
No annotation properties
owl:Class
P
Person
IRI
http://xmlns.com/foaf/0.1/Person
No annotation properties
owl:Class
O
Organization
IRI
http://xmlns.com/foaf/0.1/Organization
No annotation properties
owl:ObjectProperty
K
knows
IRI
http://xmlns.com/foaf/0.1/knows
No annotation properties
owl:ObjectProperty
M
member
IRI
http://xmlns.com/foaf/0.1/member
No annotation properties
owl:Class
E
Employee
IRI
http://example.org/ex#Employee
No annotation properties
owl:Class
M
Manager
IRI
http://example.org/ex#Manager
No annotation properties
owl:Class
E
Executive
IRI
http://example.org/ex#Executive
No annotation properties
owl:Class
D
Department
IRI
http://example.org/ex#Department
No annotation properties
owl:ObjectProperty
M
manages
IRI
http://example.org/ex#manages
No annotation properties
owl:ObjectProperty
R
reportsTo
IRI
http://example.org/ex#reportsTo
No annotation properties
owl:ObjectProperty, owl:SymmetricProperty
C
collaboratesWith
IRI
http://example.org/ex#collaboratesWith
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
A
Agent
IRI
http://xmlns.com/foaf/0.1/Agent
No annotation properties
owl:Class
P
Person
IRI
http://xmlns.com/foaf/0.1/Person
No annotation properties
owl:Class
O
Organization
IRI
http://xmlns.com/foaf/0.1/Organization
No annotation properties
owl:ObjectProperty
K
knows
IRI
http://xmlns.com/foaf/0.1/knows
No annotation properties
owl:ObjectProperty
M
member
IRI
http://xmlns.com/foaf/0.1/member
No annotation properties
owl:Class
E
Employee
IRI
http://example.org/ex#Employee
No annotation properties
owl:Class
M
Manager
IRI
http://example.org/ex#Manager
No annotation properties
owl:Class
E
Executive
IRI
http://example.org/ex#Executive
No annotation properties
owl:Class
D
Department
IRI
http://example.org/ex#Department
No annotation properties
owl:ObjectProperty
M
manages
IRI
http://example.org/ex#manages
No annotation properties
owl:ObjectProperty
R
reportsTo
IRI
http://example.org/ex#reportsTo
No annotation properties
owl:ObjectProperty, owl:SymmetricProperty
C
collaboratesWith
IRI
http://example.org/ex#collaboratesWith
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/foaf-social-network/02-before-reasoning.svg b/docs/mcp-demo/foaf-social-network/02-before-reasoning.svg index 772d5768..d0b2ebee 100644 --- a/docs/mcp-demo/foaf-social-network/02-before-reasoning.svg +++ b/docs/mcp-demo/foaf-social-network/02-before-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -68,8 +68,8 @@ --reactodia-color-emphasis-1000: oklch(25% 0.045 256.8); --reactodia-color-gray-900: oklch(28% 0.043 257.0); --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --reactodia-color-info-darkest: #3b8ba5; --reactodia-color-primary-contrast-background: oklch(100% 0 0); + --reactodia-color-info-darkest: #3b8ba5; --reactodia-paper-panning-overlay-z-index: zIndex.$panning-overlay; --reactodia-color-primary: oklch(67.5% 0.123 290.4); --reactodia-button-default-color-focus: oklch(25% 0.045 256.8); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; - --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; + --reactodia-button-border-width: 1px; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -157,8 +157,8 @@ --reactodia-navigator-viewport-stroke-width: 2; --tw-ring-shadow: 0 0 #0000; --text-2xl: 1.5rem; - --reactodia-spacing-horizontal: 5px; --node-leftbar-width: 8px; + --reactodia-spacing-horizontal: 5px; --tw-drop-shadow-alpha: 100%; --text-lg: 1.125rem; --reactodia-color-primary-dark: oklch(60% 0.140 290.4); @@ -187,8 +187,8 @@ --color-red-400: oklch(70.4% 0.191 22.216); --reactodia-color-primary-light: oklch(77% 0.100 290.4); --reactodia-color-danger-lighter: oklch(90% 0.055 9.2); - --reactodia-color-success-darker: #008b00; --reactodia-color-warning-light: #ffc426; + --reactodia-color-success-darker: #008b00; --reactodia-border-color-base: rgba(255, 255, 255, 0.7); --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; @@ -245,9 +245,9 @@ --container-2xl: 42rem; --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; - --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -272,12 +272,12 @@ --secondary: oklch(90.6% 0.035 173.4); --reactodia-navigator-viewport-fill: oklch(44.6% 0.03 256.802); --blur-sm: 8px; - --glass-blur: blur(14px); --reactodia-navigator-overflow-stroke-width: 2; - --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); + --glass-blur: blur(14px); + --reactodia-color-warning-lightest: #ffdd80; --default-mono-font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --reactodia-color-warning-lightest: #ffdd80; + --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-navigator-scrollable-pane-fill: rgba(255, 255, 255, 0.55); --toast-icon-margin-start: ; --toast-icon-margin-end: ; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Executive
A
Alice
IRI
http://example.org/alice
knows
http://example.org/eve
manages
http://example.org/bob
http://example.org/frank
B
Bob
IRI
http://example.org/bob
knows
http://example.org/carol
manages
http://example.org/carol
http://example.org/dave
C
Carol
IRI
http://example.org/carol
reportsTo
http://example.org/bob
D
Dave
IRI
http://example.org/dave
reportsTo
http://example.org/bob
collaboratesWith
http://example.org/eve
E
Eve
IRI
http://example.org/eve
No annotation properties
F
Frank
IRI
http://example.org/frank
No annotation properties
Department
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
Executive
A
Alice
IRI
http://example.org/alice
knows
http://example.org/eve
manages
http://example.org/bob
http://example.org/frank
B
Bob
IRI
http://example.org/bob
knows
http://example.org/carol
manages
http://example.org/carol
http://example.org/dave
C
Carol
IRI
http://example.org/carol
reportsTo
http://example.org/bob
D
Dave
IRI
http://example.org/dave
reportsTo
http://example.org/bob
collaboratesWith
http://example.org/eve
E
Eve
IRI
http://example.org/eve
No annotation properties
F
Frank
IRI
http://example.org/frank
No annotation properties
Department
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/foaf-social-network/03-after-reasoning.svg b/docs/mcp-demo/foaf-social-network/03-after-reasoning.svg index bd7e5322..7f4a555d 100644 --- a/docs/mcp-demo/foaf-social-network/03-after-reasoning.svg +++ b/docs/mcp-demo/foaf-social-network/03-after-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -68,8 +68,8 @@ --reactodia-color-emphasis-1000: oklch(25% 0.045 256.8); --reactodia-color-gray-900: oklch(28% 0.043 257.0); --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --reactodia-color-info-darkest: #3b8ba5; --reactodia-color-primary-contrast-background: oklch(100% 0 0); + --reactodia-color-info-darkest: #3b8ba5; --reactodia-paper-panning-overlay-z-index: zIndex.$panning-overlay; --reactodia-color-primary: oklch(67.5% 0.123 290.4); --reactodia-button-default-color-focus: oklch(25% 0.045 256.8); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; - --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; + --reactodia-button-border-width: 1px; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -157,8 +157,8 @@ --reactodia-navigator-viewport-stroke-width: 2; --tw-ring-shadow: 0 0 #0000; --text-2xl: 1.5rem; - --reactodia-spacing-horizontal: 5px; --node-leftbar-width: 8px; + --reactodia-spacing-horizontal: 5px; --tw-drop-shadow-alpha: 100%; --text-lg: 1.125rem; --reactodia-color-primary-dark: oklch(60% 0.140 290.4); @@ -187,8 +187,8 @@ --color-red-400: oklch(70.4% 0.191 22.216); --reactodia-color-primary-light: oklch(77% 0.100 290.4); --reactodia-color-danger-lighter: oklch(90% 0.055 9.2); - --reactodia-color-success-darker: #008b00; --reactodia-color-warning-light: #ffc426; + --reactodia-color-success-darker: #008b00; --reactodia-border-color-base: rgba(255, 255, 255, 0.7); --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; @@ -245,9 +245,9 @@ --container-2xl: 42rem; --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; - --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -272,12 +272,12 @@ --secondary: oklch(90.6% 0.035 173.4); --reactodia-navigator-viewport-fill: oklch(44.6% 0.03 256.802); --blur-sm: 8px; - --glass-blur: blur(14px); --reactodia-navigator-overflow-stroke-width: 2; - --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); + --glass-blur: blur(14px); + --reactodia-color-warning-lightest: #ffdd80; --default-mono-font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --reactodia-color-warning-lightest: #ffdd80; + --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-navigator-scrollable-pane-fill: rgba(255, 255, 255, 0.55); --toast-icon-margin-start: ; --toast-icon-margin-end: ; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Employee, Executive, Manager, Agent, Person
A
Alice
IRI
http://example.org/alice
No annotation properties
Employee, Manager, Agent, Person
B
Bob
IRI
http://example.org/bob
No annotation properties
Employee, Agent, Person
C
Carol
IRI
http://example.org/carol
No annotation properties
Employee, Agent, Person
D
Dave
IRI
http://example.org/dave
No annotation properties
Employee, Agent, Person
E
Eve
IRI
http://example.org/eve
No annotation properties
Employee, Agent, Person
F
Frank
IRI
http://example.org/frank
No annotation properties
Department, Agent, Organization
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department, Agent, Organization
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
Employee, Executive, Manager, Agent, Person
A
Alice
IRI
http://example.org/alice
No annotation properties
Employee, Manager, Agent, Person
B
Bob
IRI
http://example.org/bob
No annotation properties
Employee, Agent, Person
C
Carol
IRI
http://example.org/carol
No annotation properties
Employee, Agent, Person
D
Dave
IRI
http://example.org/dave
No annotation properties
Employee, Agent, Person
E
Eve
IRI
http://example.org/eve
No annotation properties
Employee, Agent, Person
F
Frank
IRI
http://example.org/frank
No annotation properties
Department, Agent, Organization
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department, Agent, Organization
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/foaf-social-network/04-frank-focus.svg b/docs/mcp-demo/foaf-social-network/04-frank-focus.svg index 2e7c56a6..2621783f 100644 --- a/docs/mcp-demo/foaf-social-network/04-frank-focus.svg +++ b/docs/mcp-demo/foaf-social-network/04-frank-focus.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -68,8 +68,8 @@ --reactodia-color-emphasis-1000: oklch(25% 0.045 256.8); --reactodia-color-gray-900: oklch(28% 0.043 257.0); --transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --reactodia-color-info-darkest: #3b8ba5; --reactodia-color-primary-contrast-background: oklch(100% 0 0); + --reactodia-color-info-darkest: #3b8ba5; --reactodia-paper-panning-overlay-z-index: zIndex.$panning-overlay; --reactodia-color-primary: oklch(67.5% 0.123 290.4); --reactodia-button-default-color-focus: oklch(25% 0.045 256.8); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; - --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; + --reactodia-button-border-width: 1px; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -157,8 +157,8 @@ --reactodia-navigator-viewport-stroke-width: 2; --tw-ring-shadow: 0 0 #0000; --text-2xl: 1.5rem; - --reactodia-spacing-horizontal: 5px; --node-leftbar-width: 8px; + --reactodia-spacing-horizontal: 5px; --tw-drop-shadow-alpha: 100%; --text-lg: 1.125rem; --reactodia-color-primary-dark: oklch(60% 0.140 290.4); @@ -187,8 +187,8 @@ --color-red-400: oklch(70.4% 0.191 22.216); --reactodia-color-primary-light: oklch(77% 0.100 290.4); --reactodia-color-danger-lighter: oklch(90% 0.055 9.2); - --reactodia-color-success-darker: #008b00; --reactodia-color-warning-light: #ffc426; + --reactodia-color-success-darker: #008b00; --reactodia-border-color-base: rgba(255, 255, 255, 0.7); --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; @@ -245,9 +245,9 @@ --container-2xl: 42rem; --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; - --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -272,12 +272,12 @@ --secondary: oklch(90.6% 0.035 173.4); --reactodia-navigator-viewport-fill: oklch(44.6% 0.03 256.802); --blur-sm: 8px; - --glass-blur: blur(14px); --reactodia-navigator-overflow-stroke-width: 2; - --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); + --glass-blur: blur(14px); + --reactodia-color-warning-lightest: #ffdd80; --default-mono-font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --reactodia-color-warning-lightest: #ffdd80; + --reactodia-canvas-box-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-navigator-scrollable-pane-fill: rgba(255, 255, 255, 0.55); --toast-icon-margin-start: ; --toast-icon-margin-end: ; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Employee, Executive, Manager, Agent, Person
A
Alice
IRI
http://example.org/alice
No annotation properties
Employee, Manager, Agent, Person
B
Bob
IRI
http://example.org/bob
No annotation properties
Employee, Agent, Person
C
Carol
IRI
http://example.org/carol
No annotation properties
Employee, Agent, Person
D
Dave
IRI
http://example.org/dave
No annotation properties
Employee, Agent, Person
E
Eve
IRI
http://example.org/eve
No annotation properties
Employee, Agent, Person
F
Frank
IRI
http://example.org/frank
No annotation properties
Department, Agent, Organization
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department, Agent, Organization
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
Employee, Executive, Manager, Agent, Person
A
Alice
IRI
http://example.org/alice
No annotation properties
Employee, Manager, Agent, Person
B
Bob
IRI
http://example.org/bob
No annotation properties
Employee, Agent, Person
C
Carol
IRI
http://example.org/carol
No annotation properties
Employee, Agent, Person
D
Dave
IRI
http://example.org/dave
No annotation properties
Employee, Agent, Person
E
Eve
IRI
http://example.org/eve
No annotation properties
Employee, Agent, Person
F
Frank
IRI
http://example.org/frank
No annotation properties
Department, Agent, Organization
E
Engineering
IRI
http://example.org/engineering
No annotation properties
Department, Agent, Organization
R
Research
IRI
http://example.org/research
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial.md b/docs/mcp-demo/pizza-tutorial.md index 8de3562a..0167b9b3 100644 --- a/docs/mcp-demo/pizza-tutorial.md +++ b/docs/mcp-demo/pizza-tutorial.md @@ -254,7 +254,7 @@ all the way up to CheeseTopping and then PizzaTopping — no extra assertions ne `{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#GarlicTopping","predicateIri":"http://www.w3.org/2000/01/rdf-schema#subClassOf","objectIri":"http://www.pizza-ontology.com/pizza.owl#VegetableTopping"}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping","predicateIri":"http://www.w3.org/2000/01/rdf-schema#subClassOf","objectIri":"http://www.pizza-ontology.com/pizza.owl#FishTopping"}}}` `{"jsonrpc":"2.0","id":55,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` -`{"jsonrpc":"2.0","id":56,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":56,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":57,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` ```tool-result @@ -274,7 +274,7 @@ all the way up to CheeseTopping and then PizzaTopping — no extra assertions ne ✓ addLink: s=GarlicTopping p=subClassOf o=VegetableTopping ✓ addLink: s=AnchoviesTopping p=subClassOf o=FishTopping ✓ runLayout: elk-layered -✓ expandAll +✓ expandNode ✓ runLayout: elk-layered Canvas: 20 nodes, 27 links @@ -345,7 +345,7 @@ on the real world. `{"jsonrpc":"2.0","id":72,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#isBaseOf","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://www.pizza-ontology.com/pizza.owl#Pizza"}}}` `{"jsonrpc":"2.0","id":73,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","predicateIri":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type","objectIri":"http://www.w3.org/2002/07/owl#FunctionalProperty"}}}` `{"jsonrpc":"2.0","id":74,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` -`{"jsonrpc":"2.0","id":75,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":75,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":76,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` ```tool-result @@ -360,7 +360,7 @@ on the real world. ✓ addLink: s=isBaseOf p=range o=Pizza ✓ addLink: s=hasBase p=type o=FunctionalProperty ✓ runLayout: elk-layered -✓ expandAll +✓ expandNode ✓ runLayout: elk-layered Canvas: 24 nodes, 37 links @@ -594,7 +594,7 @@ topping the reasoner will use for classification. `{"jsonrpc":"2.0","id":103,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#anch1"}}}` `{"jsonrpc":"2.0","id":104,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#garlic1"}}}` `{"jsonrpc":"2.0","id":105,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","objectIri":"http://www.pizza-ontology.com/pizza.owl#thin2"}}}` -`{"jsonrpc":"2.0","id":106,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":106,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":107,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` ```tool-result @@ -605,7 +605,7 @@ topping the reasoner will use for classification. ✓ addLink: s=pizza3 p=hasTopping o=anch1 ✓ addLink: s=pizza3 p=hasTopping o=garlic1 ✓ addLink: s=pizza3 p=hasBase o=thin2 -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 17 nodes, 10 links @@ -635,7 +635,7 @@ fire and classify it — but we also need to observe what the reasoner says abou `{"jsonrpc":"2.0","id":139,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#olive2"}}}` `{"jsonrpc":"2.0","id":140,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#tom2"}}}` `{"jsonrpc":"2.0","id":141,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","objectIri":"http://www.pizza-ontology.com/pizza.owl#thin3"}}}` -`{"jsonrpc":"2.0","id":142,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":142,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":143,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` `{"jsonrpc":"2.0","id":202,"method":"tools/call","params":{"name":"focusNode","arguments":{"iri":"http://www.pizza-ontology.com/pizza.owl#pizza4"}}}` @@ -648,7 +648,7 @@ fire and classify it — but we also need to observe what the reasoner says abou ✓ addLink: s=pizza4 p=hasTopping o=olive2 ✓ addLink: s=pizza4 p=hasTopping o=tom2 ✓ addLink: s=pizza4 p=hasBase o=thin3 -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr ✓ focusNode @@ -680,13 +680,13 @@ fires on our data: 3 tool calls ✓ `{"jsonrpc":"2.0","id":108,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":109,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":109,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":110,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` ```tool-result [Ontosphere — 3 tools ✓] ✓ runReasoning: 10798 triples inferred -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 21 nodes, 26 links diff --git a/docs/mcp-demo/pizza-tutorial/01-root-classes-bare.svg b/docs/mcp-demo/pizza-tutorial/01-root-classes-bare.svg index 8539f1c7..539d2106 100644 --- a/docs/mcp-demo/pizza-tutorial/01-root-classes-bare.svg +++ b/docs/mcp-demo/pizza-tutorial/01-root-classes-bare.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -344,4 +344,4 @@ .reactodia-overlaid-element { cursor: move; outline: none; } .reactodia-element-decorations { pointer-events: none; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/02-root-disjoint.svg b/docs/mcp-demo/pizza-tutorial/02-root-disjoint.svg index 66ca3810..8dfdc399 100644 --- a/docs/mcp-demo/pizza-tutorial/02-root-disjoint.svg +++ b/docs/mcp-demo/pizza-tutorial/02-root-disjoint.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/03-base-hierarchy.svg b/docs/mcp-demo/pizza-tutorial/03-base-hierarchy.svg index 8f117181..04d217ab 100644 --- a/docs/mcp-demo/pizza-tutorial/03-base-hierarchy.svg +++ b/docs/mcp-demo/pizza-tutorial/03-base-hierarchy.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
owl:Class
T
ThinAndCrispyBase
owl:Class
D
DeepPanBase
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
owl:Class
T
ThinAndCrispyBase
owl:Class
D
DeepPanBase
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/04-named-pizza-hierarchy.svg b/docs/mcp-demo/pizza-tutorial/04-named-pizza-hierarchy.svg index e96cee01..a3c75623 100644 --- a/docs/mcp-demo/pizza-tutorial/04-named-pizza-hierarchy.svg +++ b/docs/mcp-demo/pizza-tutorial/04-named-pizza-hierarchy.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
owl:Class
T
ThinAndCrispyBase
owl:Class
D
DeepPanBase
owl:Class
N
NamedPizza
owl:Class
M
Margherita
owl:Class
A
AmericanHot
owl:Class
F
FruttiDiMare
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/05-topping-categories.svg b/docs/mcp-demo/pizza-tutorial/05-topping-categories.svg index 2951fdea..01490397 100644 --- a/docs/mcp-demo/pizza-tutorial/05-topping-categories.svg +++ b/docs/mcp-demo/pizza-tutorial/05-topping-categories.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
owl:Class
T
ThinAndCrispyBase
owl:Class
D
DeepPanBase
owl:Class
N
NamedPizza
owl:Class
M
Margherita
owl:Class
A
AmericanHot
owl:Class
F
FruttiDiMare
owl:Class
C
CheeseTopping
owl:Class
M
MeatTopping
owl:Class
V
VegetableTopping
owl:Class
F
FishTopping
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/06-topping-disjoint.svg b/docs/mcp-demo/pizza-tutorial/06-topping-disjoint.svg index 817e1fc0..58c3a8bc 100644 --- a/docs/mcp-demo/pizza-tutorial/06-topping-disjoint.svg +++ b/docs/mcp-demo/pizza-tutorial/06-topping-disjoint.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
owl:Class
P
PizzaBase
owl:Class
P
PizzaTopping
owl:Class
T
ThinAndCrispyBase
owl:Class
D
DeepPanBase
owl:Class
N
NamedPizza
owl:Class
M
Margherita
owl:Class
A
AmericanHot
owl:Class
F
FruttiDiMare
owl:Class
C
CheeseTopping
owl:Class
M
MeatTopping
owl:Class
V
VegetableTopping
owl:Class
F
FishTopping
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/07-tbox-leaf-toppings.svg b/docs/mcp-demo/pizza-tutorial/07-tbox-leaf-toppings.svg index a6c32827..9c47bd84 100644 --- a/docs/mcp-demo/pizza-tutorial/07-tbox-leaf-toppings.svg +++ b/docs/mcp-demo/pizza-tutorial/07-tbox-leaf-toppings.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/08-properties-domain-range.svg b/docs/mcp-demo/pizza-tutorial/08-properties-domain-range.svg index 5bc40207..41ae2f7a 100644 --- a/docs/mcp-demo/pizza-tutorial/08-properties-domain-range.svg +++ b/docs/mcp-demo/pizza-tutorial/08-properties-domain-range.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
owl:ObjectProperty
H
hasTopping
owl:ObjectProperty
H
hasBase
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/09-tbox-complete.svg b/docs/mcp-demo/pizza-tutorial/09-tbox-complete.svg index eed0df22..36a5015c 100644 --- a/docs/mcp-demo/pizza-tutorial/09-tbox-complete.svg +++ b/docs/mcp-demo/pizza-tutorial/09-tbox-complete.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
owl:ObjectProperty
H
hasTopping
IRI
http://www.pizza-ontology.com/pizza.owl#hasTopping
No annotation properties
owl:FunctionalProperty, owl:ObjectProperty
H
hasBase
IRI
http://www.pizza-ontology.com/pizza.owl#hasBase
No annotation properties
owl:ObjectProperty
I
isToppingOf
IRI
http://www.pizza-ontology.com/pizza.owl#isToppingOf
No annotation properties
owl:ObjectProperty
I
isBaseOf
IRI
http://www.pizza-ontology.com/pizza.owl#isBaseOf
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/10-tbox-equiv-class-axioms.svg b/docs/mcp-demo/pizza-tutorial/10-tbox-equiv-class-axioms.svg index 0737f2b3..91902295 100644 --- a/docs/mcp-demo/pizza-tutorial/10-tbox-equiv-class-axioms.svg +++ b/docs/mcp-demo/pizza-tutorial/10-tbox-equiv-class-axioms.svg @@ -1,4 +1,4 @@ -
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
owl:ObjectProperty
H
hasTopping
IRI
http://www.pizza-ontology.com/pizza.owl#hasTopping
No annotation properties
owl:FunctionalProperty, owl:ObjectProperty
H
hasBase
IRI
http://www.pizza-ontology.com/pizza.owl#hasBase
No annotation properties
owl:ObjectProperty
I
isToppingOf
IRI
http://www.pizza-ontology.com/pizza.owl#isToppingOf
No annotation properties
owl:ObjectProperty
I
isBaseOf
IRI
http://www.pizza-ontology.com/pizza.owl#isBaseOf
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/11-tbox-vegetarian-pizza.svg b/docs/mcp-demo/pizza-tutorial/11-tbox-vegetarian-pizza.svg index ffcd2e57..ae645104 100644 --- a/docs/mcp-demo/pizza-tutorial/11-tbox-vegetarian-pizza.svg +++ b/docs/mcp-demo/pizza-tutorial/11-tbox-vegetarian-pizza.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
owl:ObjectProperty
H
hasTopping
IRI
http://www.pizza-ontology.com/pizza.owl#hasTopping
No annotation properties
owl:FunctionalProperty, owl:ObjectProperty
H
hasBase
IRI
http://www.pizza-ontology.com/pizza.owl#hasBase
No annotation properties
owl:ObjectProperty
I
isToppingOf
IRI
http://www.pizza-ontology.com/pizza.owl#isToppingOf
No annotation properties
owl:ObjectProperty
I
isBaseOf
IRI
http://www.pizza-ontology.com/pizza.owl#isBaseOf
No annotation properties
owl:Class
V
VegetarianPizza
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
P
Pizza
IRI
http://www.pizza-ontology.com/pizza.owl#Pizza
No annotation properties
owl:Class
P
PizzaBase
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaBase
No annotation properties
owl:Class
P
PizzaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PizzaTopping
No annotation properties
owl:Class
T
ThinAndCrispyBase
IRI
http://www.pizza-ontology.com/pizza.owl#ThinAndCrispyBase
No annotation properties
owl:Class
D
DeepPanBase
IRI
http://www.pizza-ontology.com/pizza.owl#DeepPanBase
No annotation properties
owl:Class
N
NamedPizza
IRI
http://www.pizza-ontology.com/pizza.owl#NamedPizza
No annotation properties
owl:Class
M
Margherita
IRI
http://www.pizza-ontology.com/pizza.owl#Margherita
No annotation properties
owl:Class
A
AmericanHot
IRI
http://www.pizza-ontology.com/pizza.owl#AmericanHot
No annotation properties
owl:Class
F
FruttiDiMare
IRI
http://www.pizza-ontology.com/pizza.owl#FruttiDiMare
No annotation properties
owl:Class
C
CheeseTopping
IRI
http://www.pizza-ontology.com/pizza.owl#CheeseTopping
No annotation properties
owl:Class
M
MeatTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MeatTopping
No annotation properties
owl:Class
V
VegetableTopping
IRI
http://www.pizza-ontology.com/pizza.owl#VegetableTopping
No annotation properties
owl:Class
F
FishTopping
IRI
http://www.pizza-ontology.com/pizza.owl#FishTopping
No annotation properties
owl:Class
M
MozzarellaTopping
IRI
http://www.pizza-ontology.com/pizza.owl#MozzarellaTopping
No annotation properties
owl:Class
P
ParmesanTopping
IRI
http://www.pizza-ontology.com/pizza.owl#ParmesanTopping
No annotation properties
owl:Class
P
PeperoniSausageTopping
IRI
http://www.pizza-ontology.com/pizza.owl#PeperoniSausageTopping
No annotation properties
owl:Class
T
TomatoTopping
IRI
http://www.pizza-ontology.com/pizza.owl#TomatoTopping
No annotation properties
owl:Class
O
OliveTopping
IRI
http://www.pizza-ontology.com/pizza.owl#OliveTopping
No annotation properties
owl:Class
G
GarlicTopping
IRI
http://www.pizza-ontology.com/pizza.owl#GarlicTopping
No annotation properties
owl:Class
A
AnchoviesTopping
IRI
http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping
No annotation properties
owl:ObjectProperty
H
hasTopping
IRI
http://www.pizza-ontology.com/pizza.owl#hasTopping
No annotation properties
owl:FunctionalProperty, owl:ObjectProperty
H
hasBase
IRI
http://www.pizza-ontology.com/pizza.owl#hasBase
No annotation properties
owl:ObjectProperty
I
isToppingOf
IRI
http://www.pizza-ontology.com/pizza.owl#isToppingOf
No annotation properties
owl:ObjectProperty
I
isBaseOf
IRI
http://www.pizza-ontology.com/pizza.owl#isBaseOf
No annotation properties
owl:Class
V
VegetarianPizza
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/12-abox-untyped-pizzas.svg b/docs/mcp-demo/pizza-tutorial/12-abox-untyped-pizzas.svg index 59a0f182..2d6d6346 100644 --- a/docs/mcp-demo/pizza-tutorial/12-abox-untyped-pizzas.svg +++ b/docs/mcp-demo/pizza-tutorial/12-abox-untyped-pizzas.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -344,4 +344,4 @@ .reactodia-overlaid-element { cursor: move; outline: none; } .reactodia-element-decorations { pointer-events: none; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/13-pizza1-built.svg b/docs/mcp-demo/pizza-tutorial/13-pizza1-built.svg index 09c247fb..9943a39a 100644 --- a/docs/mcp-demo/pizza-tutorial/13-pizza1-built.svg +++ b/docs/mcp-demo/pizza-tutorial/13-pizza1-built.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
pizza:MozzarellaTopping
M
mozz
pizza:TomatoTopping
T
tomato
pizza:ThinAndCrispyBase
T
thin & crispy
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
pizza:MozzarellaTopping
M
mozz
pizza:TomatoTopping
T
tomato
pizza:ThinAndCrispyBase
T
thin & crispy
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/14-pizza2-built.svg b/docs/mcp-demo/pizza-tutorial/14-pizza2-built.svg index 5215ce66..329d73dc 100644 --- a/docs/mcp-demo/pizza-tutorial/14-pizza2-built.svg +++ b/docs/mcp-demo/pizza-tutorial/14-pizza2-built.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
pizza:MozzarellaTopping
M
mozz
pizza:TomatoTopping
T
tomato
pizza:ThinAndCrispyBase
T
thin & crispy
pizza:PeperoniSausageTopping
P
peperoni
pizza:MozzarellaTopping
M
mozz
pizza:OliveTopping
O
olive
pizza:DeepPanBase
D
deep pan
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
D
_:df_9_1
D
_:df_9_2
D
_:df_10_0
P
pizza1
P
pizza2
P
pizza3
pizza:MozzarellaTopping
M
mozz
pizza:TomatoTopping
T
tomato
pizza:ThinAndCrispyBase
T
thin & crispy
pizza:PeperoniSausageTopping
P
peperoni
pizza:MozzarellaTopping
M
mozz
pizza:OliveTopping
O
olive
pizza:DeepPanBase
D
deep pan
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/15-abox-before-reasoning.svg b/docs/mcp-demo/pizza-tutorial/15-abox-before-reasoning.svg index be781fdd..233bc4b0 100644 --- a/docs/mcp-demo/pizza-tutorial/15-abox-before-reasoning.svg +++ b/docs/mcp-demo/pizza-tutorial/15-abox-before-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:PeperoniSausageTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:PeperoniSausageTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/16-pizza4-built.svg b/docs/mcp-demo/pizza-tutorial/16-pizza4-built.svg index 01a702e1..6453ceb2 100644 --- a/docs/mcp-demo/pizza-tutorial/16-pizza4-built.svg +++ b/docs/mcp-demo/pizza-tutorial/16-pizza4-built.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:PeperoniSausageTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:PeperoniSausageTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:MozzarellaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:TomatoTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/17-after-reasoning.svg b/docs/mcp-demo/pizza-tutorial/17-after-reasoning.svg index 8b0eed01..b8a63680 100644 --- a/docs/mcp-demo/pizza-tutorial/17-after-reasoning.svg +++ b/docs/mcp-demo/pizza-tutorial/17-after-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/18-pizza1-inferred.svg b/docs/mcp-demo/pizza-tutorial/18-pizza1-inferred.svg index 54caeb15..a25f46cc 100644 --- a/docs/mcp-demo/pizza-tutorial/18-pizza1-inferred.svg +++ b/docs/mcp-demo/pizza-tutorial/18-pizza1-inferred.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/19-mozz1-inferred.svg b/docs/mcp-demo/pizza-tutorial/19-mozz1-inferred.svg index 464b81fd..524e768a 100644 --- a/docs/mcp-demo/pizza-tutorial/19-mozz1-inferred.svg +++ b/docs/mcp-demo/pizza-tutorial/19-mozz1-inferred.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/pizza-tutorial/20-owa-vegetarian-lesson.svg b/docs/mcp-demo/pizza-tutorial/20-owa-vegetarian-lesson.svg index f7ec485a..8408026a 100644 --- a/docs/mcp-demo/pizza-tutorial/20-owa-vegetarian-lesson.svg +++ b/docs/mcp-demo/pizza-tutorial/20-owa-vegetarian-lesson.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
D
_:df_9_0
IRI
_:df_9_0
No annotation properties
D
_:df_9_1
IRI
_:df_9_1
No annotation properties
D
_:df_9_2
IRI
_:df_9_2
No annotation properties
D
_:df_10_0
IRI
_:df_10_0
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza1
IRI
http://www.pizza-ontology.com/pizza.owl#pizza1
No annotation properties
pizza:AmericanHot, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_1
P
pizza2
IRI
http://www.pizza-ontology.com/pizza.owl#pizza2
No annotation properties
pizza:FruttiDiMare, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_2
P
pizza3
IRI
http://www.pizza-ontology.com/pizza.owl#pizza3
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz1
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin1
No annotation properties
pizza:MeatTopping, pizza:PeperoniSausageTopping, pizza:PizzaTopping
P
peperoni
IRI
http://www.pizza-ontology.com/pizza.owl#pep1
No annotation properties
pizza:CheeseTopping, pizza:MozzarellaTopping, pizza:PizzaTopping
M
mozz
IRI
http://www.pizza-ontology.com/pizza.owl#mozz2
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive1
No annotation properties
pizza:DeepPanBase, pizza:PizzaBase
D
deep pan
IRI
http://www.pizza-ontology.com/pizza.owl#deep1
No annotation properties
pizza:AnchoviesTopping, pizza:FishTopping, pizza:PizzaTopping
A
anchovies
IRI
http://www.pizza-ontology.com/pizza.owl#anch1
No annotation properties
pizza:GarlicTopping, pizza:PizzaTopping, pizza:VegetableTopping
G
garlic
IRI
http://www.pizza-ontology.com/pizza.owl#garlic1
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin2
No annotation properties
pizza:Margherita, pizza:NamedPizza, pizza:Pizza, pizza:VegetarianPizza, urn:reactodia:blank:rdf:df_10_0, urn:reactodia:blank:rdf:df_9_0
P
pizza4
IRI
http://www.pizza-ontology.com/pizza.owl#pizza4
No annotation properties
pizza:OliveTopping, pizza:PizzaTopping, pizza:VegetableTopping
O
olive
IRI
http://www.pizza-ontology.com/pizza.owl#olive2
No annotation properties
pizza:PizzaTopping, pizza:TomatoTopping, pizza:VegetableTopping
T
tomato
IRI
http://www.pizza-ontology.com/pizza.owl#tom2
No annotation properties
pizza:PizzaBase, pizza:ThinAndCrispyBase
T
thin & crispy
IRI
http://www.pizza-ontology.com/pizza.owl#thin3
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/reasoning-demo.md b/docs/mcp-demo/reasoning-demo.md index 7d2fd9c1..3083e1c5 100644 --- a/docs/mcp-demo/reasoning-demo.md +++ b/docs/mcp-demo/reasoning-demo.md @@ -96,7 +96,7 @@ Canvas: 10 nodes, 0 links `{"jsonrpc":"2.0","id":31,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#hasSupervisor","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.com/reasoning-demo#Employee"}}}` `{"jsonrpc":"2.0","id":32,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#hasSupervisor","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.com/reasoning-demo#Manager"}}}` `{"jsonrpc":"2.0","id":34,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -121,7 +121,7 @@ Canvas: 10 nodes, 0 links ✓ addLink: s=hasSupervisor p=domain o=Employee ✓ addLink: s=hasSupervisor p=range o=Manager ✓ runLayout: elk-layered -✓ expandAll +✓ expandNode ✓ runLayout: elk-layered Canvas: 10 nodes, 17 links @@ -136,8 +136,8 @@ Canvas: 10 nodes, 17 links **You:** Now for the individuals. Alice is an Executive. Bob, Carol, and Dave have no explicit type — I want to see what the reasoner works out from the relationships alone. -**Assistant:** Switching to ABox view. Only Alice gets a `typeIri` — the others are blank nodes -whose types must be entirely inferred from the edges we assert next. +**Assistant:** Switching to ABox view. Only Alice gets a `typeIri` — the others are untyped +individuals whose types must be entirely inferred from the edges we assert next.
@@ -181,7 +181,7 @@ can see the ABox shape before we run the reasoner: `{"jsonrpc":"2.0","id":47,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#carol","predicateIri":"http://example.com/reasoning-demo#hasSupervisor","objectIri":"http://example.com/reasoning-demo#bob"}}}` `{"jsonrpc":"2.0","id":48,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#bob","predicateIri":"http://example.com/reasoning-demo#hasSupervisor","objectIri":"http://example.com/reasoning-demo#alice"}}}` `{"jsonrpc":"2.0","id":49,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":51,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -193,7 +193,7 @@ can see the ABox shape before we run the reasoner: ✓ addLink: s=carol p=hasSupervisor o=bob ✓ addLink: s=bob p=hasSupervisor o=alice ✓ runLayout: dagre-lr -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 4 nodes, 6 links @@ -221,13 +221,13 @@ Canvas: 4 nodes, 6 links 3 tool calls ✓ `{"jsonrpc":"2.0","id":52,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result [Ontosphere — 3 tools ✓] ✓ runReasoning: 10707 triples inferred -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 4 nodes, 11 links diff --git a/docs/mcp-demo/reasoning-demo/01-tbox.svg b/docs/mcp-demo/reasoning-demo/01-tbox.svg index af07ded5..e5b399e4 100644 --- a/docs/mcp-demo/reasoning-demo/01-tbox.svg +++ b/docs/mcp-demo/reasoning-demo/01-tbox.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
owl:Class
P
Person
IRI
http://example.com/reasoning-demo#Person
No annotation properties
owl:Class
E
Employee
IRI
http://example.com/reasoning-demo#Employee
No annotation properties
owl:Class
M
Manager
IRI
http://example.com/reasoning-demo#Manager
No annotation properties
owl:Class
E
Executive
IRI
http://example.com/reasoning-demo#Executive
No annotation properties
owl:ObjectProperty
K
knows
IRI
http://example.com/reasoning-demo#knows
No annotation properties
owl:ObjectProperty
H
hasFriend
IRI
http://example.com/reasoning-demo#hasFriend
No annotation properties
owl:ObjectProperty
M
manages
IRI
http://example.com/reasoning-demo#manages
No annotation properties
owl:ObjectProperty
I
isManagedBy
IRI
http://example.com/reasoning-demo#isManagedBy
No annotation properties
owl:ObjectProperty, owl:SymmetricProperty
I
isColleagueOf
IRI
http://example.com/reasoning-demo#isColleagueOf
No annotation properties
owl:ObjectProperty, owl:TransitiveProperty
H
hasSupervisor
IRI
http://example.com/reasoning-demo#hasSupervisor
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
owl:Class
P
Person
IRI
http://example.com/reasoning-demo#Person
No annotation properties
owl:Class
E
Employee
IRI
http://example.com/reasoning-demo#Employee
No annotation properties
owl:Class
M
Manager
IRI
http://example.com/reasoning-demo#Manager
No annotation properties
owl:Class
E
Executive
IRI
http://example.com/reasoning-demo#Executive
No annotation properties
owl:ObjectProperty
K
knows
IRI
http://example.com/reasoning-demo#knows
No annotation properties
owl:ObjectProperty
H
hasFriend
IRI
http://example.com/reasoning-demo#hasFriend
No annotation properties
owl:ObjectProperty
M
manages
IRI
http://example.com/reasoning-demo#manages
No annotation properties
owl:ObjectProperty
I
isManagedBy
IRI
http://example.com/reasoning-demo#isManagedBy
No annotation properties
owl:ObjectProperty, owl:SymmetricProperty
I
isColleagueOf
IRI
http://example.com/reasoning-demo#isColleagueOf
No annotation properties
owl:ObjectProperty, owl:TransitiveProperty
H
hasSupervisor
IRI
http://example.com/reasoning-demo#hasSupervisor
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/reasoning-demo/02-before-reasoning.svg b/docs/mcp-demo/reasoning-demo/02-before-reasoning.svg index 482d8240..6dadcdf9 100644 --- a/docs/mcp-demo/reasoning-demo/02-before-reasoning.svg +++ b/docs/mcp-demo/reasoning-demo/02-before-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Executive
A
Alice
IRI
http://example.com/reasoning-demo#alice
hasFriend
http://example.com/reasoning-demo#bob
manages
http://example.com/reasoning-demo#carol
B
Bob
IRI
http://example.com/reasoning-demo#bob
isColleagueOf
http://example.com/reasoning-demo#carol
C
Carol
IRI
http://example.com/reasoning-demo#carol
hasSupervisor
http://example.com/reasoning-demo#bob
D
Dave
IRI
http://example.com/reasoning-demo#dave
manages
http://example.com/reasoning-demo#bob
\ No newline at end of file +* { border-color: var(--border); }
Executive
A
Alice
IRI
http://example.com/reasoning-demo#alice
hasFriend
http://example.com/reasoning-demo#bob
manages
http://example.com/reasoning-demo#carol
B
Bob
IRI
http://example.com/reasoning-demo#bob
isColleagueOf
http://example.com/reasoning-demo#carol
C
Carol
IRI
http://example.com/reasoning-demo#carol
hasSupervisor
http://example.com/reasoning-demo#bob
D
Dave
IRI
http://example.com/reasoning-demo#dave
manages
http://example.com/reasoning-demo#bob
\ No newline at end of file diff --git a/docs/mcp-demo/reasoning-demo/03-after-reasoning.svg b/docs/mcp-demo/reasoning-demo/03-after-reasoning.svg index dfeab373..3f1248f5 100644 --- a/docs/mcp-demo/reasoning-demo/03-after-reasoning.svg +++ b/docs/mcp-demo/reasoning-demo/03-after-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Employee, Executive, Manager, Person
A
Alice
IRI
http://example.com/reasoning-demo#alice
No annotation properties
Employee, Manager, Person
B
Bob
IRI
http://example.com/reasoning-demo#bob
No annotation properties
Employee, Person
C
Carol
IRI
http://example.com/reasoning-demo#carol
No annotation properties
Employee, Manager, Person
D
Dave
IRI
http://example.com/reasoning-demo#dave
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
Employee, Executive, Manager, Person
A
Alice
IRI
http://example.com/reasoning-demo#alice
No annotation properties
Employee, Manager, Person
B
Bob
IRI
http://example.com/reasoning-demo#bob
No annotation properties
Employee, Person
C
Carol
IRI
http://example.com/reasoning-demo#carol
No annotation properties
Employee, Manager, Person
D
Dave
IRI
http://example.com/reasoning-demo#dave
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/reasoning-demo/04-dave-focus.svg b/docs/mcp-demo/reasoning-demo/04-dave-focus.svg index 7a74ebfc..90312cca 100644 --- a/docs/mcp-demo/reasoning-demo/04-dave-focus.svg +++ b/docs/mcp-demo/reasoning-demo/04-dave-focus.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
Employee, Executive, Manager, Person
A
Alice
IRI
http://example.com/reasoning-demo#alice
No annotation properties
Employee, Manager, Person
B
Bob
IRI
http://example.com/reasoning-demo#bob
No annotation properties
Employee, Person
C
Carol
IRI
http://example.com/reasoning-demo#carol
No annotation properties
Employee, Manager, Person
D
Dave
IRI
http://example.com/reasoning-demo#dave
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
Employee, Executive, Manager, Person
A
Alice
IRI
http://example.com/reasoning-demo#alice
No annotation properties
Employee, Manager, Person
B
Bob
IRI
http://example.com/reasoning-demo#bob
No annotation properties
Employee, Person
C
Carol
IRI
http://example.com/reasoning-demo#carol
No annotation properties
Employee, Manager, Person
D
Dave
IRI
http://example.com/reasoning-demo#dave
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/scene-ontology.md b/docs/mcp-demo/scene-ontology.md index 3988eedc..4a7448b0 100644 --- a/docs/mcp-demo/scene-ontology.md +++ b/docs/mcp-demo/scene-ontology.md @@ -78,7 +78,7 @@ node then wiring the subclass chain and property axioms one by one. No bulk load ✓ addLink: s=RO_0000087 p=domain o=BFO_0000004 ✓ addLink: s=RO_0000087 p=range o=BFO_0000023 -Canvas: 12 nodes, 14 links +Canvas: 12 nodes, 15 links ```
@@ -182,7 +182,7 @@ Canvas: 21 nodes, 24 links `{"jsonrpc":"2.0","id":33,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://purl.obolibrary.org/obo/RO_0000066","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.com/scene-ontology#Scene"}}}` `{"jsonrpc":"2.0","id":34,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://purl.obolibrary.org/obo/RO_0000066","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.com/scene-ontology#Location"}}}` `{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":37,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -202,7 +202,7 @@ Canvas: 21 nodes, 24 links ✓ addLink: s=RO_0000066 p=domain o=Scene ✓ addLink: s=RO_0000066 p=range o=Location ✓ runLayout: elk-layered -✓ expandAll +✓ expandNode ✓ runLayout: elk-layered Canvas: 25 nodes, 34 links @@ -278,7 +278,7 @@ Canvas: 10 nodes, 0 links `{"jsonrpc":"2.0","id":59,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/scene-ontology#rooftopChase","predicateIri":"http://purl.obolibrary.org/obo/BFO_0000055","objectIri":"http://example.com/scene-ontology#veraAntagonistRole"}}}` `{"jsonrpc":"2.0","id":60,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/scene-ontology#cafeDialogue","predicateIri":"http://purl.obolibrary.org/obo/BFO_0000055","objectIri":"http://example.com/scene-ontology#samSupportingRole"}}}` `{"jsonrpc":"2.0","id":61,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":62,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":62,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":63,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -296,7 +296,7 @@ Canvas: 10 nodes, 0 links ✓ addLink: s=rooftopChase p=BFO_0000055 o=veraAntagonistRole ✓ addLink: s=cafeDialogue p=BFO_0000055 o=samSupportingRole ✓ runLayout: dagre-lr -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 10 nodes, 12 links @@ -317,13 +317,13 @@ Canvas: 10 nodes, 12 links 3 tool calls ✓ `{"jsonrpc":"2.0","id":64,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":65,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":65,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":66,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result [Ontosphere — 3 tools ✓] ✓ runReasoning: 10785 triples inferred -✓ expandAll +✓ expandNode ✓ runLayout: dagre-lr Canvas: 10 nodes, 12 links diff --git a/docs/mcp-demo/scene-ontology/01-tbox.svg b/docs/mcp-demo/scene-ontology/01-tbox.svg index 30e733b8..16c8b5c1 100644 --- a/docs/mcp-demo/scene-ontology/01-tbox.svg +++ b/docs/mcp-demo/scene-ontology/01-tbox.svg @@ -1,4 +1,4 @@ -
owl:Class
E
entity
IRI
http://purl.obolibrary.org/obo/BFO_0000001
No annotation properties
owl:Class
C
continuant
IRI
http://purl.obolibrary.org/obo/BFO_0000002
No annotation properties
owl:Class
O
occurrent
IRI
http://purl.obolibrary.org/obo/BFO_0000003
No annotation properties
owl:Class
I
independent continuant
IRI
http://purl.obolibrary.org/obo/BFO_0000004
No annotation properties
owl:Class
P
process
IRI
http://purl.obolibrary.org/obo/BFO_0000015
No annotation properties
owl:Class
R
realizable entity
IRI
http://purl.obolibrary.org/obo/BFO_0000017
No annotation properties
owl:Class
R
role
IRI
http://purl.obolibrary.org/obo/BFO_0000023
No annotation properties
owl:Class
S
site
IRI
http://purl.obolibrary.org/obo/BFO_0000029
No annotation properties
owl:ObjectProperty
R
realizes
IRI
http://purl.obolibrary.org/obo/BFO_0000055
No annotation properties
owl:ObjectProperty
H
has participant
IRI
http://purl.obolibrary.org/obo/RO_0000057
No annotation properties
owl:ObjectProperty
O
occurs in
IRI
http://purl.obolibrary.org/obo/RO_0000066
No annotation properties
owl:ObjectProperty
H
has role
IRI
http://purl.obolibrary.org/obo/RO_0000087
No annotation properties
owl:Class
S
Scene
IRI
http://example.com/scene-ontology#Scene
No annotation properties
owl:Class
A
ActionScene
IRI
http://example.com/scene-ontology#ActionScene
No annotation properties
owl:Class
D
DialogueScene
IRI
http://example.com/scene-ontology#DialogueScene
No annotation properties
owl:Class
C
ChaseScene
IRI
http://example.com/scene-ontology#ChaseScene
No annotation properties
owl:Class
C
ConfrontationScene
IRI
http://example.com/scene-ontology#ConfrontationScene
No annotation properties
owl:Class
C
Character
IRI
http://example.com/scene-ontology#Character
No annotation properties
owl:Class
L
Location
IRI
http://example.com/scene-ontology#Location
No annotation properties
owl:Class
E
ExteriorLocation
IRI
http://example.com/scene-ontology#ExteriorLocation
No annotation properties
owl:Class
I
InteriorLocation
IRI
http://example.com/scene-ontology#InteriorLocation
No annotation properties
owl:Class
S
SceneRole
IRI
http://example.com/scene-ontology#SceneRole
No annotation properties
owl:Class
P
ProtagonistRole
IRI
http://example.com/scene-ontology#ProtagonistRole
No annotation properties
owl:Class
A
AntagonistRole
IRI
http://example.com/scene-ontology#AntagonistRole
No annotation properties
owl:Class
S
SupportingRole
IRI
http://example.com/scene-ontology#SupportingRole
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/scene-ontology/02-abox-full.svg b/docs/mcp-demo/scene-ontology/02-abox-full.svg index 36e3233b..d3a97ca3 100644 --- a/docs/mcp-demo/scene-ontology/02-abox-full.svg +++ b/docs/mcp-demo/scene-ontology/02-abox-full.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
ExteriorLocation
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ChaseScene
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
RO_0000057
http://example.com/scene-ontology#jake
http://example.com/scene-ontology#vera
DialogueScene
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
RO_0000057
http://example.com/scene-ontology#jake
http://example.com/scene-ontology#sam
ProtagonistRole
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SupportingRole
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
ExteriorLocation
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ChaseScene
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
RO_0000057
http://example.com/scene-ontology#jake
http://example.com/scene-ontology#vera
DialogueScene
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
RO_0000057
http://example.com/scene-ontology#jake
http://example.com/scene-ontology#sam
ProtagonistRole
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SupportingRole
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/scene-ontology/03-after-reasoning.svg b/docs/mcp-demo/scene-ontology/03-after-reasoning.svg index cc7f9a42..4d54ad45 100644 --- a/docs/mcp-demo/scene-ontology/03-after-reasoning.svg +++ b/docs/mcp-demo/scene-ontology/03-after-reasoning.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
ExteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ActionScene, ChaseScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
No annotation properties
DialogueScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
No annotation properties
ProtagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SceneRole, SupportingRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
ExteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ActionScene, ChaseScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
No annotation properties
DialogueScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
No annotation properties
ProtagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SceneRole, SupportingRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/scene-ontology/04-jake-focus.svg b/docs/mcp-demo/scene-ontology/04-jake-focus.svg index 9fae1d76..7b3d386a 100644 --- a/docs/mcp-demo/scene-ontology/04-jake-focus.svg +++ b/docs/mcp-demo/scene-ontology/04-jake-focus.svg @@ -19,8 +19,8 @@ --glass-shadow: 0 8px 32px oklch(0.3752 0.0394 256.8 / 0.08); --reactodia-color-success-contrast-background: #e6f6e6; --tw-inset-ring-shadow: 0 0 #0000; - --reactodia-color-content: oklch(25% 0.045 256.8); --text-base--line-height: calc(1.5 / 1); + --reactodia-color-content: oklch(25% 0.045 256.8); --muted: oklch(96.1% 0.004 247.9); --reactodia-color-info-lighter: #87d8f2; --node-border: oklch(90.6% 0.008 247.9); @@ -100,11 +100,11 @@ --reactodia-tree-background-color-active: oklch(96.1% 0.004 247.9); --reactodia-dialog-border-radius: 4px; --reactodia-color-emphasis-500: oklch(58% 0.028 256.0); + --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --reactodia-color-warning: #ffba00; --reactodia-z-index-base: 0; --reactodia-font-family-monospace: "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; --reactodia-color-secondary-contrast-foreground: #474748; - --reactodia-color-gray-1000: oklch(25% 0.045 256.8); --text-xl--line-height: calc(1.75 / 1.25); --reactodia-color-primary-darker: oklch(52% 0.150 290.4); --reactodia-paper-bg: #ffffff; @@ -119,12 +119,12 @@ --reactodia-color-success-darkest: #007300; --reactodia-selection-link-color: oklch(67.5% 0.123 290.4); --leading-tight: 1.25; + --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --color-gray-600: oklch(44.6% 0.03 256.802); --reactodia-input-border-radius: 4px; --reactodia-button-border-width: 1px; --reactodia-paper-fg: #111827; --reactodia-color-secondary-darker: oklch(90.6% 0.008 247.9); - --reactodia-color-gray-0: oklch(98.4% 0.002 247.8); --reactodia-color-gray-700: oklch(43% 0.038 257.0); --reactodia-color-emphasis-300: oklch(78% 0.015 254.0); --reactodia-color-gray-400: oklch(67% 0.022 255.0); @@ -138,12 +138,12 @@ --reactodia-color-info-contrast-foreground: #193c47; --reactodia-color-gray-600: oklch(50% 0.033 256.5); --reactodia-input-background-color-disabled: oklch(96.1% 0.004 247.9); + --reactodia-color-info: #54c7ec; --color-black: #000; --reactodia-color-warning-dark: #e6a700; - --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --vg-inferred-color: oklch(72% 0.16 75); + --reactodia-input-background-color: rgba(255, 255, 255, 0.4); --destructive: oklch(75.8% 0.109 9.2); - --reactodia-color-info: #54c7ec; --edge-default: oklch(86.7% 0.041 256.8); --canvas-grid: oklch(92.9% 0.03 186.9); --reactodia-color-info-lightest: #aae3f6; @@ -246,8 +246,8 @@ --color-red-50: oklch(97.1% 0.013 17.38); --tw-shadow: 0 0 #0000; --reactodia-inline-entity-color: oklch(67.5% 0.123 290.4); - --text-sm--line-height: calc(1.25 / 0.875); --reactodia-element-background-color: oklch(100.0% 0 0); + --text-sm--line-height: calc(1.25 / 0.875); --input: oklch(93.7% 0.005 247.9); --reactodia-transition-duration: .3s; --reactodia-color-warning-contrast-foreground: #4d3800; @@ -348,4 +348,4 @@ .reactodia-standard-link__path:not([stroke]) { stroke: var(--reactodia-link-stroke-color); } .reactodia-standard-link__label { font-weight: 700; } *, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; } -* { border-color: var(--border); }
ExteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ActionScene, ChaseScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
No annotation properties
DialogueScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
No annotation properties
ProtagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SceneRole, SupportingRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file +* { border-color: var(--border); }
ExteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
R
Rooftop
IRI
http://example.com/scene-ontology#rooftop
No annotation properties
InteriorLocation, Location, BFO_0000001, BFO_0000002, BFO_0000004, BFO_0000029
C
Café
IRI
http://example.com/scene-ontology#cafe
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
J
Jake
IRI
http://example.com/scene-ontology#jake
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
V
Vera
IRI
http://example.com/scene-ontology#vera
No annotation properties
Character, BFO_0000001, BFO_0000002, BFO_0000004
S
Sam
IRI
http://example.com/scene-ontology#sam
No annotation properties
ActionScene, ChaseScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
R
Rooftop Chase
IRI
http://example.com/scene-ontology#rooftopChase
No annotation properties
DialogueScene, Scene, BFO_0000001, BFO_0000003, BFO_0000015
C
Café Dialogue
IRI
http://example.com/scene-ontology#cafeDialogue
No annotation properties
ProtagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
J
Jake — Protagonist
IRI
http://example.com/scene-ontology#jakeProtagonistRole
No annotation properties
AntagonistRole, SceneRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
V
Vera — Antagonist
IRI
http://example.com/scene-ontology#veraAntagonistRole
No annotation properties
SceneRole, SupportingRole, BFO_0000001, BFO_0000002, BFO_0000017, BFO_0000023
S
Sam — Supporting
IRI
http://example.com/scene-ontology#samSupportingRole
No annotation properties
\ No newline at end of file diff --git a/docs/mcp-demo/seeds/foaf-social-network.md b/docs/mcp-demo/seeds/foaf-social-network.md index f792acdf..52e00469 100644 --- a/docs/mcp-demo/seeds/foaf-social-network.md +++ b/docs/mcp-demo/seeds/foaf-social-network.md @@ -57,7 +57,7 @@ every node and axiom will be visible on canvas. `{"jsonrpc":"2.0","id":19,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/ex#collaboratesWith","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.org/ex#Employee"}}}` `{"jsonrpc":"2.0","id":20,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/ex#collaboratesWith","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.org/ex#Employee"}}}` `{"jsonrpc":"2.0","id":21,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":22,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":22,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":23,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -115,7 +115,7 @@ until the reasoner fires. `{"jsonrpc":"2.0","id":47,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/eve","predicateIri":"http://xmlns.com/foaf/0.1/member","objectIri":"http://example.org/research"}}}` `{"jsonrpc":"2.0","id":48,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.org/frank","predicateIri":"http://xmlns.com/foaf/0.1/member","objectIri":"http://example.org/research"}}}` `{"jsonrpc":"2.0","id":49,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":51,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -138,7 +138,7 @@ slug: before-reasoning - Everyone typed as `Employee` or above also gets `foaf:Agent` via `foaf:Person → foaf:Agent` `{"jsonrpc":"2.0","id":52,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result diff --git a/docs/mcp-demo/seeds/pizza-tutorial.md b/docs/mcp-demo/seeds/pizza-tutorial.md index 7515bbec..16e4defb 100644 --- a/docs/mcp-demo/seeds/pizza-tutorial.md +++ b/docs/mcp-demo/seeds/pizza-tutorial.md @@ -180,7 +180,7 @@ all the way up to CheeseTopping and then PizzaTopping — no extra assertions ne `{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#GarlicTopping","predicateIri":"http://www.w3.org/2000/01/rdf-schema#subClassOf","objectIri":"http://www.pizza-ontology.com/pizza.owl#VegetableTopping"}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#AnchoviesTopping","predicateIri":"http://www.w3.org/2000/01/rdf-schema#subClassOf","objectIri":"http://www.pizza-ontology.com/pizza.owl#FishTopping"}}}` `{"jsonrpc":"2.0","id":55,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` -`{"jsonrpc":"2.0","id":56,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":56,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":57,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` ```tool-result @@ -237,7 +237,7 @@ on the real world. `{"jsonrpc":"2.0","id":72,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#isBaseOf","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://www.pizza-ontology.com/pizza.owl#Pizza"}}}` `{"jsonrpc":"2.0","id":73,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","predicateIri":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type","objectIri":"http://www.w3.org/2002/07/owl#FunctionalProperty"}}}` `{"jsonrpc":"2.0","id":74,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` -`{"jsonrpc":"2.0","id":75,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":75,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":76,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":140}}}` ```tool-result @@ -415,7 +415,7 @@ topping the reasoner will use for classification. `{"jsonrpc":"2.0","id":103,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#anch1"}}}` `{"jsonrpc":"2.0","id":104,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#garlic1"}}}` `{"jsonrpc":"2.0","id":105,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza3","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","objectIri":"http://www.pizza-ontology.com/pizza.owl#thin2"}}}` -`{"jsonrpc":"2.0","id":106,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":106,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":107,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` ```tool-result @@ -443,7 +443,7 @@ fire and classify it — but we also need to observe what the reasoner says abou `{"jsonrpc":"2.0","id":139,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#olive2"}}}` `{"jsonrpc":"2.0","id":140,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasTopping","objectIri":"http://www.pizza-ontology.com/pizza.owl#tom2"}}}` `{"jsonrpc":"2.0","id":141,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://www.pizza-ontology.com/pizza.owl#pizza4","predicateIri":"http://www.pizza-ontology.com/pizza.owl#hasBase","objectIri":"http://www.pizza-ontology.com/pizza.owl#thin3"}}}` -`{"jsonrpc":"2.0","id":142,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":142,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":143,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` `{"jsonrpc":"2.0","id":202,"method":"tools/call","params":{"name":"focusNode","arguments":{"iri":"http://www.pizza-ontology.com/pizza.owl#pizza4"}}}` @@ -473,7 +473,7 @@ fires on our data: - **scm-svf1 + VegetarianPizza:** TomatoTopping ⊆ VegetableTopping → Margherita restriction ⊆ VegetarianPizza restriction (scm-svf1); pizza1 a Margherita restriction → pizza1 a VegetarianPizza restriction → pizza1 is **VegetarianPizza** (cax-sco); pizza4 likewise; pizza3 (FruttiDiMare) also has garlic (VegetableTopping) — see OWA note below `{"jsonrpc":"2.0","id":108,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":109,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":109,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":110,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":180}}}` ```tool-result diff --git a/docs/mcp-demo/seeds/reasoning-demo.md b/docs/mcp-demo/seeds/reasoning-demo.md index 10a063ce..1e236256 100644 --- a/docs/mcp-demo/seeds/reasoning-demo.md +++ b/docs/mcp-demo/seeds/reasoning-demo.md @@ -65,7 +65,7 @@ then axioms. Starting in TBox view so every class and property node lands on the `{"jsonrpc":"2.0","id":31,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#hasSupervisor","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.com/reasoning-demo#Employee"}}}` `{"jsonrpc":"2.0","id":32,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#hasSupervisor","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.com/reasoning-demo#Manager"}}}` `{"jsonrpc":"2.0","id":34,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -82,8 +82,8 @@ slug: tbox **You:** Now for the individuals. Alice is an Executive. Bob, Carol, and Dave have no explicit type — I want to see what the reasoner works out from the relationships alone. -**Assistant:** Switching to ABox view. Only Alice gets a `typeIri` — the others are blank nodes -whose types must be entirely inferred from the edges we assert next. +**Assistant:** Switching to ABox view. Only Alice gets a `typeIri` — the others are untyped +individuals whose types must be entirely inferred from the edges we assert next. `{"jsonrpc":"2.0","id":37,"method":"tools/call","params":{"name":"setViewMode","arguments":{"mode":"abox"}}}` `{"jsonrpc":"2.0","id":38,"method":"tools/call","params":{"name":"addNode","arguments":{"iri":"http://example.com/reasoning-demo#alice","typeIri":"http://example.com/reasoning-demo#Executive","label":"Alice"}}}` @@ -110,7 +110,7 @@ can see the ABox shape before we run the reasoner: `{"jsonrpc":"2.0","id":47,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#carol","predicateIri":"http://example.com/reasoning-demo#hasSupervisor","objectIri":"http://example.com/reasoning-demo#bob"}}}` `{"jsonrpc":"2.0","id":48,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/reasoning-demo#bob","predicateIri":"http://example.com/reasoning-demo#hasSupervisor","objectIri":"http://example.com/reasoning-demo#alice"}}}` `{"jsonrpc":"2.0","id":49,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":50,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":51,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -136,7 +136,7 @@ slug: before-reasoning - hasFriend subPropertyOf knows: Alice gets knows Bob inferred `{"jsonrpc":"2.0","id":52,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":53,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":54,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result diff --git a/docs/mcp-demo/seeds/scene-ontology.md b/docs/mcp-demo/seeds/scene-ontology.md index a0b11b13..87767ec0 100644 --- a/docs/mcp-demo/seeds/scene-ontology.md +++ b/docs/mcp-demo/seeds/scene-ontology.md @@ -108,7 +108,7 @@ node then wiring the subclass chain and property axioms one by one. No bulk load `{"jsonrpc":"2.0","id":33,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://purl.obolibrary.org/obo/RO_0000066","predicateIri":"http://www.w3.org/2000/01/rdf-schema#domain","objectIri":"http://example.com/scene-ontology#Scene"}}}` `{"jsonrpc":"2.0","id":34,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://purl.obolibrary.org/obo/RO_0000066","predicateIri":"http://www.w3.org/2000/01/rdf-schema#range","objectIri":"http://example.com/scene-ontology#Location"}}}` `{"jsonrpc":"2.0","id":35,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` -`{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":36,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":37,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"elk-layered","spacing":200}}}` ```tool-result @@ -163,7 +163,7 @@ from the `has_role` relationships we assert next, since `RO:has_role rdfs:domain `{"jsonrpc":"2.0","id":59,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/scene-ontology#rooftopChase","predicateIri":"http://purl.obolibrary.org/obo/BFO_0000055","objectIri":"http://example.com/scene-ontology#veraAntagonistRole"}}}` `{"jsonrpc":"2.0","id":60,"method":"tools/call","params":{"name":"addLink","arguments":{"subjectIri":"http://example.com/scene-ontology#cafeDialogue","predicateIri":"http://purl.obolibrary.org/obo/BFO_0000055","objectIri":"http://example.com/scene-ontology#samSupportingRole"}}}` `{"jsonrpc":"2.0","id":61,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` -`{"jsonrpc":"2.0","id":62,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":62,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":63,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result @@ -182,7 +182,7 @@ slug: abox-full **Assistant:** Running reasoning. Jake should pick up `BFO:independent_continuant` via `Character → BFO_0000004`, and both scenes should inherit their BFO process superclasses through the `Scene → BFO:process` chain. `{"jsonrpc":"2.0","id":64,"method":"tools/call","params":{"name":"runReasoning","arguments":{}}}` -`{"jsonrpc":"2.0","id":65,"method":"tools/call","params":{"name":"expandAll","arguments":{}}}` +`{"jsonrpc":"2.0","id":65,"method":"tools/call","params":{"name":"expandNode","arguments":{}}}` `{"jsonrpc":"2.0","id":66,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr","spacing":200}}}` ```tool-result diff --git a/public/.well-known/mcp.json b/public/.well-known/mcp.json index a36aa16e..d8feb30d 100644 --- a/public/.well-known/mcp.json +++ b/public/.well-known/mcp.json @@ -1,6 +1,6 @@ { "name": "Ontosphere", - "description": "Interactive RDF/ontology knowledge graph editor — ABox authoring, OWL-RL reasoning, layout, and export. All client-side, no backend.\n\nABOX vs TBOX — TWO SEPARATE CANVAS VIEWS (critical for AI agents):\nOntosphere maintains a strict ABox/TBox split. Every node you add is classified by its rdf:type and appears in exactly one view:\n • ABox view (\"abox\") — individuals and instance data. Nodes typed as owl:NamedIndividual, skos:Concept, or any non-schema type. This is the default view for authoring instance knowledge.\n • TBox view (\"tbox\") — ontology schema. Nodes typed as owl:Class, owl:ObjectProperty, owl:DatatypeProperty, owl:AnnotationProperty, rdfs:Class, etc. This view shows the schema/vocabulary layer.\n • \"Punned\" resources (typed as both, e.g. owl:Class AND owl:NamedIndividual) appear in both views.\nSwitching views replaces the entire canvas — ABox nodes are invisible in TBox view and vice versa. Use setViewMode before exportImage to capture the right layer. addNode writes triples to the store and the canvas populates automatically in the correct view.\n\nArchitecture for AI agents: The app has two coupled layers. (1) N3 RDF store (urn:vg:data) — source of truth for all triples. addNode/addLink write here first. (2) Reactodia canvas — mirrors the store subset matching the active view as draggable node cards and arrows. Nodes start collapsed; call expandNode or expandAll to reveal annotation property cards. OWL-RL reasoning writes inferred triples back to the store (urn:vg:inferred) and refreshes the canvas.\n\nONTOLOGY DISCOVERY — always the first step:\nOWL, RDFS, RDF, and XSD are pre-loaded. All other ontologies must be loaded explicitly:\n 1. loadOntology(query=\"use case\") — find the right prefix (\"calendar\" → ical, \"music\" → mo, \"building\" → bot, \"e-commerce\" → gr, …)\n 2. loadOntology(url=\"\") — load by prefix name, e.g. loadOntology(url=\"mo\"). Repeat for each domain.\n 3. Register a namespace prefix: addNamespace(prefix, namespace) if you want short-form IRIs.\nIMPORTANT: Prefer domain-specific ontologies over schema.org for knowledge graphs.\nfoaf: is already pre-loaded (no loadOntology needed) and is the standard for persons.\nDomain → ontology mapping:\n • Persons → foaf:Person (pre-loaded)\n • Calendar events / meetings → ical:Vevent (loadOntology(query=\"calendar\"))\n • Organizations → org:Organization (loadOntology(query=\"organization\"))\n • Locations / buildings → bot:Building (loadOntology(query=\"building\"))\n schema: is a web-markup vocabulary (SEO); foaf:/ical:/org: are proper semantic-web ontologies.\n\nRecommended workflow: loadOntology(query=…) → loadOntology(url=\"\") ×N → addNamespace ×N → setViewMode(\"tbox\") → addNode ×N (owl:Class etc.) → addLink ×N (subClassOf etc.) → runLayout → setViewMode(\"abox\") → addNode ×N (individuals) → addLink ×N → runLayout → runReasoning → fitCanvas → exportImage(svg).\nFor 5+ ABox individuals, replace N addNode calls with one loadRdf(inline Turtle) — far fewer round-trips.\n\nGRAPH ARCHITECTURE\nAsserted triples live in urn:vg:data — all mutation tools (addNode, addLink, updateNode, SPARQL CONSTRUCT, etc.) operate here only.\nInferred triples live in urn:vg:inferred — written by runReasoning, cleared by clearInferred, and read-only from all other tools.\nSHACL shapes live in urn:vg:shapes — loaded by loadShacl, read by validateGraph.\nMutation tools never touch urn:vg:inferred or urn:vg:shapes; the separation is structural.\n\nNamespace prefixes: rdf: rdfs: owl: xsd: foaf: skos: dc: dcterms: schema: ex: are always available.\nAny prefix defined by a loaded ontology (loadOntology) or registered via addNamespace is also usable in IRI arguments in all subsequent tool calls.\n\nAgent integration: (1) Claude Code / Playwright — call window.__mcpTools[name](params) via browser_evaluate. (2) AI Relay Bridge — any AI chat (ChatGPT, Claude.ai, Gemini) can control Ontosphere via a bookmarklet relay that intercepts JSON-RPC 2.0 tool calls and injects results back automatically; see docs/relay-bridge.md. Full agent guide: AGENTS.md. Example sessions with SVG snapshots: docs/mcp-demo/.", + "description": "Browser-based RDF/ontology knowledge graph editor. ABox authoring, OWL-RL reasoning, layout, and export. All client-side, no backend.\n\nKEY RULES FOR AI AGENTS:\n• Two canvas views — ABox (individuals) and TBox (classes/properties). addNode writes to the store; the canvas shows the node in the correct view automatically. Use setViewMode to switch.\n• Ontology discovery first: loadOntology(query=\"use case\") → loadOntology(url=\"\") × N → setNamespace × N. foaf: is pre-loaded. OWL/RDFS/RDF/XSD always available.\n• Prefer domain ontologies over schema.org: foaf:Person, ical:Vevent, org:Organization, bot:Building.\n• For 5+ individuals use loadRdf(turtle=...) instead of N×addNode — one round-trip.\n• addLink blank-node limit: use loadRdf for owl:someValuesFrom/equivalentClass restrictions.\n• Batch up to 5 non-dependent calls per relay message. Send discovery (getNodes, queryGraph) alone.\n• Tool failed? Call help({tool:\"\"}) for the exact parameter schema.\n\nGRAPH ARCHITECTURE\nurn:vg:data = asserted triples (all mutations go here)\nurn:vg:inferred = OWL-RL derived (runReasoning writes; clearInferred removes)\nurn:vg:shapes = SHACL constraints (loadShacl writes; validateGraph reads)\n\nPre-loaded prefixes: rdf: rdfs: owl: xsd: foaf: skos: dc: dcterms: schema: ex:\nAfter loadOntology or setNamespace, those prefixes work in all tool IRI arguments.\n\nRecommended workflow:\nloadOntology(query=…) → loadOntology(url=\"\") × N → setNamespace × N\n→ setViewMode(\"tbox\") → addNode × N (owl:Class) → addLink × N → runLayout\n→ setViewMode(\"abox\") → loadRdf(turtle=...) OR addNode × N → addLink × N → runLayout\n→ runReasoning → fitCanvas + exportImage(svg) [last three safe to batch]\n\nAgent integration: (1) Claude Code / Playwright — window.__mcpTools[name](params) via browser_evaluate. (2) AI Relay Bridge — any AI chat controls Ontosphere via bookmarklet relay; see docs/relay-bridge.md and AGENTS.md.", "tools": [ { "name": "loadRdf", @@ -31,17 +31,19 @@ }, { "name": "loadOntology", - "description": "Discover or load well-known ontologies — three modes in one tool. (1) Load: pass url with a prefix name (e.g. \"ical\", \"mo\", \"bot\", \"gr\") or a namespace/file URL — loads the TBox, does NOT add canvas nodes. (2) Search: pass query with a use-case keyword (\"calendar\", \"music\", \"building\", \"e-commerce\", \"spatial\", \"IoT\") — returns matching entries with prefix/description/loadUrl. (3) List all: pass neither — returns all ~55 registered ontologies. If url does not match a known prefix or URL, load fails and suggestions are returned automatically. OWL/RDFS/RDF/XSD are always pre-loaded.", + "description": "Discover or load well-known ontologies — three modes in one tool. (1) Load: pass url with a prefix name (e.g. \"ical\", \"mo\", \"bot\", \"gr\") or a namespace/file URL — loads the TBox, does NOT add canvas nodes. (2) Search: pass query with a use-case keyword (\"calendar\", \"music\", \"building\", \"e-commerce\", \"spatial\", \"IoT\") — returns matching entries with prefix/description/loadUrl without loading. (3) List all: pass neither — returns all ~55 registered ontologies. If url does not match a known prefix or URL, load fails and suggestions are returned automatically. OWL/RDFS/RDF/XSD are always pre-loaded.", "inputSchema": { "type": "object", "properties": { "url": { - "type": "string" + "type": "string", + "description": "Prefix name (e.g. \"ical\", \"mo\") or full URL to load. Omit to search or list all ontologies." + }, + "query": { + "type": "string", + "description": "Use-case keyword to search the registry (e.g. \"calendar\", \"building\", \"IoT\"). Returns matching ontologies without loading." } - }, - "required": [ - "url" - ] + } } }, { @@ -146,7 +148,7 @@ }, { "name": "addNode", - "description": "Create a node (RDF subject) on the canvas by writing triples to the store. The node appears in the view that matches its rdf:type — owl:Class/owl:ObjectProperty etc. → TBox view; owl:NamedIndividual or unrecognised types → ABox view. Switch to the correct view with setViewMode BEFORE calling addNode so the node materialises immediately.", + "description": "Create a node (RDF subject) on the canvas by writing triples to the store. The node appears in the view that matches its rdf:type — owl:Class/owl:ObjectProperty etc. → TBox view; owl:NamedIndividual or unrecognised types → ABox view. Switch to the correct view with setViewMode BEFORE calling addNode so the node materialises immediately. For 5+ individuals use loadRdf(turtle=...) instead.", "inputSchema": { "type": "object", "properties": { @@ -184,28 +186,19 @@ }, { "name": "expandNode", - "description": "Expand one canvas node to show its annotation property card. Use when you need to reveal properties on a specific node. To expand every node at once, use expandAll — do not loop this tool.", + "description": "Expand canvas node(s) to show annotation property cards. Pass iri to expand one node; omit iri to expand all nodes at once. Pass expand=false to collapse.", "inputSchema": { "type": "object", "properties": { "iri": { - "type": "string" + "type": "string", + "description": "IRI of the node to expand. Omit to expand all canvas nodes." }, "expand": { "type": "boolean", "default": true } - }, - "required": [ - "iri" - ] - } - }, - { - "name": "expandAll", - "description": "Expand every canvas node in one call. Use instead of looping expandNode when you want all property cards visible.", - "inputSchema": { - "type": "object" + } } }, { @@ -316,6 +309,10 @@ "elk-stress", "elk-radial" ] + }, + "spacing": { + "type": "number", + "description": "Minimum distance between nodes in pixels. Defaults to 120." } }, "required": [ @@ -380,8 +377,8 @@ } }, { - "name": "addNamespace", - "description": "Register a new IRI prefix so it can be used in abbreviated form in tool parameters (e.g. \"myns:Alice\" → \"http://myns.org/Alice\").", + "name": "setNamespace", + "description": "Register or update an IRI prefix (upsert). Creates the prefix if new, replaces it if already registered. Use before IRI arguments to enable short prefix:local notation.", "inputSchema": { "type": "object", "properties": { @@ -400,25 +397,6 @@ ] } }, - { - "name": "updateNamespace", - "description": "Change the IRI namespace bound to an existing prefix.", - "inputSchema": { - "type": "object", - "properties": { - "prefix": { - "type": "string" - }, - "namespace": { - "type": "string" - } - }, - "required": [ - "prefix", - "namespace" - ] - } - }, { "name": "removeNamespace", "description": "Unregister an IRI prefix from the namespace registry.", @@ -608,4 +586,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/mcp/__tests__/links.test.ts b/src/mcp/__tests__/links.test.ts index 9d5590af..d31b200f 100644 --- a/src/mcp/__tests__/links.test.ts +++ b/src/mcp/__tests__/links.test.ts @@ -52,7 +52,7 @@ describe('addLink', () => { const result = await addLink.handler({ subjectIri: 'http://s', predicateIri: 'http://p' }); expect(result).toEqual({ success: false, - error: 'subjectIri, predicateIri, and objectIri are all required', + error: 'subjectIri, predicateIri, and objectIri are all required. Call help({tool:"addLink"}) for the full schema.', }); expect(rdfManager.addTriple).not.toHaveBeenCalled(); }); @@ -61,7 +61,7 @@ describe('addLink', () => { const result = await addLink.handler(null); expect(result).toEqual({ success: false, - error: 'subjectIri, predicateIri, and objectIri are all required', + error: 'subjectIri, predicateIri, and objectIri are all required. Call help({tool:"addLink"}) for the full schema.', }); }); }); diff --git a/src/mcp/manifest.ts b/src/mcp/manifest.ts index d669660b..2f9cc9b3 100644 --- a/src/mcp/manifest.ts +++ b/src/mcp/manifest.ts @@ -4,37 +4,28 @@ import type { McpToolManifestEntry } from './types'; export const mcpServerName = 'Ontosphere'; export const mcpServerDescription = - 'Interactive RDF/ontology knowledge graph editor — ABox authoring, OWL-RL reasoning, layout, and export. All client-side, no backend.\n\n' + - 'ABOX vs TBOX — TWO SEPARATE CANVAS VIEWS (critical for AI agents):\n' + - 'Ontosphere maintains a strict ABox/TBox split. Every node you add is classified by its rdf:type and appears in exactly one view:\n' + - ' • ABox view ("abox") — individuals and instance data. Nodes typed as owl:NamedIndividual, skos:Concept, or any non-schema type. This is the default view for authoring instance knowledge.\n' + - ' • TBox view ("tbox") — ontology schema. Nodes typed as owl:Class, owl:ObjectProperty, owl:DatatypeProperty, owl:AnnotationProperty, rdfs:Class, etc. This view shows the schema/vocabulary layer.\n' + - ' • "Punned" resources (typed as both, e.g. owl:Class AND owl:NamedIndividual) appear in both views.\n' + - 'Switching views replaces the entire canvas — ABox nodes are invisible in TBox view and vice versa. Use setViewMode before exportImage to capture the right layer. addNode writes triples to the store and the canvas populates automatically in the correct view.\n\n' + - 'Architecture for AI agents: The app has two coupled layers. (1) N3 RDF store (urn:vg:data) — source of truth for all triples. addNode/addLink write here first. (2) Reactodia canvas — mirrors the store subset matching the active view as draggable node cards and arrows. Nodes start collapsed; call expandNode or expandAll to reveal annotation property cards. OWL-RL reasoning writes inferred triples back to the store (urn:vg:inferred) and refreshes the canvas.\n\n' + - 'ONTOLOGY DISCOVERY — always the first step:\n' + - 'OWL, RDFS, RDF, and XSD are pre-loaded. All other ontologies must be loaded explicitly:\n' + - ' 1. loadOntology(query="use case") — find the right prefix ("calendar" → ical, "music" → mo, "building" → bot, "e-commerce" → gr, …)\n' + - ' 2. loadOntology(url="") — load by prefix name, e.g. loadOntology(url="mo"). Repeat for each domain.\n' + - ' 3. Register a namespace prefix: addNamespace(prefix, namespace) if you want short-form IRIs.\n' + - 'IMPORTANT: Prefer domain-specific ontologies over schema.org for knowledge graphs.\n' + - 'foaf: is already pre-loaded (no loadOntology needed) and is the standard for persons.\n' + - 'Domain → ontology mapping:\n' + - ' • Persons → foaf:Person (pre-loaded)\n' + - ' • Calendar events / meetings → ical:Vevent (loadOntology(query="calendar"))\n' + - ' • Organizations → org:Organization (loadOntology(query="organization"))\n' + - ' • Locations / buildings → bot:Building (loadOntology(query="building"))\n' + - ' schema: is a web-markup vocabulary (SEO); foaf:/ical:/org: are proper semantic-web ontologies.\n\n' + - 'Recommended workflow: loadOntology(query=…) → loadOntology(url="") ×N → addNamespace ×N → setViewMode("tbox") → addNode ×N (owl:Class etc.) → addLink ×N (subClassOf etc.) → runLayout → setViewMode("abox") → addNode ×N (individuals) → addLink ×N → runLayout → runReasoning → fitCanvas → exportImage(svg).\n' + - 'For 5+ ABox individuals, replace N addNode calls with one loadRdf(inline Turtle) — far fewer round-trips.\n\n' + + 'Browser-based RDF/ontology knowledge graph editor. ABox authoring, OWL-RL reasoning, layout, and export. All client-side, no backend.\n\n' + + 'KEY RULES FOR AI AGENTS:\n' + + '• Two canvas views — ABox (individuals) and TBox (classes/properties). addNode writes to the store; the canvas shows the node in the correct view automatically. Use setViewMode to switch.\n' + + '• Ontology discovery first: loadOntology(query="use case") → loadOntology(url="") × N → setNamespace × N. foaf: is pre-loaded. OWL/RDFS/RDF/XSD always available.\n' + + '• Prefer domain ontologies over schema.org: foaf:Person, ical:Vevent, org:Organization, bot:Building.\n' + + '• For 5+ individuals use loadRdf(turtle=...) instead of N×addNode — one round-trip.\n' + + '• addLink blank-node limit: use loadRdf for owl:someValuesFrom/equivalentClass restrictions.\n' + + '• Batch up to 5 non-dependent calls per relay message. Send discovery (getNodes, queryGraph) alone.\n' + + '• Tool failed? Call help({tool:""}) for the exact parameter schema.\n\n' + 'GRAPH ARCHITECTURE\n' + - 'Asserted triples live in urn:vg:data — all mutation tools (addNode, addLink, updateNode, SPARQL CONSTRUCT, etc.) operate here only.\n' + - 'Inferred triples live in urn:vg:inferred — written by runReasoning, cleared by clearInferred, and read-only from all other tools.\n' + - 'SHACL shapes live in urn:vg:shapes — loaded by loadShacl, read by validateGraph.\n' + - 'Mutation tools never touch urn:vg:inferred or urn:vg:shapes; the separation is structural.\n\n' + - 'Namespace prefixes: rdf: rdfs: owl: xsd: foaf: skos: dc: dcterms: schema: ex: are always available.\n' + - 'Any prefix defined by a loaded ontology (loadOntology) or registered via addNamespace is also usable in IRI arguments in all subsequent tool calls.\n\n' + - 'Agent integration: (1) Claude Code / Playwright — call window.__mcpTools[name](params) via browser_evaluate. (2) AI Relay Bridge — any AI chat (ChatGPT, Claude.ai, Gemini) can control Ontosphere via a bookmarklet relay that intercepts JSON-RPC 2.0 tool calls and injects results back automatically; see docs/relay-bridge.md. Full agent guide: AGENTS.md. Example sessions with SVG snapshots: docs/mcp-demo/.'; + 'urn:vg:data = asserted triples (all mutations go here)\n' + + 'urn:vg:inferred = OWL-RL derived (runReasoning writes; clearInferred removes)\n' + + 'urn:vg:shapes = SHACL constraints (loadShacl writes; validateGraph reads)\n\n' + + 'Pre-loaded prefixes: rdf: rdfs: owl: xsd: foaf: skos: dc: dcterms: schema: ex:\n' + + 'After loadOntology or setNamespace, those prefixes work in all tool IRI arguments.\n\n' + + 'Recommended workflow:\n' + + 'loadOntology(query=…) → loadOntology(url="") × N → setNamespace × N\n' + + '→ setViewMode("tbox") → addNode × N (owl:Class) → addLink × N → runLayout\n' + + '→ setViewMode("abox") → loadRdf(turtle=...) OR addNode × N → addLink × N → runLayout\n' + + '→ runReasoning → fitCanvas + exportImage(svg) [last three safe to batch]\n\n' + + 'Agent integration: (1) Claude Code / Playwright — window.__mcpTools[name](params) via browser_evaluate. ' + + '(2) AI Relay Bridge — any AI chat controls Ontosphere via bookmarklet relay; see docs/relay-bridge.md and AGENTS.md.'; export const mcpManifest: McpToolManifestEntry[] = [ { @@ -61,16 +52,22 @@ export const mcpManifest: McpToolManifestEntry[] = [ description: 'Discover or load well-known ontologies — three modes in one tool. ' + '(1) Load: pass url with a prefix name (e.g. "ical", "mo", "bot", "gr") or a namespace/file URL — loads the TBox, does NOT add canvas nodes. ' + - '(2) Search: pass query with a use-case keyword ("calendar", "music", "building", "e-commerce", "spatial", "IoT") — returns matching entries with prefix/description/loadUrl. ' + + '(2) Search: pass query with a use-case keyword ("calendar", "music", "building", "e-commerce", "spatial", "IoT") — returns matching entries with prefix/description/loadUrl without loading. ' + '(3) List all: pass neither — returns all ~55 registered ontologies. ' + 'If url does not match a known prefix or URL, load fails and suggestions are returned automatically. ' + 'OWL/RDFS/RDF/XSD are always pre-loaded.', inputSchema: { type: 'object', properties: { - url: { type: 'string' }, + url: { + type: 'string', + description: 'Prefix name (e.g. "ical", "mo") or full URL to load. Omit to search or list all ontologies.', + }, + query: { + type: 'string', + description: 'Use-case keyword to search the registry (e.g. "calendar", "building", "IoT"). Returns matching ontologies without loading.', + }, }, - required: ['url'], }, }, { @@ -155,7 +152,7 @@ export const mcpManifest: McpToolManifestEntry[] = [ }, { name: 'addNode', - description: 'Create a node (RDF subject) on the canvas by writing triples to the store. The node appears in the view that matches its rdf:type — owl:Class/owl:ObjectProperty etc. → TBox view; owl:NamedIndividual or unrecognised types → ABox view. Switch to the correct view with setViewMode BEFORE calling addNode so the node materialises immediately.', + description: 'Create a node (RDF subject) on the canvas by writing triples to the store. The node appears in the view that matches its rdf:type — owl:Class/owl:ObjectProperty etc. → TBox view; owl:NamedIndividual or unrecognised types → ABox view. Switch to the correct view with setViewMode BEFORE calling addNode so the node materialises immediately. For 5+ individuals use loadRdf(turtle=...) instead.', inputSchema: { type: 'object', properties: { @@ -179,21 +176,15 @@ export const mcpManifest: McpToolManifestEntry[] = [ }, { name: 'expandNode', - description: 'Expand one canvas node to show its annotation property card. Use when you need to reveal properties on a specific node. To expand every node at once, use expandAll — do not loop this tool.', + description: 'Expand canvas node(s) to show annotation property cards. Pass iri to expand one node; omit iri to expand all nodes at once. Pass expand=false to collapse.', inputSchema: { type: 'object', properties: { - iri: { type: 'string' }, + iri: { type: 'string', description: 'IRI of the node to expand. Omit to expand all canvas nodes.' }, expand: { type: 'boolean', default: true }, }, - required: ['iri'], }, }, - { - name: 'expandAll', - description: 'Expand every canvas node in one call. Use instead of looping expandNode when you want all property cards visible.', - inputSchema: { type: 'object' }, - }, { name: 'getNodes', description: 'Discover or filter all known entities (TBox classes and ABox individuals). Use labelContains to find by name — falls back to fuzzy match if nothing found (response includes fuzzyFallback:true). Use typeIri to filter by class, focusFirst:true to pan the viewport to the first canvas match. Use this before addNode/addLink to resolve IRIs.', @@ -258,6 +249,10 @@ export const mcpManifest: McpToolManifestEntry[] = [ type: 'string', enum: ['dagre-lr', 'dagre-tb', 'elk-layered', 'elk-force', 'elk-stress', 'elk-radial'], }, + spacing: { + type: 'number', + description: 'Minimum distance between nodes in pixels. Defaults to 120.', + }, }, required: ['algorithm'], }, @@ -304,8 +299,8 @@ export const mcpManifest: McpToolManifestEntry[] = [ inputSchema: { type: 'object' }, }, { - name: 'addNamespace', - description: 'Register a new IRI prefix so it can be used in abbreviated form in tool parameters (e.g. "myns:Alice" → "http://myns.org/Alice").', + name: 'setNamespace', + description: 'Register or update an IRI prefix (upsert). Creates the prefix if new, replaces it if already registered. Use before IRI arguments to enable short prefix:local notation.', inputSchema: { type: 'object', properties: { @@ -315,15 +310,6 @@ export const mcpManifest: McpToolManifestEntry[] = [ required: ['prefix', 'namespace'], }, }, - { - name: 'updateNamespace', - description: 'Change the IRI namespace bound to an existing prefix.', - inputSchema: { - type: 'object', - properties: { prefix: { type: 'string' }, namespace: { type: 'string' } }, - required: ['prefix', 'namespace'], - }, - }, { name: 'removeNamespace', description: 'Unregister an IRI prefix from the namespace registry.', diff --git a/src/mcp/tools/graph.ts b/src/mcp/tools/graph.ts index 1fd91003..b1df58b2 100644 --- a/src/mcp/tools/graph.ts +++ b/src/mcp/tools/graph.ts @@ -459,37 +459,51 @@ const help: McpTool = { return { success: true, data: { content: JSON.stringify({ name: entry.name, description: entry.description, inputSchema: entry.inputSchema }) } }; } const instructions = [ - mcpServerDescription, + 'RELAY FORMAT', + 'Single backtick per JSON-RPC object. Up to 5 calls per message — they run in order.', + '`{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"TOOLNAME","arguments":ARGS}}`', + '', + 'Example — layout + fit + export in one message:', + '`{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"runLayout","arguments":{"algorithm":"dagre-lr"}}}`', + '`{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"fitCanvas","arguments":{}}}`', + '`{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"exportImage","arguments":{"format":"svg"}}}`', + '', + 'CRITICAL RULES', + '1. Single ` not triple ```. Increment id per call. Never output a call you don\'t intend to run.', + '2. Batch up to 5 non-dependent calls (mutations, layout, export). Send discovery calls (getNodes, queryGraph) alone and wait for the result before continuing.', + '3. addLink: both nodes must exist first — call addNode for each endpoint in a prior batch or earlier in the same batch.', + '4. 5+ individuals: loadRdf(turtle=...) not repeated addNode — one round-trip.', + '5. Pre-loaded prefixes: foaf rdf rdfs owl xsd skos dc ex — use short form (foaf:Person, owl:Class).', + '6. Tool failed? Call help({tool:"toolname"}) to get the exact parameter schema.', '', - 'RELAY OUTPUT FORMAT', - 'Emit one MCP JSON-RPC 2.0 request per line, each wrapped in single backtick chars (U+0060).', - 'Format: BACKTICK{"jsonrpc":"2.0","id":,"method":"tools/call","params":{"name":"","arguments":{...}}}BACKTICK', - 'Replace BACKTICK with the actual backtick character (`) and fill in tool name and arguments.', + 'COMMON MISTAKES', + 'WRONG: addLink({s:"ex:A", p:"foaf:knows", o:"ex:B"})', + 'RIGHT: addLink({subjectIri:"ex:A", predicateIri:"foaf:knows", objectIri:"ex:B"})', '', - 'Rules:', - '1. Multiple tool calls per response are allowed — they run sequentially.', - '2. Use a different integer id for each call.', - '3. Wait for the injected result message before issuing more calls.', - '4. Never output a tool call unless you intend it to run — the relay executes everything it finds.', - '5. addLink requires both nodes to already exist on canvas — never issue addNode and addLink for the same node in one response.', - '6. For 5+ individuals, use loadRdf with inline Turtle instead of looping addNode — one call, no per-node round-trips.', - '7. Prefer domain ontologies over schema: — call loadOntology(query="use case") to find the right prefix; foaf:Person is pre-loaded for persons, ical: for meetings.', + 'WRONG: loadOntology({url:"calendar"}) ← searches by prefix name, not use-case', + 'RIGHT: loadOntology({query:"calendar"}) then loadOntology({url:"ical"}) to load', '', - 'Reading results:', - 'The relay injects a message starting with [Ontosphere — N tools ✓] followed by one backtick-wrapped', - 'JSON-RPC 2.0 response per call. result.content[0].text holds the outcome summary.', - '- result means success; error means failure (check error.message).', - '- A Canvas summary line and SVG may follow.', + 'SPARQL: prefixes registered via loadOntology/setNamespace are auto-injected — no PREFIX declarations needed for them.', + 'Only declare a PREFIX if it is not in your namespace registry.', '', - 'Timeout / late results:', - 'Long operations (layout, reasoning) may exceed the relay timeout. A timed-out call returns a JSON-RPC', - 'error with data.lateResult=true. Do NOT retry — a [Ontosphere — late result for ] follow-up', - 'will be injected automatically when the operation completes.', + 'WORKFLOW (minimal working session)', + '1. suggestOntologiesForTask({task:"..."}) → pick prefixes', + '2. loadOntology({url:""}) × N [batch these]', + '3. setViewMode({mode:"abox"})', + '4. loadRdf({turtle:"..."}) OR addNode × N + addLink × N [batch builds; discovery alone]', + '5. runLayout({algorithm:"dagre-lr"}) + fitCanvas() + exportImage({format:"svg"}) [batch these]', + '', + 'READING RESULTS', + 'Relay injects [Ontosphere — N tools ✓] with one backtick-wrapped JSON-RPC response per call.', + 'result = success; error = failure (check error.message).', + 'Long ops (layout, reasoning) may time out — a [late result for ] follow-up arrives automatically. Do NOT retry.', + '', + mcpServerDescription, '', 'TOOLS', ...mcpManifest.map(e => `${e.name} — ${e.description}`), '', - 'Call help({"tool":""}) for the full schema of any tool.', + 'Call help({tool:""}) for the full schema of any tool.', ].join('\n'); return { success: true, data: { content: instructions } }; }, diff --git a/src/mcp/tools/links.ts b/src/mcp/tools/links.ts index 64eb35ae..fd13bebc 100644 --- a/src/mcp/tools/links.ts +++ b/src/mcp/tools/links.ts @@ -10,6 +10,10 @@ interface LinkParams { subjectIri?: string; predicateIri?: string; objectIri?: string; + // common aliases accepted silently + s?: string; subject?: string; + p?: string; predicate?: string; + o?: string; object?: string; limit?: number; } @@ -29,12 +33,15 @@ export const linkTools: McpTool[] = [ handler: async (params: unknown) => { try { const raw = (params ?? {}) as LinkParams; - const subjectIri = raw.subjectIri ? expandIri(raw.subjectIri) : undefined; - const predicateIri = raw.predicateIri ? expandIri(raw.predicateIri) : undefined; + const rawS = raw.subjectIri ?? raw.subject ?? raw.s; + const rawP = raw.predicateIri ?? raw.predicate ?? raw.p; + const rawO = raw.objectIri ?? raw.object ?? raw.o; + const subjectIri = rawS ? expandIri(rawS) : undefined; + const predicateIri = rawP ? expandIri(rawP) : undefined; // objectIri may be a plain literal — only expand if it looks like a prefixed IRI - const objectIri = raw.objectIri ? expandIri(raw.objectIri) : undefined; + const objectIri = rawO ? expandIri(rawO) : undefined; if (!subjectIri || !predicateIri || !objectIri) { - return { success: false as const, error: 'subjectIri, predicateIri, and objectIri are all required' }; + return { success: false as const, error: 'subjectIri, predicateIri, and objectIri are all required. Call help({tool:"addLink"}) for the full schema.' }; } const expandError = [subjectIri, predicateIri, objectIri].find(v => v.startsWith('Unknown prefix:')); if (expandError) return { success: false as const, error: expandError }; @@ -72,9 +79,12 @@ export const linkTools: McpTool[] = [ handler: async (params: unknown) => { try { const raw = (params ?? {}) as LinkParams; - const subjectIri = raw.subjectIri ? expandIri(raw.subjectIri) : undefined; - const predicateIri = raw.predicateIri ? expandIri(raw.predicateIri) : undefined; - const objectIri = raw.objectIri ? expandIri(raw.objectIri) : undefined; + const rawS = raw.subjectIri ?? raw.subject ?? raw.s; + const rawP = raw.predicateIri ?? raw.predicate ?? raw.p; + const rawO = raw.objectIri ?? raw.object ?? raw.o; + const subjectIri = rawS ? expandIri(rawS) : undefined; + const predicateIri = rawP ? expandIri(rawP) : undefined; + const objectIri = rawO ? expandIri(rawO) : undefined; if (!subjectIri || !predicateIri || !objectIri) { return { success: false as const, error: 'subjectIri, predicateIri, and objectIri are all required' }; } diff --git a/src/mcp/tools/namespaceTools.ts b/src/mcp/tools/namespaceTools.ts index b78f5a69..f05c2dc7 100644 --- a/src/mcp/tools/namespaceTools.ts +++ b/src/mcp/tools/namespaceTools.ts @@ -3,9 +3,9 @@ import type { McpTool } from '../types'; import { rdfManager } from '@/utils/rdfManager'; import { normalizeEntry } from '@/constants/namespaces'; -const addNamespace: McpTool = { - name: 'addNamespace', - description: 'Register a new IRI prefix so it can be used in abbreviated form in tool parameters (e.g. "myns:Alice" → "http://myns.org/Alice").', +const setNamespace: McpTool = { + name: 'setNamespace', + description: 'Register or update an IRI prefix (upsert). Creates the prefix if new, replaces it if already registered.', inputSchema: { type: 'object', properties: { @@ -20,10 +20,6 @@ const addNamespace: McpTool = { if (!prefix) return { success: false, error: 'prefix is required' }; if (!namespace) return { success: false, error: 'namespace is required' }; const key = prefix.endsWith(':') ? prefix.slice(0, -1) : prefix; - const existing = rdfManager.getNamespaces(); - if (existing.some(e => e.prefix === key)) { - return { success: false, error: `Prefix "${key}:" already registered. Use updateNamespace to change it.` }; - } const entry = normalizeEntry({ prefix: key, uri: namespace }); rdfManager.addNamespace(entry.prefix, entry.uri); return { success: true, data: { registered: `${key}: → ${namespace}` } }; @@ -33,43 +29,12 @@ const addNamespace: McpTool = { }, }; -const updateNamespace: McpTool = { - name: 'updateNamespace', - description: 'Change the IRI namespace bound to an existing prefix.', - inputSchema: { - type: 'object', - properties: { - prefix: { type: 'string' }, - namespace: { type: 'string' }, - }, - required: ['prefix', 'namespace'], - }, - handler: async (params) => { - try { - const { prefix, namespace } = params as { prefix?: string; namespace?: string }; - if (!prefix) return { success: false, error: 'prefix is required' }; - if (!namespace) return { success: false, error: 'namespace is required' }; - const key = prefix.endsWith(':') ? prefix.slice(0, -1) : prefix; - const existing = rdfManager.getNamespaces(); - if (!existing.some(e => e.prefix === key)) { - return { success: false, error: `Prefix "${key}:" not found. Use addNamespace to register it first.` }; - } - rdfManager.addNamespace(key, namespace); - return { success: true, data: { updated: `${key}: → ${namespace}` } }; - } catch (e) { - return { success: false, error: String(e) }; - } - }, -}; - const removeNamespace: McpTool = { name: 'removeNamespace', description: 'Unregister an IRI prefix from the namespace registry.', inputSchema: { type: 'object', - properties: { - prefix: { type: 'string' }, - }, + properties: { prefix: { type: 'string' } }, required: ['prefix'], }, handler: async (params) => { @@ -105,4 +70,4 @@ const listNamespaces: McpTool = { }, }; -export const namespaceTools: McpTool[] = [addNamespace, updateNamespace, removeNamespace, listNamespaces]; +export const namespaceTools: McpTool[] = [setNamespace, removeNamespace, listNamespaces]; diff --git a/src/mcp/tools/nodes.ts b/src/mcp/tools/nodes.ts index bfef9be3..80ceea2c 100644 --- a/src/mcp/tools/nodes.ts +++ b/src/mcp/tools/nodes.ts @@ -33,11 +33,11 @@ const addNode: McpTool = { }, handler: async (params) => { try { - const raw = params as { iri?: string; typeIri?: string; label?: string }; + const raw = params as { iri?: string; typeIri?: string; type?: string; label?: string }; if (!raw.iri) return { success: false, error: 'iri is required' }; const iri = expandIri(raw.iri); if (iri.startsWith('Unknown prefix:')) return { success: false, error: iri }; - const typeIri = raw.typeIri ? expandIri(raw.typeIri) : undefined; + const typeIri = (raw.typeIri ?? raw.type) ? expandIri((raw.typeIri ?? raw.type)!) : undefined; if (typeIri?.startsWith('Unknown prefix:')) return { success: false, error: typeIri }; const { label } = raw; @@ -85,43 +85,32 @@ const removeNode: McpTool = { const expandNode: McpTool = { name: 'expandNode', - description: 'Expand a node to show its annotation properties. Pass expand=false to collapse.', + description: 'Expand canvas node(s) to show annotation properties. Pass iri to expand one node; omit iri to expand all nodes at once. Pass expand=false to collapse.', inputSchema: { type: 'object', properties: { iri: { type: 'string' }, expand: { type: 'boolean', default: true }, }, - required: ['iri'], }, handler: async (params) => { try { - const { iri, expand = true } = params as { iri: string; expand?: boolean }; - const { ctx } = getWorkspaceRefs(); - const el = findEntityElement(iri, ctx.model); - if (!el) return { success: false, error: `Element not on canvas: ${iri}` }; - ctx.model.history.execute(Reactodia.setElementExpanded(el, expand)); - return { success: true, data: { iri, expanded: expand } }; - } catch (e) { - return { success: false, error: String(e) }; - } - }, -}; - -const expandAll: McpTool = { - name: 'expandAll', - description: 'Expand all nodes on the canvas to show their annotation properties.', - inputSchema: { type: 'object' }, - handler: async () => { - try { + const { iri, expand = true } = (params ?? {}) as { iri?: string; expand?: boolean }; const { ctx } = getWorkspaceRefs(); const model = ctx.model; - for (const el of model.elements) { - if (el instanceof Reactodia.EntityElement) { - model.history.execute(Reactodia.setElementExpanded(el, true)); + if (!iri) { + // Expand/collapse all canvas nodes + for (const el of model.elements) { + if (el instanceof Reactodia.EntityElement) { + model.history.execute(Reactodia.setElementExpanded(el, expand)); + } } + return { success: true, data: { expanded: model.elements.length } }; } - return { success: true, data: { expanded: model.elements.length } }; + const el = findEntityElement(iri, model); + if (!el) return { success: false, error: `Element not on canvas: ${iri}` }; + model.history.execute(Reactodia.setElementExpanded(el, expand)); + return { success: true, data: { iri, expanded: expand } }; } catch (e) { return { success: false, error: String(e) }; } @@ -368,4 +357,4 @@ const updateNode: McpTool = { }, }; -export const nodeTools: McpTool[] = [addNode, removeNode, expandNode, expandAll, getNodes, getNodeDetails, updateNode]; +export const nodeTools: McpTool[] = [addNode, removeNode, expandNode, getNodes, getNodeDetails, updateNode];