react-semaphor 0.1.324 → 0.1.326

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.
Files changed (58) hide show
  1. package/dist/analytics-protocol/index.cjs +1 -0
  2. package/dist/analytics-protocol/index.js +274 -0
  3. package/dist/brand-studio/index.cjs +2 -2
  4. package/dist/brand-studio/index.js +7 -6
  5. package/dist/chunks/{braces-C7BeIXvM.js → braces-DVaMJoCd.js} +1 -1
  6. package/dist/chunks/{braces-ZjRH2Kl7.js → braces-dHeaioTd.js} +1 -1
  7. package/dist/chunks/{calendar-preferences-dialog-B9Hz3pTH.js → calendar-preferences-dialog--2jD-eKu.js} +6 -5
  8. package/dist/chunks/calendar-preferences-dialog-mqU_uOmY.js +1 -0
  9. package/dist/chunks/{chevrons-up-down-CA-XvN1o.js → chevrons-up-down-CLbzBHoI.js} +1 -1
  10. package/dist/chunks/{chevrons-up-down-Cuilz9aY.js → chevrons-up-down-DNQE-uEp.js} +1 -1
  11. package/dist/chunks/{dashboard-briefing-launcher-COLpvReF.js → dashboard-briefing-launcher-DguNfFr8.js} +1 -1
  12. package/dist/chunks/{dashboard-briefing-launcher-CUEn7cr6.js → dashboard-briefing-launcher-DsjXUPFq.js} +29 -28
  13. package/dist/chunks/{dashboard-controls-CLShFyUq.js → dashboard-controls-DgNkM1yT.js} +10 -9
  14. package/dist/chunks/{dashboard-controls-DH8gdpOc.js → dashboard-controls-XCa9PZuU.js} +1 -1
  15. package/dist/chunks/dashboard-json-DiBd65Xf.js +1 -0
  16. package/dist/chunks/{dashboard-json-Db0DpTMw.js → dashboard-json-DkA6Bf0Y.js} +7 -6
  17. package/dist/chunks/{edit-dashboard-visual-Cc3xpTNQ.js → edit-dashboard-visual-BC9eOc4U.js} +2 -2
  18. package/dist/chunks/{edit-dashboard-visual-DmMKWtln.js → edit-dashboard-visual-Q5hW5MXk.js} +11 -9
  19. package/dist/chunks/index-B1-46PoR.js +1303 -0
  20. package/dist/chunks/index-BxM99sFL.js +1 -0
  21. package/dist/chunks/index-CuHybtft.js +51 -0
  22. package/dist/chunks/{index-PTx7430W.js → index-DwfDwtv2.js} +33456 -32921
  23. package/dist/chunks/{palette-CanPG11m.js → palette-DpcvHAiY.js} +1 -1
  24. package/dist/chunks/{palette-D96DOM7E.js → palette-DtmNws9a.js} +1 -1
  25. package/dist/chunks/{resource-management-panel-DR7Ku6sa.js → resource-management-panel-CGwWKZOP.js} +1 -1
  26. package/dist/chunks/{resource-management-panel-C1mbF-2a.js → resource-management-panel-D2oAQkKi.js} +6 -5
  27. package/dist/chunks/{save-DxkSzUTZ.js → save-BY7WF62U.js} +1 -1
  28. package/dist/chunks/{save-CqrBQKG6.js → save-Cv_XRb94.js} +1 -1
  29. package/dist/chunks/{switch-BXICAlvS.js → switch-5aQ_jcLH.js} +39 -39
  30. package/dist/chunks/{switch-Deo2Ltmj.js → switch-j3AThLFk.js} +2580 -2628
  31. package/dist/chunks/{use-create-flow-overlay-state-CmxTpqeg.js → use-create-flow-overlay-state-BQPXP0AM.js} +1 -1
  32. package/dist/chunks/{use-create-flow-overlay-state-B65gg2oB.js → use-create-flow-overlay-state-CP6GDQAX.js} +29 -28
  33. package/dist/chunks/{use-visual-utils-Diuguy3D.js → use-visual-utils-CSXU-96k.js} +2 -2
  34. package/dist/chunks/{use-visual-utils-51Nsy8cj.js → use-visual-utils-NpOW5uZ1.js} +1 -1
  35. package/dist/chunks/validators-DJUMR5An.js +2 -0
  36. package/dist/chunks/validators-DvTxl9i0.js +352 -0
  37. package/dist/dashboard/index.cjs +1 -1
  38. package/dist/dashboard/index.js +1 -1
  39. package/dist/dashboard-authoring/index.cjs +3 -3
  40. package/dist/dashboard-authoring/index.js +857 -310
  41. package/dist/data-app-sdk/index.cjs +1 -0
  42. package/dist/data-app-sdk/index.js +512 -0
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.js +141 -140
  45. package/dist/surfboard/index.cjs +1 -1
  46. package/dist/surfboard/index.js +2 -2
  47. package/dist/types/analytics-protocol.d.ts +495 -0
  48. package/dist/types/dashboard-authoring.d.ts +183 -0
  49. package/dist/types/dashboard.d.ts +6 -1
  50. package/dist/types/data-app-sdk.d.ts +378 -0
  51. package/dist/types/main.d.ts +118 -2
  52. package/dist/types/shared.d.ts +1 -0
  53. package/dist/types/surfboard.d.ts +6 -1
  54. package/dist/types/types.d.ts +6 -1
  55. package/package.json +11 -1
  56. package/dist/chunks/calendar-preferences-dialog-CLXaVo3h.js +0 -1
  57. package/dist/chunks/dashboard-json-eGBWfSN1.js +0 -1
  58. package/dist/chunks/index-CMS4bp9G.js +0 -1303
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=["lg","md","sm","xs","xxs"],_=10;function c(t,a,e){return e?{code:t,message:a,cardId:e}:{code:t,message:a}}function v(t){const a=new Set;for(const e of t){if(a.has(e))return e;a.add(e)}return null}function C(t){var I,k;const a=[];if(!t||typeof t!="object")return{ok:!1,errors:[c("invalid_plan","Dashboard plan must be a structured object.")],warnings:[]};const e=t,s=[...e.warnings||[]];e.version!==1&&a.push(c("invalid_version","Dashboard plan version must be 1.")),(I=e.title)!=null&&I.trim()||a.push(c("missing_title","Dashboard plan needs a title."));const n=Array.isArray(e.datasets)?e.datasets:[],d=Array.isArray(e.sheets)?e.sheets:[];n.length!==1&&a.push(c("invalid_dataset_count","MVP dashboard authoring requires exactly one selected dataset.")),d.length!==1&&a.push(c("invalid_sheet_count","MVP dashboard authoring creates exactly one dashboard sheet."));const i=d[0];i&&i.kind!=="dashboard"&&a.push(c("invalid_sheet_kind",'Generated sheet must use kind "dashboard".'));const l=(i==null?void 0:i.cards)||[];l.length>_&&a.push(c("too_many_cards",`Generated dashboards can contain at most ${_} cards.`));const r=v(l.map(p=>p.id));r&&a.push(c("duplicate_card_id",`Duplicate generated card id: ${r}.`));const u=v(l.map(p=>p.frameId));u&&a.push(c("duplicate_frame_id",`Duplicate generated frame id: ${u}.`));for(const p of l)(k=p.title)!=null&&k.trim()||a.push(c("missing_card_title","Card title is required.",p.id)),p.type==="custom"&&a.push(c("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",p.id)),p.type!=="text"&&!p.query&&s.push(c("missing_query_intent","Non-text card has no query intent and may be skipped by the app layer.",p.id));const f=Array.isArray(e.filterInputs)?e.filterInputs:[],b=f.map(p=>p.id),m=v(b);m&&a.push(c("duplicate_input_id",`Duplicate dashboard input id: ${m}.`));const o=f.map(p=>p.variableName).filter(Boolean)||[],h=v(o);h&&a.push(c("duplicate_input_variable",`Duplicate dashboard input variable name: ${h}.`));const y=Array.isArray(e.calculatedFields)?e.calculatedFields:[];for(const p of y)p.scope==="domain"&&p.reuseOnly!==!0&&a.push(c("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${p.name}" is outside MVP.`));return{ok:a.length===0,errors:a,warnings:s}}function F(t){var i;const a=[];if(!t||typeof t!="object")return{ok:!1,errors:[c("invalid_change_plan","Dashboard change plan must be a structured object.")],warnings:[]};const e=t,s=[...e.warnings||[]];e.version!==1&&a.push(c("invalid_version","Dashboard change plan version must be 1.")),(i=e.dashboardId)!=null&&i.trim()||a.push(c("missing_dashboard_id","Dashboard change plan needs a dashboard id."));const n=Array.isArray(e.datasets)?e.datasets:[],d=Array.isArray(e.operations)?e.operations:[];n.length>1&&a.push(c("invalid_dataset_count","MVP dashboard refinement can ground new AI operations in at most one selected dataset."));for(const l of d){if(l.kind==="unsupported"){s.push(c("unsupported_operation",l.reason||l.requestedAction));continue}l.kind==="addCard"&&l.card.type==="custom"&&a.push(c("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",l.card.id)),l.kind==="addCalculatedField"&&l.field.scope==="domain"&&l.field.reuseOnly!==!0&&a.push(c("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${l.field.name}" is outside MVP.`))}return{ok:a.length===0,errors:a,warnings:s}}const O={lg:48,md:36,sm:24,xs:12,xxs:6};function M(t){switch(t){case"kpi":return{w:12,h:12,minW:8,minH:8};case"table":return{w:48,h:28,minW:12,minH:12};case"text":return{w:48,h:10,minW:12,minH:8};case"chart":default:return{w:24,h:24,minW:12,minH:10}}}function R(t,a){let e=0,s=0,n=0;return t.map(d=>{const i=Math.min(d.w,a);e>0&&e+i>a&&(e=0,s+=n,n=0);const l={i:d.frameId,x:e,y:s,w:i,h:d.h,minW:Math.min(d.minW,a),minH:d.minH,static:!1};return e+=i,n=Math.max(n,d.h),l})}function w(t){const a=[...t].sort((e,s)=>e.priority-s.priority).map(e=>({...e,...M(e.role)}));return Object.fromEntries(A.map(e=>{const s=O[e],n=e==="lg"||e==="md"?a:a.map(d=>({...d,w:s,minW:Math.min(d.minW,s)}));return[e,R(n,s)]}))}function N(t,a,e){return e?{code:t,message:a,cardId:e}:{code:t,message:a}}function S(t,a,e){const s=(a||[]).filter(n=>n.scope==="card"&&n.targetCardId===e).map(n=>n.field).filter(Boolean);return s.length===0?t:{...t,calculatedFields:[...t.calculatedFields||[],...s]}}function V(t){const a={};return{inputs:(t.filterInputs||[]).map((s,n)=>(s.defaultValue!==void 0&&(a.shared??(a.shared={}),a.shared[s.id]={status:"set",value:{kind:"filter",filterValue:s.defaultValue}}),{id:s.id,kind:"filter",label:s.label,variableName:s.variableName,scope:{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:n},exports:["label","value","start","end","range"],filter:s.filter})),defaultInputValues:a.shared&&Object.keys(a.shared).length>0?a:void 0}}function E(t){var b,m;const a=C(t.plan);if(!a.ok)throw new Error(a.errors.map(o=>o.message).join(`
2
- `)||"Dashboard plan is invalid.");const e=t.plan.sheets[0],s=[...a.warnings],n=[],d=new Map(t.cardArtifacts.map(o=>[o.planCardId,o])),i=[];for(const o of e.cards){const h=d.get(o.id);if(!h){const I=N("missing_card_artifact",`Card "${o.title}" was skipped because no generated artifact was supplied.`,o.id);n.push(I);continue}s.push(...h.warnings||[]);const y=S(h.card,t.plan.calculatedFields,o.id);i.push({id:o.frameId,cards:[y],activeCardId:y.id})}if(i.length===0)throw new Error("Dashboard plan did not produce any persistable cards.");const{inputs:l,defaultInputValues:r}=V(t.plan),u=w(e.cards.filter(o=>i.some(h=>h.id===o.frameId)).map(o=>({frameId:o.frameId,priority:o.priority,role:o.role})));return{dashboard:{id:t.dashboardId,title:t.plan.title,description:t.plan.description||"",sheets:[{id:e.id,kind:"dashboard",title:e.title,description:e.description,frames:i,layouts:u,calculatedFields:(b=t.plan.calculatedFields)==null?void 0:b.filter(o=>o.scope==="sheet"&&o.field).map(o=>o.field)}],calculatedFields:(m=t.plan.calculatedFields)==null?void 0:m.filter(o=>o.scope==="dashboard"&&o.field).map(o=>o.field),inputs:l,...r?{defaultInputValues:r}:{}},warnings:s,skippedOperations:n}}function g(t,a,e){return e?{code:t,message:a,cardId:e}:{code:t,message:a}}function H(t){return JSON.parse(JSON.stringify(t))}function $(t){var a;return(a=t.sheets)==null?void 0:a.find(e=>(e.kind||"dashboard")==="dashboard")}function D(t,a){var e;for(const s of t.sheets||[])for(const n of s.frames||[]){const d=(e=n.cards)==null?void 0:e.find(i=>i.id===a);if(d)return{sheet:s,frame:n,card:d}}return null}function x(t){var e,s;const a=(s=(e=t.cards)==null?void 0:e[0])==null?void 0:s.type;return a==="kpi"?"kpi":a==="table"||a==="detailTable"||a==="pivotTable"?"table":a==="text"?"text":"chart"}function T(t){var a;return new Map((((a=t.layouts)==null?void 0:a.lg)||[]).map((e,s)=>[e.i,s]))}function P(t,a=new Map){const e=T(t),s=Math.max(e.size,a.size),n=(t.frames||[]).map((d,i)=>({frameId:d.id,role:x(d),priority:a.get(d.id)??e.get(d.id)??s+i}));t.layouts=w(n)}function B(t){return Object.values(t.layouts||{}).some(a=>a.length>0)}function j(t,a){if(!B(t)){P(t);return}const e=w([{frameId:a.id,role:x(a),priority:0}]);t.layouts??(t.layouts={});for(const[s,n]of Object.entries(e)){const d=t.layouts[s]||[];if(d.some(r=>r.i===a.id))continue;const i=n[0];if(!i)continue;const l=d.reduce((r,u)=>Math.max(r,u.y+u.h),0);t.layouts[s]=[...d,{...i,y:l}]}}function W(t,a){var e;a.defaultValue!==void 0&&(t.defaultInputValues??(t.defaultInputValues={}),(e=t.defaultInputValues).shared??(e.shared={}),t.defaultInputValues.shared[a.id]={status:"set",value:{kind:"filter",filterValue:a.defaultValue}})}function G(t){var l;const a=F(t.changePlan);if(!a.ok)throw new Error(a.errors.map(r=>r.message).join(`
3
- `)||"Dashboard change plan is invalid.");const e=H(t.dashboard),s=[...a.warnings],n=[],d=new Map(t.cardArtifacts.map(r=>[r.planCardId,r])),i=$(e);if(!i)throw new Error("Dashboard has no editable dashboard sheet.");i.frames??(i.frames=[]);for(const r of t.changePlan.operations)switch(r.kind){case"addCard":{if((i.frames||[]).reduce((m,o)=>{var h;return m+(((h=o.cards)==null?void 0:h.length)||0)},0)>=_){n.push(g("generated_card_limit_reached",`MVP AI refinement is capped at ${_} cards.`,r.card.id));break}const f=d.get(r.card.id);if(!f){n.push(g("missing_card_artifact",`Card "${r.card.title}" was skipped because no generated artifact was supplied.`,r.card.id));break}const b={id:r.card.frameId,cards:[f.card],activeCardId:f.card.id};i.frames.push(b),j(i,b);break}case"addFilterInput":{e.inputs??(e.inputs=[]);const u={id:r.input.id,kind:"filter",label:r.input.label,variableName:r.input.variableName,scope:{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:e.inputs.length},exports:["label","value","start","end","range"],filter:r.input.filter};e.inputs.push(u),W(e,r.input);break}case"addCalculatedField":{if(r.field.scope==="dashboard"&&r.field.field)e.calculatedFields??(e.calculatedFields=[]),e.calculatedFields.push(r.field.field);else if(r.field.scope==="sheet"&&r.field.field)i.calculatedFields??(i.calculatedFields=[]),i.calculatedFields.push(r.field.field);else if(r.field.scope==="card"&&r.field.field){const u=r.field.targetCardId?D(e,r.field.targetCardId):null;u?((l=u.card).calculatedFields??(l.calculatedFields=[]),u.card.calculatedFields.push(r.field.field)):n.push(g("missing_calculated_field_target",`Calculated field "${r.field.name}" needs a valid target card.`))}break}case"renameCard":{const u=D(e,r.cardId);if(!u){n.push(g("card_not_found",`Card "${r.cardId}" could not be renamed because it was not found.`,r.cardId));break}u.card.title=r.title,r.description!==void 0&&(u.card.description=r.description);break}case"reorderCards":{const u=new Map;for(let f=0;f<r.cardIds.length;f+=1){const b=r.cardIds[f],m=D(e,b);m&&u.set(m.frame.id,f)}P(i,u);break}case"reuseCalculatedField":s.push(g("reused_calculated_field",`Calculated field "${r.fieldId}" is reused by reference.`));break;case"unsupported":n.push(g("unsupported_operation",r.reason||r.requestedAction));break}return{dashboard:e,warnings:s,skippedOperations:n}}exports.DASHBOARD_AUTHORING_BREAKPOINTS=A;exports.DASHBOARD_AUTHORING_MAX_GENERATED_CARDS=_;exports.applyDashboardChangePlan=G;exports.compileDashboardFromPlan=E;exports.compileResponsiveDashboardLayouts=w;exports.validateDashboardChangePlan=F;exports.validateDashboardPlan=C;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const G=require("../chunks/validators-DJUMR5An.js"),W=["lg","md","sm","xs","xxs"],S=10;function f(e,t,a){return a?{code:e,message:t,cardId:a}:{code:e,message:t}}function $(e){const t=new Set;for(const a of e){if(t.has(a))return a;t.add(a)}return null}function K(e){var _,x;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_plan","Dashboard plan must be a structured object.")],warnings:[]};const a=e,n=[...a.warnings||[]];a.version!==1&&t.push(f("invalid_version","Dashboard plan version must be 1.")),(_=a.title)!=null&&_.trim()||t.push(f("missing_title","Dashboard plan needs a title."));const i=Array.isArray(a.datasets)?a.datasets:[],r=Array.isArray(a.sheets)?a.sheets:[];i.length!==1&&t.push(f("invalid_dataset_count","MVP dashboard authoring requires exactly one selected dataset.")),r.length!==1&&t.push(f("invalid_sheet_count","MVP dashboard authoring creates exactly one dashboard sheet."));const d=r[0];d&&d.kind!=="dashboard"&&t.push(f("invalid_sheet_kind",'Generated sheet must use kind "dashboard".'));const l=(d==null?void 0:d.cards)||[];l.length>S&&t.push(f("too_many_cards",`Generated dashboards can contain at most ${S} cards.`));const s=$(l.map(u=>u.id));s&&t.push(f("duplicate_card_id",`Duplicate generated card id: ${s}.`));const c=$(l.map(u=>u.frameId));c&&t.push(f("duplicate_frame_id",`Duplicate generated frame id: ${c}.`));for(const u of l)(x=u.title)!=null&&x.trim()||t.push(f("missing_card_title","Card title is required.",u.id)),u.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",u.id)),u.type!=="text"&&!u.query&&n.push(f("missing_query_intent","Non-text card has no query intent and may be skipped by the app layer.",u.id));const m=Array.isArray(a.filterInputs)?a.filterInputs:[],y=m.map(u=>u.id),g=$(y);g&&t.push(f("duplicate_input_id",`Duplicate dashboard input id: ${g}.`));const o=m.map(u=>u.variableName).filter(Boolean)||[],b=$(o);b&&t.push(f("duplicate_input_variable",`Duplicate dashboard input variable name: ${b}.`));const k=Array.isArray(a.calculatedFields)?a.calculatedFields:[];for(const u of k)u.scope==="domain"&&u.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${u.name}" is outside MVP.`));return{ok:t.length===0,errors:t,warnings:n}}function U(e){var d;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_change_plan","Dashboard change plan must be a structured object.")],warnings:[]};const a=e,n=[...a.warnings||[]];a.version!==1&&t.push(f("invalid_version","Dashboard change plan version must be 1.")),(d=a.dashboardId)!=null&&d.trim()||t.push(f("missing_dashboard_id","Dashboard change plan needs a dashboard id."));const i=Array.isArray(a.datasets)?a.datasets:[],r=Array.isArray(a.operations)?a.operations:[];i.length>1&&t.push(f("invalid_dataset_count","MVP dashboard refinement can ground new AI operations in at most one selected dataset."));for(const l of r){if(l.kind==="unsupported"){n.push(f("unsupported_operation",l.reason||l.requestedAction));continue}l.kind==="addCard"&&l.card.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",l.card.id)),l.kind==="addCalculatedField"&&l.field.scope==="domain"&&l.field.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${l.field.name}" is outside MVP.`))}return{ok:t.length===0,errors:t,warnings:n}}const ne={lg:48,md:36,sm:24,xs:12,xxs:6};function re(e,t){let a=0,n=0,i=0;return e.map(r=>{const d=Math.min(r.w,t);a>0&&a+d>t&&(a=0,n+=i,i=0);const l={i:r.frameId,x:a,y:n,w:d,h:r.h,minW:Math.min(r.minW,t),minH:r.minH,static:!1};return a+=d,i=Math.max(i,r.h),l})}function ie(e){const t=[...e].sort((s,c)=>s.priority-c.priority),a=t.filter(s=>s.role==="kpi"),n=t.filter(s=>s.role==="chart"),i=t.filter(s=>s.role==="table"),r=t.filter(s=>s.role==="text"),d=r.slice(0,1),l=r.slice(d.length);return{kpis:a,introText:d,charts:n,tables:i,supportingText:l}}function se(e,t,a){return t==="xxs"||t==="xs"?a:t==="sm"?Math.min(12,a):t==="md"?e<=1||e===2?18:12:e<=1||e===2?24:e===3?16:12}function de(e,t,a,n){return a==="xxs"||a==="xs"||a==="sm"||a==="md"||t===1||t%2===1&&e===0?n:n/2}function oe(e){const{item:t,band:a,index:n,bandCount:i,breakpoint:r,columns:d}=e;return a==="kpi"?{...t,band:a,w:se(i,r,d),h:15,minW:Math.min(6,d),minH:12}:a==="table"?{...t,band:a,w:d,h:r==="xxs"||r==="xs"?34:38,minW:Math.min(12,d),minH:18}:a==="introText"?{...t,band:a,w:d,h:r==="xxs"||r==="xs"?12:10,minW:Math.min(12,d),minH:8}:a==="supportingText"?{...t,band:a,w:r==="lg"?d/2:d,h:r==="xxs"||r==="xs"?12:10,minW:Math.min(12,d),minH:8}:{...t,band:a,w:de(n,i,r,d),h:r==="xxs"||r==="xs"?28:30,minW:Math.min(12,d),minH:16}}function F(e,t,a,n){return e.map((i,r)=>oe({item:i,band:t,index:r,bandCount:e.length,breakpoint:a,columns:n}))}function N(e){const t=ie(e);return Object.fromEntries(W.map(a=>{const n=ne[a],i=[...F(t.introText,"introText",a,n),...F(t.kpis,"kpi",a,n),...F(t.charts,"chart",a,n),...F(t.tables,"table",a,n),...F(t.supportingText,"supportingText",a,n)];return[a,re(i,n)]}))}function le(e){const t=String(e||"").trim().toLowerCase();return t.includes("date")||t.includes("time")||t.includes("timestamp")?"date":t.includes("int")||t.includes("float")||t.includes("double")||t.includes("decimal")||t.includes("numeric")||t.includes("number")||t.includes("currency")||t.includes("percent")?"number":t.includes("bool")?"boolean":"string"}function ce(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function ue(e){return ce(e)&&typeof e.filterId=="string"&&typeof e.operation=="string"&&Array.isArray(e.values)}function fe(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function pe(e){return e.filter(t=>t instanceof Date||typeof t=="string")}function R(e,t){if(t===void 0)return;const a=le(e.dataType),n=e.operation||"in";if(ue(t))return{...t,filterId:e.id,name:t.name||e.column,valueType:a,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};if(n==="is null"||n==="is not null")return{filterId:e.id,name:e.column,operation:n,valueType:a,values:[],dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};const i=Array.isArray(t)?t:[t],r=a==="date"?pe(i):fe(i);if(r.length!==0&&!((n==="between"||n==="not between")&&r.length<2))return{filterId:e.id,name:e.column,operation:n,valueType:a,values:r,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext}}function me(e,t,a){return a?{code:e,message:t,cardId:a}:{code:e,message:t}}function he(e,t,a){const n=(t||[]).filter(i=>i.scope==="card"&&i.targetCardId===a).map(i=>i.field).filter(Boolean);return n.length===0?e:{...e,calculatedFields:[...e.calculatedFields||[],...n]}}function be(e){const t={};return{inputs:(e.filterInputs||[]).map((n,i)=>{const r=R(n.filter,n.defaultValue);return r&&(t.shared??(t.shared={}),t.shared[n.id]={status:"set",value:{kind:"filter",filterValue:r}}),{id:n.id,kind:"filter",label:n.label,variableName:n.variableName,scope:n.scope||{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:i},exports:["label","value","start","end","range"],filter:n.filter}}),defaultInputValues:t.shared&&Object.keys(t.shared).length>0?t:void 0}}function ge(e){var y,g;const t=K(e.plan);if(!t.ok)throw new Error(t.errors.map(o=>o.message).join(`
2
+ `)||"Dashboard plan is invalid.");const a=e.plan.sheets[0],n=[...t.warnings],i=[],r=new Map(e.cardArtifacts.map(o=>[o.planCardId,o])),d=[];for(const o of a.cards){const b=r.get(o.id);if(!b){const _=me("missing_card_artifact",`Card "${o.title}" was skipped because no generated artifact was supplied.`,o.id);i.push(_);continue}n.push(...b.warnings||[]);const k=he(b.card,e.plan.calculatedFields,o.id);d.push({id:o.frameId,cards:[k],activeCardId:k.id})}if(d.length===0)throw new Error("Dashboard plan did not produce any persistable cards.");const{inputs:l,defaultInputValues:s}=be(e.plan),c=N(a.cards.filter(o=>d.some(b=>b.id===o.frameId)).map(o=>({frameId:o.frameId,priority:o.priority,role:o.role})));return{dashboard:{id:e.dashboardId,title:e.plan.title,description:e.plan.description||"",sheets:[{id:a.id,kind:"dashboard",title:a.title,description:a.description,frames:d,layouts:c,calculatedFields:(y=e.plan.calculatedFields)==null?void 0:y.filter(o=>o.scope==="sheet"&&o.field).map(o=>o.field)}],calculatedFields:(g=e.plan.calculatedFields)==null?void 0:g.filter(o=>o.scope==="dashboard"&&o.field).map(o=>o.field),inputs:l,...s?{defaultInputValues:s}:{}},warnings:n,skippedOperations:i}}function C(e,t,a){return a?{code:e,message:t,cardId:a}:{code:e,message:t}}function Ie(e){return JSON.parse(JSON.stringify(e))}function ye(e){var t;return(t=e.sheets)==null?void 0:t.find(a=>(a.kind||"dashboard")==="dashboard")}function P(e,t){var a;for(const n of e.sheets||[])for(const i of n.frames||[]){const r=(a=i.cards)==null?void 0:a.find(d=>d.id===t);if(r)return{sheet:n,frame:i,card:r}}return null}function X(e){var a,n;const t=(n=(a=e.cards)==null?void 0:a[0])==null?void 0:n.type;return t==="kpi"?"kpi":t==="table"||t==="detailTable"||t==="pivotTable"?"table":t==="text"?"text":"chart"}function _e(e){var t;return new Map((((t=e.layouts)==null?void 0:t.lg)||[]).map((a,n)=>[a.i,n]))}function J(e,t=new Map){const a=_e(e),n=Math.max(a.size,t.size),i=(e.frames||[]).map((r,d)=>({frameId:r.id,role:X(r),priority:t.get(r.id)??a.get(r.id)??n+d}));e.layouts=N(i)}function we(e){return Object.values(e.layouts||{}).some(t=>t.length>0)}function ve(e,t){if(!we(e)){J(e);return}const a=N([{frameId:t.id,role:X(t),priority:0}]);e.layouts??(e.layouts={});for(const[n,i]of Object.entries(a)){const r=e.layouts[n]||[];if(r.some(s=>s.i===t.id))continue;const d=i[0];if(!d)continue;const l=r.reduce((s,c)=>Math.max(s,c.y+c.h),0);e.layouts[n]=[...r,{...d,y:l}]}}function Ce(e,t){var n;const a=R(t.filter,t.defaultValue);a&&(e.defaultInputValues??(e.defaultInputValues={}),(n=e.defaultInputValues).shared??(n.shared={}),e.defaultInputValues.shared[t.id]={status:"set",value:{kind:"filter",filterValue:a}})}function ke(e){var l;const t=U(e.changePlan);if(!t.ok)throw new Error(t.errors.map(s=>s.message).join(`
3
+ `)||"Dashboard change plan is invalid.");const a=Ie(e.dashboard),n=[...t.warnings],i=[],r=new Map(e.cardArtifacts.map(s=>[s.planCardId,s])),d=ye(a);if(!d)throw new Error("Dashboard has no editable dashboard sheet.");d.frames??(d.frames=[]);for(const s of e.changePlan.operations)switch(s.kind){case"addCard":{if((d.frames||[]).reduce((g,o)=>{var b;return g+(((b=o.cards)==null?void 0:b.length)||0)},0)>=S){i.push(C("generated_card_limit_reached",`MVP AI refinement is capped at ${S} cards.`,s.card.id));break}const m=r.get(s.card.id);if(!m){i.push(C("missing_card_artifact",`Card "${s.card.title}" was skipped because no generated artifact was supplied.`,s.card.id));break}const y={id:s.card.frameId,cards:[m.card],activeCardId:m.card.id};d.frames.push(y),ve(d,y);break}case"addFilterInput":{a.inputs??(a.inputs=[]);const c={id:s.input.id,kind:"filter",label:s.input.label,variableName:s.input.variableName,scope:s.input.scope||{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:a.inputs.length},exports:["label","value","start","end","range"],filter:s.input.filter};a.inputs.push(c),Ce(a,s.input);break}case"addCalculatedField":{if(s.field.scope==="dashboard"&&s.field.field)a.calculatedFields??(a.calculatedFields=[]),a.calculatedFields.push(s.field.field);else if(s.field.scope==="sheet"&&s.field.field)d.calculatedFields??(d.calculatedFields=[]),d.calculatedFields.push(s.field.field);else if(s.field.scope==="card"&&s.field.field){const c=s.field.targetCardId?P(a,s.field.targetCardId):null;c?((l=c.card).calculatedFields??(l.calculatedFields=[]),c.card.calculatedFields.push(s.field.field)):i.push(C("missing_calculated_field_target",`Calculated field "${s.field.name}" needs a valid target card.`))}break}case"renameCard":{const c=P(a,s.cardId);if(!c){i.push(C("card_not_found",`Card "${s.cardId}" could not be renamed because it was not found.`,s.cardId));break}c.card.title=s.title,s.description!==void 0&&(c.card.description=s.description);break}case"reorderCards":{const c=new Map;for(let m=0;m<s.cardIds.length;m+=1){const y=s.cardIds[m],g=P(a,y);g&&c.set(g.frame.id,m)}J(d,c);break}case"reuseCalculatedField":n.push(C("reused_calculated_field",`Calculated field "${s.fieldId}" is reused by reference.`));break;case"unsupported":i.push(C("unsupported_operation",s.reason||s.requestedAction));break}return{dashboard:a,warnings:n,skippedOperations:i}}function I(e,t,a){return a?{code:e,message:t,cardId:a}:{code:e,message:t}}function D(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Y(e,t){if(!t.has(e))return t.add(e),e;let a=2,n=`${e}-${a}`;for(;t.has(n);)a+=1,n=`${e}-${a}`;return t.add(n),n}function xe(e){return e.kind==="semantic"?["semantic",e.domainId,e.datasetId||"",e.datasetName,e.connectionId||""].join(":"):e.kind==="physical"?["physical",e.connectionId,e.databaseName||"",e.schemaName||"",e.tableName].join(":"):["sql",e.connectionId,e.sql].join(":")}function v(e){return!!(e&&typeof e=="object")}function E(e){return v(e)&&(e.kind==="semantic"||e.kind==="physical"||e.kind==="sql")}function Q(e){return Array.isArray(e.inputs)?e.inputs.filter(t=>v(t)&&typeof t.id=="string"):[]}function Z(e){return Array.isArray(e.sections)?e.sections.filter(t=>v(t)):[]}function ee(e){return Array.isArray(e.views)?e.views.filter(t=>v(t)):[]}function Ae(e){return e.kind==="semantic"?{kind:"semantic",domainId:e.domainId,datasetName:e.datasetName,datasetId:e.datasetId,label:e.label,connectionId:e.connectionId}:e.kind==="physical"?{kind:"physical",connectionId:e.connectionId,databaseName:e.databaseName,schemaName:e.schemaName,tableName:e.tableName,label:e.label}:null}function Fe(e){return(e==null?void 0:e.source)||null}function te(e){const t=[];for(const a of Q(e))E(a.source)&&t.push(a.source);for(const a of Z(e))for(const n of ee(a)){const i=Fe(n.analytics);E(i)&&t.push(i)}return t}function De(e,t){const a=new Map;for(const i of te(e))a.set(xe(i),i);const n=[...a.values()].map(Ae).filter(i=>!!i);return n.length===0?(t.push(I("missing_materializable_dataset","No semantic or physical source could be converted into the current dashboard authoring dataset reference.")),[]):(n.length>1&&t.push(I("multiple_datasets_out_of_scope","The current dashboard authoring compiler supports one selected dataset; using the first source and deferring the rest.")),[n[0]])}function Se(e){return(Array.isArray(e.fields)?e.fields:[]).map(t=>t.name).filter(t=>{var a;return t!==((a=e.dateField)==null?void 0:a.name)})}function Te(e){const t=Array.isArray(e.metrics)?e.metrics.filter(a=>typeof a=="string"&&a.trim().length>0):[];return Array.from(new Set([e.metric,...t].filter(a=>typeof a=="string"&&a.trim().length>0)))}function $e(e){return v(e)&&typeof e.name=="string"&&e.name.trim().length>0}function Ne(e){if(!Array.isArray(e.dimensions))return;const t=e.dimensions.filter($e).map(a=>a.name);return t.length?t:void 0}function H(e){return e==="hour"?"day":e}function Me(e){var t,a;if(e){if(e.kind==="metric")return{metric:e.metric,metrics:Te(e),dateField:(t=e.dateField)==null?void 0:t.name,timeGrain:H(e.timeGrain),dimensions:Ne(e),limit:e.limit};if(e.kind==="records")return{metrics:e.measures,dateField:(a=e.dateField)==null?void 0:a.name,timeGrain:H(e.timeGrain),dimensions:Se(e),limit:e.limit}}}function Pe(e){return e&&G.validateSemaphorAnalyticsIntent(e).ok?e:void 0}function Ve(e){var t;switch((t=e.presentation)==null?void 0:t.kind){case"kpi":return"kpi";case"lineChart":return"line";case"barChart":return"bar";case"areaChart":return"area";case"table":return"table";case"text":return"text";default:return null}}function Re(e){var t,a,n;return((t=e.presentation)==null?void 0:t.kind)==="kpi"?"kpi":((a=e.presentation)==null?void 0:a.kind)==="table"?"table":((n=e.presentation)==null?void 0:n.kind)==="text"?"text":"chart"}function qe(e){switch(e){case"not_in":return"not in";case"contains":return"like";default:return e||"in"}}function Be(e){return v(e.field)?e.field.dataType==="datetime"?"date":e.field.dataType||"string":"string"}function Oe(e){if(!(!e||e.kind!=="physical"))return[e.databaseName,e.schemaName,e.tableName].filter(Boolean).join(".")}function Le(e,t,a,n,i){if(e.kind!=="filter")return i.push(I("control_inputs_deferred",`Control input "${e.label}" is represented in the protocol but not yet materialized by the dashboard authoring adapter.`)),null;if(!v(e.field)||typeof e.field.name!="string")return i.push(I("filter_requires_field",`Filter "${e.label||e.id}" needs a field before the dashboard compiler can materialize it.`)),null;const r=e.source||t,d=(r==null?void 0:r.kind)==="semantic"||(r==null?void 0:r.kind)==="physical"||(r==null?void 0:r.kind)==="sql"?r.connectionId:void 0;if(!d)return i.push(I("filter_requires_connection_id",`Filter "${e.label}" needs a source connectionId before the dashboard compiler can materialize it.`)),null;const c={id:`filter-${Y(D(e.id,e.field.name),n)}`,variableName:e.id,connectionId:d,title:e.label,column:e.field.name,dataType:Be(e),qualifiedTableName:Oe(r),sql:"",operation:qe(e.operator),type:e.multi===!1?"single":"multiple",location:"dashboard",displayMode:"toolbar",fieldMeta:(r==null?void 0:r.kind)==="semantic"?{name:e.field.name,qualifiedFieldName:e.field.name,dataType:e.field.dataType,role:e.field.role==="measure"?"metric":"groupby"}:void 0,semanticContext:(r==null?void 0:r.kind)==="semantic"?{semanticDomainId:r.domainId,connectionId:r.connectionId}:void 0};return{id:e.id,label:e.label,variableName:e.id,scope:a,filter:c,defaultValue:R(c,e.defaultValue)}}function V(e){const t=[],a=[];for(const n of e.viewIds){const i=e.viewIdToCardId.get(n);i?t.push(i):a.push(n)}return a.length>0&&e.warnings.push(I("input_scope_view_not_found",`Filter "${e.inputLabel}" referenced unknown view ids: ${a.join(", ")}.`)),Array.from(new Set(t))}function ze(e){var n,i;if(!e.protocolScope){const r=Array.from(new Set(e.boundCardIds));return r.length>0&&r.length<e.allCardIds.length?{kind:"cards",cardIds:r}:void 0}if(e.protocolScope.level==="dashboard"){if(!((n=e.protocolScope.excludeViewIds)!=null&&n.length))return;const r=new Set(V({inputLabel:e.inputLabel,viewIds:e.protocolScope.excludeViewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings}));return{kind:"cards",cardIds:e.allCardIds.filter(d=>!r.has(d))}}if(e.protocolScope.level==="view"){const r=V({inputLabel:e.inputLabel,viewIds:e.protocolScope.viewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings});return r.length===0?(e.warnings.push(I("input_scope_has_no_materialized_cards",`Filter "${e.inputLabel}" was deferred because its view scope does not match any materialized cards.`)),null):{kind:"cards",cardIds:r}}const t=e.sectionIdToCardIds.get(e.protocolScope.sectionId)||[];if(t.length===0)return e.warnings.push(I("input_scope_section_not_found",`Filter "${e.inputLabel}" was deferred because section "${e.protocolScope.sectionId}" does not match any materialized cards.`)),null;if(!((i=e.protocolScope.excludeViewIds)!=null&&i.length))return{kind:"cards",cardIds:t};const a=new Set(V({inputLabel:e.inputLabel,viewIds:e.protocolScope.excludeViewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings}));return{kind:"cards",cardIds:t.filter(r=>!a.has(r))}}function je(e){var _,x,u;const t=[],a=G.validateSemaphorDashboardIntent(e);for(const p of a.warnings)t.push(I(p.code,p.message));for(const p of a.errors)t.push(I(p.code,p.message));const n=Z(e),i=Q(e),r=De(e,t),d=te(e)[0],l=[],s=new Map,c=new Map,m=new Map,y=new Set,g=new Set;let o=0;for(const[p,w]of n.entries()){const A=typeof w.title=="string"?w.title:`Section ${p+1}`,q=w.id||D(A,`section-${p+1}`);c.set(q,[]);for(const[B,h]of ee(w).entries()){const O=Ve(h),M=D(h.id||`${A}-${h.title||`View ${B+1}`}`,`card-${p+1}-${B+1}`);if(!O){t.push(I("unsupported_presentation",`Dashboard presentation "${((_=h.presentation)==null?void 0:_.kind)||"unknown"}" is not supported by the dashboard authoring adapter.`,`card-${M}`));continue}if(((x=h.analytics)==null?void 0:x.kind)==="sql"){t.push(I("sql_intent_deferred","SQL analytics intent is valid protocol, but the current dashboard authoring adapter only materializes semantic and physical config-card intents.",`card-${M}`));continue}const L=Y(M,y),T=`card-${L}`;h.id&&s.set(h.id,T),(u=c.get(q))==null||u.push(T);const ae=h.analytics&&"inputs"in h.analytics?h.analytics.inputs:void 0;for(const z of ae||[]){const j=m.get(z.inputId)||[];j.push(T),m.set(z.inputId,j)}l.push({id:T,frameId:`frame-${L}`,title:h.title,description:h.description,type:O,role:Re(h),priority:o,section:A,query:Me(h.analytics),analyticsIntent:Pe(h.analytics),text:h.text}),o+=1}}const b=i.map(p=>{const w=ze({protocolScope:p.scope,inputLabel:p.label,allCardIds:l.map(A=>A.id),boundCardIds:m.get(p.id)||[],viewIdToCardId:s,sectionIdToCardIds:c,warnings:t});return w===null?null:Le(p,d,w,g,t)}).filter(p=>!!p);return{plan:{version:1,id:`plan-${D(e.title,"dashboard")}`,title:e.title,description:e.description,datasets:r,sheets:[{id:`sheet-${D(e.title,"dashboard")}`,title:e.title,description:e.description,kind:"dashboard",cards:l}],filterInputs:b.length?b:void 0,warnings:t.length?t:void 0,unresolvedRequests:a.ok?void 0:a.errors.map(p=>p.message)},warnings:t}}exports.DASHBOARD_AUTHORING_BREAKPOINTS=W;exports.DASHBOARD_AUTHORING_MAX_GENERATED_CARDS=S;exports.applyDashboardChangePlan=ke;exports.compileDashboardFromPlan=ge;exports.compileResponsiveDashboardLayouts=N;exports.dashboardPlanFromSemaphorDashboardIntent=je;exports.validateDashboardChangePlan=U;exports.validateDashboardPlan=K;