feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: ontology viewer - #748

Merged
coodos merged 3 commits into
mainfrom
feat/ongology-UI
Jan 30, 2026
Merged

feat: ontology viewer#748
coodos merged 3 commits into
mainfrom
feat/ongology-UI

Conversation

@coodos

@coodoscoodos commented Jan 30, 2026

Copy link
Copy Markdown
Contributor

Description of change

add ontology viewer

Issue Number

closes#747 (I love this number)

Type of change

  • New (a change which implements a new feature)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Ontology Viewer UI added with search, schema list, detail view and raw-JSON endpoints.
  • Bug Fixes / Changes

    • Removed the UserProfile schema.
  • Chores

    • Workspace updated to include additional services.
    • Service port changed and view engine configured (EJS) for the ontology UI.
    • Minor repository ignore additions.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitaiBot commented Jan 30, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds an Ontology viewer service (EJS UI + routes), five new JSON Schema files, removes userProfile schema, updates two web3 mapping schemaId values, expands pnpm workspace to include services/*, adds ejs dependency, removes a package manifest, and updates .gitignore.

Changes

Cohort / File(s)Summary
New Schemas
services/ontology/schemas/currency.json, services/ontology/schemas/ledger.json, services/ontology/schemas/poll.json, services/ontology/schemas/reference.json, services/ontology/schemas/vote.json
Added five JSON Schema files defining Currency, Ledger, Poll, Reference, and Vote models with properties, formats, required fields, and additionalProperties=false.
Removed Schema
services/ontology/schemas/userProfile.json
Deleted the UserProfile JSON Schema file.
Ontology Service & UI
services/ontology/src/index.js, services/ontology/views/index.ejs
Added Express routes, port change to 6767, EJS view engine, getSchemaList utility, JSON schema endpoints and a server-rendered UI with a client-side drawer to view schema details.
Web3 Adapter Mappings
platforms/eCurrency-api/src/web3adapter/mappings/currency.mapping.json, platforms/eCurrency-api/src/web3adapter/mappings/ledger.mapping.json
Updated schemaId values: currency -> 550e8400-e29b-41d4-a716-446655440008; ledger -> 550e8400-e29b-41d4-a716-446655440006.
Workspace & Manifests
pnpm-workspace.yaml, services/ontology/package.json, services/web3-adapter/package.json
Added services/* to pnpm workspace, added ejs dependency to ontology package, and removed services/web3-adapter/package.json.
Repo Config
.gitignore
Added .svelte-kit to the ignore list.

Sequence Diagram(s)

sequenceDiagram
participant Client as Client (Browser)
participant Service as Ontology Service (Express)
participant SchemaFS as Schema Files (disk)
participant ViewEngine as EJS (renderer)
Client->>Service: GET /?q={query}
Service->>SchemaFS: Read schema files list
SchemaFS-->>Service: Return list of schemas
Service->>ViewEngine: Render index.ejs with list (and optional selected)
ViewEngine-->>Client: HTML page (list + drawer)
Client->>Service: GET /schemas/:uuid
Service->>SchemaFS: Read schema file :uuid
SchemaFS-->>Service: Return schema JSON
Service-->>Client: JSON schema
Client->>Client: Render drawer with schema details
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Suggested reviewers

  • sosweetham
  • xPathin

Poem

🐰 I hopped through schema fields with cheer,

currency and ledgers now appear,
A drawer that opens, JSON in view,
EJS paints the scenes anew,
Hop on, the ontology's here!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 inconclusive)
Check nameStatusExplanationResolution
Out of Scope Changes check❓ InconclusiveSeveral changes appear tangential to the core viewer feature: currency/ledger mapping updates, web3-adapter removal, and userProfile deletion lack clear connection to #747 objectives.Clarify the purpose of schema updates (currency, ledger), web3-adapter package removal, and userProfile deletion in relation to the ontology viewer feature.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title 'feat: ontology viewer' clearly summarizes the main feature addition, following conventional commit format.
Description check✅ PassedThe description follows the required template with all key sections completed: issue number, type of change, and all checklist items marked.
Linked Issues check✅ PassedThe PR implements the ontology viewer feature requested in #747, adding UI and backend routes to display global ontologies as specified.
Docstring Coverage✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ongology-UI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

export const npm_config_verify_deps_before_run: string;
export const npm_config__jsr_registry: string;
export const CLOJURE_HOME: string;
export const MEMORY_PRESSURE_WRITE: string;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete these and add a gitignore fr

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@services/ontology/schemas/vote.json`:
- Around line 32-55: Add a "required": ["mode"] entry to the "data" object
schema in services/ontology/schemas/vote.json so that data.mode is required and
must match the existing enum; specifically, inside the "data" property's object
(which contains "type": "object", "properties": { "mode": ... }), add the
required array to enforce the presence of "mode".
In `@services/ontology/src/index.js`:
- Around line 48-61: The getSchemaList function can throw when a schema lacks
title; make the mapping and filtering defensive by normalizing titles to strings
before using toLowerCase: when building list from schemaIndex in getSchemaList,
ensure each item's title is set to (schema.title || '') or String(schema.title
|| '') so title is never undefined, and in the filter reference the normalized
s.title (or guard with (s.title || '').toLowerCase()) when checking includes;
this ensures s.title.toLowerCase() cannot throw while preserving search
behavior.
🧹 Nitpick comments (4)
services/ontology/views/index.ejs (3)

155-161: Consider adding aria-modal="true" and focus trap for better accessibility.

The drawer has good ARIA attributes (role="dialog", aria-label), but for modal dialogs, aria-modal="true" should be added to indicate that content behind the drawer is inert. Additionally, there's no focus trap to prevent keyboard users from tabbing outside the open drawer.

♿ Suggested accessibility improvement
- <div class="drawer-panel" id="drawerPanel" role="dialog" aria-label="Schema detail">+ <div class="drawer-panel" id="drawerPanel" role="dialog" aria-modal="true" aria-label="Schema detail">

Consider also implementing a focus trap in JavaScript to keep keyboard focus within the drawer while it's open.


220-248: Good XSS prevention with escapeHtml, but consider URL encoding for the href.

The escapeHtml function properly prevents XSS when building innerHTML. However, at line 225, escapeHtml(schema.schemaId) is used in the href attribute. While escapeHtml handles HTML entity encoding, it doesn't URL-encode special characters. Since schema IDs appear to be UUIDs (which only contain safe characters), this works, but for robustness, consider using encodeURIComponent for the URL path:

🛡️ Suggested improvement for URL safety
- html += '<div class="raw-link"><a href="/schemas/' + escapeHtml(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';+ html += '<div class="raw-link"><a href="/schemas/' + encodeURIComponent(schema.schemaId) + '" target="_blank" rel="noopener">Raw JSON</a></div>';

245-248: Consider providing more specific error feedback to users.

The catch block displays a generic "Failed to load schema" message. For better user experience, consider differentiating between network errors and "not found" responses.

💡 Suggested improvement
- .catch(function() {- content.innerHTML = '<p>Failed to load schema.</p>';+ .catch(function(err) {+ var msg = err && err.message === 'Not found' ? 'Schema not found.' : 'Failed to load schema.';+ content.innerHTML = '<p>' + msg + '</p>';
openDrawer();
});
services/ontology/src/index.js (1)

93-111: Consider URL pattern consistency.

The UI route uses /schema/:uuid (singular) while the JSON API uses /schemas/:uuid (plural). This is a minor inconsistency that could confuse users. If intentional for distinguishing UI from API, consider documenting this convention.

Comment threadservices/ontology/schemas/vote.json
Comment threadservices/ontology/src/index.js
@coodos
coodos merged commit faea22e into mainJan 30, 2026
3 of 4 checks passed
@coodos
coodos deleted the feat/ongology-UI branch January 30, 2026 08:20
@coderabbitaicoderabbitaiBot mentioned this pull request Mar 28, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feature] Ontology Viewer

2 participants

@coodos@sosweetham