@semiont/cli 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -8,7 +8,7 @@ const require = (name) => {
|
|
|
8
8
|
throw new Error('Unknown module: ' + name);
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
"use strict";var SemiontDashboard=(()=>{var ne=Object.create;var _=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var w=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var ce=(e,n)=>{for(var t in n)_(e,t,{get:n[t],enumerable:!0})},F=(e,n,t,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of oe(n))!re.call(e,o)&&o!==t&&_(e,o,{get:()=>n[o],enumerable:!(a=ae(n,o))||a.enumerable});return e};var N=(e,n,t)=>(t=e!=null?ne(ie(e)):{},F(n||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e)),le=e=>F(_({},"__esModule",{value:!0}),e);var Ae={};ce(Ae,{WebDashboardApp:()=>q});var s=N(w("react"),1);var i=N(w("react"),1),me="semiont-tag semiont-tag--secondary semiont-tag--compact",de=new Set(["graph","neo4j","janusgraph","neptune"]),pe=e=>e.toLowerCase().startsWith("inference.");function ue(e){let n=e.indexOf(".");if(n!==-1){let t=e.slice(0,n),a=e.slice(n+1);return t.charAt(0).toUpperCase()+t.slice(1)+" ("+a.charAt(0).toUpperCase()+a.slice(1)+")"}return e.charAt(0).toUpperCase()+e.slice(1)}var V=["proxy","frontend","backend","database"];function ge(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";case"warning":return"semiont-indicator semiont-indicator--busy";default:return"semiont-indicator"}}function ve(e){switch(e){case"healthy":return"healthy";case"unhealthy":return"unhealthy";case"warning":return"warning";default:return"unknown"}}function he(e){switch(e){case"healthy":return"semiont-badge semiont-badge--success";case"unhealthy":return"semiont-badge semiont-badge--error";case"warning":return"semiont-badge semiont-badge--warning";default:return"semiont-badge semiont-badge--info"}}var fe=({service:e})=>{let n=e.evidence&&e.evidence.length>0?[...e.evidence]:(()=>{let a=e.details||"",o=[],d=a.match(/[Pp][Ii][Dd]:\s*(\d+)/),v=a.match(/[Cc]ontainer:\s*(\S+)/);return d&&o.push(`pid ${d[1]}`),v&&o.push(`container ${v[1].slice(0,12)}`),e.runningCount!==void 0&&e.desiredCount!==void 0&&o.push(`${e.runningCount}/${e.desiredCount} tasks`),o})();e.checkedAt&&n.push(`checked ${new Date(e.checkedAt).toLocaleTimeString()}`);let t=be(e);return i.default.createElement("div",{className:"service-row"},i.default.createElement("div",{className:"service-row__indicator"},i.default.createElement("span",{className:ge(e.status)})),i.default.createElement("div",{className:"service-row__name"},ue(e.name)),i.default.createElement("div",{className:"service-row__host"},e.hostname?i.default.createElement("span",{className:"service-row__hostname"},e.hostname):i.default.createElement("span",{className:"service-row__hostname service-row__hostname--dim"},"\u2014")),i.default.createElement("div",{className:"service-row__status"},i.default.createElement("span",{className:he(e.status)},i.default.createElement("span",{className:"semiont-badge__text"},ve(e.status)))),i.default.createElement("div",{className:"service-row__tags"},n.map((a,o)=>i.default.createElement("span",{key:o,className:me},a))),i.default.createElement("div",{className:"service-row__actions"},t.map((a,o)=>i.default.createElement("a",{key:o,href:a.url,target:"_blank",rel:"noopener noreferrer",className:"semiont-tag semiont-tag--info semiont-tag--compact"},a.label))))};function be(e){let n=[],t=e.awsRegion||"us-east-1";return e.ecsServiceName&&e.ecsClusterName&&(n.push({label:"Console \u2197",url:`https://console.aws.amazon.com/ecs/home?region=${t}#/clusters/${e.ecsClusterName}/services/${e.ecsServiceName}/details`}),e.logGroupName&&n.push({label:"Logs \u2197",url:`https://console.aws.amazon.com/cloudwatch/home?region=${t}#logsV2:log-groups/log-group/${encodeURIComponent(e.logGroupName)}`})),e.rdsInstanceId&&n.push({label:"Console \u2197",url:`https://console.aws.amazon.com/rds/home?region=${t}#database:id=${e.rdsInstanceId};is-cluster=false`}),n}var H=({services:e})=>{let t=[...e.filter(a=>!de.has(a.name.toLowerCase())&&!pe(a.name))].sort((a,o)=>{let d=V.indexOf(a.name.toLowerCase()),v=V.indexOf(o.name.toLowerCase());return d===-1&&v===-1?a.name.localeCompare(o.name):d===-1?1:v===-1?-1:d-v});return i.default.createElement("div",{className:"service-list"},i.default.createElement("div",{className:"service-list__header"},i.default.createElement("div",{className:"service-row__indicator"}),i.default.createElement("div",{className:"service-row__name"},"Service"),i.default.createElement("div",{className:"service-row__host"},"Address"),i.default.createElement("div",{className:"service-row__status"},"Status"),i.default.createElement("div",{className:"service-row__tags"},"Details"),i.default.createElement("div",{className:"service-row__actions"})),t.map((a,o)=>i.default.createElement(fe,{key:o,service:a})))};var g=N(w("react"),1);var m=N(w("react"),1),Se="semiont-tag semiont-tag--secondary semiont-tag--compact",f=({indicator:e,label:n,value:t,tags:a})=>m.default.createElement("div",{className:"mm-row"},m.default.createElement("div",{className:"mm-row__indicator"},m.default.createElement("span",{className:e})),m.default.createElement("div",{className:"mm-row__label"},n),m.default.createElement("div",{className:"mm-row__value"},t),m.default.createElement("div",{className:"mm-row__tags"},a==null?void 0:a.filter(Boolean).map((o,d)=>m.default.createElement("span",{key:d,className:Se},o)))),y=({title:e,children:n})=>m.default.createElement("div",{className:"mm-group"},m.default.createElement("div",{className:"mm-group__title"},e),m.default.createElement("div",{className:"mm-list"},n));function we(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}function Ne(e){return e.includes(".")?e.slice(e.indexOf(".")+1).replace(/^\w/,n=>n.toUpperCase()):e}var M=({inferenceServices:e})=>e.length===0?null:m.default.createElement(y,{title:"Inference"},e.map(n=>m.default.createElement(f,{key:n.name,indicator:we(n.status),label:Ne(n.name),value:n.status,tags:n.evidence})));function j(e){if(e===0)return"0 B";let n=1024,t=["B","KB","MB","GB","TB"],a=Math.floor(Math.log(e)/Math.log(n));return`${(e/Math.pow(n,a)).toFixed(1)} ${t[a]}`}function T(e,n=40){return e.length<=n?e:"\u2026"+e.slice(e.length-n+1)}function ye(e){switch(e.state){case"active":return"semiont-indicator semiont-indicator--online semiont-indicator--pulse";case"idle":return"semiont-indicator semiont-indicator--online";case"error":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}function ke(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}var O=({makeMeaning:e,inferenceServices:n})=>g.default.createElement("div",{className:"mm-sections"},g.default.createElement(y,{title:"System of Record"},g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Event Log",value:e.eventLog.eventCount!==void 0?e.eventLog.eventCount.toLocaleString()+" events":"unknown",tags:[e.eventLog.streamCount!==void 0&&`${e.eventLog.streamCount} streams`,e.eventLog.sizeBytes!==void 0&&j(e.eventLog.sizeBytes),e.eventLog.path&&T(e.eventLog.path)]}),g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Content Store",value:e.contentStore.sizeBytes!==void 0?j(e.contentStore.sizeBytes):"unknown",tags:[e.contentStore.fileCount!==void 0&&`${e.contentStore.fileCount} files`,e.contentStore.path&&T(e.contentStore.path)]})),g.default.createElement(y,{title:"Projections"},g.default.createElement(f,{indicator:ke(e.graph.status),label:"Graph",value:e.graph.status,tags:[e.graph.address,e.graph.database,...e.graph.evidence??[]]}),g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Materialized Views",value:e.materializedViews.fileCount!==void 0?`${e.materializedViews.fileCount} projections`:"unknown",tags:[e.materializedViews.lastUpdated&&`updated ${new Date(e.materializedViews.lastUpdated).toLocaleTimeString()}`,e.materializedViews.path&&T(e.materializedViews.path)]})),g.default.createElement(y,{title:"Actors"},["gatherer","matcher","stower"].map(t=>{let a=e.actors[t];return g.default.createElement(f,{key:t,indicator:ye(a),label:t.charAt(0).toUpperCase()+t.slice(1),value:a.state,tags:[a.provider,a.model,a.errorMessage&&a.errorMessage.slice(0,40)]})})),g.default.createElement(M,{inferenceServices:n}));var r=N(w("react"),1);var b="semiont-tag semiont-tag--secondary semiont-tag--compact",Ce={"reference-annotation":"Reference Annotation","highlight-annotation":"Highlight Annotation","assessment-annotation":"Assessment Annotation","comment-annotation":"Comment Annotation","tag-annotation":"Tag Annotation",generation:"Generation"};function _e(e){let n=Date.now()-e.getTime(),t=Math.floor(n/6e4);if(t<1)return"just now";if(t<60)return`${t}m ago`;let a=Math.floor(t/60);return a<24?`${a}h ago`:`${Math.floor(a/24)}d ago`}function Me(e){return e.state==="error"?"semiont-indicator semiont-indicator--offline":e.activeCount>0?"semiont-indicator semiont-indicator--online semiont-indicator--pulse":e.pendingCount>10?"semiont-indicator semiont-indicator--busy":"semiont-indicator semiont-indicator--online"}var K=({workers:e,inferenceServices:n})=>r.default.createElement("div",{className:"mm-sections"},r.default.createElement("div",{className:"mm-group"},r.default.createElement("div",{className:"mm-group__title"},"Workers"),r.default.createElement("div",{className:"mm-list"},r.default.createElement("div",{className:"mm-row mm-row--header"},r.default.createElement("div",{className:"mm-row__indicator"}),r.default.createElement("div",{className:"mm-row__label"},"Worker"),r.default.createElement("div",{className:"mm-row__value"},"Status"),r.default.createElement("div",{className:"mm-row__tags"},"Details")),e.map((t,a)=>r.default.createElement("div",{key:a,className:"mm-row"},r.default.createElement("div",{className:"mm-row__indicator"},r.default.createElement("span",{className:Me(t)})),r.default.createElement("div",{className:"mm-row__label"},Ce[t.type]),r.default.createElement("div",{className:"mm-row__value"},t.state),r.default.createElement("div",{className:"mm-row__tags"},r.default.createElement("span",{className:t.activeCount>0?"semiont-tag semiont-tag--success semiont-tag--compact":b},t.activeCount," active"),r.default.createElement("span",{className:b},t.pendingCount," pending"),t.completedCount>0&&r.default.createElement("span",{className:b},t.completedCount," done"),t.failedCount>0&&r.default.createElement("span",{className:"semiont-tag semiont-tag--warning semiont-tag--compact"},t.failedCount," failed"),t.state==="idle"&&!t.lastProcessed&&r.default.createElement("span",{className:b},"never used"),t.lastProcessed&&t.state==="idle"&&r.default.createElement("span",{className:b},"last used ",_e(new Date(t.lastProcessed))),t.lastProcessed&&t.state!=="idle"&&r.default.createElement("span",{className:b},"last ",new Date(t.lastProcessed).toLocaleTimeString())))))),r.default.createElement(M,{inferenceServices:n}));var Le={eventLog:{path:""},contentStore:{path:""},graph:{status:"unknown"},materializedViews:{path:""},actors:{gatherer:{state:"unknown"},matcher:{state:"unknown"},stower:{state:"unknown"}}},U=({logs:e,service:n})=>{let t=n?e.filter(a=>a.service===n||!n):e;return s.default.createElement("div",{className:"semiont-panel semiont-panel--bordered dashboard-logs"},s.default.createElement("div",{className:"semiont-panel-header"},s.default.createElement("span",{className:"semiont-panel-header__title"},"Recent Logs")),t.length===0?s.default.createElement("div",{className:"logs-empty"},"No recent logs"):s.default.createElement("div",{className:"logs-list"},t.slice(0,50).map((a,o)=>s.default.createElement("div",{key:o,className:`log-entry log-entry--${a.level}`},s.default.createElement("span",{className:"log-timestamp"},new Date(a.timestamp).toLocaleTimeString()),s.default.createElement("span",{className:"log-service"},a.service),s.default.createElement("span",{className:`log-level semiont-badge semiont-badge--${a.level==="error"?"error":a.level==="warn"?"warning":"info"}`},s.default.createElement("span",{className:"semiont-badge__text"},a.level.toUpperCase())),s.default.createElement("span",{className:"log-message"},a.message)))))},De=({active:e,onChange:n,webHealthy:t,webTotal:a,mmHealthy:o,mmTotal:d,wkHealthy:v,wkTotal:L})=>{let D=[{id:"make-meaning",label:"Make Meaning",healthy:o,total:d},{id:"workers",label:"Workers",healthy:v,total:L},{id:"web",label:"Web Interface",healthy:t,total:a}];function A(c,S){return S===0?"semiont-badge semiont-badge--info":c===S?"semiont-badge semiont-badge--success":c===0?"semiont-badge semiont-badge--error":"semiont-badge semiont-badge--warning"}return s.default.createElement("div",{className:"dashboard-tabs"},D.map(c=>s.default.createElement("button",{key:c.id,className:`dashboard-tab${e===c.id?" dashboard-tab--active":""}`,onClick:()=>n(c.id)},c.label,s.default.createElement("span",{className:A(c.healthy,c.total)},s.default.createElement("span",{className:"semiont-badge__text"},c.healthy,"/",c.total)))))},P=({time:e,label:n})=>s.default.createElement("span",{className:"tab-update-time"},n,": ",e?e.toLocaleTimeString():"\u2014"),q=({environment:e,refreshInterval:n})=>{let[t,a]=(0,s.useState)("make-meaning"),[o,d]=(0,s.useState)([]),[v,L]=(0,s.useState)([]),[D,A]=(0,s.useState)(null),[c,S]=(0,s.useState)(Le),[J,E]=(0,s.useState)(null),[I,Q]=(0,s.useState)([]),[X,Y]=(0,s.useState)(null),[W,$]=(0,s.useState)(!1),[x,z]=(0,s.useState)(!1);if((0,s.useEffect)(()=>{let l=window.io;if(!l){console.error("Socket.IO not loaded");return}let h=l();return h.on("connect",()=>$(!0)),h.on("disconnect",()=>$(!1)),h.on("services-update",p=>{d(p.services),L(p.logs),A(new Date),z(!0)}),h.on("make-meaning-update",p=>{let{lastUpdate:C,...se}=p;S(se),E(C?new Date(C):new Date)}),h.on("actors-update",p=>{S(C=>({...C,actors:p.actors})),p.lastUpdate&&E(new Date(p.lastUpdate))}),h.on("workers-update",p=>{Q(p.workers),Y(p.lastUpdate?new Date(p.lastUpdate):new Date),x||z(!0)}),()=>h.disconnect()},[]),!x)return s.default.createElement("div",{className:"dashboard-container"},s.default.createElement("div",{className:"dashboard-loading"},s.default.createElement("div",{className:"semiont-spinner"})));let k=o.find(l=>l.name.toLowerCase()==="graph"),u=k?{...c,graph:{...c.graph,status:k.status==="healthy"?"healthy":k.status==="unhealthy"?"unhealthy":"unknown",evidence:k.evidence}}:c,Z=new Set(["graph","neo4j","janusgraph","neptune"]),B=o.filter(l=>l.name.toLowerCase().startsWith("inference.")),G=o.filter(l=>!Z.has(l.name.toLowerCase())&&!l.name.toLowerCase().startsWith("inference.")),R=G.filter(l=>l.status==="healthy").length,ee=[u.eventLog.path,u.contentStore.path,u.graph.status==="healthy",u.materializedViews.path,u.actors.gatherer.state!=="error"&&u.actors.gatherer.state!=="unknown",u.actors.matcher.state!=="error"&&u.actors.matcher.state!=="unknown",u.actors.stower.state!=="error"&&u.actors.stower.state!=="unknown"].filter(Boolean).length,te=I.filter(l=>l.state!=="error").length;return s.default.createElement("div",{className:"dashboard-container"},s.default.createElement("header",{className:"dashboard-header semiont-panel semiont-panel--bordered"},s.default.createElement("div",{className:"dashboard-header-left"},s.default.createElement("h1",{className:"dashboard-title"},"Semiont Dashboard"),s.default.createElement("span",{className:"semiont-badge semiont-badge--info dashboard-env"},s.default.createElement("span",{className:"semiont-badge__text"},e))),s.default.createElement("div",{className:"dashboard-header-right"},s.default.createElement("span",{className:`semiont-indicator ${W?"semiont-indicator--online":"semiont-indicator--offline"}`}),s.default.createElement("span",{className:"dashboard-connection-label"},W?"Live":"Disconnected"))),s.default.createElement("div",{className:"semiont-panel semiont-panel--bordered dashboard-tab-panel"},s.default.createElement(De,{active:t,onChange:a,webHealthy:R,webTotal:G.length,mmHealthy:ee,mmTotal:7,wkHealthy:te,wkTotal:I.length}),s.default.createElement("div",{className:"tab-content"},t==="web"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:D,label:"updated"})),s.default.createElement(H,{services:o}),s.default.createElement(U,{logs:v})),t==="make-meaning"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:J,label:"updated"})),s.default.createElement(O,{makeMeaning:u,inferenceServices:B}),s.default.createElement(U,{logs:[]})),t==="workers"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:X,label:"updated"})),s.default.createElement(K,{workers:I,inferenceServices:B}),s.default.createElement(U,{logs:[]})))))};typeof window<"u"&&(window.SemiontDashboard=window.SemiontDashboard||{},window.SemiontDashboard.WebDashboardApp=q);return le(Ae);})();
|
|
11
|
+
"use strict";var SemiontDashboard=(()=>{var se=Object.create;var M=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var S=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var re=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},F=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ae(t))!ie.call(e,o)&&o!==n&&M(e,o,{get:()=>t[o],enumerable:!(a=ne(t,o))||a.enumerable});return e};var N=(e,t,n)=>(n=e!=null?se(oe(e)):{},F(t||!e||!e.__esModule?M(n,"default",{value:e,enumerable:!0}):n,e)),ce=e=>F(M({},"__esModule",{value:!0}),e);var De={};re(De,{WebDashboardApp:()=>q});var s=N(S("react"),1);var i=N(S("react"),1),le="semiont-tag semiont-tag--secondary semiont-tag--compact",me=new Set(["graph","neo4j","janusgraph","neptune"]),de=e=>e.toLowerCase().startsWith("inference.");function pe(e){let t=e.indexOf(".");if(t!==-1){let n=e.slice(0,t),a=e.slice(t+1);return n.charAt(0).toUpperCase()+n.slice(1)+" ("+a.charAt(0).toUpperCase()+a.slice(1)+")"}return e.charAt(0).toUpperCase()+e.slice(1)}var V=["proxy","frontend","backend","database"];function ue(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";case"warning":return"semiont-indicator semiont-indicator--busy";default:return"semiont-indicator"}}function ge(e){switch(e){case"healthy":return"healthy";case"unhealthy":return"unhealthy";case"warning":return"warning";default:return"unknown"}}function ve(e){switch(e){case"healthy":return"semiont-badge semiont-badge--success";case"unhealthy":return"semiont-badge semiont-badge--error";case"warning":return"semiont-badge semiont-badge--warning";default:return"semiont-badge semiont-badge--info"}}var he=({service:e})=>{let t=e.evidence&&e.evidence.length>0?[...e.evidence]:(()=>{let a=e.details||"",o=[],p=a.match(/[Pp][Ii][Dd]:\s*(\d+)/),v=a.match(/[Cc]ontainer:\s*(\S+)/);return p&&o.push(`pid ${p[1]}`),v&&o.push(`container ${v[1].slice(0,12)}`),e.runningCount!==void 0&&e.desiredCount!==void 0&&o.push(`${e.runningCount}/${e.desiredCount} tasks`),o})();e.checkedAt&&t.push(`checked ${new Date(e.checkedAt).toLocaleTimeString()}`);let n=fe(e);return i.default.createElement("div",{className:"service-row"},i.default.createElement("div",{className:"service-row__indicator"},i.default.createElement("span",{className:ue(e.status)})),i.default.createElement("div",{className:"service-row__name"},pe(e.name)),i.default.createElement("div",{className:"service-row__host"},e.hostname?i.default.createElement("span",{className:"service-row__hostname"},e.hostname):i.default.createElement("span",{className:"service-row__hostname service-row__hostname--dim"},"\u2014")),i.default.createElement("div",{className:"service-row__status"},i.default.createElement("span",{className:ve(e.status)},i.default.createElement("span",{className:"semiont-badge__text"},ge(e.status)))),i.default.createElement("div",{className:"service-row__tags"},t.map((a,o)=>i.default.createElement("span",{key:o,className:le},a))),i.default.createElement("div",{className:"service-row__actions"},n.map((a,o)=>i.default.createElement("a",{key:o,href:a.url,target:"_blank",rel:"noopener noreferrer",className:"semiont-tag semiont-tag--info semiont-tag--compact"},a.label))))};function fe(e){let t=[],n=e.awsRegion||"us-east-1";return e.ecsServiceName&&e.ecsClusterName&&(t.push({label:"Console \u2197",url:`https://console.aws.amazon.com/ecs/home?region=${n}#/clusters/${e.ecsClusterName}/services/${e.ecsServiceName}/details`}),e.logGroupName&&t.push({label:"Logs \u2197",url:`https://console.aws.amazon.com/cloudwatch/home?region=${n}#logsV2:log-groups/log-group/${encodeURIComponent(e.logGroupName)}`})),e.rdsInstanceId&&t.push({label:"Console \u2197",url:`https://console.aws.amazon.com/rds/home?region=${n}#database:id=${e.rdsInstanceId};is-cluster=false`}),t}var H=({services:e})=>{let n=[...e.filter(a=>!me.has(a.name.toLowerCase())&&!de(a.name))].sort((a,o)=>{let p=V.indexOf(a.name.toLowerCase()),v=V.indexOf(o.name.toLowerCase());return p===-1&&v===-1?a.name.localeCompare(o.name):p===-1?1:v===-1?-1:p-v});return i.default.createElement("div",{className:"service-list"},i.default.createElement("div",{className:"service-list__header"},i.default.createElement("div",{className:"service-row__indicator"}),i.default.createElement("div",{className:"service-row__name"},"Service"),i.default.createElement("div",{className:"service-row__host"},"Address"),i.default.createElement("div",{className:"service-row__status"},"Status"),i.default.createElement("div",{className:"service-row__tags"},"Details"),i.default.createElement("div",{className:"service-row__actions"})),n.map((a,o)=>i.default.createElement(he,{key:o,service:a})))};var g=N(S("react"),1);var d=N(S("react"),1),be="semiont-tag semiont-tag--secondary semiont-tag--compact",f=({indicator:e,label:t,value:n,tags:a})=>d.default.createElement("div",{className:"mm-row"},d.default.createElement("div",{className:"mm-row__indicator"},d.default.createElement("span",{className:e})),d.default.createElement("div",{className:"mm-row__label"},t),d.default.createElement("div",{className:"mm-row__value"},n),d.default.createElement("div",{className:"mm-row__tags"},a==null?void 0:a.filter(Boolean).map((o,p)=>d.default.createElement("span",{key:p,className:be},o)))),y=({title:e,children:t})=>d.default.createElement("div",{className:"mm-group"},d.default.createElement("div",{className:"mm-group__title"},e),d.default.createElement("div",{className:"mm-list"},t));function we(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}function Se(e){return e.includes(".")?e.slice(e.indexOf(".")+1).replace(/^\w/,t=>t.toUpperCase()):e}var L=({inferenceServices:e})=>e.length===0?null:d.default.createElement(y,{title:"Inference"},e.map(t=>d.default.createElement(f,{key:t.name,indicator:we(t.status),label:Se(t.name),value:t.status,tags:t.evidence})));function j(e){if(e===0)return"0 B";let t=1024,n=["B","KB","MB","GB","TB"],a=Math.floor(Math.log(e)/Math.log(t));return`${(e/Math.pow(t,a)).toFixed(1)} ${n[a]}`}function T(e,t=40){return e.length<=t?e:"\u2026"+e.slice(e.length-t+1)}function Ne(e){switch(e.state){case"active":return"semiont-indicator semiont-indicator--online semiont-indicator--pulse";case"idle":return"semiont-indicator semiont-indicator--online";case"error":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}function ye(e){switch(e){case"healthy":return"semiont-indicator semiont-indicator--online";case"unhealthy":return"semiont-indicator semiont-indicator--offline";default:return"semiont-indicator"}}var O=({makeMeaning:e,inferenceServices:t})=>g.default.createElement("div",{className:"mm-sections"},g.default.createElement(y,{title:"System of Record"},g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Event Log",value:e.eventLog.eventCount!==void 0?e.eventLog.eventCount.toLocaleString()+" events":"unknown",tags:[e.eventLog.streamCount!==void 0&&`${e.eventLog.streamCount} streams`,e.eventLog.sizeBytes!==void 0&&j(e.eventLog.sizeBytes),e.eventLog.path&&T(e.eventLog.path)]}),g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Content Store",value:e.contentStore.sizeBytes!==void 0?j(e.contentStore.sizeBytes):"unknown",tags:[e.contentStore.fileCount!==void 0&&`${e.contentStore.fileCount} files`,e.contentStore.path&&T(e.contentStore.path)]})),g.default.createElement(y,{title:"Projections"},g.default.createElement(f,{indicator:ye(e.graph.status),label:"Graph",value:e.graph.status,tags:[e.graph.address,e.graph.database,...e.graph.evidence??[]]}),g.default.createElement(f,{indicator:"semiont-indicator semiont-indicator--online",label:"Materialized Views",value:e.materializedViews.fileCount!==void 0?`${e.materializedViews.fileCount} projections`:"unknown",tags:[e.materializedViews.lastUpdated&&`updated ${new Date(e.materializedViews.lastUpdated).toLocaleTimeString()}`,e.materializedViews.path&&T(e.materializedViews.path)]})),g.default.createElement(y,{title:"Actors"},["gatherer","matcher","stower","browser"].map(n=>{let a=e.actors[n];return g.default.createElement(f,{key:n,indicator:Ne(a),label:n.charAt(0).toUpperCase()+n.slice(1),value:a.state,tags:[a.provider,a.model,a.errorMessage&&a.errorMessage.slice(0,40)]})})),g.default.createElement(L,{inferenceServices:t}));var r=N(S("react"),1);var b="semiont-tag semiont-tag--secondary semiont-tag--compact",ke={"reference-annotation":"Reference Annotation","highlight-annotation":"Highlight Annotation","assessment-annotation":"Assessment Annotation","comment-annotation":"Comment Annotation","tag-annotation":"Tag Annotation",generation:"Generation"};function Ce(e){let t=Date.now()-e.getTime(),n=Math.floor(t/6e4);if(n<1)return"just now";if(n<60)return`${n}m ago`;let a=Math.floor(n/60);return a<24?`${a}h ago`:`${Math.floor(a/24)}d ago`}function _e(e){return e.state==="error"?"semiont-indicator semiont-indicator--offline":e.activeCount>0?"semiont-indicator semiont-indicator--online semiont-indicator--pulse":e.pendingCount>10?"semiont-indicator semiont-indicator--busy":"semiont-indicator semiont-indicator--online"}var K=({workers:e,inferenceServices:t})=>r.default.createElement("div",{className:"mm-sections"},r.default.createElement("div",{className:"mm-group"},r.default.createElement("div",{className:"mm-group__title"},"Workers"),r.default.createElement("div",{className:"mm-list"},r.default.createElement("div",{className:"mm-row mm-row--header"},r.default.createElement("div",{className:"mm-row__indicator"}),r.default.createElement("div",{className:"mm-row__label"},"Worker"),r.default.createElement("div",{className:"mm-row__value"},"Status"),r.default.createElement("div",{className:"mm-row__tags"},"Details")),e.map((n,a)=>r.default.createElement("div",{key:a,className:"mm-row"},r.default.createElement("div",{className:"mm-row__indicator"},r.default.createElement("span",{className:_e(n)})),r.default.createElement("div",{className:"mm-row__label"},ke[n.type]),r.default.createElement("div",{className:"mm-row__value"},n.state),r.default.createElement("div",{className:"mm-row__tags"},r.default.createElement("span",{className:n.activeCount>0?"semiont-tag semiont-tag--success semiont-tag--compact":b},n.activeCount," active"),r.default.createElement("span",{className:b},n.pendingCount," pending"),n.completedCount>0&&r.default.createElement("span",{className:b},n.completedCount," done"),n.failedCount>0&&r.default.createElement("span",{className:"semiont-tag semiont-tag--warning semiont-tag--compact"},n.failedCount," failed"),n.state==="idle"&&!n.lastProcessed&&r.default.createElement("span",{className:b},"never used"),n.lastProcessed&&n.state==="idle"&&r.default.createElement("span",{className:b},"last used ",Ce(new Date(n.lastProcessed))),n.lastProcessed&&n.state!=="idle"&&r.default.createElement("span",{className:b},"last ",new Date(n.lastProcessed).toLocaleTimeString())))))),r.default.createElement(L,{inferenceServices:t}));var Me={eventLog:{path:""},contentStore:{path:""},graph:{status:"unknown"},materializedViews:{path:""},actors:{gatherer:{state:"unknown"},matcher:{state:"unknown"},stower:{state:"unknown"},browser:{state:"unknown"}}},U=({logs:e,service:t})=>{let n=t?e.filter(a=>a.service===t||!t):e;return s.default.createElement("div",{className:"semiont-panel semiont-panel--bordered dashboard-logs"},s.default.createElement("div",{className:"semiont-panel-header"},s.default.createElement("span",{className:"semiont-panel-header__title"},"Recent Logs")),n.length===0?s.default.createElement("div",{className:"logs-empty"},"No recent logs"):s.default.createElement("div",{className:"logs-list"},n.slice(0,50).map((a,o)=>s.default.createElement("div",{key:o,className:`log-entry log-entry--${a.level}`},s.default.createElement("span",{className:"log-timestamp"},new Date(a.timestamp).toLocaleTimeString()),s.default.createElement("span",{className:"log-service"},a.service),s.default.createElement("span",{className:`log-level semiont-badge semiont-badge--${a.level==="error"?"error":a.level==="warn"?"warning":"info"}`},s.default.createElement("span",{className:"semiont-badge__text"},a.level.toUpperCase())),s.default.createElement("span",{className:"log-message"},a.message)))))},Le=({active:e,onChange:t,webHealthy:n,webTotal:a,mmHealthy:o,mmTotal:p,wkHealthy:v,wkTotal:D})=>{let A=[{id:"make-meaning",label:"Make Meaning",healthy:o,total:p},{id:"workers",label:"Workers",healthy:v,total:D},{id:"web",label:"Web Interface",healthy:n,total:a}];function w(c,k){return k===0?"semiont-badge semiont-badge--info":c===k?"semiont-badge semiont-badge--success":c===0?"semiont-badge semiont-badge--error":"semiont-badge semiont-badge--warning"}return s.default.createElement("div",{className:"dashboard-tabs"},A.map(c=>s.default.createElement("button",{key:c.id,className:`dashboard-tab${e===c.id?" dashboard-tab--active":""}`,onClick:()=>t(c.id)},c.label,s.default.createElement("span",{className:w(c.healthy,c.total)},s.default.createElement("span",{className:"semiont-badge__text"},c.healthy,"/",c.total)))))},P=({time:e,label:t})=>s.default.createElement("span",{className:"tab-update-time"},t,": ",e?e.toLocaleTimeString():"\u2014"),q=({environment:e})=>{let[t,n]=(0,s.useState)("make-meaning"),[a,o]=(0,s.useState)([]),[p,v]=(0,s.useState)([]),[D,A]=(0,s.useState)(null),[w,c]=(0,s.useState)(Me),[k,E]=(0,s.useState)(null),[I,J]=(0,s.useState)([]),[Q,X]=(0,s.useState)(null),[W,$]=(0,s.useState)(!1),[x,z]=(0,s.useState)(!1);if((0,s.useEffect)(()=>{let m=window.io;if(!m){console.error("Socket.IO not loaded");return}let h=m();return h.on("connect",()=>$(!0)),h.on("disconnect",()=>$(!1)),h.on("services-update",u=>{o(u.services),v(u.logs),A(new Date),z(!0)}),h.on("make-meaning-update",u=>{let{lastUpdate:_,...te}=u;c(te),E(_?new Date(_):new Date)}),h.on("actors-update",u=>{c(_=>({..._,actors:u.actors})),u.lastUpdate&&E(new Date(u.lastUpdate))}),h.on("workers-update",u=>{J(u.workers),X(u.lastUpdate?new Date(u.lastUpdate):new Date),x||z(!0)}),()=>h.disconnect()},[]),!x)return s.default.createElement("div",{className:"dashboard-container"},s.default.createElement("div",{className:"dashboard-loading"},s.default.createElement("div",{className:"semiont-spinner"})));let C=a.find(m=>m.name.toLowerCase()==="graph"),l=C?{...w,graph:{...w.graph,status:C.status==="healthy"?"healthy":C.status==="unhealthy"?"unhealthy":"unknown",evidence:C.evidence}}:w,Y=new Set(["graph","neo4j","janusgraph","neptune"]),B=a.filter(m=>m.name.toLowerCase().startsWith("inference.")),G=a.filter(m=>!Y.has(m.name.toLowerCase())&&!m.name.toLowerCase().startsWith("inference.")),Z=G.filter(m=>m.status==="healthy").length,R=[l.eventLog.eventCount!==void 0,l.contentStore.fileCount!==void 0,l.graph.status==="healthy",l.materializedViews.fileCount!==void 0,l.actors.gatherer.state!=="error"&&l.actors.gatherer.state!=="unknown",l.actors.matcher.state!=="error"&&l.actors.matcher.state!=="unknown",l.actors.stower.state!=="error"&&l.actors.stower.state!=="unknown",l.actors.browser.state!=="error"&&l.actors.browser.state!=="unknown"].filter(Boolean).length,ee=I.filter(m=>m.state!=="error").length;return s.default.createElement("div",{className:"dashboard-container"},s.default.createElement("header",{className:"dashboard-header semiont-panel semiont-panel--bordered"},s.default.createElement("div",{className:"dashboard-header-left"},s.default.createElement("h1",{className:"dashboard-title"},"Semiont Dashboard"),s.default.createElement("span",{className:"semiont-badge semiont-badge--info dashboard-env"},s.default.createElement("span",{className:"semiont-badge__text"},e))),s.default.createElement("div",{className:"dashboard-header-right"},s.default.createElement("span",{className:`semiont-indicator ${W?"semiont-indicator--online":"semiont-indicator--offline"}`}),s.default.createElement("span",{className:"dashboard-connection-label"},W?"Live":"Disconnected"))),s.default.createElement("div",{className:"semiont-panel semiont-panel--bordered dashboard-tab-panel"},s.default.createElement(Le,{active:t,onChange:n,webHealthy:Z,webTotal:G.length,mmHealthy:R,mmTotal:8,wkHealthy:ee,wkTotal:I.length}),s.default.createElement("div",{className:"tab-content"},t==="web"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:D,label:"updated"})),s.default.createElement(H,{services:a}),s.default.createElement(U,{logs:p})),t==="make-meaning"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:k,label:"updated"})),s.default.createElement(O,{makeMeaning:l,inferenceServices:B}),s.default.createElement(U,{logs:[]})),t==="workers"&&s.default.createElement(s.default.Fragment,null,s.default.createElement("div",{className:"tab-meta"},s.default.createElement(P,{time:Q,label:"updated"})),s.default.createElement(K,{workers:I,inferenceServices:B}),s.default.createElement(U,{logs:[]})))))};typeof window<"u"&&(window.SemiontDashboard=window.SemiontDashboard||{},window.SemiontDashboard.WebDashboardApp=q);return ce(De);})();
|
|
12
12
|
// Ensure global is set
|
|
13
13
|
if (typeof window !== "undefined") { window.SemiontDashboard = SemiontDashboard; }
|
|
14
14
|
//# sourceMappingURL=dashboard.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/dashboard/web-dashboard-app.tsx", "../../src/core/dashboard/sections/section-web-interface.tsx", "../../src/core/dashboard/sections/section-make-meaning.tsx", "../../src/core/dashboard/sections/dashboard-shared.tsx", "../../src/core/dashboard/sections/section-workers.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Web Dashboard React Application\n */\n\nimport '@semiont/react-ui/styles/index.css';\nimport React, { useState, useEffect } from 'react';\nimport type { ServiceStatus, LogEntry, MakeMeaningStatus, WorkerStatus } from './dashboard-components.js';\nimport { SectionWebInterface } from './sections/section-web-interface.js';\nimport { SectionMakeMeaning } from './sections/section-make-meaning.js';\nimport { SectionWorkers } from './sections/section-workers.js';\n\ndeclare const window: any;\n\nconst DEFAULT_MAKE_MEANING: MakeMeaningStatus = {\n eventLog: { path: '' },\n contentStore: { path: '' },\n graph: { status: 'unknown' },\n materializedViews: { path: '' },\n actors: {\n gatherer: { state: 'unknown' },\n matcher: { state: 'unknown' },\n stower: { state: 'unknown' },\n },\n};\n\ntype TabId = 'web' | 'make-meaning' | 'workers';\n\nconst LogViewer: React.FC<{ logs: LogEntry[]; service?: string }> = ({ logs, service }) => {\n const filtered = service ? logs.filter(l => l.service === service || !service) : logs;\n return (\n <div className=\"semiont-panel semiont-panel--bordered dashboard-logs\">\n <div className=\"semiont-panel-header\">\n <span className=\"semiont-panel-header__title\">Recent Logs</span>\n </div>\n {filtered.length === 0 ? (\n <div className=\"logs-empty\">No recent logs</div>\n ) : (\n <div className=\"logs-list\">\n {filtered.slice(0, 50).map((log, i) => (\n <div key={i} className={`log-entry log-entry--${log.level}`}>\n <span className=\"log-timestamp\">{new Date(log.timestamp).toLocaleTimeString()}</span>\n <span className=\"log-service\">{log.service}</span>\n <span className={`log-level semiont-badge semiont-badge--${log.level === 'error' ? 'error' : log.level === 'warn' ? 'warning' : 'info'}`}>\n <span className=\"semiont-badge__text\">{log.level.toUpperCase()}</span>\n </span>\n <span className=\"log-message\">{log.message}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst TabBar: React.FC<{\n active: TabId;\n onChange: (t: TabId) => void;\n webHealthy: number; webTotal: number;\n mmHealthy: number; mmTotal: number;\n wkHealthy: number; wkTotal: number;\n}> = ({ active, onChange, webHealthy, webTotal, mmHealthy, mmTotal, wkHealthy, wkTotal }) => {\n const tabs: { id: TabId; label: string; healthy: number; total: number }[] = [\n { id: 'make-meaning', label: 'Make Meaning', healthy: mmHealthy, total: mmTotal },\n { id: 'workers', label: 'Workers', healthy: wkHealthy, total: wkTotal },\n { id: 'web', label: 'Web Interface', healthy: webHealthy, total: webTotal },\n ];\n\n function badgeClass(healthy: number, total: number) {\n if (total === 0) return 'semiont-badge semiont-badge--info';\n if (healthy === total) return 'semiont-badge semiont-badge--success';\n if (healthy === 0) return 'semiont-badge semiont-badge--error';\n return 'semiont-badge semiont-badge--warning';\n }\n\n return (\n <div className=\"dashboard-tabs\">\n {tabs.map(tab => (\n <button\n key={tab.id}\n className={`dashboard-tab${active === tab.id ? ' dashboard-tab--active' : ''}`}\n onClick={() => onChange(tab.id)}\n >\n {tab.label}\n <span className={badgeClass(tab.healthy, tab.total)}>\n <span className=\"semiont-badge__text\">{tab.healthy}/{tab.total}</span>\n </span>\n </button>\n ))}\n </div>\n );\n};\n\nconst UpdateTime: React.FC<{ time: Date | null; label: string }> = ({ time, label }) => (\n <span className=\"tab-update-time\">\n {label}: {time ? time.toLocaleTimeString() : '\u2014'}\n </span>\n);\n\nexport const WebDashboardApp: React.FC<{\n environment: string;\n refreshInterval: number;\n}> = ({ environment, refreshInterval }) => {\n const [activeTab, setActiveTab] = useState<TabId>('make-meaning');\n\n const [services, setServices] = useState<ServiceStatus[]>([]);\n const [serviceLogs, setServiceLogs] = useState<LogEntry[]>([]);\n const [servicesUpdated, setServicesUpdated] = useState<Date | null>(null);\n\n const [makeMeaning, setMakeMeaning] = useState<MakeMeaningStatus>(DEFAULT_MAKE_MEANING);\n const [mmUpdated, setMmUpdated] = useState<Date | null>(null);\n\n const [workers, setWorkers] = useState<WorkerStatus[]>([]);\n const [workersUpdated, setWorkersUpdated] = useState<Date | null>(null);\n\n const [connected, setConnected] = useState(false);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n const io = window.io;\n if (!io) { console.error('Socket.IO not loaded'); return; }\n\n const socket = io();\n socket.on('connect', () => setConnected(true));\n socket.on('disconnect', () => setConnected(false));\n\n socket.on('services-update', (d: { services: ServiceStatus[]; logs: LogEntry[]; lastUpdate: Date }) => {\n setServices(d.services);\n setServiceLogs(d.logs);\n setServicesUpdated(new Date());\n setReady(true);\n });\n\n socket.on('make-meaning-update', (d: MakeMeaningStatus & { lastUpdate?: Date }) => {\n const { lastUpdate, ...mm } = d as any;\n setMakeMeaning(mm);\n setMmUpdated(lastUpdate ? new Date(lastUpdate) : new Date());\n });\n\n socket.on('actors-update', (d: { actors: MakeMeaningStatus['actors']; lastUpdate?: Date }) => {\n setMakeMeaning(prev => ({ ...prev, actors: d.actors }));\n if (d.lastUpdate) setMmUpdated(new Date(d.lastUpdate));\n });\n\n socket.on('workers-update', (d: { workers: WorkerStatus[]; lastUpdate?: Date }) => {\n setWorkers(d.workers);\n setWorkersUpdated(d.lastUpdate ? new Date(d.lastUpdate) : new Date());\n if (!ready) setReady(true);\n });\n\n return () => socket.disconnect();\n }, []);\n\n void refreshInterval;\n\n if (!ready) {\n return (\n <div className=\"dashboard-container\">\n <div className=\"dashboard-loading\">\n <div className=\"semiont-spinner\" />\n </div>\n </div>\n );\n }\n\n // Bridge graph status from services array into makeMeaning\n const graphService = services.find((s: ServiceStatus) => s.name.toLowerCase() === 'graph');\n const mm: MakeMeaningStatus = graphService\n ? { ...makeMeaning, graph: { ...makeMeaning.graph,\n status: graphService.status === 'healthy' ? 'healthy'\n : graphService.status === 'unhealthy' ? 'unhealthy' : 'unknown',\n evidence: graphService.evidence } }\n : makeMeaning;\n\n const MAKE_MEANING_SERVICES = new Set(['graph', 'neo4j', 'janusgraph', 'neptune']);\n const inferenceServices = services.filter(s => s.name.toLowerCase().startsWith('inference.'));\n const webServices = services.filter(s => !MAKE_MEANING_SERVICES.has(s.name.toLowerCase()) && !s.name.toLowerCase().startsWith('inference.'));\n const webHealthy = webServices.filter(s => s.status === 'healthy').length;\n\n // Make Meaning healthy count (mirrors section-make-meaning countHealthy)\n const mmHealthy = [\n mm.eventLog.path,\n mm.contentStore.path,\n mm.graph.status === 'healthy',\n mm.materializedViews.path,\n mm.actors.gatherer.state !== 'error' && mm.actors.gatherer.state !== 'unknown',\n mm.actors.matcher.state !== 'error' && mm.actors.matcher.state !== 'unknown',\n mm.actors.stower.state !== 'error' && mm.actors.stower.state !== 'unknown',\n ].filter(Boolean).length;\n\n const wkHealthy = workers.filter(w => w.state !== 'error').length;\n\n return (\n <div className=\"dashboard-container\">\n <header className=\"dashboard-header semiont-panel semiont-panel--bordered\">\n <div className=\"dashboard-header-left\">\n <h1 className=\"dashboard-title\">Semiont Dashboard</h1>\n <span className=\"semiont-badge semiont-badge--info dashboard-env\">\n <span className=\"semiont-badge__text\">{environment}</span>\n </span>\n </div>\n <div className=\"dashboard-header-right\">\n <span className={`semiont-indicator ${connected ? 'semiont-indicator--online' : 'semiont-indicator--offline'}`} />\n <span className=\"dashboard-connection-label\">{connected ? 'Live' : 'Disconnected'}</span>\n </div>\n </header>\n\n <div className=\"semiont-panel semiont-panel--bordered dashboard-tab-panel\">\n <TabBar\n active={activeTab} onChange={setActiveTab}\n webHealthy={webHealthy} webTotal={webServices.length}\n mmHealthy={mmHealthy} mmTotal={7}\n wkHealthy={wkHealthy} wkTotal={workers.length}\n />\n\n <div className=\"tab-content\">\n {activeTab === 'web' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={servicesUpdated} label=\"updated\" />\n </div>\n <SectionWebInterface services={services} />\n <LogViewer logs={serviceLogs} />\n </>\n )}\n\n {activeTab === 'make-meaning' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={mmUpdated} label=\"updated\" />\n </div>\n <SectionMakeMeaning makeMeaning={mm} inferenceServices={inferenceServices} />\n <LogViewer logs={[]} />\n </>\n )}\n\n {activeTab === 'workers' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={workersUpdated} label=\"updated\" />\n </div>\n <SectionWorkers workers={workers} inferenceServices={inferenceServices} />\n <LogViewer logs={[]} />\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nif (typeof window !== 'undefined') {\n window.SemiontDashboard = window.SemiontDashboard || {};\n window.SemiontDashboard.WebDashboardApp = WebDashboardApp;\n}\n", "import React from 'react';\nimport type { ServiceStatus } from '../dashboard-components.js';\n\nconst TAG = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nconst MAKE_MEANING_SERVICES = new Set(['graph', 'neo4j', 'janusgraph', 'neptune']);\nconst isInferenceService = (name: string) => name.toLowerCase().startsWith('inference.');\n\nfunction formatServiceName(name: string): string {\n // \"inference.anthropic\" \u2192 \"Inference (Anthropic)\"\n const dotIdx = name.indexOf('.');\n if (dotIdx !== -1) {\n const base = name.slice(0, dotIdx);\n const qualifier = name.slice(dotIdx + 1);\n return base.charAt(0).toUpperCase() + base.slice(1) +\n ' (' + qualifier.charAt(0).toUpperCase() + qualifier.slice(1) + ')';\n }\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n// Display order for web interface services\nconst SERVICE_ORDER = ['proxy', 'frontend', 'backend', 'database'];\n\nfunction indicatorClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n case 'warning': return 'semiont-indicator semiont-indicator--busy';\n default: return 'semiont-indicator';\n }\n}\n\nfunction statusLabel(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'healthy';\n case 'unhealthy': return 'unhealthy';\n case 'warning': return 'warning';\n default: return 'unknown';\n }\n}\n\nfunction statusBadgeClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-badge semiont-badge--success';\n case 'unhealthy': return 'semiont-badge semiont-badge--error';\n case 'warning': return 'semiont-badge semiont-badge--warning';\n default: return 'semiont-badge semiont-badge--info';\n }\n}\n\nconst ServiceRow: React.FC<{ service: ServiceStatus }> = ({ service }) => {\n // Evidence tags: prefer structured evidence, fall back to parsing details string\n const tags: string[] = service.evidence && service.evidence.length > 0\n ? [...service.evidence]\n : (() => {\n const details = service.details || '';\n const out: string[] = [];\n const pidMatch = details.match(/[Pp][Ii][Dd]:\\s*(\\d+)/);\n const containerMatch = details.match(/[Cc]ontainer:\\s*(\\S+)/);\n if (pidMatch) out.push(`pid ${pidMatch[1]}`);\n if (containerMatch) out.push(`container ${containerMatch[1].slice(0, 12)}`);\n if (service.runningCount !== undefined && service.desiredCount !== undefined) {\n out.push(`${service.runningCount}/${service.desiredCount} tasks`);\n }\n return out;\n })();\n\n if (service.checkedAt) {\n tags.push(`checked ${new Date(service.checkedAt).toLocaleTimeString()}`);\n }\n\n const consoleLinks = getConsoleLinks(service);\n\n return (\n <div className=\"service-row\">\n <div className=\"service-row__indicator\">\n <span className={indicatorClass(service.status)} />\n </div>\n <div className=\"service-row__name\">{formatServiceName(service.name)}</div>\n <div className=\"service-row__host\">\n {service.hostname\n ? <span className=\"service-row__hostname\">{service.hostname}</span>\n : <span className=\"service-row__hostname service-row__hostname--dim\">\u2014</span>\n }\n </div>\n <div className=\"service-row__status\">\n <span className={statusBadgeClass(service.status)}>\n <span className=\"semiont-badge__text\">{statusLabel(service.status)}</span>\n </span>\n </div>\n <div className=\"service-row__tags\">\n {tags.map((t, i) => <span key={i} className={TAG}>{t}</span>)}\n </div>\n <div className=\"service-row__actions\">\n {consoleLinks.map((link, i) => (\n <a key={i} href={link.url} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"semiont-tag semiont-tag--info semiont-tag--compact\">\n {link.label}\n </a>\n ))}\n </div>\n </div>\n );\n};\n\nfunction getConsoleLinks(service: ServiceStatus) {\n const links: { label: string; url: string }[] = [];\n const region = service.awsRegion || 'us-east-1';\n if (service.ecsServiceName && service.ecsClusterName) {\n links.push({ label: 'Console \u2197', url: `https://console.aws.amazon.com/ecs/home?region=${region}#/clusters/${service.ecsClusterName}/services/${service.ecsServiceName}/details` });\n if (service.logGroupName) {\n links.push({ label: 'Logs \u2197', url: `https://console.aws.amazon.com/cloudwatch/home?region=${region}#logsV2:log-groups/log-group/${encodeURIComponent(service.logGroupName)}` });\n }\n }\n if (service.rdsInstanceId) {\n links.push({ label: 'Console \u2197', url: `https://console.aws.amazon.com/rds/home?region=${region}#database:id=${service.rdsInstanceId};is-cluster=false` });\n }\n return links;\n}\n\ninterface Props {\n services: ServiceStatus[];\n}\n\nexport const SectionWebInterface: React.FC<Props> = ({ services }) => {\n const webServices = services.filter(s => !MAKE_MEANING_SERVICES.has(s.name.toLowerCase()) && !isInferenceService(s.name));\n\n // Sort by preferred order, then alphabetically for anything unknown\n const sorted = [...webServices].sort((a, b) => {\n const ai = SERVICE_ORDER.indexOf(a.name.toLowerCase());\n const bi = SERVICE_ORDER.indexOf(b.name.toLowerCase());\n if (ai === -1 && bi === -1) return a.name.localeCompare(b.name);\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n });\n\n return (\n <div className=\"service-list\">\n <div className=\"service-list__header\">\n <div className=\"service-row__indicator\" />\n <div className=\"service-row__name\">Service</div>\n <div className=\"service-row__host\">Address</div>\n <div className=\"service-row__status\">Status</div>\n <div className=\"service-row__tags\">Details</div>\n <div className=\"service-row__actions\" />\n </div>\n {sorted.map((s, i) => <ServiceRow key={i} service={s} />)}\n </div>\n );\n};\n", "import React from 'react';\nimport type { MakeMeaningStatus, ActorStatus, ServiceStatus } from '../dashboard-components.js';\nimport { MmRow, MmGroup, SectionInference } from './dashboard-shared.js';\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;\n}\n\nfunction truncatePath(p: string, max = 40): string {\n if (p.length <= max) return p;\n return '\u2026' + p.slice(p.length - max + 1);\n}\n\nfunction actorIndicatorClass(actor: ActorStatus): string {\n switch (actor.state) {\n case 'active': return 'semiont-indicator semiont-indicator--online semiont-indicator--pulse';\n case 'idle': return 'semiont-indicator semiont-indicator--online';\n case 'error': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\nfunction graphIndicatorClass(status: MakeMeaningStatus['graph']['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\ninterface Props {\n makeMeaning: MakeMeaningStatus;\n inferenceServices: ServiceStatus[];\n}\n\nexport const SectionMakeMeaning: React.FC<Props> = ({ makeMeaning: mm, inferenceServices }) => {\n return (\n <div className=\"mm-sections\">\n\n <MmGroup title=\"System of Record\">\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Event Log\"\n value={mm.eventLog.eventCount !== undefined\n ? mm.eventLog.eventCount.toLocaleString() + ' events'\n : 'unknown'}\n tags={[\n mm.eventLog.streamCount !== undefined && `${mm.eventLog.streamCount} streams`,\n mm.eventLog.sizeBytes !== undefined && formatBytes(mm.eventLog.sizeBytes),\n mm.eventLog.path && truncatePath(mm.eventLog.path),\n ]}\n />\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Content Store\"\n value={mm.contentStore.sizeBytes !== undefined\n ? formatBytes(mm.contentStore.sizeBytes)\n : 'unknown'}\n tags={[\n mm.contentStore.fileCount !== undefined && `${mm.contentStore.fileCount} files`,\n mm.contentStore.path && truncatePath(mm.contentStore.path),\n ]}\n />\n </MmGroup>\n\n <MmGroup title=\"Projections\">\n <MmRow\n indicator={graphIndicatorClass(mm.graph.status)}\n label=\"Graph\"\n value={mm.graph.status}\n tags={[\n mm.graph.address,\n mm.graph.database,\n ...(mm.graph.evidence ?? []),\n ]}\n />\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Materialized Views\"\n value={mm.materializedViews.fileCount !== undefined\n ? `${mm.materializedViews.fileCount} projections`\n : 'unknown'}\n tags={[\n mm.materializedViews.lastUpdated &&\n `updated ${new Date(mm.materializedViews.lastUpdated).toLocaleTimeString()}`,\n mm.materializedViews.path && truncatePath(mm.materializedViews.path),\n ]}\n />\n </MmGroup>\n\n <MmGroup title=\"Actors\">\n {(['gatherer', 'matcher', 'stower'] as const).map(name => {\n const actor = mm.actors[name];\n return (\n <MmRow\n key={name}\n indicator={actorIndicatorClass(actor)}\n label={name.charAt(0).toUpperCase() + name.slice(1)}\n value={actor.state}\n tags={[\n actor.provider,\n actor.model,\n actor.errorMessage && actor.errorMessage.slice(0, 40),\n ]}\n />\n );\n })}\n </MmGroup>\n\n <SectionInference inferenceServices={inferenceServices} />\n\n </div>\n );\n};\n", "import React from 'react';\nimport type { ServiceStatus } from '../dashboard-components.js';\n\nconst TAG = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nexport const MmRow: React.FC<{\n indicator: string;\n label: string;\n value: string;\n tags?: (string | undefined | false)[];\n}> = ({ indicator, label, value, tags }) => (\n <div className=\"mm-row\">\n <div className=\"mm-row__indicator\"><span className={indicator} /></div>\n <div className=\"mm-row__label\">{label}</div>\n <div className=\"mm-row__value\">{value}</div>\n <div className=\"mm-row__tags\">\n {tags?.filter(Boolean).map((t, i) => (\n <span key={i} className={TAG}>{t as string}</span>\n ))}\n </div>\n </div>\n);\n\nexport const MmGroup: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (\n <div className=\"mm-group\">\n <div className=\"mm-group__title\">{title}</div>\n <div className=\"mm-list\">{children}</div>\n </div>\n);\n\nexport function inferenceIndicatorClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\nexport function inferenceServiceLabel(name: string): string {\n // \"inference.anthropic\" \u2192 \"Anthropic\"\n return name.includes('.')\n ? name.slice(name.indexOf('.') + 1).replace(/^\\w/, c => c.toUpperCase())\n : name;\n}\n\nexport const SectionInference: React.FC<{ inferenceServices: ServiceStatus[] }> = ({ inferenceServices }) => {\n if (inferenceServices.length === 0) return null;\n return (\n <MmGroup title=\"Inference\">\n {inferenceServices.map(svc => (\n <MmRow\n key={svc.name}\n indicator={inferenceIndicatorClass(svc.status)}\n label={inferenceServiceLabel(svc.name)}\n value={svc.status}\n tags={svc.evidence}\n />\n ))}\n </MmGroup>\n );\n};\n", "import React from 'react';\nimport type { WorkerStatus, ServiceStatus } from '../dashboard-components.js';\nimport { SectionInference } from './dashboard-shared.js';\n\nconst TAG_SEC = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nconst WORKER_LABELS: Record<WorkerStatus['type'], string> = {\n 'reference-annotation': 'Reference Annotation',\n 'highlight-annotation': 'Highlight Annotation',\n 'assessment-annotation': 'Assessment Annotation',\n 'comment-annotation': 'Comment Annotation',\n 'tag-annotation': 'Tag Annotation',\n 'generation': 'Generation',\n};\n\nfunction idleSince(last: Date): string {\n const ms = Date.now() - last.getTime();\n const mins = Math.floor(ms / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n return `${Math.floor(hrs / 24)}d ago`;\n}\n\nfunction workerIndicatorClass(w: WorkerStatus): string {\n if (w.state === 'error') return 'semiont-indicator semiont-indicator--offline';\n if (w.activeCount > 0) return 'semiont-indicator semiont-indicator--online semiont-indicator--pulse';\n if (w.pendingCount > 10) return 'semiont-indicator semiont-indicator--busy';\n return 'semiont-indicator semiont-indicator--online';\n}\n\ninterface Props {\n workers: WorkerStatus[];\n inferenceServices: ServiceStatus[];\n}\n\nexport const SectionWorkers: React.FC<Props> = ({ workers, inferenceServices }) => {\n return (\n <div className=\"mm-sections\">\n <div className=\"mm-group\">\n <div className=\"mm-group__title\">Workers</div>\n <div className=\"mm-list\">\n <div className=\"mm-row mm-row--header\">\n <div className=\"mm-row__indicator\" />\n <div className=\"mm-row__label\">Worker</div>\n <div className=\"mm-row__value\">Status</div>\n <div className=\"mm-row__tags\">Details</div>\n </div>\n {workers.map((w, i) => (\n <div key={i} className=\"mm-row\">\n <div className=\"mm-row__indicator\"><span className={workerIndicatorClass(w)} /></div>\n <div className=\"mm-row__label\">{WORKER_LABELS[w.type]}</div>\n <div className=\"mm-row__value\">{w.state}</div>\n <div className=\"mm-row__tags\">\n <span className={w.activeCount > 0 ? 'semiont-tag semiont-tag--success semiont-tag--compact' : TAG_SEC}>\n {w.activeCount} active\n </span>\n <span className={TAG_SEC}>{w.pendingCount} pending</span>\n {w.completedCount > 0 && (\n <span className={TAG_SEC}>{w.completedCount} done</span>\n )}\n {w.failedCount > 0 && (\n <span className={'semiont-tag semiont-tag--warning semiont-tag--compact'}>{w.failedCount} failed</span>\n )}\n {w.state === 'idle' && !w.lastProcessed && (\n <span className={TAG_SEC}>never used</span>\n )}\n {w.lastProcessed && w.state === 'idle' && (\n <span className={TAG_SEC}>last used {idleSince(new Date(w.lastProcessed))}</span>\n )}\n {w.lastProcessed && w.state !== 'idle' && (\n <span className={TAG_SEC}>last {new Date(w.lastProcessed).toLocaleTimeString()}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <SectionInference inferenceServices={inferenceServices} />\n </div>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["web_dashboard_app_exports", "__export", "WebDashboardApp", "import_react", "import_react", "TAG", "MAKE_MEANING_SERVICES", "isInferenceService", "name", "formatServiceName", "dotIdx", "base", "qualifier", "SERVICE_ORDER", "indicatorClass", "status", "statusLabel", "statusBadgeClass", "ServiceRow", "service", "tags", "details", "out", "pidMatch", "containerMatch", "consoleLinks", "getConsoleLinks", "React", "t", "i", "link", "links", "region", "SectionWebInterface", "services", "sorted", "s", "b", "ai", "bi", "import_react", "import_react", "TAG", "MmRow", "indicator", "label", "value", "tags", "React", "t", "i", "MmGroup", "title", "children", "inferenceIndicatorClass", "status", "inferenceServiceLabel", "name", "c", "SectionInference", "inferenceServices", "svc", "formatBytes", "bytes", "k", "sizes", "i", "truncatePath", "p", "max", "actorIndicatorClass", "actor", "graphIndicatorClass", "status", "SectionMakeMeaning", "mm", "inferenceServices", "React", "MmGroup", "MmRow", "name", "SectionInference", "import_react", "TAG_SEC", "WORKER_LABELS", "idleSince", "last", "ms", "mins", "hrs", "workerIndicatorClass", "w", "SectionWorkers", "workers", "inferenceServices", "React", "i", "SectionInference", "DEFAULT_MAKE_MEANING", "LogViewer", "logs", "service", "filtered", "l", "React", "log", "i", "TabBar", "active", "onChange", "webHealthy", "webTotal", "mmHealthy", "mmTotal", "wkHealthy", "wkTotal", "tabs", "badgeClass", "healthy", "total", "tab", "UpdateTime", "time", "label", "WebDashboardApp", "environment", "
|
|
4
|
+
"sourcesContent": ["/**\n * Web Dashboard React Application\n */\n\nimport '@semiont/react-ui/styles/index.css';\nimport React, { useState, useEffect } from 'react';\nimport type { ServiceStatus, LogEntry, MakeMeaningStatus, WorkerStatus } from './dashboard-components.js';\nimport { SectionWebInterface } from './sections/section-web-interface.js';\nimport { SectionMakeMeaning } from './sections/section-make-meaning.js';\nimport { SectionWorkers } from './sections/section-workers.js';\n\ndeclare const window: any;\n\nconst DEFAULT_MAKE_MEANING: MakeMeaningStatus = {\n eventLog: { path: '' },\n contentStore: { path: '' },\n graph: { status: 'unknown' },\n materializedViews: { path: '' },\n actors: {\n gatherer: { state: 'unknown' },\n matcher: { state: 'unknown' },\n stower: { state: 'unknown' },\n browser: { state: 'unknown' },\n },\n};\n\ntype TabId = 'web' | 'make-meaning' | 'workers';\n\nconst LogViewer: React.FC<{ logs: LogEntry[]; service?: string }> = ({ logs, service }) => {\n const filtered = service ? logs.filter(l => l.service === service || !service) : logs;\n return (\n <div className=\"semiont-panel semiont-panel--bordered dashboard-logs\">\n <div className=\"semiont-panel-header\">\n <span className=\"semiont-panel-header__title\">Recent Logs</span>\n </div>\n {filtered.length === 0 ? (\n <div className=\"logs-empty\">No recent logs</div>\n ) : (\n <div className=\"logs-list\">\n {filtered.slice(0, 50).map((log, i) => (\n <div key={i} className={`log-entry log-entry--${log.level}`}>\n <span className=\"log-timestamp\">{new Date(log.timestamp).toLocaleTimeString()}</span>\n <span className=\"log-service\">{log.service}</span>\n <span className={`log-level semiont-badge semiont-badge--${log.level === 'error' ? 'error' : log.level === 'warn' ? 'warning' : 'info'}`}>\n <span className=\"semiont-badge__text\">{log.level.toUpperCase()}</span>\n </span>\n <span className=\"log-message\">{log.message}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst TabBar: React.FC<{\n active: TabId;\n onChange: (t: TabId) => void;\n webHealthy: number; webTotal: number;\n mmHealthy: number; mmTotal: number;\n wkHealthy: number; wkTotal: number;\n}> = ({ active, onChange, webHealthy, webTotal, mmHealthy, mmTotal, wkHealthy, wkTotal }) => {\n const tabs: { id: TabId; label: string; healthy: number; total: number }[] = [\n { id: 'make-meaning', label: 'Make Meaning', healthy: mmHealthy, total: mmTotal },\n { id: 'workers', label: 'Workers', healthy: wkHealthy, total: wkTotal },\n { id: 'web', label: 'Web Interface', healthy: webHealthy, total: webTotal },\n ];\n\n function badgeClass(healthy: number, total: number) {\n if (total === 0) return 'semiont-badge semiont-badge--info';\n if (healthy === total) return 'semiont-badge semiont-badge--success';\n if (healthy === 0) return 'semiont-badge semiont-badge--error';\n return 'semiont-badge semiont-badge--warning';\n }\n\n return (\n <div className=\"dashboard-tabs\">\n {tabs.map(tab => (\n <button\n key={tab.id}\n className={`dashboard-tab${active === tab.id ? ' dashboard-tab--active' : ''}`}\n onClick={() => onChange(tab.id)}\n >\n {tab.label}\n <span className={badgeClass(tab.healthy, tab.total)}>\n <span className=\"semiont-badge__text\">{tab.healthy}/{tab.total}</span>\n </span>\n </button>\n ))}\n </div>\n );\n};\n\nconst UpdateTime: React.FC<{ time: Date | null; label: string }> = ({ time, label }) => (\n <span className=\"tab-update-time\">\n {label}: {time ? time.toLocaleTimeString() : '\u2014'}\n </span>\n);\n\nexport const WebDashboardApp: React.FC<{\n environment: string;\n refreshInterval: number;\n}> = ({ environment }) => {\n const [activeTab, setActiveTab] = useState<TabId>('make-meaning');\n\n const [services, setServices] = useState<ServiceStatus[]>([]);\n const [serviceLogs, setServiceLogs] = useState<LogEntry[]>([]);\n const [servicesUpdated, setServicesUpdated] = useState<Date | null>(null);\n\n const [makeMeaning, setMakeMeaning] = useState<MakeMeaningStatus>(DEFAULT_MAKE_MEANING);\n const [mmUpdated, setMmUpdated] = useState<Date | null>(null);\n\n const [workers, setWorkers] = useState<WorkerStatus[]>([]);\n const [workersUpdated, setWorkersUpdated] = useState<Date | null>(null);\n\n const [connected, setConnected] = useState(false);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n const io = window.io;\n if (!io) { console.error('Socket.IO not loaded'); return; }\n\n const socket = io();\n socket.on('connect', () => setConnected(true));\n socket.on('disconnect', () => setConnected(false));\n\n socket.on('services-update', (d: { services: ServiceStatus[]; logs: LogEntry[]; lastUpdate: Date }) => {\n setServices(d.services);\n setServiceLogs(d.logs);\n setServicesUpdated(new Date());\n setReady(true);\n });\n\n socket.on('make-meaning-update', (d: MakeMeaningStatus & { lastUpdate?: Date }) => {\n const { lastUpdate, ...mm } = d as any;\n setMakeMeaning(mm);\n setMmUpdated(lastUpdate ? new Date(lastUpdate) : new Date());\n });\n\n socket.on('actors-update', (d: { actors: MakeMeaningStatus['actors']; lastUpdate?: Date }) => {\n setMakeMeaning(prev => ({ ...prev, actors: d.actors }));\n if (d.lastUpdate) setMmUpdated(new Date(d.lastUpdate));\n });\n\n socket.on('workers-update', (d: { workers: WorkerStatus[]; lastUpdate?: Date }) => {\n setWorkers(d.workers);\n setWorkersUpdated(d.lastUpdate ? new Date(d.lastUpdate) : new Date());\n if (!ready) setReady(true);\n });\n\n return () => socket.disconnect();\n }, []);\n\n if (!ready) {\n return (\n <div className=\"dashboard-container\">\n <div className=\"dashboard-loading\">\n <div className=\"semiont-spinner\" />\n </div>\n </div>\n );\n }\n\n // Bridge graph status from services array into makeMeaning\n const graphService = services.find((s: ServiceStatus) => s.name.toLowerCase() === 'graph');\n const mm: MakeMeaningStatus = graphService\n ? { ...makeMeaning, graph: { ...makeMeaning.graph,\n status: graphService.status === 'healthy' ? 'healthy'\n : graphService.status === 'unhealthy' ? 'unhealthy' : 'unknown',\n evidence: graphService.evidence } }\n : makeMeaning;\n\n const MAKE_MEANING_SERVICES = new Set(['graph', 'neo4j', 'janusgraph', 'neptune']);\n const inferenceServices = services.filter(s => s.name.toLowerCase().startsWith('inference.'));\n const webServices = services.filter(s => !MAKE_MEANING_SERVICES.has(s.name.toLowerCase()) && !s.name.toLowerCase().startsWith('inference.'));\n const webHealthy = webServices.filter(s => s.status === 'healthy').length;\n\n const mmHealthy = [\n mm.eventLog.eventCount !== undefined,\n mm.contentStore.fileCount !== undefined,\n mm.graph.status === 'healthy',\n mm.materializedViews.fileCount !== undefined,\n mm.actors.gatherer.state !== 'error' && mm.actors.gatherer.state !== 'unknown',\n mm.actors.matcher.state !== 'error' && mm.actors.matcher.state !== 'unknown',\n mm.actors.stower.state !== 'error' && mm.actors.stower.state !== 'unknown',\n mm.actors.browser.state !== 'error' && mm.actors.browser.state !== 'unknown',\n ].filter(Boolean).length;\n\n const wkHealthy = workers.filter(w => w.state !== 'error').length;\n\n return (\n <div className=\"dashboard-container\">\n <header className=\"dashboard-header semiont-panel semiont-panel--bordered\">\n <div className=\"dashboard-header-left\">\n <h1 className=\"dashboard-title\">Semiont Dashboard</h1>\n <span className=\"semiont-badge semiont-badge--info dashboard-env\">\n <span className=\"semiont-badge__text\">{environment}</span>\n </span>\n </div>\n <div className=\"dashboard-header-right\">\n <span className={`semiont-indicator ${connected ? 'semiont-indicator--online' : 'semiont-indicator--offline'}`} />\n <span className=\"dashboard-connection-label\">{connected ? 'Live' : 'Disconnected'}</span>\n </div>\n </header>\n\n <div className=\"semiont-panel semiont-panel--bordered dashboard-tab-panel\">\n <TabBar\n active={activeTab} onChange={setActiveTab}\n webHealthy={webHealthy} webTotal={webServices.length}\n mmHealthy={mmHealthy} mmTotal={8}\n wkHealthy={wkHealthy} wkTotal={workers.length}\n />\n\n <div className=\"tab-content\">\n {activeTab === 'web' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={servicesUpdated} label=\"updated\" />\n </div>\n <SectionWebInterface services={services} />\n <LogViewer logs={serviceLogs} />\n </>\n )}\n\n {activeTab === 'make-meaning' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={mmUpdated} label=\"updated\" />\n </div>\n <SectionMakeMeaning makeMeaning={mm} inferenceServices={inferenceServices} />\n <LogViewer logs={[]} />\n </>\n )}\n\n {activeTab === 'workers' && (\n <>\n <div className=\"tab-meta\">\n <UpdateTime time={workersUpdated} label=\"updated\" />\n </div>\n <SectionWorkers workers={workers} inferenceServices={inferenceServices} />\n <LogViewer logs={[]} />\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nif (typeof window !== 'undefined') {\n window.SemiontDashboard = window.SemiontDashboard || {};\n window.SemiontDashboard.WebDashboardApp = WebDashboardApp;\n}\n", "import React from 'react';\nimport type { ServiceStatus } from '../dashboard-components.js';\n\nconst TAG = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nconst MAKE_MEANING_SERVICES = new Set(['graph', 'neo4j', 'janusgraph', 'neptune']);\nconst isInferenceService = (name: string) => name.toLowerCase().startsWith('inference.');\n\nfunction formatServiceName(name: string): string {\n // \"inference.anthropic\" \u2192 \"Inference (Anthropic)\"\n const dotIdx = name.indexOf('.');\n if (dotIdx !== -1) {\n const base = name.slice(0, dotIdx);\n const qualifier = name.slice(dotIdx + 1);\n return base.charAt(0).toUpperCase() + base.slice(1) +\n ' (' + qualifier.charAt(0).toUpperCase() + qualifier.slice(1) + ')';\n }\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n// Display order for web interface services\nconst SERVICE_ORDER = ['proxy', 'frontend', 'backend', 'database'];\n\nfunction indicatorClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n case 'warning': return 'semiont-indicator semiont-indicator--busy';\n default: return 'semiont-indicator';\n }\n}\n\nfunction statusLabel(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'healthy';\n case 'unhealthy': return 'unhealthy';\n case 'warning': return 'warning';\n default: return 'unknown';\n }\n}\n\nfunction statusBadgeClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-badge semiont-badge--success';\n case 'unhealthy': return 'semiont-badge semiont-badge--error';\n case 'warning': return 'semiont-badge semiont-badge--warning';\n default: return 'semiont-badge semiont-badge--info';\n }\n}\n\nconst ServiceRow: React.FC<{ service: ServiceStatus }> = ({ service }) => {\n // Evidence tags: prefer structured evidence, fall back to parsing details string\n const tags: string[] = service.evidence && service.evidence.length > 0\n ? [...service.evidence]\n : (() => {\n const details = service.details || '';\n const out: string[] = [];\n const pidMatch = details.match(/[Pp][Ii][Dd]:\\s*(\\d+)/);\n const containerMatch = details.match(/[Cc]ontainer:\\s*(\\S+)/);\n if (pidMatch) out.push(`pid ${pidMatch[1]}`);\n if (containerMatch) out.push(`container ${containerMatch[1].slice(0, 12)}`);\n if (service.runningCount !== undefined && service.desiredCount !== undefined) {\n out.push(`${service.runningCount}/${service.desiredCount} tasks`);\n }\n return out;\n })();\n\n if (service.checkedAt) {\n tags.push(`checked ${new Date(service.checkedAt).toLocaleTimeString()}`);\n }\n\n const consoleLinks = getConsoleLinks(service);\n\n return (\n <div className=\"service-row\">\n <div className=\"service-row__indicator\">\n <span className={indicatorClass(service.status)} />\n </div>\n <div className=\"service-row__name\">{formatServiceName(service.name)}</div>\n <div className=\"service-row__host\">\n {service.hostname\n ? <span className=\"service-row__hostname\">{service.hostname}</span>\n : <span className=\"service-row__hostname service-row__hostname--dim\">\u2014</span>\n }\n </div>\n <div className=\"service-row__status\">\n <span className={statusBadgeClass(service.status)}>\n <span className=\"semiont-badge__text\">{statusLabel(service.status)}</span>\n </span>\n </div>\n <div className=\"service-row__tags\">\n {tags.map((t, i) => <span key={i} className={TAG}>{t}</span>)}\n </div>\n <div className=\"service-row__actions\">\n {consoleLinks.map((link, i) => (\n <a key={i} href={link.url} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"semiont-tag semiont-tag--info semiont-tag--compact\">\n {link.label}\n </a>\n ))}\n </div>\n </div>\n );\n};\n\nfunction getConsoleLinks(service: ServiceStatus) {\n const links: { label: string; url: string }[] = [];\n const region = service.awsRegion || 'us-east-1';\n if (service.ecsServiceName && service.ecsClusterName) {\n links.push({ label: 'Console \u2197', url: `https://console.aws.amazon.com/ecs/home?region=${region}#/clusters/${service.ecsClusterName}/services/${service.ecsServiceName}/details` });\n if (service.logGroupName) {\n links.push({ label: 'Logs \u2197', url: `https://console.aws.amazon.com/cloudwatch/home?region=${region}#logsV2:log-groups/log-group/${encodeURIComponent(service.logGroupName)}` });\n }\n }\n if (service.rdsInstanceId) {\n links.push({ label: 'Console \u2197', url: `https://console.aws.amazon.com/rds/home?region=${region}#database:id=${service.rdsInstanceId};is-cluster=false` });\n }\n return links;\n}\n\ninterface Props {\n services: ServiceStatus[];\n}\n\nexport const SectionWebInterface: React.FC<Props> = ({ services }) => {\n const webServices = services.filter(s => !MAKE_MEANING_SERVICES.has(s.name.toLowerCase()) && !isInferenceService(s.name));\n\n // Sort by preferred order, then alphabetically for anything unknown\n const sorted = [...webServices].sort((a, b) => {\n const ai = SERVICE_ORDER.indexOf(a.name.toLowerCase());\n const bi = SERVICE_ORDER.indexOf(b.name.toLowerCase());\n if (ai === -1 && bi === -1) return a.name.localeCompare(b.name);\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n });\n\n return (\n <div className=\"service-list\">\n <div className=\"service-list__header\">\n <div className=\"service-row__indicator\" />\n <div className=\"service-row__name\">Service</div>\n <div className=\"service-row__host\">Address</div>\n <div className=\"service-row__status\">Status</div>\n <div className=\"service-row__tags\">Details</div>\n <div className=\"service-row__actions\" />\n </div>\n {sorted.map((s, i) => <ServiceRow key={i} service={s} />)}\n </div>\n );\n};\n", "import React from 'react';\nimport type { MakeMeaningStatus, ActorStatus, ServiceStatus } from '../dashboard-components.js';\nimport { MmRow, MmGroup, SectionInference } from './dashboard-shared.js';\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;\n}\n\nfunction truncatePath(p: string, max = 40): string {\n if (p.length <= max) return p;\n return '\u2026' + p.slice(p.length - max + 1);\n}\n\nfunction actorIndicatorClass(actor: ActorStatus): string {\n switch (actor.state) {\n case 'active': return 'semiont-indicator semiont-indicator--online semiont-indicator--pulse';\n case 'idle': return 'semiont-indicator semiont-indicator--online';\n case 'error': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\nfunction graphIndicatorClass(status: MakeMeaningStatus['graph']['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\ninterface Props {\n makeMeaning: MakeMeaningStatus;\n inferenceServices: ServiceStatus[];\n}\n\nexport const SectionMakeMeaning: React.FC<Props> = ({ makeMeaning: mm, inferenceServices }) => {\n return (\n <div className=\"mm-sections\">\n\n <MmGroup title=\"System of Record\">\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Event Log\"\n value={mm.eventLog.eventCount !== undefined\n ? mm.eventLog.eventCount.toLocaleString() + ' events'\n : 'unknown'}\n tags={[\n mm.eventLog.streamCount !== undefined && `${mm.eventLog.streamCount} streams`,\n mm.eventLog.sizeBytes !== undefined && formatBytes(mm.eventLog.sizeBytes),\n mm.eventLog.path && truncatePath(mm.eventLog.path),\n ]}\n />\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Content Store\"\n value={mm.contentStore.sizeBytes !== undefined\n ? formatBytes(mm.contentStore.sizeBytes)\n : 'unknown'}\n tags={[\n mm.contentStore.fileCount !== undefined && `${mm.contentStore.fileCount} files`,\n mm.contentStore.path && truncatePath(mm.contentStore.path),\n ]}\n />\n </MmGroup>\n\n <MmGroup title=\"Projections\">\n <MmRow\n indicator={graphIndicatorClass(mm.graph.status)}\n label=\"Graph\"\n value={mm.graph.status}\n tags={[\n mm.graph.address,\n mm.graph.database,\n ...(mm.graph.evidence ?? []),\n ]}\n />\n <MmRow\n indicator=\"semiont-indicator semiont-indicator--online\"\n label=\"Materialized Views\"\n value={mm.materializedViews.fileCount !== undefined\n ? `${mm.materializedViews.fileCount} projections`\n : 'unknown'}\n tags={[\n mm.materializedViews.lastUpdated &&\n `updated ${new Date(mm.materializedViews.lastUpdated).toLocaleTimeString()}`,\n mm.materializedViews.path && truncatePath(mm.materializedViews.path),\n ]}\n />\n </MmGroup>\n\n <MmGroup title=\"Actors\">\n {(['gatherer', 'matcher', 'stower', 'browser'] as const).map(name => {\n const actor = mm.actors[name];\n return (\n <MmRow\n key={name}\n indicator={actorIndicatorClass(actor)}\n label={name.charAt(0).toUpperCase() + name.slice(1)}\n value={actor.state}\n tags={[\n actor.provider,\n actor.model,\n actor.errorMessage && actor.errorMessage.slice(0, 40),\n ]}\n />\n );\n })}\n </MmGroup>\n\n <SectionInference inferenceServices={inferenceServices} />\n\n </div>\n );\n};\n", "import React from 'react';\nimport type { ServiceStatus } from '../dashboard-components.js';\n\nconst TAG = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nexport const MmRow: React.FC<{\n indicator: string;\n label: string;\n value: string;\n tags?: (string | undefined | false)[];\n}> = ({ indicator, label, value, tags }) => (\n <div className=\"mm-row\">\n <div className=\"mm-row__indicator\"><span className={indicator} /></div>\n <div className=\"mm-row__label\">{label}</div>\n <div className=\"mm-row__value\">{value}</div>\n <div className=\"mm-row__tags\">\n {tags?.filter(Boolean).map((t, i) => (\n <span key={i} className={TAG}>{t as string}</span>\n ))}\n </div>\n </div>\n);\n\nexport const MmGroup: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (\n <div className=\"mm-group\">\n <div className=\"mm-group__title\">{title}</div>\n <div className=\"mm-list\">{children}</div>\n </div>\n);\n\nexport function inferenceIndicatorClass(status: ServiceStatus['status']): string {\n switch (status) {\n case 'healthy': return 'semiont-indicator semiont-indicator--online';\n case 'unhealthy': return 'semiont-indicator semiont-indicator--offline';\n default: return 'semiont-indicator';\n }\n}\n\nexport function inferenceServiceLabel(name: string): string {\n // \"inference.anthropic\" \u2192 \"Anthropic\"\n return name.includes('.')\n ? name.slice(name.indexOf('.') + 1).replace(/^\\w/, c => c.toUpperCase())\n : name;\n}\n\nexport const SectionInference: React.FC<{ inferenceServices: ServiceStatus[] }> = ({ inferenceServices }) => {\n if (inferenceServices.length === 0) return null;\n return (\n <MmGroup title=\"Inference\">\n {inferenceServices.map(svc => (\n <MmRow\n key={svc.name}\n indicator={inferenceIndicatorClass(svc.status)}\n label={inferenceServiceLabel(svc.name)}\n value={svc.status}\n tags={svc.evidence}\n />\n ))}\n </MmGroup>\n );\n};\n", "import React from 'react';\nimport type { WorkerStatus, ServiceStatus } from '../dashboard-components.js';\nimport { SectionInference } from './dashboard-shared.js';\n\nconst TAG_SEC = 'semiont-tag semiont-tag--secondary semiont-tag--compact';\n\nconst WORKER_LABELS: Record<WorkerStatus['type'], string> = {\n 'reference-annotation': 'Reference Annotation',\n 'highlight-annotation': 'Highlight Annotation',\n 'assessment-annotation': 'Assessment Annotation',\n 'comment-annotation': 'Comment Annotation',\n 'tag-annotation': 'Tag Annotation',\n 'generation': 'Generation',\n};\n\nfunction idleSince(last: Date): string {\n const ms = Date.now() - last.getTime();\n const mins = Math.floor(ms / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n return `${Math.floor(hrs / 24)}d ago`;\n}\n\nfunction workerIndicatorClass(w: WorkerStatus): string {\n if (w.state === 'error') return 'semiont-indicator semiont-indicator--offline';\n if (w.activeCount > 0) return 'semiont-indicator semiont-indicator--online semiont-indicator--pulse';\n if (w.pendingCount > 10) return 'semiont-indicator semiont-indicator--busy';\n return 'semiont-indicator semiont-indicator--online';\n}\n\ninterface Props {\n workers: WorkerStatus[];\n inferenceServices: ServiceStatus[];\n}\n\nexport const SectionWorkers: React.FC<Props> = ({ workers, inferenceServices }) => {\n return (\n <div className=\"mm-sections\">\n <div className=\"mm-group\">\n <div className=\"mm-group__title\">Workers</div>\n <div className=\"mm-list\">\n <div className=\"mm-row mm-row--header\">\n <div className=\"mm-row__indicator\" />\n <div className=\"mm-row__label\">Worker</div>\n <div className=\"mm-row__value\">Status</div>\n <div className=\"mm-row__tags\">Details</div>\n </div>\n {workers.map((w, i) => (\n <div key={i} className=\"mm-row\">\n <div className=\"mm-row__indicator\"><span className={workerIndicatorClass(w)} /></div>\n <div className=\"mm-row__label\">{WORKER_LABELS[w.type]}</div>\n <div className=\"mm-row__value\">{w.state}</div>\n <div className=\"mm-row__tags\">\n <span className={w.activeCount > 0 ? 'semiont-tag semiont-tag--success semiont-tag--compact' : TAG_SEC}>\n {w.activeCount} active\n </span>\n <span className={TAG_SEC}>{w.pendingCount} pending</span>\n {w.completedCount > 0 && (\n <span className={TAG_SEC}>{w.completedCount} done</span>\n )}\n {w.failedCount > 0 && (\n <span className={'semiont-tag semiont-tag--warning semiont-tag--compact'}>{w.failedCount} failed</span>\n )}\n {w.state === 'idle' && !w.lastProcessed && (\n <span className={TAG_SEC}>never used</span>\n )}\n {w.lastProcessed && w.state === 'idle' && (\n <span className={TAG_SEC}>last used {idleSince(new Date(w.lastProcessed))}</span>\n )}\n {w.lastProcessed && w.state !== 'idle' && (\n <span className={TAG_SEC}>last {new Date(w.lastProcessed).toLocaleTimeString()}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <SectionInference inferenceServices={inferenceServices} />\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["web_dashboard_app_exports", "__export", "WebDashboardApp", "import_react", "import_react", "TAG", "MAKE_MEANING_SERVICES", "isInferenceService", "name", "formatServiceName", "dotIdx", "base", "qualifier", "SERVICE_ORDER", "indicatorClass", "status", "statusLabel", "statusBadgeClass", "ServiceRow", "service", "tags", "details", "out", "pidMatch", "containerMatch", "consoleLinks", "getConsoleLinks", "React", "t", "i", "link", "links", "region", "SectionWebInterface", "services", "sorted", "s", "b", "ai", "bi", "import_react", "import_react", "TAG", "MmRow", "indicator", "label", "value", "tags", "React", "t", "i", "MmGroup", "title", "children", "inferenceIndicatorClass", "status", "inferenceServiceLabel", "name", "c", "SectionInference", "inferenceServices", "svc", "formatBytes", "bytes", "k", "sizes", "i", "truncatePath", "p", "max", "actorIndicatorClass", "actor", "graphIndicatorClass", "status", "SectionMakeMeaning", "mm", "inferenceServices", "React", "MmGroup", "MmRow", "name", "SectionInference", "import_react", "TAG_SEC", "WORKER_LABELS", "idleSince", "last", "ms", "mins", "hrs", "workerIndicatorClass", "w", "SectionWorkers", "workers", "inferenceServices", "React", "i", "SectionInference", "DEFAULT_MAKE_MEANING", "LogViewer", "logs", "service", "filtered", "l", "React", "log", "i", "TabBar", "active", "onChange", "webHealthy", "webTotal", "mmHealthy", "mmTotal", "wkHealthy", "wkTotal", "tabs", "badgeClass", "healthy", "total", "tab", "UpdateTime", "time", "label", "WebDashboardApp", "environment", "activeTab", "setActiveTab", "services", "setServices", "serviceLogs", "setServiceLogs", "servicesUpdated", "setServicesUpdated", "makeMeaning", "setMakeMeaning", "mmUpdated", "setMmUpdated", "workers", "setWorkers", "workersUpdated", "setWorkersUpdated", "connected", "setConnected", "ready", "setReady", "io", "socket", "d", "lastUpdate", "mm", "prev", "graphService", "s", "MAKE_MEANING_SERVICES", "inferenceServices", "webServices", "w", "SectionWebInterface", "SectionMakeMeaning", "SectionWorkers"]
|
|
7
7
|
}
|
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
# Routes traffic between frontend (Next.js) and backend (Hono API)
|
|
3
3
|
#
|
|
4
4
|
# Routing rules (order matters - first match wins):
|
|
5
|
-
# 1. /api/auth/*
|
|
6
|
-
# 2. /api/cookies/*
|
|
7
|
-
# 3. /api/resources/*
|
|
8
|
-
# 4. /resources/*
|
|
9
|
-
# 5. /annotations/*
|
|
10
|
-
# 6. /admin/*
|
|
11
|
-
# 7. /api
|
|
12
|
-
# 8. /*
|
|
5
|
+
# 1. /api/auth/* → frontend (NextAuth)
|
|
6
|
+
# 2. /api/cookies/* → frontend (cookie consent/export)
|
|
7
|
+
# 3. /api/resources/* → frontend (authenticated proxy for images/files)
|
|
8
|
+
# 4. /resources/* → backend (main API, SSE-safe: no timeout, no buffering)
|
|
9
|
+
# 5. /annotations/* → backend (main API)
|
|
10
|
+
# 6. /admin/* → backend (main API)
|
|
11
|
+
# 7. /api/events/stream → backend (SSE-safe: no timeout, no buffering)
|
|
12
|
+
# 8. /api/participants/* → backend (SSE-safe: no timeout, no buffering)
|
|
13
|
+
# 9. /api/* → backend (OpenAPI docs, spec)
|
|
14
|
+
# 10. /_next/* → frontend (Next.js static assets)
|
|
15
|
+
# 11. /* → frontend (Next.js pages)
|
|
13
16
|
|
|
14
17
|
static_resources:
|
|
15
18
|
listeners:
|
|
@@ -121,7 +124,29 @@ static_resources:
|
|
|
121
124
|
cluster: backend
|
|
122
125
|
timeout: 30s
|
|
123
126
|
|
|
124
|
-
# Backend
|
|
127
|
+
# Backend SSE routes under /api/ (must come before generic /api/ catch-all)
|
|
128
|
+
- match:
|
|
129
|
+
prefix: "/api/events/stream"
|
|
130
|
+
route:
|
|
131
|
+
cluster: backend
|
|
132
|
+
timeout: 0s
|
|
133
|
+
idle_timeout: 3600s
|
|
134
|
+
typed_per_filter_config:
|
|
135
|
+
envoy.filters.http.buffer:
|
|
136
|
+
"@type": type.googleapis.com/envoy.extensions.filters.http.buffer.v3.BufferPerRoute
|
|
137
|
+
disabled: true
|
|
138
|
+
- match:
|
|
139
|
+
prefix: "/api/participants/"
|
|
140
|
+
route:
|
|
141
|
+
cluster: backend
|
|
142
|
+
timeout: 0s
|
|
143
|
+
idle_timeout: 3600s
|
|
144
|
+
typed_per_filter_config:
|
|
145
|
+
envoy.filters.http.buffer:
|
|
146
|
+
"@type": type.googleapis.com/envoy.extensions.filters.http.buffer.v3.BufferPerRoute
|
|
147
|
+
disabled: true
|
|
148
|
+
|
|
149
|
+
# Backend OpenAPI documentation and other /api/ routes
|
|
125
150
|
- match:
|
|
126
151
|
prefix: "/api/"
|
|
127
152
|
route:
|
|
@@ -129,13 +154,11 @@ static_resources:
|
|
|
129
154
|
timeout: 30s
|
|
130
155
|
|
|
131
156
|
# Next.js static assets (must come before catch-all)
|
|
132
|
-
# Preserve Content-Type headers from Next.js
|
|
133
157
|
- match:
|
|
134
158
|
prefix: "/_next/"
|
|
135
159
|
route:
|
|
136
160
|
cluster: frontend
|
|
137
161
|
timeout: 30s
|
|
138
|
-
auto_host_rewrite: true
|
|
139
162
|
|
|
140
163
|
# Everything else goes to frontend (Next.js pages)
|
|
141
164
|
- match:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semiont/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Semiont CLI - Unified environment management tool",
|
|
5
5
|
"_comment": "AWS SDK dependencies (@aws-sdk/*) are only used by platforms/aws",
|
|
6
6
|
"type": "module",
|
|
@@ -64,12 +64,12 @@
|
|
|
64
64
|
"@aws-sdk/client-secrets-manager": "^3.600.0",
|
|
65
65
|
"@aws-sdk/client-sts": "^3.859.0",
|
|
66
66
|
"@aws-sdk/client-wafv2": "^3.859.0",
|
|
67
|
-
"@semiont/api-client": "0.4.
|
|
68
|
-
"@semiont/content": "0.4.
|
|
69
|
-
"@semiont/core": "0.4.
|
|
70
|
-
"@semiont/event-sourcing": "0.4.
|
|
71
|
-
"@semiont/graph": "0.4.
|
|
72
|
-
"@semiont/make-meaning": "0.4.
|
|
67
|
+
"@semiont/api-client": "0.4.5",
|
|
68
|
+
"@semiont/content": "0.4.5",
|
|
69
|
+
"@semiont/core": "0.4.5",
|
|
70
|
+
"@semiont/event-sourcing": "0.4.5",
|
|
71
|
+
"@semiont/graph": "0.4.5",
|
|
72
|
+
"@semiont/make-meaning": "0.4.5",
|
|
73
73
|
"arg": "^5.0.2",
|
|
74
74
|
"argon2": "^0.44.0",
|
|
75
75
|
"express": "^5.2.1",
|