@contractspec/example.integration-hub 3.8.12 → 3.8.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/example.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- declare const example: import("@contractspec/lib.contracts-spec").ExampleSpec;
2
- export default example;
1
+ declare const ExamplesIntegrationHubExample: import("@contractspec/lib.contracts-spec").ExampleSpec;
2
+ export default ExamplesIntegrationHubExample;
3
+ export { ExamplesIntegrationHubExample };
package/dist/example.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Provider-agnostic integration center with connectors, connections, field mappings, and sync logs.",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.core"],tags:["integrations","sync","etl","connectors"]},docs:{rootDocId:"docs.examples.integration-hub",goalDocId:"docs.examples.integration-hub.goal",usageDocId:"docs.examples.integration-hub.usage",constraintsDocId:"docs.examples.integration-hub.constraints"},entrypoints:{packageName:"@contractspec/example.integration-hub",feature:"./feature",contracts:"./contracts",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
2
+ import{defineExample as h}from"@contractspec/lib.contracts-spec/examples";var j=h({meta:{key:"examples.integration-hub",version:"1.0.0",title:"Integration Hub",description:"Integration Hub example with sync engine and field mappings for ContractSpec",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","integration-hub"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.integration-hub"}}),v=j;export{v as default,j as ExamplesIntegrationHubExample};
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  * Demonstrates a complete integration platform with connections and sync.
5
5
  */
6
6
  export * from './connection';
7
+ export * from './example';
7
8
  export { createIntegrationHandlers, type IntegrationHandlers, } from './handlers/integration.handlers';
8
9
  export * from './integration';
9
10
  export * from './mcp-example';
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  // @bun
2
- import{defineEnum as HH}from"@contractspec/lib.schema";var KH=HH("ConnectionStatus",["PENDING","CONNECTED","DISCONNECTED","ERROR","EXPIRED"]),XH=HH("AuthType",["api_key","oauth2","bearer","header","basic","webhook_signing","service_account"]),ZH=HH("TransportType",["rest","mcp","webhook","sdk"]);import{defineSchemaModel as jH,ScalarTypeEnum as N}from"@contractspec/lib.schema";var m=jH({name:"ConnectionModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.String_unsecure(),isOptional:!1},status:{type:KH,isOptional:!1},authType:{type:N.String_unsecure(),isOptional:!1},externalAccountName:{type:N.String_unsecure(),isOptional:!0},connectedAt:{type:N.DateTime(),isOptional:!0},lastHealthCheck:{type:N.DateTime(),isOptional:!0},healthStatus:{type:N.String_unsecure(),isOptional:!0},transport:{type:ZH,isOptional:!0},authMethod:{type:XH,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}}),$H=jH({name:"CreateConnectionInput",fields:{integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.NonEmptyString(),isOptional:!1},authType:{type:N.NonEmptyString(),isOptional:!1},credentials:{type:N.JSON(),isOptional:!0},transport:{type:ZH,isOptional:!0},authMethod:{type:XH,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}});import{defineCommand as aH}from"@contractspec/lib.contracts-spec/operations";var nH=["@example.integration-hub"],eH=aH({meta:{key:"integration.connection.create",version:"1.0.0",stability:"stable",owners:[...nH],tags:["integration","connection","create"],description:"Create a connection to an external system.",goal:"Authenticate with external systems.",context:"Connection setup."},io:{input:$H,output:m},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.connection.created",version:"1.0.0",when:"Connection created",payload:m}],audit:["integration.connection.created"]},acceptance:{scenarios:[{key:"create-connection-happy-path",given:["User is authenticated"],when:["User creates connection with valid credentials"],then:["Connection is created","ConnectionCreated event is emitted"]}],examples:[{key:"connect-crm",input:{name:"Salesforce Prod",integrationId:"salesforce",credentials:{clientId:"xxx"}},output:{id:"conn-123",status:"connected",connectedAt:"2025-01-01T12:00:00Z"}}]}});import{web as HK}from"@contractspec/lib.runtime-sandbox";var{generateId:p}=HK;function hH(H){return{id:H.id,projectId:H.projectId,organizationId:H.organizationId,name:H.name,description:H.description??void 0,type:H.type,status:H.status,iconUrl:H.iconUrl??void 0,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function QH(H){return{id:H.id,integrationId:H.integrationId,name:H.name,status:H.status,credentials:H.credentials?JSON.parse(H.credentials):void 0,config:H.config?JSON.parse(H.config):void 0,lastSyncAt:H.lastSyncAt?new Date(H.lastSyncAt):void 0,errorMessage:H.errorMessage??void 0,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function qH(H){return{id:H.id,connectionId:H.connectionId,name:H.name,sourceEntity:H.sourceEntity,targetEntity:H.targetEntity,frequency:H.frequency,status:H.status,lastRunAt:H.lastRunAt?new Date(H.lastRunAt):void 0,lastRunStatus:H.lastRunStatus??void 0,recordsSynced:H.recordsSynced,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function xH(H){return{id:H.id,syncConfigId:H.syncConfigId,sourceField:H.sourceField,targetField:H.targetField,transformType:H.transformType??void 0,transformConfig:H.transformConfig?JSON.parse(H.transformConfig):void 0,createdAt:new Date(H.createdAt)}}function KK(H){async function Z(Q){let{projectId:Y,type:P,status:B,search:_,limit:z=20,offset:M=0}=Q,j="WHERE projectId = ?",f=[Y];if(P&&P!=="all")j+=" AND type = ?",f.push(P);if(B&&B!=="all")j+=" AND status = ?",f.push(B);if(_)j+=" AND name LIKE ?",f.push(`%${_}%`);let sH=(await H.query(`SELECT COUNT(*) as count FROM integration ${j}`,f)).rows[0]?.count??0;return{integrations:(await H.query(`SELECT * FROM integration ${j} ORDER BY name LIMIT ? OFFSET ?`,[...f,z,M])).rows.map(hH),total:sH}}async function K(Q,Y){let P=p("integ"),B=new Date().toISOString();await H.execute(`INSERT INTO integration (id, projectId, organizationId, name, description, type, status, iconUrl, createdAt, updatedAt)
3
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[P,Y.projectId,Y.organizationId,Q.name,Q.description??null,Q.type,"INACTIVE",Q.iconUrl??null,B,B]);let _=(await H.query("SELECT * FROM integration WHERE id = ?",[P])).rows;return hH(_[0])}async function X(Q){let{integrationId:Y,status:P,limit:B=20,offset:_=0}=Q,z="WHERE 1=1",M=[];if(Y)z+=" AND integrationId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await H.query(`SELECT COUNT(*) as count FROM integration_connection ${z}`,M)).rows[0]?.count??0;return{connections:(await H.query(`SELECT * FROM integration_connection ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(QH),total:f}}async function $(Q){let Y=p("conn"),P=new Date().toISOString();await H.execute(`INSERT INTO integration_connection (id, integrationId, name, status, credentials, config, createdAt, updatedAt)
4
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[Y,Q.integrationId,Q.name,"PENDING",Q.credentials?JSON.stringify(Q.credentials):null,Q.config?JSON.stringify(Q.config):null,P,P]),await H.execute("UPDATE integration_connection SET status = 'CONNECTED', updatedAt = ? WHERE id = ?",[P,Y]),await H.execute("UPDATE integration SET status = 'ACTIVE', updatedAt = ? WHERE id = ?",[P,Q.integrationId]);let B=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Y])).rows;return QH(B[0])}async function q(Q){let Y=new Date().toISOString();await H.execute("UPDATE integration_connection SET status = 'DISCONNECTED', updatedAt = ? WHERE id = ?",[Y,Q]);let P=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Q])).rows;return QH(P[0])}async function G(Q){let{connectionId:Y,status:P,limit:B=20,offset:_=0}=Q,z="WHERE 1=1",M=[];if(Y)z+=" AND connectionId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await H.query(`SELECT COUNT(*) as count FROM integration_sync_config ${z}`,M)).rows[0]?.count??0;return{configs:(await H.query(`SELECT * FROM integration_sync_config ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(qH),total:f}}async function W(Q){let Y=p("sync"),P=new Date().toISOString();await H.execute(`INSERT INTO integration_sync_config (id, connectionId, name, sourceEntity, targetEntity, frequency, status, recordsSynced, createdAt, updatedAt)
5
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Y,Q.connectionId,Q.name,Q.sourceEntity,Q.targetEntity,Q.frequency??"DAILY","ACTIVE",0,P,P]);let B=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Y])).rows;return qH(B[0])}async function A(Q){let Y=new Date().toISOString(),P=[];await H.execute("DELETE FROM integration_field_mapping WHERE syncConfigId = ?",[Q.syncConfigId]);for(let B of Q.mappings){let _=p("fmap");await H.execute(`INSERT INTO integration_field_mapping (id, syncConfigId, sourceField, targetField, transformType, transformConfig, createdAt)
6
- VALUES (?, ?, ?, ?, ?, ?, ?)`,[_,Q.syncConfigId,B.sourceField,B.targetField,B.transformType??null,B.transformConfig?JSON.stringify(B.transformConfig):null,Y]);let z=(await H.query("SELECT * FROM integration_field_mapping WHERE id = ?",[_])).rows;P.push(xH(z[0]))}return P}async function O(Q){return(await H.query("SELECT * FROM integration_field_mapping WHERE syncConfigId = ?",[Q])).rows.map(xH)}async function U(Q){let Y=new Date().toISOString(),P=Math.floor(Math.random()*1000)+50;await H.execute("UPDATE integration_sync_config SET lastRunAt = ?, lastRunStatus = 'SUCCESS', recordsSynced = recordsSynced + ?, updatedAt = ? WHERE id = ?",[Y,P,Y,Q]);let B=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Q])).rows;if(B[0])await H.execute("UPDATE integration_connection SET lastSyncAt = ?, updatedAt = ? WHERE id = ?",[Y,Y,B[0].connectionId]);let _=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Q])).rows;return qH(_[0])}async function D(Q){let Y=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Q.connectionId])).rows;if(!Y[0])return{valid:!1,provider:"unknown",keyPrefix:"",error:`Connection ${Q.connectionId} not found`};let P=Q.providerKey.slice(0,8),B=Q.providerKey.length>=16;return{valid:B,provider:Y[0].name,keyPrefix:`${P}...`,expiresAt:B?new Date(Date.now()+7776000000).toISOString():void 0,error:B?void 0:"Key must be at least 16 characters"}}async function F(Q){let Y=new Date().toISOString();return await H.execute("UPDATE integration_connection SET updatedAt = ? WHERE id = ?",[Y,Q.connectionId]),{refreshed:!0,expiresAt:new Date(Date.now()+3600000).toISOString(),tokenType:"Bearer",scopes:["read","write","sync"]}}async function V(Q){return{integrationId:Q.integrationId,transports:[{transport:"rest",supported:!0,defaultVersion:"v2"},{transport:"mcp",supported:!0,defaultVersion:"v1"},{transport:"webhook",supported:!0},{transport:"sdk",supported:!1}]}}return{listIntegrations:Z,createIntegration:K,listConnections:X,connectService:$,disconnectService:q,listSyncConfigs:G,configureSync:W,mapFields:A,getFieldMappings:O,runSync:U,validateByokKey:D,refreshOAuth2Token:F,getTransportOptions:V}}import{defineEnum as XK}from"@contractspec/lib.schema";var UH=XK("IntegrationStatus",["DRAFT","ACTIVE","PAUSED","ERROR","ARCHIVED"]);import{defineSchemaModel as EH,ScalarTypeEnum as R}from"@contractspec/lib.schema";var u=EH({name:"IntegrationModel",fields:{id:{type:R.String_unsecure(),isOptional:!1},name:{type:R.String_unsecure(),isOptional:!1},slug:{type:R.String_unsecure(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.String_unsecure(),isOptional:!1},status:{type:UH,isOptional:!1},createdAt:{type:R.DateTime(),isOptional:!1}}}),JH=EH({name:"CreateIntegrationInput",fields:{name:{type:R.NonEmptyString(),isOptional:!1},slug:{type:R.NonEmptyString(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.NonEmptyString(),isOptional:!1},config:{type:R.JSON(),isOptional:!0},featureFlagKey:{type:R.String_unsecure(),isOptional:!0}}});import{defineCommand as ZK}from"@contractspec/lib.contracts-spec/operations";var $K=ZK({meta:{key:"integration.create",version:"1.0.0",stability:"stable",owners:["@example.integration-hub"],tags:["integration","create"],description:"Create a new integration.",goal:"Allow users to set up integrations with external systems.",context:"Integration setup."},io:{input:JH,output:u},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.created",version:"1.0.0",when:"Integration created",payload:u}],audit:["integration.created"]},acceptance:{scenarios:[{key:"create-integration-happy-path",given:["User is admin"],when:["User defines new integration type"],then:["Integration definition is created","IntegrationCreated event is emitted"]}],examples:[{key:"create-slack",input:{name:"Slack",category:"communication",authType:"oauth2"},output:{id:"slack",status:"active"}}]}});import{createMcpToolsets as QK}from"@contractspec/lib.ai-agent/tools/mcp-client";import{randomUUID as qK}from"crypto";var UK=["-y","@modelcontextprotocol/server-filesystem","."];async function MX(){let H=YK(),Z=vH(),K=JK(),X=await QK([K],{onNameCollision:"error"});try{let $=Object.keys(X.tools).sort(),q={mode:H,server:{name:K.name,transport:Z},authMethod:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_AUTH_METHOD,apiVersion:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_API_VERSION,tools:$};if(H==="call"){let G=wH("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_NAME"),W=GK("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_ARGS_JSON",{}),A=X.tools[G];if(!A?.execute)throw Error(`Tool "${G}" was not found. Available tools: ${$.join(", ")}`);let O=await A.execute(W,{toolCallId:`integration-hub-${qK()}`,messages:[]});q.toolCall={name:G,args:W,output:O}}return q}finally{await X.cleanup().catch(()=>{return})}}function JK(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_NAME??"filesystem",Z=vH(),K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_PREFIX;if(Z==="stdio")return{name:H,transport:Z,command:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_COMMAND??"npx",args:DK("CONTRACTSPEC_INTEGRATION_HUB_MCP_ARGS_JSON",UK),toolPrefix:K};let X=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN,$=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN_ENV;return{name:H,transport:Z==="webhook"||Z==="http"?"http":"sse",url:wH("CONTRACTSPEC_INTEGRATION_HUB_MCP_URL"),headers:PK("CONTRACTSPEC_INTEGRATION_HUB_MCP_HEADERS_JSON"),accessToken:X,accessTokenEnvVar:$,toolPrefix:K}}function YK(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE?.toLowerCase()??"list";if(H==="list"||H==="call")return H;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE: ${H}. Use "list" or "call".`)}function vH(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT?.toLowerCase()??"stdio";if(H==="stdio"||H==="http"||H==="sse"||H==="webhook")return H;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT: ${H}. Use "stdio", "http", "sse", or "webhook".`)}function DK(H,Z){if(!process.env[H])return Z;let X=TH(H);if(!Array.isArray(X)||X.some(($)=>typeof $!=="string"))throw Error(`${H} must be a JSON string array.`);return X}function bH(H){if(!process.env[H])return;let K=TH(H);if(!WK(K))throw Error(`${H} must be a JSON object.`);return K}function GK(H,Z){return bH(H)??Z}function PK(H){let Z=bH(H);if(!Z)return;let K=Object.entries(Z);if(K.find(([,$])=>typeof $!=="string"))throw Error(`${H} must contain only string values.`);return Object.fromEntries(K)}function TH(H){let Z=process.env[H];if(!Z)return;try{return JSON.parse(Z)}catch{throw Error(`${H} contains invalid JSON.`)}}function wH(H){let Z=process.env[H];if(!Z)throw Error(`Missing required env var: ${H}`);return Z}function WK(H){return typeof H==="object"&&H!==null&&!Array.isArray(H)}import{defineEnum as YH}from"@contractspec/lib.schema";var x=YH("SyncDirection",["INBOUND","OUTBOUND","BIDIRECTIONAL"]),l=YH("SyncStatus",["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]),c=YH("MappingType",["DIRECT","TRANSFORM","LOOKUP","CONSTANT","COMPUTED"]);import{defineSchemaModel as C,ScalarTypeEnum as J}from"@contractspec/lib.schema";var b=C({name:"FieldMappingModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.String_unsecure(),isOptional:!1},targetField:{type:J.String_unsecure(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!1}}}),r=C({name:"SyncConfigModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.String_unsecure(),isOptional:!1},targetObject:{type:J.String_unsecure(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!1},scheduleCron:{type:J.String_unsecure(),isOptional:!0},isActive:{type:J.Boolean(),isOptional:!1},lastSyncAt:{type:J.DateTime(),isOptional:!0},fieldMappings:{type:b,isArray:!0,isOptional:!0}}}),T=C({name:"SyncRunModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1},direction:{type:x,isOptional:!1},trigger:{type:J.String_unsecure(),isOptional:!1},recordsProcessed:{type:J.Int_unsecure(),isOptional:!1},recordsCreated:{type:J.Int_unsecure(),isOptional:!1},recordsUpdated:{type:J.Int_unsecure(),isOptional:!1},recordsFailed:{type:J.Int_unsecure(),isOptional:!1},errorMessage:{type:J.String_unsecure(),isOptional:!0},startedAt:{type:J.DateTime(),isOptional:!0},completedAt:{type:J.DateTime(),isOptional:!0},createdAt:{type:J.DateTime(),isOptional:!1}}}),DH=C({name:"CreateSyncConfigInput",fields:{integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.NonEmptyString(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.NonEmptyString(),isOptional:!1},targetObject:{type:J.NonEmptyString(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!0},scheduleCron:{type:J.String_unsecure(),isOptional:!0}}}),GH=C({name:"AddFieldMappingInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.NonEmptyString(),isOptional:!1},targetField:{type:J.NonEmptyString(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},lookupConfig:{type:J.JSON(),isOptional:!0},constantValue:{type:J.JSON(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!0},defaultValue:{type:J.JSON(),isOptional:!0}}}),PH=C({name:"TriggerSyncInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!0},fullSync:{type:J.Boolean(),isOptional:!0}}}),WH=C({name:"ListSyncRunsInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!0},limit:{type:J.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:J.Int_unsecure(),isOptional:!0,defaultValue:0}}}),BH=C({name:"ListSyncRunsOutput",fields:{runs:{type:T,isArray:!0,isOptional:!1},total:{type:J.Int_unsecure(),isOptional:!1}}});import{defineCommand as OH,defineQuery as BK}from"@contractspec/lib.contracts-spec/operations";var i=["@example.integration-hub"],OK=OH({meta:{key:"integration.syncConfig.create",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","config","create"],description:"Create a sync configuration.",goal:"Define how data should be synchronized.",context:"Sync setup."},io:{input:DH,output:r},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.syncConfig.created",version:"1.0.0",when:"Sync config created",payload:r}],audit:["integration.syncConfig.created"]},acceptance:{scenarios:[{key:"create-sync-happy-path",given:["User is authenticated"],when:["User creates sync config"],then:["Sync config is created","SyncConfigCreated event is emitted"]}],examples:[{key:"create-contact-sync",input:{name:"Contacts Sync",sourceConnectionId:"conn-1",targetConnectionId:"conn-2"},output:{id:"sync-123",status:"active"}}]}}),LK=OH({meta:{key:"integration.fieldMapping.add",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","mapping","field"],description:"Add a field mapping to a sync config.",goal:"Map fields between systems.",context:"Mapping configuration."},io:{input:GH,output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.fieldMapping.added",version:"1.0.0",when:"Mapping added",payload:b}]},acceptance:{scenarios:[{key:"add-mapping-happy-path",given:["Sync config exists"],when:["User adds field mapping"],then:["Mapping is added","FieldMappingAdded event is emitted"]}],examples:[{key:"map-email",input:{syncConfigId:"sync-123",sourceField:"email",targetField:"user_email"},output:{id:"map-456",type:"string"}}]}}),NK=OH({meta:{key:"integration.sync.trigger",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","trigger"],description:"Trigger a manual sync.",goal:"Start data synchronization.",context:"Manual sync or webhook trigger."},io:{input:PH,output:T},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.sync.started",version:"1.0.0",when:"Sync starts",payload:T}],audit:["integration.sync.triggered"]},acceptance:{scenarios:[{key:"trigger-sync-happy-path",given:["Sync config exists"],when:["User triggers sync"],then:["Sync run starts","SyncStarted event is emitted"]}],examples:[{key:"manual-trigger",input:{syncConfigId:"sync-123"},output:{id:"run-789",status:"pending"}}]}}),AK=BK({meta:{key:"integration.syncRun.list",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","run","list"],description:"List sync run history.",goal:"View sync history and status.",context:"Sync monitoring."},io:{input:WH,output:BH},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["User has access to syncs"],when:["User lists sync runs"],then:["List of runs is returned"]}],examples:[{key:"list-recent",input:{limit:10},output:{items:[],total:50}}]}});class SH{transform(H,Z){try{if(Z.startsWith("uppercase"))return typeof H==="string"?H.toUpperCase():H;if(Z.startsWith("lowercase"))return typeof H==="string"?H.toLowerCase():H;if(Z.startsWith("trim"))return typeof H==="string"?H.trim():H;if(Z.startsWith("default:")){let K=Z.replace("default:","");return H??JSON.parse(K)}if(Z.startsWith("concat:")){let K=Z.replace("concat:","")||" ";if(Array.isArray(H))return H.join(K);return H}if(Z.startsWith("split:")){let K=Z.replace("split:","")||",";if(typeof H==="string")return H.split(K);return H}if(Z.startsWith("number"))return Number(H);if(Z.startsWith("boolean"))return Boolean(H);if(Z.startsWith("string"))return String(H);return H}catch{return H}}}class gH{transformer;constructor(H){this.transformer=H??new SH}async sync(H){return{success:!0,recordsProcessed:0,recordsCreated:0,recordsUpdated:0,recordsDeleted:0,recordsFailed:0,recordsSkipped:0,errors:[]}}transformRecord(H,Z,K){let X={};for(let $ of Z){let q,G;switch($.mappingType){case"DIRECT":q=this.getNestedValue(H.data,$.sourceField);break;case"TRANSFORM":G=this.getNestedValue(H.data,$.sourceField),q=$.transformExpression?this.transformer.transform(G,$.transformExpression):G;break;case"CONSTANT":q=$.constantValue;break;case"LOOKUP":q=this.getNestedValue(H.data,$.sourceField);break;case"COMPUTED":q=$.transformExpression?this.evaluateComputed(H.data,$.transformExpression):null;break;default:q=this.getNestedValue(H.data,$.sourceField)}if(q===void 0||q===null)q=$.defaultValue;this.setNestedValue(X,$.targetField,q)}return{id:H.id,data:X}}validateRecord(H,Z){let K=[];for(let X of Z)if(X.isRequired){let $=this.getNestedValue(H.data,X.targetField);if($===void 0||$===null)K.push({recordId:H.id,field:X.targetField,message:`Required field ${X.targetField} is missing`,code:"REQUIRED_FIELD_MISSING"})}return{valid:K.length===0,errors:K}}getNestedValue(H,Z){let K=Z.split("."),X=H;for(let $ of K){if(X===null||X===void 0)return;X=X[$]}return X}setNestedValue(H,Z,K){let X=Z.split("."),$=H;for(let G=0;G<X.length-1;G++){let W=X[G];if(W===void 0)continue;if(!(W in $))$[W]={};$=$[W]}let q=X[X.length-1];if(q!==void 0)$[q]=K}evaluateComputed(H,Z){try{return Z.replace(/\$\{([^}]+)\}/g,(X,$)=>{let q=this.getNestedValue(H,$);return String(q??"")})}catch{return null}}}function gX(H){return new gH(H)}function yX(H){let Z=JSON.stringify(H,Object.keys(H).sort()),K=0;for(let X=0;X<Z.length;X++){let $=Z.charCodeAt(X);K=(K<<5)-K+$,K=K&K}return K.toString(16)}function dX(H,Z){if(!H||!Z)return!0;return H!==Z}import{useTemplateRuntime as FK}from"@contractspec/lib.example-shared-ui";import{useCallback as _K,useEffect as zK,useState as w}from"react";function LH(H="local-project"){let{handlers:Z}=FK(),K=Z.integration,[X,$]=w([]),[q,G]=w([]),[W,A]=w([]),[O,U]=w(!0),[D,F]=w(null),V=_K(async()=>{try{U(!0),F(null);let[Y,P,B]=await Promise.all([K.listIntegrations({projectId:H,limit:100}),K.listConnections({limit:100}),K.listSyncConfigs({limit:100})]);$(Y.integrations),G(P.connections),A(B.configs)}catch(Y){F(Y instanceof Error?Y:Error("Failed to load integrations"))}finally{U(!1)}},[K,H]);zK(()=>{V()},[V]);let Q={totalIntegrations:X.length,activeIntegrations:X.filter((Y)=>Y.status==="ACTIVE").length,totalConnections:q.length,connectedCount:q.filter((Y)=>Y.status==="CONNECTED").length,totalSyncs:W.length,activeSyncs:W.filter((Y)=>Y.status==="ACTIVE").length};return{integrations:X,connections:q,syncConfigs:W,loading:O,error:D,stats:Q,refetch:V}}import{defineVisualization as o,VisualizationRegistry as RK}from"@contractspec/lib.contracts-spec/visualizations";var VK={key:"integration.list",version:"1.0.0"},MK={key:"integration.connection.list",version:"1.0.0"},yH={key:"integration.syncConfig.list",version:"1.0.0"},t={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},NH=o({meta:{...t,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:VK,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),AH=o({meta:{...t,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:MK,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),FH=o({meta:{...t,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:yH,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),_H=o({meta:{...t,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:yH,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),dH=[NH,AH,FH,_H],oX=new RK([...dH]),tX=dH.map((H)=>({key:H.meta.key,version:H.meta.version}));function IK(H){return H==="ACTIVE"||H==="SUCCESS"}function s(H,Z,K){let X=new Map,$=new Map,q=0,G=0;for(let O of H)X.set(O.type,(X.get(O.type)??0)+1);for(let O of Z)$.set(O.status,($.get(O.status)??0)+1);for(let O of K)if(IK(O.status))q+=1;else G+=1;return{primaryItems:[{key:"integration-types",spec:NH,data:{data:Array.from(X.entries()).map(([O,U])=>({type:O,count:U}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:AH,data:{data:Array.from($.entries()).map(([O,U])=>({status:O,count:U}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:FH,data:{data:[{value:q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:_H,data:{data:[{value:G}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{ComparisonView as kK,VisualizationCard as fK,VisualizationGrid as CK}from"@contractspec/lib.design-system";import{jsx as S,jsxs as mH}from"react/jsx-runtime";function pH({integrations:H,connections:Z,syncConfigs:K}){let{primaryItems:X,comparisonItems:$}=s(H,Z,K);return mH("section",{className:"space-y-4",children:[mH("div",{children:[S("h3",{className:"font-semibold text-lg",children:"Integration Visualizations"}),S("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for integration coverage and sync health."})]}),S(CK,{children:X.map((q)=>S(fK,{data:q.data,description:q.description,height:q.height,spec:q.spec,title:q.title},q.key))}),S(kK,{description:"Comparison surface for healthy versus attention-needed syncs.",items:$,title:"Sync-State Comparison"})]})}import{ChatWithSidebar as jK}from"@contractspec/module.ai-chat";import{jsx as uH}from"react/jsx-runtime";var hK=["List my integrations","Show sync status","Add a connection"],xK="You are an Integration Hub assistant. Help users manage integrations, connections, and sync configurations. When asked about integrations, connections, or syncs, provide clear, actionable guidance.";function zH({proxyUrl:H="/api/chat",mcpServers:Z,thinkingLevel:K="thinking",suggestions:X=hK,systemPrompt:$=xK,className:q}){return uH("div",{className:q??"flex h-[500px] flex-col",children:uH(jK,{className:"flex-1",systemPrompt:$,proxyUrl:H,mcpServers:Z,thinkingLevel:K,suggestions:X,showSuggestionsWhenEmpty:!0})})}import{Button as a}from"@contractspec/lib.design-system";import{Badge as lH}from"@contractspec/lib.ui-kit-web/ui/badge";import{HStack as EK}from"@contractspec/lib.ui-kit-web/ui/stack";import{jsx as E,jsxs as bK}from"react/jsx-runtime";var vK={ACTIVE:"default",CONNECTED:"default",SUCCESS:"default",PENDING:"secondary",PAUSED:"secondary",ERROR:"destructive",DISCONNECTED:"outline"};function g(H){return H?H.toLocaleString():"Never"}function RH(H){return H?JSON.stringify(H,null,2):"No configuration"}function n({status:H}){return E(lH,{variant:vK[H]??"outline",children:H})}function e({controller:H,label:Z,toggleColumnId:K,toggleVisibleLabel:X,toggleHiddenLabel:$,pinColumnId:q,pinLabel:G,resizeColumnId:W,resizeLabel:A}){let O=H.rows[0],U=H.columns.find((Q)=>Q.id===K),D=H.columns.find((Q)=>Q.id===q),F=H.columns.find((Q)=>Q.id===W),V=D?.pinState==="left"?!1:"left";return bK(EK,{gap:"sm",className:"flex-wrap",children:[E(lH,{variant:"outline",children:Z}),E(a,{variant:"outline",size:"sm",onPress:()=>O?.toggleExpanded?.(!O?.isExpanded),children:"Expand First Row"}),E(a,{variant:"outline",size:"sm",onPress:()=>U?.toggleVisibility?.(!U?.visible),children:U?.visible?X:$}),E(a,{variant:"outline",size:"sm",onPress:()=>D?.pin?.(V),children:D?.pinState==="left"?`Unpin ${G}`:`Pin ${G}`}),E(a,{variant:"outline",size:"sm",onPress:()=>F?.resizeBy?.(40),children:A})]})}import{DataTable as TK}from"@contractspec/lib.design-system";import{useContractTable as wK}from"@contractspec/lib.presentation-runtime-react";import{VStack as cH}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as y}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as k,jsxs as VH}from"react/jsx-runtime";function MH({connections:H}){let Z=wK({data:H,columns:[{id:"connection",header:"Connection",label:"Connection",accessor:(K)=>K.name,cell:({item:K})=>VH(cH,{gap:"xs",children:[k(y,{className:"font-medium text-sm",children:K.name}),VH(y,{className:"text-muted-foreground text-xs",children:["Created ",K.createdAt.toLocaleDateString()]})]}),size:240,minSize:180,canSort:!0,canPin:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:K})=>k(n,{status:String(K)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"lastSyncAt",header:"Last Sync",label:"Last Sync",accessor:(K)=>K.lastSyncAt?.getTime()??0,cell:({item:K})=>g(K.lastSyncAt),size:200,canSort:!0,canHide:!0,canResize:!0},{id:"errorMessage",header:"Errors",label:"Errors",accessor:(K)=>K.errorMessage??"",cell:({value:K})=>String(K||"No errors"),size:240,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{errorMessage:!1},columnPinning:{left:["connection"],right:[]}},renderExpandedContent:(K)=>VH(cH,{gap:"sm",className:"py-2",children:[k(y,{className:"font-medium text-sm",children:"Credentials"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RH(K.credentials)}),k(y,{className:"font-medium text-sm",children:"Config"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RH(K.config)}),k(y,{className:"text-muted-foreground text-sm",children:K.errorMessage??"No sync errors recorded."})]}),getCanExpand:()=>!0});return k(TK,{controller:Z,title:"Connections",description:"Client-mode ContractSpec table with visibility, pinning, resizing, and expanded diagnostics.",toolbar:k(e,{controller:Z,label:`${H.length} total connections`,toggleColumnId:"errorMessage",toggleVisibleLabel:"Hide Error Column",toggleHiddenLabel:"Show Error Column",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"connection",resizeLabel:"Widen Connection"}),emptyState:k("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No connections found"})})}import{DataTable as SK}from"@contractspec/lib.design-system";import{useContractTable as gK}from"@contractspec/lib.presentation-runtime-react";import{VStack as rH}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as v}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as d,jsxs as h}from"react/jsx-runtime";function IH({syncConfigs:H}){let Z=gK({data:H,columns:[{id:"sync",header:"Sync Config",label:"Sync Config",accessor:(K)=>K.name,cell:({item:K})=>h(rH,{gap:"xs",children:[d(v,{className:"font-medium text-sm",children:K.name}),h(v,{className:"text-muted-foreground text-xs",children:[K.sourceEntity," \u2192 ",K.targetEntity]})]}),size:260,minSize:200,canSort:!0,canPin:!0,canResize:!0},{id:"frequency",header:"Frequency",label:"Frequency",accessorKey:"frequency",size:160,canSort:!0,canHide:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:K})=>d(n,{status:String(K)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"recordsSynced",header:"Records",label:"Records",accessorKey:"recordsSynced",align:"right",size:140,canSort:!0,canResize:!0},{id:"lastRunAt",header:"Last Run",label:"Last Run",accessor:(K)=>K.lastRunAt?.getTime()??0,cell:({item:K})=>g(K.lastRunAt),size:200,canSort:!0,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{lastRunAt:!1},columnPinning:{left:["sync"],right:[]}},renderExpandedContent:(K)=>h(rH,{gap:"sm",className:"py-2",children:[h(v,{className:"text-muted-foreground text-sm",children:["Connection ",K.connectionId]}),h(v,{className:"text-muted-foreground text-sm",children:["Last run: ",g(K.lastRunAt)]}),h(v,{className:"text-muted-foreground text-sm",children:["Last status: ",K.lastRunStatus??"No runs recorded"]}),h(v,{className:"text-muted-foreground text-sm",children:["Updated ",K.updatedAt.toLocaleString()]})]}),getCanExpand:()=>!0});return d(SK,{controller:Z,title:"Sync Configs",description:"Shared table primitives applied to sync monitoring without changing the surrounding dashboard layout.",toolbar:d(e,{controller:Z,label:`${H.length} syncs`,toggleColumnId:"lastRunAt",toggleVisibleLabel:"Hide Last Run",toggleHiddenLabel:"Show Last Run",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"sync",resizeLabel:"Widen Sync"}),emptyState:d("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No sync configurations found"})})}import{Button as iH,ErrorState as yK,LoaderBlock as dK,StatCard as kH,StatCardGroup as mK}from"@contractspec/lib.design-system";import{useState as pK}from"react";import{jsx as L,jsxs as I}from"react/jsx-runtime";var uK={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",INACTIVE:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",CONNECTED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DISCONNECTED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",PENDING:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",ERROR:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",PAUSED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"},lK={CRM:"\uD83D\uDCCA",MARKETING:"\uD83D\uDCE3",PAYMENT:"\uD83D\uDCB3",COMMUNICATION:"\uD83D\uDCAC",DATA:"\uD83D\uDDC4\uFE0F",CUSTOM:"\u2699\uFE0F"};function cK(){let[H,Z]=pK("integrations"),{integrations:K,connections:X,syncConfigs:$,loading:q,error:G,stats:W,refetch:A}=LH(),O=[{id:"integrations",label:"Integrations",icon:"\uD83D\uDD0C"},{id:"connections",label:"Connections",icon:"\uD83D\uDD17"},{id:"syncs",label:"Sync Configs",icon:"\uD83D\uDD04"},{id:"chat",label:"Chat",icon:"\uD83D\uDCAC"}];if(q)return L(dK,{label:"Loading Integrations..."});if(G)return L(yK,{title:"Failed to load Integrations",description:G.message,onRetry:A,retryLabel:"Retry"});return I("div",{className:"space-y-6",children:[I("div",{className:"flex items-center justify-between",children:[L("h2",{className:"font-bold text-2xl",children:"Integration Hub"}),I(iH,{onClick:()=>alert("Add integration modal"),children:[L("span",{className:"mr-2",children:"+"})," Add Integration"]})]}),I(mK,{children:[L(kH,{label:"Integrations",value:W.totalIntegrations,hint:`${W.activeIntegrations} active`}),L(kH,{label:"Connections",value:W.totalConnections,hint:`${W.connectedCount} connected`}),L(kH,{label:"Syncs",value:W.totalSyncs,hint:`${W.activeSyncs} active`})]}),L(pH,{connections:X,integrations:K,syncConfigs:$}),L("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:O.map((U)=>I(iH,{type:"button",role:"tab","aria-selected":H===U.id,onClick:()=>Z(U.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${H===U.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[L("span",{children:U.icon}),U.label]},U.id))}),I("div",{className:"min-h-[400px]",role:"tabpanel",children:[H==="integrations"&&I("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[K.map((U)=>I("div",{className:"cursor-pointer rounded-lg border border-border bg-card p-4 transition-colors hover:bg-muted/50",children:[I("div",{className:"mb-3 flex items-center gap-3",children:[L("span",{className:"text-2xl",children:lK[U.type]??"\u2699\uFE0F"}),I("div",{children:[L("h3",{className:"font-medium",children:U.name}),L("p",{className:"text-muted-foreground text-sm",children:U.type})]})]}),I("div",{className:"flex items-center justify-between",children:[L("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${uK[U.status]??""}`,children:U.status}),L("span",{className:"text-muted-foreground text-xs",children:U.createdAt.toLocaleDateString()})]})]},U.id)),K.length===0&&L("div",{className:"col-span-full flex h-64 items-center justify-center text-muted-foreground",children:"No integrations configured"})]}),H==="connections"&&L(MH,{connections:X}),H==="chat"&&L(zH,{proxyUrl:"/api/chat",thinkingLevel:"thinking",suggestions:["List my integrations","Show sync status","Add a connection"],className:"min-h-[400px]"}),H==="syncs"&&L(IH,{syncConfigs:$})]})]})}var oH=[{id:"int-1",name:"Salesforce",type:"CRM",status:"ACTIVE",connectionCount:3},{id:"int-2",name:"HubSpot",type:"MARKETING",status:"ACTIVE",connectionCount:2},{id:"int-3",name:"Stripe",type:"PAYMENT",status:"ACTIVE",connectionCount:1},{id:"int-4",name:"Slack",type:"COMMUNICATION",status:"INACTIVE",connectionCount:0},{id:"int-5",name:"Google Sheets",type:"DATA",status:"ACTIVE",connectionCount:5},{id:"int-6",name:"PostHog",type:"ANALYTICS",status:"ACTIVE",connectionCount:1}],fH=[{id:"conn-1",integrationId:"int-1",name:"Production Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-16T10:00:00Z"},{id:"conn-2",integrationId:"int-1",name:"Sandbox Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-15T14:00:00Z"},{id:"conn-3",integrationId:"int-2",name:"Marketing HubSpot",status:"CONNECTED",lastSyncAt:"2024-01-16T08:00:00Z"},{id:"conn-4",integrationId:"int-3",name:"Stripe Live",status:"CONNECTED",lastSyncAt:"2024-01-16T12:00:00Z"},{id:"conn-5",integrationId:"int-5",name:"Analytics Sheet",status:"ERROR",lastSyncAt:"2024-01-14T09:00:00Z",error:"Authentication expired"},{id:"conn-6",integrationId:"int-6",name:"PostHog Workspace",status:"CONNECTED",lastSyncAt:"2024-01-16T11:45:00Z"}],tH=[{id:"sync-1",connectionId:"conn-1",name:"Contacts Sync",frequency:"HOURLY",lastRunAt:"2024-01-16T10:00:00Z",status:"SUCCESS",recordsSynced:1250},{id:"sync-2",connectionId:"conn-1",name:"Opportunities Sync",frequency:"DAILY",lastRunAt:"2024-01-16T00:00:00Z",status:"SUCCESS",recordsSynced:340},{id:"sync-3",connectionId:"conn-3",name:"Orders Sync",frequency:"REALTIME",lastRunAt:"2024-01-16T12:30:00Z",status:"SUCCESS",recordsSynced:89},{id:"sync-4",connectionId:"conn-5",name:"Metrics Export",frequency:"DAILY",lastRunAt:"2024-01-14T09:00:00Z",status:"FAILED",recordsSynced:0}],rK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="IntegrationDashboard")throw Error("integrationDashboardMarkdownRenderer: not IntegrationDashboard");let Z=oH,K=fH,X=tH,$=s(Z,K,X),q=Z.filter((D)=>D.status==="ACTIVE"),G=K.filter((D)=>D.status==="CONNECTED"),W=K.filter((D)=>D.status==="ERROR"),O=X.filter((D)=>D.status==="SUCCESS").reduce((D,F)=>D+F.recordsSynced,0),U=["# Integration Hub","","> Connect and sync data with external services","","## Overview","","| Metric | Value |","|--------|-------|",`| Active Integrations | ${q.length} |`,`| Connected Services | ${G.length} |`,`| Error Connections | ${W.length} |`,`| Sync Configs | ${X.length} |`,`| Records Synced (24h) | ${O.toLocaleString()} |`,""];U.push("## Visualization Overview"),U.push("");for(let D of[...$.primaryItems,...$.comparisonItems])U.push(`- **${D.title}** via \`${D.spec.meta.key}\``);U.push(""),U.push("## Integrations"),U.push(""),U.push("| Name | Type | Connections | Status |"),U.push("|------|------|-------------|--------|");for(let D of Z){let F=D.status==="ACTIVE"?"\uD83D\uDFE2":"\u26AB";U.push(`| ${D.name} | ${D.type} | ${D.connectionCount} | ${F} ${D.status} |`)}U.push(""),U.push("## Recent Sync Activity"),U.push(""),U.push("| Sync | Frequency | Last Run | Records | Status |"),U.push("|------|-----------|----------|---------|--------|");for(let D of X){let F=new Date(D.lastRunAt).toLocaleString(),V=D.status==="SUCCESS"?"\u2705":"\u274C";U.push(`| ${D.name} | ${D.frequency} | ${F} | ${D.recordsSynced} | ${V} ${D.status} |`)}if(W.length>0){U.push(""),U.push("## \u26A0\uFE0F Connections with Errors"),U.push("");for(let D of W){let F=Z.find((V)=>V.id===D.integrationId);U.push(`- **${D.name}** (${F?.name??"Unknown"}): ${D.error??"Unknown error"}`)}}return{mimeType:"text/markdown",body:U.join(`
7
- `)}}},iK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="ConnectionList")throw Error("connectionListMarkdownRenderer: not ConnectionList");let Z=fH,K=oH,X=["# Connections","","> Manage connections to external services",""];for(let $ of K){let q=Z.filter((G)=>G.integrationId===$.id);if(q.length===0)continue;X.push(`## ${$.name}`),X.push(""),X.push("| Connection | Status | Last Sync |"),X.push("|------------|--------|-----------|");for(let G of q){let W=new Date(G.lastSyncAt).toLocaleString(),A=G.status==="CONNECTED"?"\uD83D\uDFE2":G.status==="ERROR"?"\uD83D\uDD34":"\u26AB";X.push(`| ${G.name} | ${A} ${G.status} | ${W} |`)}X.push("")}return{mimeType:"text/markdown",body:X.join(`
8
- `)}}},oK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="SyncConfigEditor")throw Error("syncConfigMarkdownRenderer: not SyncConfigEditor");let Z=tH,K=fH,X=["# Sync Configurations","","> Configure automated data synchronization",""];for(let $ of Z){let q=K.find((W)=>W.id===$.connectionId),G=$.status==="SUCCESS"?"\u2705":"\u274C";X.push(`## ${$.name}`),X.push(""),X.push(`**Connection:** ${q?.name??"Unknown"}`),X.push(`**Frequency:** ${$.frequency}`),X.push(`**Status:** ${G} ${$.status}`),X.push(`**Last Run:** ${new Date($.lastRunAt).toLocaleString()}`),X.push(`**Records Synced:** ${$.recordsSynced.toLocaleString()}`),X.push("")}return X.push("## Frequency Options"),X.push(""),X.push("- **REALTIME**: Sync on every change"),X.push("- **HOURLY**: Sync every hour"),X.push("- **DAILY**: Sync once per day"),X.push("- **WEEKLY**: Sync once per week"),X.push("- **MANUAL**: Sync only when triggered"),{mimeType:"text/markdown",body:X.join(`
9
- `)}}};export{LH as useIntegrationData,oK as syncConfigMarkdownRenderer,MX as runIntegrationHubMcpExampleFromEnv,rK as integrationDashboardMarkdownRenderer,dX as hasChanges,gX as createSyncEngine,s as createIntegrationVisualizationSections,KK as createIntegrationHandlers,iK as connectionListMarkdownRenderer,yX as computeChecksum,PH as TriggerSyncInputModel,NK as TriggerSyncContract,l as SyncStatusEnum,T as SyncRunModel,x as SyncDirectionEnum,r as SyncConfigModel,c as MappingTypeEnum,BH as ListSyncRunsOutputModel,WH as ListSyncRunsInputModel,AK as ListSyncRunsContract,dH as IntegrationVisualizationSpecs,oX as IntegrationVisualizationRegistry,tX as IntegrationVisualizationRefs,NH as IntegrationTypeVisualization,UH as IntegrationStatusEnum,u as IntegrationModel,zH as IntegrationHubChat,cK as IntegrationDashboard,FH as HealthySyncMetricVisualization,b as FieldMappingModel,DH as CreateSyncConfigInputModel,OK as CreateSyncConfigContract,JH as CreateIntegrationInputModel,$K as CreateIntegrationContract,$H as CreateConnectionInputModel,eH as CreateConnectionContract,AH as ConnectionStatusVisualization,KH as ConnectionStatusEnum,m as ConnectionModel,gH as BasicSyncEngine,SH as BasicFieldTransformer,_H as AttentionSyncMetricVisualization,GH as AddFieldMappingInputModel,LK as AddFieldMappingContract};
2
+ import{defineEnum as KK}from"@contractspec/lib.schema";var XK=KK("ConnectionStatus",["PENDING","CONNECTED","DISCONNECTED","ERROR","EXPIRED"]),ZK=KK("AuthType",["api_key","oauth2","bearer","header","basic","webhook_signing","service_account"]),$K=KK("TransportType",["rest","mcp","webhook","sdk"]);import{defineSchemaModel as jK,ScalarTypeEnum as N}from"@contractspec/lib.schema";var m=jK({name:"ConnectionModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.String_unsecure(),isOptional:!1},status:{type:XK,isOptional:!1},authType:{type:N.String_unsecure(),isOptional:!1},externalAccountName:{type:N.String_unsecure(),isOptional:!0},connectedAt:{type:N.DateTime(),isOptional:!0},lastHealthCheck:{type:N.DateTime(),isOptional:!0},healthStatus:{type:N.String_unsecure(),isOptional:!0},transport:{type:$K,isOptional:!0},authMethod:{type:ZK,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}}),QK=jK({name:"CreateConnectionInput",fields:{integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.NonEmptyString(),isOptional:!1},authType:{type:N.NonEmptyString(),isOptional:!1},credentials:{type:N.JSON(),isOptional:!0},transport:{type:$K,isOptional:!0},authMethod:{type:ZK,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}});import{defineCommand as aK}from"@contractspec/lib.contracts-spec/operations";var nK=["@example.integration-hub"],eK=aK({meta:{key:"integration.connection.create",version:"1.0.0",stability:"stable",owners:[...nK],tags:["integration","connection","create"],description:"Create a connection to an external system.",goal:"Authenticate with external systems.",context:"Connection setup."},io:{input:QK,output:m},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.connection.created",version:"1.0.0",when:"Connection created",payload:m}],audit:["integration.connection.created"]},acceptance:{scenarios:[{key:"create-connection-happy-path",given:["User is authenticated"],when:["User creates connection with valid credentials"],then:["Connection is created","ConnectionCreated event is emitted"]}],examples:[{key:"connect-crm",input:{name:"Salesforce Prod",integrationId:"salesforce",credentials:{clientId:"xxx"}},output:{id:"conn-123",status:"connected",connectedAt:"2025-01-01T12:00:00Z"}}]}});import{defineExample as KX}from"@contractspec/lib.contracts-spec/examples";var XX=KX({meta:{key:"examples.integration-hub",version:"1.0.0",title:"Integration Hub",description:"Integration Hub example with sync engine and field mappings for ContractSpec",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","integration-hub"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.integration-hub"}}),PZ=XX;import{web as ZX}from"@contractspec/lib.runtime-sandbox";var{generateId:p}=ZX;function hK(K){return{id:K.id,projectId:K.projectId,organizationId:K.organizationId,name:K.name,description:K.description??void 0,type:K.type,status:K.status,iconUrl:K.iconUrl??void 0,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function qK(K){return{id:K.id,integrationId:K.integrationId,name:K.name,status:K.status,credentials:K.credentials?JSON.parse(K.credentials):void 0,config:K.config?JSON.parse(K.config):void 0,lastSyncAt:K.lastSyncAt?new Date(K.lastSyncAt):void 0,errorMessage:K.errorMessage??void 0,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function HK(K){return{id:K.id,connectionId:K.connectionId,name:K.name,sourceEntity:K.sourceEntity,targetEntity:K.targetEntity,frequency:K.frequency,status:K.status,lastRunAt:K.lastRunAt?new Date(K.lastRunAt):void 0,lastRunStatus:K.lastRunStatus??void 0,recordsSynced:K.recordsSynced,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function xK(K){return{id:K.id,syncConfigId:K.syncConfigId,sourceField:K.sourceField,targetField:K.targetField,transformType:K.transformType??void 0,transformConfig:K.transformConfig?JSON.parse(K.transformConfig):void 0,createdAt:new Date(K.createdAt)}}function $X(K){async function $(q){let{projectId:Y,type:P,status:B,search:_,limit:z=20,offset:M=0}=q,j="WHERE projectId = ?",f=[Y];if(P&&P!=="all")j+=" AND type = ?",f.push(P);if(B&&B!=="all")j+=" AND status = ?",f.push(B);if(_)j+=" AND name LIKE ?",f.push(`%${_}%`);let sK=(await K.query(`SELECT COUNT(*) as count FROM integration ${j}`,f)).rows[0]?.count??0;return{integrations:(await K.query(`SELECT * FROM integration ${j} ORDER BY name LIMIT ? OFFSET ?`,[...f,z,M])).rows.map(hK),total:sK}}async function X(q,Y){let P=p("integ"),B=new Date().toISOString();await K.execute(`INSERT INTO integration (id, projectId, organizationId, name, description, type, status, iconUrl, createdAt, updatedAt)
3
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[P,Y.projectId,Y.organizationId,q.name,q.description??null,q.type,"INACTIVE",q.iconUrl??null,B,B]);let _=(await K.query("SELECT * FROM integration WHERE id = ?",[P])).rows;return hK(_[0])}async function Z(q){let{integrationId:Y,status:P,limit:B=20,offset:_=0}=q,z="WHERE 1=1",M=[];if(Y)z+=" AND integrationId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await K.query(`SELECT COUNT(*) as count FROM integration_connection ${z}`,M)).rows[0]?.count??0;return{connections:(await K.query(`SELECT * FROM integration_connection ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(qK),total:f}}async function Q(q){let Y=p("conn"),P=new Date().toISOString();await K.execute(`INSERT INTO integration_connection (id, integrationId, name, status, credentials, config, createdAt, updatedAt)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[Y,q.integrationId,q.name,"PENDING",q.credentials?JSON.stringify(q.credentials):null,q.config?JSON.stringify(q.config):null,P,P]),await K.execute("UPDATE integration_connection SET status = 'CONNECTED', updatedAt = ? WHERE id = ?",[P,Y]),await K.execute("UPDATE integration SET status = 'ACTIVE', updatedAt = ? WHERE id = ?",[P,q.integrationId]);let B=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[Y])).rows;return qK(B[0])}async function H(q){let Y=new Date().toISOString();await K.execute("UPDATE integration_connection SET status = 'DISCONNECTED', updatedAt = ? WHERE id = ?",[Y,q]);let P=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[q])).rows;return qK(P[0])}async function G(q){let{connectionId:Y,status:P,limit:B=20,offset:_=0}=q,z="WHERE 1=1",M=[];if(Y)z+=" AND connectionId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await K.query(`SELECT COUNT(*) as count FROM integration_sync_config ${z}`,M)).rows[0]?.count??0;return{configs:(await K.query(`SELECT * FROM integration_sync_config ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(HK),total:f}}async function W(q){let Y=p("sync"),P=new Date().toISOString();await K.execute(`INSERT INTO integration_sync_config (id, connectionId, name, sourceEntity, targetEntity, frequency, status, recordsSynced, createdAt, updatedAt)
5
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Y,q.connectionId,q.name,q.sourceEntity,q.targetEntity,q.frequency??"DAILY","ACTIVE",0,P,P]);let B=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[Y])).rows;return HK(B[0])}async function A(q){let Y=new Date().toISOString(),P=[];await K.execute("DELETE FROM integration_field_mapping WHERE syncConfigId = ?",[q.syncConfigId]);for(let B of q.mappings){let _=p("fmap");await K.execute(`INSERT INTO integration_field_mapping (id, syncConfigId, sourceField, targetField, transformType, transformConfig, createdAt)
6
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,[_,q.syncConfigId,B.sourceField,B.targetField,B.transformType??null,B.transformConfig?JSON.stringify(B.transformConfig):null,Y]);let z=(await K.query("SELECT * FROM integration_field_mapping WHERE id = ?",[_])).rows;P.push(xK(z[0]))}return P}async function O(q){return(await K.query("SELECT * FROM integration_field_mapping WHERE syncConfigId = ?",[q])).rows.map(xK)}async function U(q){let Y=new Date().toISOString(),P=Math.floor(Math.random()*1000)+50;await K.execute("UPDATE integration_sync_config SET lastRunAt = ?, lastRunStatus = 'SUCCESS', recordsSynced = recordsSynced + ?, updatedAt = ? WHERE id = ?",[Y,P,Y,q]);let B=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[q])).rows;if(B[0])await K.execute("UPDATE integration_connection SET lastSyncAt = ?, updatedAt = ? WHERE id = ?",[Y,Y,B[0].connectionId]);let _=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[q])).rows;return HK(_[0])}async function D(q){let Y=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[q.connectionId])).rows;if(!Y[0])return{valid:!1,provider:"unknown",keyPrefix:"",error:`Connection ${q.connectionId} not found`};let P=q.providerKey.slice(0,8),B=q.providerKey.length>=16;return{valid:B,provider:Y[0].name,keyPrefix:`${P}...`,expiresAt:B?new Date(Date.now()+7776000000).toISOString():void 0,error:B?void 0:"Key must be at least 16 characters"}}async function F(q){let Y=new Date().toISOString();return await K.execute("UPDATE integration_connection SET updatedAt = ? WHERE id = ?",[Y,q.connectionId]),{refreshed:!0,expiresAt:new Date(Date.now()+3600000).toISOString(),tokenType:"Bearer",scopes:["read","write","sync"]}}async function V(q){return{integrationId:q.integrationId,transports:[{transport:"rest",supported:!0,defaultVersion:"v2"},{transport:"mcp",supported:!0,defaultVersion:"v1"},{transport:"webhook",supported:!0},{transport:"sdk",supported:!1}]}}return{listIntegrations:$,createIntegration:X,listConnections:Z,connectService:Q,disconnectService:H,listSyncConfigs:G,configureSync:W,mapFields:A,getFieldMappings:O,runSync:U,validateByokKey:D,refreshOAuth2Token:F,getTransportOptions:V}}import{defineEnum as QX}from"@contractspec/lib.schema";var UK=QX("IntegrationStatus",["DRAFT","ACTIVE","PAUSED","ERROR","ARCHIVED"]);import{defineSchemaModel as EK,ScalarTypeEnum as R}from"@contractspec/lib.schema";var u=EK({name:"IntegrationModel",fields:{id:{type:R.String_unsecure(),isOptional:!1},name:{type:R.String_unsecure(),isOptional:!1},slug:{type:R.String_unsecure(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.String_unsecure(),isOptional:!1},status:{type:UK,isOptional:!1},createdAt:{type:R.DateTime(),isOptional:!1}}}),JK=EK({name:"CreateIntegrationInput",fields:{name:{type:R.NonEmptyString(),isOptional:!1},slug:{type:R.NonEmptyString(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.NonEmptyString(),isOptional:!1},config:{type:R.JSON(),isOptional:!0},featureFlagKey:{type:R.String_unsecure(),isOptional:!0}}});import{defineCommand as qX}from"@contractspec/lib.contracts-spec/operations";var HX=qX({meta:{key:"integration.create",version:"1.0.0",stability:"stable",owners:["@example.integration-hub"],tags:["integration","create"],description:"Create a new integration.",goal:"Allow users to set up integrations with external systems.",context:"Integration setup."},io:{input:JK,output:u},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.created",version:"1.0.0",when:"Integration created",payload:u}],audit:["integration.created"]},acceptance:{scenarios:[{key:"create-integration-happy-path",given:["User is admin"],when:["User defines new integration type"],then:["Integration definition is created","IntegrationCreated event is emitted"]}],examples:[{key:"create-slack",input:{name:"Slack",category:"communication",authType:"oauth2"},output:{id:"slack",status:"active"}}]}});import{createMcpToolsets as UX}from"@contractspec/lib.ai-agent/tools/mcp-client";import{randomUUID as JX}from"crypto";var YX=["-y","@modelcontextprotocol/server-filesystem","."];async function jZ(){let K=GX(),$=vK(),X=DX(),Z=await UX([X],{onNameCollision:"error"});try{let Q=Object.keys(Z.tools).sort(),H={mode:K,server:{name:X.name,transport:$},authMethod:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_AUTH_METHOD,apiVersion:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_API_VERSION,tools:Q};if(K==="call"){let G=wK("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_NAME"),W=WX("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_ARGS_JSON",{}),A=Z.tools[G];if(!A?.execute)throw Error(`Tool "${G}" was not found. Available tools: ${Q.join(", ")}`);let O=await A.execute(W,{toolCallId:`integration-hub-${JX()}`,messages:[]});H.toolCall={name:G,args:W,output:O}}return H}finally{await Z.cleanup().catch(()=>{return})}}function DX(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_NAME??"filesystem",$=vK(),X=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_PREFIX;if($==="stdio")return{name:K,transport:$,command:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_COMMAND??"npx",args:PX("CONTRACTSPEC_INTEGRATION_HUB_MCP_ARGS_JSON",YX),toolPrefix:X};let Z=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN,Q=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN_ENV;return{name:K,transport:$==="webhook"||$==="http"?"http":"sse",url:wK("CONTRACTSPEC_INTEGRATION_HUB_MCP_URL"),headers:BX("CONTRACTSPEC_INTEGRATION_HUB_MCP_HEADERS_JSON"),accessToken:Z,accessTokenEnvVar:Q,toolPrefix:X}}function GX(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE?.toLowerCase()??"list";if(K==="list"||K==="call")return K;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE: ${K}. Use "list" or "call".`)}function vK(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT?.toLowerCase()??"stdio";if(K==="stdio"||K==="http"||K==="sse"||K==="webhook")return K;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT: ${K}. Use "stdio", "http", "sse", or "webhook".`)}function PX(K,$){if(!process.env[K])return $;let Z=TK(K);if(!Array.isArray(Z)||Z.some((Q)=>typeof Q!=="string"))throw Error(`${K} must be a JSON string array.`);return Z}function bK(K){if(!process.env[K])return;let X=TK(K);if(!OX(X))throw Error(`${K} must be a JSON object.`);return X}function WX(K,$){return bK(K)??$}function BX(K){let $=bK(K);if(!$)return;let X=Object.entries($);if(X.find(([,Q])=>typeof Q!=="string"))throw Error(`${K} must contain only string values.`);return Object.fromEntries(X)}function TK(K){let $=process.env[K];if(!$)return;try{return JSON.parse($)}catch{throw Error(`${K} contains invalid JSON.`)}}function wK(K){let $=process.env[K];if(!$)throw Error(`Missing required env var: ${K}`);return $}function OX(K){return typeof K==="object"&&K!==null&&!Array.isArray(K)}import{defineEnum as YK}from"@contractspec/lib.schema";var x=YK("SyncDirection",["INBOUND","OUTBOUND","BIDIRECTIONAL"]),l=YK("SyncStatus",["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]),c=YK("MappingType",["DIRECT","TRANSFORM","LOOKUP","CONSTANT","COMPUTED"]);import{defineSchemaModel as C,ScalarTypeEnum as J}from"@contractspec/lib.schema";var b=C({name:"FieldMappingModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.String_unsecure(),isOptional:!1},targetField:{type:J.String_unsecure(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!1}}}),r=C({name:"SyncConfigModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.String_unsecure(),isOptional:!1},targetObject:{type:J.String_unsecure(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!1},scheduleCron:{type:J.String_unsecure(),isOptional:!0},isActive:{type:J.Boolean(),isOptional:!1},lastSyncAt:{type:J.DateTime(),isOptional:!0},fieldMappings:{type:b,isArray:!0,isOptional:!0}}}),T=C({name:"SyncRunModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1},direction:{type:x,isOptional:!1},trigger:{type:J.String_unsecure(),isOptional:!1},recordsProcessed:{type:J.Int_unsecure(),isOptional:!1},recordsCreated:{type:J.Int_unsecure(),isOptional:!1},recordsUpdated:{type:J.Int_unsecure(),isOptional:!1},recordsFailed:{type:J.Int_unsecure(),isOptional:!1},errorMessage:{type:J.String_unsecure(),isOptional:!0},startedAt:{type:J.DateTime(),isOptional:!0},completedAt:{type:J.DateTime(),isOptional:!0},createdAt:{type:J.DateTime(),isOptional:!1}}}),DK=C({name:"CreateSyncConfigInput",fields:{integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.NonEmptyString(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.NonEmptyString(),isOptional:!1},targetObject:{type:J.NonEmptyString(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!0},scheduleCron:{type:J.String_unsecure(),isOptional:!0}}}),GK=C({name:"AddFieldMappingInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.NonEmptyString(),isOptional:!1},targetField:{type:J.NonEmptyString(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},lookupConfig:{type:J.JSON(),isOptional:!0},constantValue:{type:J.JSON(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!0},defaultValue:{type:J.JSON(),isOptional:!0}}}),PK=C({name:"TriggerSyncInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!0},fullSync:{type:J.Boolean(),isOptional:!0}}}),WK=C({name:"ListSyncRunsInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!0},limit:{type:J.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:J.Int_unsecure(),isOptional:!0,defaultValue:0}}}),BK=C({name:"ListSyncRunsOutput",fields:{runs:{type:T,isArray:!0,isOptional:!1},total:{type:J.Int_unsecure(),isOptional:!1}}});import{defineCommand as OK,defineQuery as LX}from"@contractspec/lib.contracts-spec/operations";var i=["@example.integration-hub"],NX=OK({meta:{key:"integration.syncConfig.create",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","config","create"],description:"Create a sync configuration.",goal:"Define how data should be synchronized.",context:"Sync setup."},io:{input:DK,output:r},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.syncConfig.created",version:"1.0.0",when:"Sync config created",payload:r}],audit:["integration.syncConfig.created"]},acceptance:{scenarios:[{key:"create-sync-happy-path",given:["User is authenticated"],when:["User creates sync config"],then:["Sync config is created","SyncConfigCreated event is emitted"]}],examples:[{key:"create-contact-sync",input:{name:"Contacts Sync",sourceConnectionId:"conn-1",targetConnectionId:"conn-2"},output:{id:"sync-123",status:"active"}}]}}),AX=OK({meta:{key:"integration.fieldMapping.add",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","mapping","field"],description:"Add a field mapping to a sync config.",goal:"Map fields between systems.",context:"Mapping configuration."},io:{input:GK,output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.fieldMapping.added",version:"1.0.0",when:"Mapping added",payload:b}]},acceptance:{scenarios:[{key:"add-mapping-happy-path",given:["Sync config exists"],when:["User adds field mapping"],then:["Mapping is added","FieldMappingAdded event is emitted"]}],examples:[{key:"map-email",input:{syncConfigId:"sync-123",sourceField:"email",targetField:"user_email"},output:{id:"map-456",type:"string"}}]}}),FX=OK({meta:{key:"integration.sync.trigger",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","trigger"],description:"Trigger a manual sync.",goal:"Start data synchronization.",context:"Manual sync or webhook trigger."},io:{input:PK,output:T},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.sync.started",version:"1.0.0",when:"Sync starts",payload:T}],audit:["integration.sync.triggered"]},acceptance:{scenarios:[{key:"trigger-sync-happy-path",given:["Sync config exists"],when:["User triggers sync"],then:["Sync run starts","SyncStarted event is emitted"]}],examples:[{key:"manual-trigger",input:{syncConfigId:"sync-123"},output:{id:"run-789",status:"pending"}}]}}),_X=LX({meta:{key:"integration.syncRun.list",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","run","list"],description:"List sync run history.",goal:"View sync history and status.",context:"Sync monitoring."},io:{input:WK,output:BK},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["User has access to syncs"],when:["User lists sync runs"],then:["List of runs is returned"]}],examples:[{key:"list-recent",input:{limit:10},output:{items:[],total:50}}]}});class SK{transform(K,$){try{if($.startsWith("uppercase"))return typeof K==="string"?K.toUpperCase():K;if($.startsWith("lowercase"))return typeof K==="string"?K.toLowerCase():K;if($.startsWith("trim"))return typeof K==="string"?K.trim():K;if($.startsWith("default:")){let X=$.replace("default:","");return K??JSON.parse(X)}if($.startsWith("concat:")){let X=$.replace("concat:","")||" ";if(Array.isArray(K))return K.join(X);return K}if($.startsWith("split:")){let X=$.replace("split:","")||",";if(typeof K==="string")return K.split(X);return K}if($.startsWith("number"))return Number(K);if($.startsWith("boolean"))return Boolean(K);if($.startsWith("string"))return String(K);return K}catch{return K}}}class gK{transformer;constructor(K){this.transformer=K??new SK}async sync(K){return{success:!0,recordsProcessed:0,recordsCreated:0,recordsUpdated:0,recordsDeleted:0,recordsFailed:0,recordsSkipped:0,errors:[]}}transformRecord(K,$,X){let Z={};for(let Q of $){let H,G;switch(Q.mappingType){case"DIRECT":H=this.getNestedValue(K.data,Q.sourceField);break;case"TRANSFORM":G=this.getNestedValue(K.data,Q.sourceField),H=Q.transformExpression?this.transformer.transform(G,Q.transformExpression):G;break;case"CONSTANT":H=Q.constantValue;break;case"LOOKUP":H=this.getNestedValue(K.data,Q.sourceField);break;case"COMPUTED":H=Q.transformExpression?this.evaluateComputed(K.data,Q.transformExpression):null;break;default:H=this.getNestedValue(K.data,Q.sourceField)}if(H===void 0||H===null)H=Q.defaultValue;this.setNestedValue(Z,Q.targetField,H)}return{id:K.id,data:Z}}validateRecord(K,$){let X=[];for(let Z of $)if(Z.isRequired){let Q=this.getNestedValue(K.data,Z.targetField);if(Q===void 0||Q===null)X.push({recordId:K.id,field:Z.targetField,message:`Required field ${Z.targetField} is missing`,code:"REQUIRED_FIELD_MISSING"})}return{valid:X.length===0,errors:X}}getNestedValue(K,$){let X=$.split("."),Z=K;for(let Q of X){if(Z===null||Z===void 0)return;Z=Z[Q]}return Z}setNestedValue(K,$,X){let Z=$.split("."),Q=K;for(let G=0;G<Z.length-1;G++){let W=Z[G];if(W===void 0)continue;if(!(W in Q))Q[W]={};Q=Q[W]}let H=Z[Z.length-1];if(H!==void 0)Q[H]=X}evaluateComputed(K,$){try{return $.replace(/\$\{([^}]+)\}/g,(Z,Q)=>{let H=this.getNestedValue(K,Q);return String(H??"")})}catch{return null}}}function uZ(K){return new gK(K)}function lZ(K){let $=JSON.stringify(K,Object.keys(K).sort()),X=0;for(let Z=0;Z<$.length;Z++){let Q=$.charCodeAt(Z);X=(X<<5)-X+Q,X=X&X}return X.toString(16)}function cZ(K,$){if(!K||!$)return!0;return K!==$}import{useTemplateRuntime as zX}from"@contractspec/lib.example-shared-ui";import{useCallback as RX,useEffect as VX,useState as w}from"react";function LK(K="local-project"){let{handlers:$}=zX(),X=$.integration,[Z,Q]=w([]),[H,G]=w([]),[W,A]=w([]),[O,U]=w(!0),[D,F]=w(null),V=RX(async()=>{try{U(!0),F(null);let[Y,P,B]=await Promise.all([X.listIntegrations({projectId:K,limit:100}),X.listConnections({limit:100}),X.listSyncConfigs({limit:100})]);Q(Y.integrations),G(P.connections),A(B.configs)}catch(Y){F(Y instanceof Error?Y:Error("Failed to load integrations"))}finally{U(!1)}},[X,K]);VX(()=>{V()},[V]);let q={totalIntegrations:Z.length,activeIntegrations:Z.filter((Y)=>Y.status==="ACTIVE").length,totalConnections:H.length,connectedCount:H.filter((Y)=>Y.status==="CONNECTED").length,totalSyncs:W.length,activeSyncs:W.filter((Y)=>Y.status==="ACTIVE").length};return{integrations:Z,connections:H,syncConfigs:W,loading:O,error:D,stats:q,refetch:V}}import{defineVisualization as o,VisualizationRegistry as MX}from"@contractspec/lib.contracts-spec/visualizations";var IX={key:"integration.list",version:"1.0.0"},kX={key:"integration.connection.list",version:"1.0.0"},yK={key:"integration.syncConfig.list",version:"1.0.0"},t={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},NK=o({meta:{...t,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:IX,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),AK=o({meta:{...t,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:kX,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),FK=o({meta:{...t,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:yK,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),_K=o({meta:{...t,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:yK,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),dK=[NK,AK,FK,_K],eZ=new MX([...dK]),K0=dK.map((K)=>({key:K.meta.key,version:K.meta.version}));function fX(K){return K==="ACTIVE"||K==="SUCCESS"}function s(K,$,X){let Z=new Map,Q=new Map,H=0,G=0;for(let O of K)Z.set(O.type,(Z.get(O.type)??0)+1);for(let O of $)Q.set(O.status,(Q.get(O.status)??0)+1);for(let O of X)if(fX(O.status))H+=1;else G+=1;return{primaryItems:[{key:"integration-types",spec:NK,data:{data:Array.from(Z.entries()).map(([O,U])=>({type:O,count:U}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:AK,data:{data:Array.from(Q.entries()).map(([O,U])=>({status:O,count:U}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:FK,data:{data:[{value:H}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:_K,data:{data:[{value:G}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{ComparisonView as CX,VisualizationCard as jX,VisualizationGrid as hX}from"@contractspec/lib.design-system";import{jsx as S,jsxs as mK}from"react/jsx-runtime";function pK({integrations:K,connections:$,syncConfigs:X}){let{primaryItems:Z,comparisonItems:Q}=s(K,$,X);return mK("section",{className:"space-y-4",children:[mK("div",{children:[S("h3",{className:"font-semibold text-lg",children:"Integration Visualizations"}),S("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for integration coverage and sync health."})]}),S(hX,{children:Z.map((H)=>S(jX,{data:H.data,description:H.description,height:H.height,spec:H.spec,title:H.title},H.key))}),S(CX,{description:"Comparison surface for healthy versus attention-needed syncs.",items:Q,title:"Sync-State Comparison"})]})}import{ChatWithSidebar as xX}from"@contractspec/module.ai-chat";import{jsx as uK}from"react/jsx-runtime";var EX=["List my integrations","Show sync status","Add a connection"],vX="You are an Integration Hub assistant. Help users manage integrations, connections, and sync configurations. When asked about integrations, connections, or syncs, provide clear, actionable guidance.";function zK({proxyUrl:K="/api/chat",mcpServers:$,thinkingLevel:X="thinking",suggestions:Z=EX,systemPrompt:Q=vX,className:H}){return uK("div",{className:H??"flex h-[500px] flex-col",children:uK(xX,{className:"flex-1",systemPrompt:Q,proxyUrl:K,mcpServers:$,thinkingLevel:X,suggestions:Z,showSuggestionsWhenEmpty:!0})})}import{Button as a}from"@contractspec/lib.design-system";import{Badge as lK}from"@contractspec/lib.ui-kit-web/ui/badge";import{HStack as bX}from"@contractspec/lib.ui-kit-web/ui/stack";import{jsx as E,jsxs as wX}from"react/jsx-runtime";var TX={ACTIVE:"default",CONNECTED:"default",SUCCESS:"default",PENDING:"secondary",PAUSED:"secondary",ERROR:"destructive",DISCONNECTED:"outline"};function g(K){return K?K.toLocaleString():"Never"}function RK(K){return K?JSON.stringify(K,null,2):"No configuration"}function n({status:K}){return E(lK,{variant:TX[K]??"outline",children:K})}function e({controller:K,label:$,toggleColumnId:X,toggleVisibleLabel:Z,toggleHiddenLabel:Q,pinColumnId:H,pinLabel:G,resizeColumnId:W,resizeLabel:A}){let O=K.rows[0],U=K.columns.find((q)=>q.id===X),D=K.columns.find((q)=>q.id===H),F=K.columns.find((q)=>q.id===W),V=D?.pinState==="left"?!1:"left";return wX(bX,{gap:"sm",className:"flex-wrap",children:[E(lK,{variant:"outline",children:$}),E(a,{variant:"outline",size:"sm",onPress:()=>O?.toggleExpanded?.(!O?.isExpanded),children:"Expand First Row"}),E(a,{variant:"outline",size:"sm",onPress:()=>U?.toggleVisibility?.(!U?.visible),children:U?.visible?Z:Q}),E(a,{variant:"outline",size:"sm",onPress:()=>D?.pin?.(V),children:D?.pinState==="left"?`Unpin ${G}`:`Pin ${G}`}),E(a,{variant:"outline",size:"sm",onPress:()=>F?.resizeBy?.(40),children:A})]})}import{DataTable as SX}from"@contractspec/lib.design-system";import{useContractTable as gX}from"@contractspec/lib.presentation-runtime-react";import{VStack as cK}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as y}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as k,jsxs as VK}from"react/jsx-runtime";function MK({connections:K}){let $=gX({data:K,columns:[{id:"connection",header:"Connection",label:"Connection",accessor:(X)=>X.name,cell:({item:X})=>VK(cK,{gap:"xs",children:[k(y,{className:"font-medium text-sm",children:X.name}),VK(y,{className:"text-muted-foreground text-xs",children:["Created ",X.createdAt.toLocaleDateString()]})]}),size:240,minSize:180,canSort:!0,canPin:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:X})=>k(n,{status:String(X)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"lastSyncAt",header:"Last Sync",label:"Last Sync",accessor:(X)=>X.lastSyncAt?.getTime()??0,cell:({item:X})=>g(X.lastSyncAt),size:200,canSort:!0,canHide:!0,canResize:!0},{id:"errorMessage",header:"Errors",label:"Errors",accessor:(X)=>X.errorMessage??"",cell:({value:X})=>String(X||"No errors"),size:240,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{errorMessage:!1},columnPinning:{left:["connection"],right:[]}},renderExpandedContent:(X)=>VK(cK,{gap:"sm",className:"py-2",children:[k(y,{className:"font-medium text-sm",children:"Credentials"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RK(X.credentials)}),k(y,{className:"font-medium text-sm",children:"Config"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RK(X.config)}),k(y,{className:"text-muted-foreground text-sm",children:X.errorMessage??"No sync errors recorded."})]}),getCanExpand:()=>!0});return k(SX,{controller:$,title:"Connections",description:"Client-mode ContractSpec table with visibility, pinning, resizing, and expanded diagnostics.",toolbar:k(e,{controller:$,label:`${K.length} total connections`,toggleColumnId:"errorMessage",toggleVisibleLabel:"Hide Error Column",toggleHiddenLabel:"Show Error Column",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"connection",resizeLabel:"Widen Connection"}),emptyState:k("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No connections found"})})}import{DataTable as yX}from"@contractspec/lib.design-system";import{useContractTable as dX}from"@contractspec/lib.presentation-runtime-react";import{VStack as rK}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as v}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as d,jsxs as h}from"react/jsx-runtime";function IK({syncConfigs:K}){let $=dX({data:K,columns:[{id:"sync",header:"Sync Config",label:"Sync Config",accessor:(X)=>X.name,cell:({item:X})=>h(rK,{gap:"xs",children:[d(v,{className:"font-medium text-sm",children:X.name}),h(v,{className:"text-muted-foreground text-xs",children:[X.sourceEntity," \u2192 ",X.targetEntity]})]}),size:260,minSize:200,canSort:!0,canPin:!0,canResize:!0},{id:"frequency",header:"Frequency",label:"Frequency",accessorKey:"frequency",size:160,canSort:!0,canHide:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:X})=>d(n,{status:String(X)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"recordsSynced",header:"Records",label:"Records",accessorKey:"recordsSynced",align:"right",size:140,canSort:!0,canResize:!0},{id:"lastRunAt",header:"Last Run",label:"Last Run",accessor:(X)=>X.lastRunAt?.getTime()??0,cell:({item:X})=>g(X.lastRunAt),size:200,canSort:!0,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{lastRunAt:!1},columnPinning:{left:["sync"],right:[]}},renderExpandedContent:(X)=>h(rK,{gap:"sm",className:"py-2",children:[h(v,{className:"text-muted-foreground text-sm",children:["Connection ",X.connectionId]}),h(v,{className:"text-muted-foreground text-sm",children:["Last run: ",g(X.lastRunAt)]}),h(v,{className:"text-muted-foreground text-sm",children:["Last status: ",X.lastRunStatus??"No runs recorded"]}),h(v,{className:"text-muted-foreground text-sm",children:["Updated ",X.updatedAt.toLocaleString()]})]}),getCanExpand:()=>!0});return d(yX,{controller:$,title:"Sync Configs",description:"Shared table primitives applied to sync monitoring without changing the surrounding dashboard layout.",toolbar:d(e,{controller:$,label:`${K.length} syncs`,toggleColumnId:"lastRunAt",toggleVisibleLabel:"Hide Last Run",toggleHiddenLabel:"Show Last Run",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"sync",resizeLabel:"Widen Sync"}),emptyState:d("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No sync configurations found"})})}import{Button as iK,ErrorState as mX,LoaderBlock as pX,StatCard as kK,StatCardGroup as uX}from"@contractspec/lib.design-system";import{useState as lX}from"react";import{jsx as L,jsxs as I}from"react/jsx-runtime";var cX={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",INACTIVE:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",CONNECTED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DISCONNECTED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",PENDING:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",ERROR:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",PAUSED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"},rX={CRM:"\uD83D\uDCCA",MARKETING:"\uD83D\uDCE3",PAYMENT:"\uD83D\uDCB3",COMMUNICATION:"\uD83D\uDCAC",DATA:"\uD83D\uDDC4\uFE0F",CUSTOM:"\u2699\uFE0F"};function iX(){let[K,$]=lX("integrations"),{integrations:X,connections:Z,syncConfigs:Q,loading:H,error:G,stats:W,refetch:A}=LK(),O=[{id:"integrations",label:"Integrations",icon:"\uD83D\uDD0C"},{id:"connections",label:"Connections",icon:"\uD83D\uDD17"},{id:"syncs",label:"Sync Configs",icon:"\uD83D\uDD04"},{id:"chat",label:"Chat",icon:"\uD83D\uDCAC"}];if(H)return L(pX,{label:"Loading Integrations..."});if(G)return L(mX,{title:"Failed to load Integrations",description:G.message,onRetry:A,retryLabel:"Retry"});return I("div",{className:"space-y-6",children:[I("div",{className:"flex items-center justify-between",children:[L("h2",{className:"font-bold text-2xl",children:"Integration Hub"}),I(iK,{onClick:()=>alert("Add integration modal"),children:[L("span",{className:"mr-2",children:"+"})," Add Integration"]})]}),I(uX,{children:[L(kK,{label:"Integrations",value:W.totalIntegrations,hint:`${W.activeIntegrations} active`}),L(kK,{label:"Connections",value:W.totalConnections,hint:`${W.connectedCount} connected`}),L(kK,{label:"Syncs",value:W.totalSyncs,hint:`${W.activeSyncs} active`})]}),L(pK,{connections:Z,integrations:X,syncConfigs:Q}),L("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:O.map((U)=>I(iK,{type:"button",role:"tab","aria-selected":K===U.id,onClick:()=>$(U.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${K===U.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[L("span",{children:U.icon}),U.label]},U.id))}),I("div",{className:"min-h-[400px]",role:"tabpanel",children:[K==="integrations"&&I("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[X.map((U)=>I("div",{className:"cursor-pointer rounded-lg border border-border bg-card p-4 transition-colors hover:bg-muted/50",children:[I("div",{className:"mb-3 flex items-center gap-3",children:[L("span",{className:"text-2xl",children:rX[U.type]??"\u2699\uFE0F"}),I("div",{children:[L("h3",{className:"font-medium",children:U.name}),L("p",{className:"text-muted-foreground text-sm",children:U.type})]})]}),I("div",{className:"flex items-center justify-between",children:[L("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${cX[U.status]??""}`,children:U.status}),L("span",{className:"text-muted-foreground text-xs",children:U.createdAt.toLocaleDateString()})]})]},U.id)),X.length===0&&L("div",{className:"col-span-full flex h-64 items-center justify-center text-muted-foreground",children:"No integrations configured"})]}),K==="connections"&&L(MK,{connections:Z}),K==="chat"&&L(zK,{proxyUrl:"/api/chat",thinkingLevel:"thinking",suggestions:["List my integrations","Show sync status","Add a connection"],className:"min-h-[400px]"}),K==="syncs"&&L(IK,{syncConfigs:Q})]})]})}var oK=[{id:"int-1",name:"Salesforce",type:"CRM",status:"ACTIVE",connectionCount:3},{id:"int-2",name:"HubSpot",type:"MARKETING",status:"ACTIVE",connectionCount:2},{id:"int-3",name:"Stripe",type:"PAYMENT",status:"ACTIVE",connectionCount:1},{id:"int-4",name:"Slack",type:"COMMUNICATION",status:"INACTIVE",connectionCount:0},{id:"int-5",name:"Google Sheets",type:"DATA",status:"ACTIVE",connectionCount:5},{id:"int-6",name:"PostHog",type:"ANALYTICS",status:"ACTIVE",connectionCount:1}],fK=[{id:"conn-1",integrationId:"int-1",name:"Production Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-16T10:00:00Z"},{id:"conn-2",integrationId:"int-1",name:"Sandbox Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-15T14:00:00Z"},{id:"conn-3",integrationId:"int-2",name:"Marketing HubSpot",status:"CONNECTED",lastSyncAt:"2024-01-16T08:00:00Z"},{id:"conn-4",integrationId:"int-3",name:"Stripe Live",status:"CONNECTED",lastSyncAt:"2024-01-16T12:00:00Z"},{id:"conn-5",integrationId:"int-5",name:"Analytics Sheet",status:"ERROR",lastSyncAt:"2024-01-14T09:00:00Z",error:"Authentication expired"},{id:"conn-6",integrationId:"int-6",name:"PostHog Workspace",status:"CONNECTED",lastSyncAt:"2024-01-16T11:45:00Z"}],tK=[{id:"sync-1",connectionId:"conn-1",name:"Contacts Sync",frequency:"HOURLY",lastRunAt:"2024-01-16T10:00:00Z",status:"SUCCESS",recordsSynced:1250},{id:"sync-2",connectionId:"conn-1",name:"Opportunities Sync",frequency:"DAILY",lastRunAt:"2024-01-16T00:00:00Z",status:"SUCCESS",recordsSynced:340},{id:"sync-3",connectionId:"conn-3",name:"Orders Sync",frequency:"REALTIME",lastRunAt:"2024-01-16T12:30:00Z",status:"SUCCESS",recordsSynced:89},{id:"sync-4",connectionId:"conn-5",name:"Metrics Export",frequency:"DAILY",lastRunAt:"2024-01-14T09:00:00Z",status:"FAILED",recordsSynced:0}],oX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="IntegrationDashboard")throw Error("integrationDashboardMarkdownRenderer: not IntegrationDashboard");let $=oK,X=fK,Z=tK,Q=s($,X,Z),H=$.filter((D)=>D.status==="ACTIVE"),G=X.filter((D)=>D.status==="CONNECTED"),W=X.filter((D)=>D.status==="ERROR"),O=Z.filter((D)=>D.status==="SUCCESS").reduce((D,F)=>D+F.recordsSynced,0),U=["# Integration Hub","","> Connect and sync data with external services","","## Overview","","| Metric | Value |","|--------|-------|",`| Active Integrations | ${H.length} |`,`| Connected Services | ${G.length} |`,`| Error Connections | ${W.length} |`,`| Sync Configs | ${Z.length} |`,`| Records Synced (24h) | ${O.toLocaleString()} |`,""];U.push("## Visualization Overview"),U.push("");for(let D of[...Q.primaryItems,...Q.comparisonItems])U.push(`- **${D.title}** via \`${D.spec.meta.key}\``);U.push(""),U.push("## Integrations"),U.push(""),U.push("| Name | Type | Connections | Status |"),U.push("|------|------|-------------|--------|");for(let D of $){let F=D.status==="ACTIVE"?"\uD83D\uDFE2":"\u26AB";U.push(`| ${D.name} | ${D.type} | ${D.connectionCount} | ${F} ${D.status} |`)}U.push(""),U.push("## Recent Sync Activity"),U.push(""),U.push("| Sync | Frequency | Last Run | Records | Status |"),U.push("|------|-----------|----------|---------|--------|");for(let D of Z){let F=new Date(D.lastRunAt).toLocaleString(),V=D.status==="SUCCESS"?"\u2705":"\u274C";U.push(`| ${D.name} | ${D.frequency} | ${F} | ${D.recordsSynced} | ${V} ${D.status} |`)}if(W.length>0){U.push(""),U.push("## \u26A0\uFE0F Connections with Errors"),U.push("");for(let D of W){let F=$.find((V)=>V.id===D.integrationId);U.push(`- **${D.name}** (${F?.name??"Unknown"}): ${D.error??"Unknown error"}`)}}return{mimeType:"text/markdown",body:U.join(`
7
+ `)}}},tX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="ConnectionList")throw Error("connectionListMarkdownRenderer: not ConnectionList");let $=fK,X=oK,Z=["# Connections","","> Manage connections to external services",""];for(let Q of X){let H=$.filter((G)=>G.integrationId===Q.id);if(H.length===0)continue;Z.push(`## ${Q.name}`),Z.push(""),Z.push("| Connection | Status | Last Sync |"),Z.push("|------------|--------|-----------|");for(let G of H){let W=new Date(G.lastSyncAt).toLocaleString(),A=G.status==="CONNECTED"?"\uD83D\uDFE2":G.status==="ERROR"?"\uD83D\uDD34":"\u26AB";Z.push(`| ${G.name} | ${A} ${G.status} | ${W} |`)}Z.push("")}return{mimeType:"text/markdown",body:Z.join(`
8
+ `)}}},sX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="SyncConfigEditor")throw Error("syncConfigMarkdownRenderer: not SyncConfigEditor");let $=tK,X=fK,Z=["# Sync Configurations","","> Configure automated data synchronization",""];for(let Q of $){let H=X.find((W)=>W.id===Q.connectionId),G=Q.status==="SUCCESS"?"\u2705":"\u274C";Z.push(`## ${Q.name}`),Z.push(""),Z.push(`**Connection:** ${H?.name??"Unknown"}`),Z.push(`**Frequency:** ${Q.frequency}`),Z.push(`**Status:** ${G} ${Q.status}`),Z.push(`**Last Run:** ${new Date(Q.lastRunAt).toLocaleString()}`),Z.push(`**Records Synced:** ${Q.recordsSynced.toLocaleString()}`),Z.push("")}return Z.push("## Frequency Options"),Z.push(""),Z.push("- **REALTIME**: Sync on every change"),Z.push("- **HOURLY**: Sync every hour"),Z.push("- **DAILY**: Sync once per day"),Z.push("- **WEEKLY**: Sync once per week"),Z.push("- **MANUAL**: Sync only when triggered"),{mimeType:"text/markdown",body:Z.join(`
9
+ `)}}};export{LK as useIntegrationData,sX as syncConfigMarkdownRenderer,jZ as runIntegrationHubMcpExampleFromEnv,oX as integrationDashboardMarkdownRenderer,cZ as hasChanges,uZ as createSyncEngine,s as createIntegrationVisualizationSections,$X as createIntegrationHandlers,tX as connectionListMarkdownRenderer,lZ as computeChecksum,PK as TriggerSyncInputModel,FX as TriggerSyncContract,l as SyncStatusEnum,T as SyncRunModel,x as SyncDirectionEnum,r as SyncConfigModel,c as MappingTypeEnum,BK as ListSyncRunsOutputModel,WK as ListSyncRunsInputModel,_X as ListSyncRunsContract,dK as IntegrationVisualizationSpecs,eZ as IntegrationVisualizationRegistry,K0 as IntegrationVisualizationRefs,NK as IntegrationTypeVisualization,UK as IntegrationStatusEnum,u as IntegrationModel,zK as IntegrationHubChat,iX as IntegrationDashboard,FK as HealthySyncMetricVisualization,b as FieldMappingModel,XX as ExamplesIntegrationHubExample,DK as CreateSyncConfigInputModel,NX as CreateSyncConfigContract,JK as CreateIntegrationInputModel,HX as CreateIntegrationContract,QK as CreateConnectionInputModel,eK as CreateConnectionContract,AK as ConnectionStatusVisualization,XK as ConnectionStatusEnum,m as ConnectionModel,gK as BasicSyncEngine,SK as BasicFieldTransformer,_K as AttentionSyncMetricVisualization,GK as AddFieldMappingInputModel,AX as AddFieldMappingContract};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{defineVisualization as j,VisualizationRegistry as v}from"@contractspec/lib.contracts-spec/visualizations";var L={key:"integration.list",version:"1.0.0"},Y={key:"integration.connection.list",version:"1.0.0"},W={key:"integration.syncConfig.list",version:"1.0.0"},k={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},D=j({meta:{...k,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:L,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),J=j({meta:{...k,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:Y,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),K=j({meta:{...k,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),P=j({meta:{...k,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),X=[D,J,K,P],f=new v([...X]),Z=X.map((x)=>({key:x.meta.key,version:x.meta.version}));function G(x){return x==="ACTIVE"||x==="SUCCESS"}function F(x,$,b){let q=new Map,w=new Map,Q=0,U=0;for(let m of x)q.set(m.type,(q.get(m.type)??0)+1);for(let m of $)w.set(m.status,(w.get(m.status)??0)+1);for(let m of b)if(G(m.status))Q+=1;else U+=1;return{primaryItems:[{key:"integration-types",spec:D,data:{data:Array.from(q.entries()).map(([m,B])=>({type:m,count:B}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:J,data:{data:Array.from(w.entries()).map(([m,B])=>({status:m,count:B}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:K,data:{data:[{value:Q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:P,data:{data:[{value:U}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{defineFeature as H}from"@contractspec/lib.contracts-spec";var p=H({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Connect and sync data with external systems through configurable integrations",domain:"integration",owners:["@integration-team"],tags:["integration","sync","etl","connectors"],stability:"experimental"},operations:[{key:"integration.create",version:"1.0.0"},{key:"integration.connection.create",version:"1.0.0"},{key:"integration.syncConfig.create",version:"1.0.0"},{key:"integration.fieldMapping.add",version:"1.0.0"},{key:"integration.sync.trigger",version:"1.0.0"},{key:"integration.syncRun.list",version:"1.0.0"}],events:[{key:"integration.created",version:"1.0.0"},{key:"integration.connection.created",version:"1.0.0"},{key:"integration.connection.statusChanged",version:"1.0.0"},{key:"integration.syncConfig.created",version:"1.0.0"},{key:"integration.sync.started",version:"1.0.0"},{key:"integration.sync.completed",version:"1.0.0"},{key:"integration.sync.failed",version:"1.0.0"},{key:"integration.record.synced",version:"1.0.0"},{key:"integration.fieldMapping.added",version:"1.0.0"}],presentations:[{key:"integration.list",version:"1.0.0"},{key:"integration.detail",version:"1.0.0"},{key:"integration.connection.list",version:"1.0.0"},{key:"integration.connection.setup",version:"1.0.0"},{key:"integration.syncConfig.list",version:"1.0.0"},{key:"integration.syncConfig.editor",version:"1.0.0"},{key:"integration.fieldMapping.editor",version:"1.0.0"},{key:"integration.syncRun.viewList",version:"1.0.0"},{key:"integration.syncRun.detail",version:"1.0.0"},{key:"integration.health",version:"1.0.0"},{key:"integration.sync.activity",version:"1.0.0"}],opToPresentation:[{op:{key:"integration.syncConfig.create",version:"1.0.0"},pres:{key:"integration.syncConfig.editor",version:"1.0.0"}},{op:{key:"integration.fieldMapping.add",version:"1.0.0"},pres:{key:"integration.fieldMapping.editor",version:"1.0.0"}},{op:{key:"integration.syncRun.list",version:"1.0.0"},pres:{key:"integration.syncRun.viewList",version:"1.0.0"}}],presentationsTargets:[{key:"integration.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.detail",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.editor",version:"1.0.0",targets:["react"]},{key:"integration.fieldMapping.editor",version:"1.0.0",targets:["react"]},{key:"integration.syncRun.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncRun.detail",version:"1.0.0",targets:["react","markdown"]}],visualizations:Z,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"},{key:"jobs",version:"1.0.0"},{key:"files",version:"1.0.0"}],provides:[{key:"integration",version:"1.0.0"},{key:"sync",version:"1.0.0"},{key:"etl",version:"1.0.0"}]},integrations:[{key:"integration-hub.integration.default-connector",version:"1.0.0"}],telemetry:[{key:"integration-hub.telemetry",version:"1.0.0"}],jobs:[{key:"integration-hub.job.sync-run",version:"1.0.0"},{key:"integration-hub.job.health-check",version:"1.0.0"}],docs:["docs.examples.integration-hub","docs.examples.integration-hub.goal","docs.examples.integration-hub.usage","docs.examples.integration-hub.constraints"]});export{p as IntegrationHubFeature};
2
+ import{defineVisualization as j,VisualizationRegistry as v}from"@contractspec/lib.contracts-spec/visualizations";var L={key:"integration.list",version:"1.0.0"},Y={key:"integration.connection.list",version:"1.0.0"},W={key:"integration.syncConfig.list",version:"1.0.0"},k={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},D=j({meta:{...k,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:L,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),J=j({meta:{...k,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:Y,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),K=j({meta:{...k,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),P=j({meta:{...k,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),X=[D,J,K,P],h=new v([...X]),Z=X.map((x)=>({key:x.meta.key,version:x.meta.version}));function G(x){return x==="ACTIVE"||x==="SUCCESS"}function f(x,$,b){let q=new Map,w=new Map,Q=0,U=0;for(let m of x)q.set(m.type,(q.get(m.type)??0)+1);for(let m of $)w.set(m.status,(w.get(m.status)??0)+1);for(let m of b)if(G(m.status))Q+=1;else U+=1;return{primaryItems:[{key:"integration-types",spec:D,data:{data:Array.from(q.entries()).map(([m,B])=>({type:m,count:B}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:J,data:{data:Array.from(w.entries()).map(([m,B])=>({status:m,count:B}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:K,data:{data:[{value:Q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:P,data:{data:[{value:U}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{defineFeature as H}from"@contractspec/lib.contracts-spec/features";var p=H({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Connect and sync data with external systems through configurable integrations",domain:"integration",owners:["@integration-team"],tags:["integration","sync","etl","connectors"],stability:"experimental"},operations:[{key:"integration.create",version:"1.0.0"},{key:"integration.connection.create",version:"1.0.0"},{key:"integration.syncConfig.create",version:"1.0.0"},{key:"integration.fieldMapping.add",version:"1.0.0"},{key:"integration.sync.trigger",version:"1.0.0"},{key:"integration.syncRun.list",version:"1.0.0"}],events:[{key:"integration.created",version:"1.0.0"},{key:"integration.connection.created",version:"1.0.0"},{key:"integration.connection.statusChanged",version:"1.0.0"},{key:"integration.syncConfig.created",version:"1.0.0"},{key:"integration.sync.started",version:"1.0.0"},{key:"integration.sync.completed",version:"1.0.0"},{key:"integration.sync.failed",version:"1.0.0"},{key:"integration.record.synced",version:"1.0.0"},{key:"integration.fieldMapping.added",version:"1.0.0"}],presentations:[{key:"integration.list",version:"1.0.0"},{key:"integration.detail",version:"1.0.0"},{key:"integration.connection.list",version:"1.0.0"},{key:"integration.connection.setup",version:"1.0.0"},{key:"integration.syncConfig.list",version:"1.0.0"},{key:"integration.syncConfig.editor",version:"1.0.0"},{key:"integration.fieldMapping.editor",version:"1.0.0"},{key:"integration.syncRun.viewList",version:"1.0.0"},{key:"integration.syncRun.detail",version:"1.0.0"},{key:"integration.health",version:"1.0.0"},{key:"integration.sync.activity",version:"1.0.0"}],opToPresentation:[{op:{key:"integration.syncConfig.create",version:"1.0.0"},pres:{key:"integration.syncConfig.editor",version:"1.0.0"}},{op:{key:"integration.fieldMapping.add",version:"1.0.0"},pres:{key:"integration.fieldMapping.editor",version:"1.0.0"}},{op:{key:"integration.syncRun.list",version:"1.0.0"},pres:{key:"integration.syncRun.viewList",version:"1.0.0"}}],presentationsTargets:[{key:"integration.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.detail",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.editor",version:"1.0.0",targets:["react"]},{key:"integration.fieldMapping.editor",version:"1.0.0",targets:["react"]},{key:"integration.syncRun.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncRun.detail",version:"1.0.0",targets:["react","markdown"]}],visualizations:Z,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"},{key:"jobs",version:"1.0.0"},{key:"files",version:"1.0.0"}],provides:[{key:"integration",version:"1.0.0"},{key:"sync",version:"1.0.0"},{key:"etl",version:"1.0.0"}]},integrations:[{key:"integration-hub.integration.default-connector",version:"1.0.0"}],telemetry:[{key:"integration-hub.telemetry",version:"1.0.0"}],jobs:[{key:"integration-hub.job.sync-run",version:"1.0.0"},{key:"integration-hub.job.health-check",version:"1.0.0"}],docs:["docs.examples.integration-hub","docs.examples.integration-hub.goal","docs.examples.integration-hub.usage","docs.examples.integration-hub.constraints"]});export{p as IntegrationHubFeature};
@@ -1 +1 @@
1
- import{defineExample as g}from"@contractspec/lib.contracts-spec";var h=g({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Provider-agnostic integration center with connectors, connections, field mappings, and sync logs.",kind:"template",visibility:"public",stability:"experimental",owners:["@platform.core"],tags:["integrations","sync","etl","connectors"]},docs:{rootDocId:"docs.examples.integration-hub",goalDocId:"docs.examples.integration-hub.goal",usageDocId:"docs.examples.integration-hub.usage",constraintsDocId:"docs.examples.integration-hub.constraints"},entrypoints:{packageName:"@contractspec/example.integration-hub",feature:"./feature",contracts:"./contracts",presentations:"./presentations",handlers:"./handlers",docs:"./docs",ui:"./ui"},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs","builder","markdown","evolution"]},studio:{enabled:!0,installable:!0},mcp:{enabled:!0}}}),q=h;export{q as default};
1
+ import{defineExample as h}from"@contractspec/lib.contracts-spec/examples";var j=h({meta:{key:"examples.integration-hub",version:"1.0.0",title:"Integration Hub",description:"Integration Hub example with sync engine and field mappings for ContractSpec",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","integration-hub"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.integration-hub"}}),v=j;export{v as default,j as ExamplesIntegrationHubExample};
@@ -1,8 +1,8 @@
1
- import{defineEnum as HH}from"@contractspec/lib.schema";var KH=HH("ConnectionStatus",["PENDING","CONNECTED","DISCONNECTED","ERROR","EXPIRED"]),XH=HH("AuthType",["api_key","oauth2","bearer","header","basic","webhook_signing","service_account"]),ZH=HH("TransportType",["rest","mcp","webhook","sdk"]);import{defineSchemaModel as jH,ScalarTypeEnum as N}from"@contractspec/lib.schema";var m=jH({name:"ConnectionModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.String_unsecure(),isOptional:!1},status:{type:KH,isOptional:!1},authType:{type:N.String_unsecure(),isOptional:!1},externalAccountName:{type:N.String_unsecure(),isOptional:!0},connectedAt:{type:N.DateTime(),isOptional:!0},lastHealthCheck:{type:N.DateTime(),isOptional:!0},healthStatus:{type:N.String_unsecure(),isOptional:!0},transport:{type:ZH,isOptional:!0},authMethod:{type:XH,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}}),$H=jH({name:"CreateConnectionInput",fields:{integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.NonEmptyString(),isOptional:!1},authType:{type:N.NonEmptyString(),isOptional:!1},credentials:{type:N.JSON(),isOptional:!0},transport:{type:ZH,isOptional:!0},authMethod:{type:XH,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}});import{defineCommand as aH}from"@contractspec/lib.contracts-spec/operations";var nH=["@example.integration-hub"],eH=aH({meta:{key:"integration.connection.create",version:"1.0.0",stability:"stable",owners:[...nH],tags:["integration","connection","create"],description:"Create a connection to an external system.",goal:"Authenticate with external systems.",context:"Connection setup."},io:{input:$H,output:m},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.connection.created",version:"1.0.0",when:"Connection created",payload:m}],audit:["integration.connection.created"]},acceptance:{scenarios:[{key:"create-connection-happy-path",given:["User is authenticated"],when:["User creates connection with valid credentials"],then:["Connection is created","ConnectionCreated event is emitted"]}],examples:[{key:"connect-crm",input:{name:"Salesforce Prod",integrationId:"salesforce",credentials:{clientId:"xxx"}},output:{id:"conn-123",status:"connected",connectedAt:"2025-01-01T12:00:00Z"}}]}});import{web as HK}from"@contractspec/lib.runtime-sandbox";var{generateId:p}=HK;function hH(H){return{id:H.id,projectId:H.projectId,organizationId:H.organizationId,name:H.name,description:H.description??void 0,type:H.type,status:H.status,iconUrl:H.iconUrl??void 0,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function QH(H){return{id:H.id,integrationId:H.integrationId,name:H.name,status:H.status,credentials:H.credentials?JSON.parse(H.credentials):void 0,config:H.config?JSON.parse(H.config):void 0,lastSyncAt:H.lastSyncAt?new Date(H.lastSyncAt):void 0,errorMessage:H.errorMessage??void 0,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function qH(H){return{id:H.id,connectionId:H.connectionId,name:H.name,sourceEntity:H.sourceEntity,targetEntity:H.targetEntity,frequency:H.frequency,status:H.status,lastRunAt:H.lastRunAt?new Date(H.lastRunAt):void 0,lastRunStatus:H.lastRunStatus??void 0,recordsSynced:H.recordsSynced,createdAt:new Date(H.createdAt),updatedAt:new Date(H.updatedAt)}}function xH(H){return{id:H.id,syncConfigId:H.syncConfigId,sourceField:H.sourceField,targetField:H.targetField,transformType:H.transformType??void 0,transformConfig:H.transformConfig?JSON.parse(H.transformConfig):void 0,createdAt:new Date(H.createdAt)}}function KK(H){async function Z(Q){let{projectId:Y,type:P,status:B,search:_,limit:z=20,offset:M=0}=Q,j="WHERE projectId = ?",f=[Y];if(P&&P!=="all")j+=" AND type = ?",f.push(P);if(B&&B!=="all")j+=" AND status = ?",f.push(B);if(_)j+=" AND name LIKE ?",f.push(`%${_}%`);let sH=(await H.query(`SELECT COUNT(*) as count FROM integration ${j}`,f)).rows[0]?.count??0;return{integrations:(await H.query(`SELECT * FROM integration ${j} ORDER BY name LIMIT ? OFFSET ?`,[...f,z,M])).rows.map(hH),total:sH}}async function K(Q,Y){let P=p("integ"),B=new Date().toISOString();await H.execute(`INSERT INTO integration (id, projectId, organizationId, name, description, type, status, iconUrl, createdAt, updatedAt)
2
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[P,Y.projectId,Y.organizationId,Q.name,Q.description??null,Q.type,"INACTIVE",Q.iconUrl??null,B,B]);let _=(await H.query("SELECT * FROM integration WHERE id = ?",[P])).rows;return hH(_[0])}async function X(Q){let{integrationId:Y,status:P,limit:B=20,offset:_=0}=Q,z="WHERE 1=1",M=[];if(Y)z+=" AND integrationId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await H.query(`SELECT COUNT(*) as count FROM integration_connection ${z}`,M)).rows[0]?.count??0;return{connections:(await H.query(`SELECT * FROM integration_connection ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(QH),total:f}}async function $(Q){let Y=p("conn"),P=new Date().toISOString();await H.execute(`INSERT INTO integration_connection (id, integrationId, name, status, credentials, config, createdAt, updatedAt)
3
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[Y,Q.integrationId,Q.name,"PENDING",Q.credentials?JSON.stringify(Q.credentials):null,Q.config?JSON.stringify(Q.config):null,P,P]),await H.execute("UPDATE integration_connection SET status = 'CONNECTED', updatedAt = ? WHERE id = ?",[P,Y]),await H.execute("UPDATE integration SET status = 'ACTIVE', updatedAt = ? WHERE id = ?",[P,Q.integrationId]);let B=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Y])).rows;return QH(B[0])}async function q(Q){let Y=new Date().toISOString();await H.execute("UPDATE integration_connection SET status = 'DISCONNECTED', updatedAt = ? WHERE id = ?",[Y,Q]);let P=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Q])).rows;return QH(P[0])}async function G(Q){let{connectionId:Y,status:P,limit:B=20,offset:_=0}=Q,z="WHERE 1=1",M=[];if(Y)z+=" AND connectionId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await H.query(`SELECT COUNT(*) as count FROM integration_sync_config ${z}`,M)).rows[0]?.count??0;return{configs:(await H.query(`SELECT * FROM integration_sync_config ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(qH),total:f}}async function W(Q){let Y=p("sync"),P=new Date().toISOString();await H.execute(`INSERT INTO integration_sync_config (id, connectionId, name, sourceEntity, targetEntity, frequency, status, recordsSynced, createdAt, updatedAt)
4
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Y,Q.connectionId,Q.name,Q.sourceEntity,Q.targetEntity,Q.frequency??"DAILY","ACTIVE",0,P,P]);let B=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Y])).rows;return qH(B[0])}async function A(Q){let Y=new Date().toISOString(),P=[];await H.execute("DELETE FROM integration_field_mapping WHERE syncConfigId = ?",[Q.syncConfigId]);for(let B of Q.mappings){let _=p("fmap");await H.execute(`INSERT INTO integration_field_mapping (id, syncConfigId, sourceField, targetField, transformType, transformConfig, createdAt)
5
- VALUES (?, ?, ?, ?, ?, ?, ?)`,[_,Q.syncConfigId,B.sourceField,B.targetField,B.transformType??null,B.transformConfig?JSON.stringify(B.transformConfig):null,Y]);let z=(await H.query("SELECT * FROM integration_field_mapping WHERE id = ?",[_])).rows;P.push(xH(z[0]))}return P}async function O(Q){return(await H.query("SELECT * FROM integration_field_mapping WHERE syncConfigId = ?",[Q])).rows.map(xH)}async function U(Q){let Y=new Date().toISOString(),P=Math.floor(Math.random()*1000)+50;await H.execute("UPDATE integration_sync_config SET lastRunAt = ?, lastRunStatus = 'SUCCESS', recordsSynced = recordsSynced + ?, updatedAt = ? WHERE id = ?",[Y,P,Y,Q]);let B=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Q])).rows;if(B[0])await H.execute("UPDATE integration_connection SET lastSyncAt = ?, updatedAt = ? WHERE id = ?",[Y,Y,B[0].connectionId]);let _=(await H.query("SELECT * FROM integration_sync_config WHERE id = ?",[Q])).rows;return qH(_[0])}async function D(Q){let Y=(await H.query("SELECT * FROM integration_connection WHERE id = ?",[Q.connectionId])).rows;if(!Y[0])return{valid:!1,provider:"unknown",keyPrefix:"",error:`Connection ${Q.connectionId} not found`};let P=Q.providerKey.slice(0,8),B=Q.providerKey.length>=16;return{valid:B,provider:Y[0].name,keyPrefix:`${P}...`,expiresAt:B?new Date(Date.now()+7776000000).toISOString():void 0,error:B?void 0:"Key must be at least 16 characters"}}async function F(Q){let Y=new Date().toISOString();return await H.execute("UPDATE integration_connection SET updatedAt = ? WHERE id = ?",[Y,Q.connectionId]),{refreshed:!0,expiresAt:new Date(Date.now()+3600000).toISOString(),tokenType:"Bearer",scopes:["read","write","sync"]}}async function V(Q){return{integrationId:Q.integrationId,transports:[{transport:"rest",supported:!0,defaultVersion:"v2"},{transport:"mcp",supported:!0,defaultVersion:"v1"},{transport:"webhook",supported:!0},{transport:"sdk",supported:!1}]}}return{listIntegrations:Z,createIntegration:K,listConnections:X,connectService:$,disconnectService:q,listSyncConfigs:G,configureSync:W,mapFields:A,getFieldMappings:O,runSync:U,validateByokKey:D,refreshOAuth2Token:F,getTransportOptions:V}}import{defineEnum as XK}from"@contractspec/lib.schema";var UH=XK("IntegrationStatus",["DRAFT","ACTIVE","PAUSED","ERROR","ARCHIVED"]);import{defineSchemaModel as EH,ScalarTypeEnum as R}from"@contractspec/lib.schema";var u=EH({name:"IntegrationModel",fields:{id:{type:R.String_unsecure(),isOptional:!1},name:{type:R.String_unsecure(),isOptional:!1},slug:{type:R.String_unsecure(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.String_unsecure(),isOptional:!1},status:{type:UH,isOptional:!1},createdAt:{type:R.DateTime(),isOptional:!1}}}),JH=EH({name:"CreateIntegrationInput",fields:{name:{type:R.NonEmptyString(),isOptional:!1},slug:{type:R.NonEmptyString(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.NonEmptyString(),isOptional:!1},config:{type:R.JSON(),isOptional:!0},featureFlagKey:{type:R.String_unsecure(),isOptional:!0}}});import{defineCommand as ZK}from"@contractspec/lib.contracts-spec/operations";var $K=ZK({meta:{key:"integration.create",version:"1.0.0",stability:"stable",owners:["@example.integration-hub"],tags:["integration","create"],description:"Create a new integration.",goal:"Allow users to set up integrations with external systems.",context:"Integration setup."},io:{input:JH,output:u},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.created",version:"1.0.0",when:"Integration created",payload:u}],audit:["integration.created"]},acceptance:{scenarios:[{key:"create-integration-happy-path",given:["User is admin"],when:["User defines new integration type"],then:["Integration definition is created","IntegrationCreated event is emitted"]}],examples:[{key:"create-slack",input:{name:"Slack",category:"communication",authType:"oauth2"},output:{id:"slack",status:"active"}}]}});import{createMcpToolsets as QK}from"@contractspec/lib.ai-agent/tools/mcp-client";import{randomUUID as qK}from"crypto";var UK=["-y","@modelcontextprotocol/server-filesystem","."];async function MX(){let H=YK(),Z=vH(),K=JK(),X=await QK([K],{onNameCollision:"error"});try{let $=Object.keys(X.tools).sort(),q={mode:H,server:{name:K.name,transport:Z},authMethod:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_AUTH_METHOD,apiVersion:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_API_VERSION,tools:$};if(H==="call"){let G=wH("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_NAME"),W=GK("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_ARGS_JSON",{}),A=X.tools[G];if(!A?.execute)throw Error(`Tool "${G}" was not found. Available tools: ${$.join(", ")}`);let O=await A.execute(W,{toolCallId:`integration-hub-${qK()}`,messages:[]});q.toolCall={name:G,args:W,output:O}}return q}finally{await X.cleanup().catch(()=>{return})}}function JK(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_NAME??"filesystem",Z=vH(),K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_PREFIX;if(Z==="stdio")return{name:H,transport:Z,command:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_COMMAND??"npx",args:DK("CONTRACTSPEC_INTEGRATION_HUB_MCP_ARGS_JSON",UK),toolPrefix:K};let X=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN,$=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN_ENV;return{name:H,transport:Z==="webhook"||Z==="http"?"http":"sse",url:wH("CONTRACTSPEC_INTEGRATION_HUB_MCP_URL"),headers:PK("CONTRACTSPEC_INTEGRATION_HUB_MCP_HEADERS_JSON"),accessToken:X,accessTokenEnvVar:$,toolPrefix:K}}function YK(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE?.toLowerCase()??"list";if(H==="list"||H==="call")return H;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE: ${H}. Use "list" or "call".`)}function vH(){let H=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT?.toLowerCase()??"stdio";if(H==="stdio"||H==="http"||H==="sse"||H==="webhook")return H;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT: ${H}. Use "stdio", "http", "sse", or "webhook".`)}function DK(H,Z){if(!process.env[H])return Z;let X=TH(H);if(!Array.isArray(X)||X.some(($)=>typeof $!=="string"))throw Error(`${H} must be a JSON string array.`);return X}function bH(H){if(!process.env[H])return;let K=TH(H);if(!WK(K))throw Error(`${H} must be a JSON object.`);return K}function GK(H,Z){return bH(H)??Z}function PK(H){let Z=bH(H);if(!Z)return;let K=Object.entries(Z);if(K.find(([,$])=>typeof $!=="string"))throw Error(`${H} must contain only string values.`);return Object.fromEntries(K)}function TH(H){let Z=process.env[H];if(!Z)return;try{return JSON.parse(Z)}catch{throw Error(`${H} contains invalid JSON.`)}}function wH(H){let Z=process.env[H];if(!Z)throw Error(`Missing required env var: ${H}`);return Z}function WK(H){return typeof H==="object"&&H!==null&&!Array.isArray(H)}import{defineEnum as YH}from"@contractspec/lib.schema";var x=YH("SyncDirection",["INBOUND","OUTBOUND","BIDIRECTIONAL"]),l=YH("SyncStatus",["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]),c=YH("MappingType",["DIRECT","TRANSFORM","LOOKUP","CONSTANT","COMPUTED"]);import{defineSchemaModel as C,ScalarTypeEnum as J}from"@contractspec/lib.schema";var b=C({name:"FieldMappingModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.String_unsecure(),isOptional:!1},targetField:{type:J.String_unsecure(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!1}}}),r=C({name:"SyncConfigModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.String_unsecure(),isOptional:!1},targetObject:{type:J.String_unsecure(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!1},scheduleCron:{type:J.String_unsecure(),isOptional:!0},isActive:{type:J.Boolean(),isOptional:!1},lastSyncAt:{type:J.DateTime(),isOptional:!0},fieldMappings:{type:b,isArray:!0,isOptional:!0}}}),T=C({name:"SyncRunModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1},direction:{type:x,isOptional:!1},trigger:{type:J.String_unsecure(),isOptional:!1},recordsProcessed:{type:J.Int_unsecure(),isOptional:!1},recordsCreated:{type:J.Int_unsecure(),isOptional:!1},recordsUpdated:{type:J.Int_unsecure(),isOptional:!1},recordsFailed:{type:J.Int_unsecure(),isOptional:!1},errorMessage:{type:J.String_unsecure(),isOptional:!0},startedAt:{type:J.DateTime(),isOptional:!0},completedAt:{type:J.DateTime(),isOptional:!0},createdAt:{type:J.DateTime(),isOptional:!1}}}),DH=C({name:"CreateSyncConfigInput",fields:{integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.NonEmptyString(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.NonEmptyString(),isOptional:!1},targetObject:{type:J.NonEmptyString(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!0},scheduleCron:{type:J.String_unsecure(),isOptional:!0}}}),GH=C({name:"AddFieldMappingInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.NonEmptyString(),isOptional:!1},targetField:{type:J.NonEmptyString(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},lookupConfig:{type:J.JSON(),isOptional:!0},constantValue:{type:J.JSON(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!0},defaultValue:{type:J.JSON(),isOptional:!0}}}),PH=C({name:"TriggerSyncInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!0},fullSync:{type:J.Boolean(),isOptional:!0}}}),WH=C({name:"ListSyncRunsInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!0},limit:{type:J.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:J.Int_unsecure(),isOptional:!0,defaultValue:0}}}),BH=C({name:"ListSyncRunsOutput",fields:{runs:{type:T,isArray:!0,isOptional:!1},total:{type:J.Int_unsecure(),isOptional:!1}}});import{defineCommand as OH,defineQuery as BK}from"@contractspec/lib.contracts-spec/operations";var i=["@example.integration-hub"],OK=OH({meta:{key:"integration.syncConfig.create",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","config","create"],description:"Create a sync configuration.",goal:"Define how data should be synchronized.",context:"Sync setup."},io:{input:DH,output:r},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.syncConfig.created",version:"1.0.0",when:"Sync config created",payload:r}],audit:["integration.syncConfig.created"]},acceptance:{scenarios:[{key:"create-sync-happy-path",given:["User is authenticated"],when:["User creates sync config"],then:["Sync config is created","SyncConfigCreated event is emitted"]}],examples:[{key:"create-contact-sync",input:{name:"Contacts Sync",sourceConnectionId:"conn-1",targetConnectionId:"conn-2"},output:{id:"sync-123",status:"active"}}]}}),LK=OH({meta:{key:"integration.fieldMapping.add",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","mapping","field"],description:"Add a field mapping to a sync config.",goal:"Map fields between systems.",context:"Mapping configuration."},io:{input:GH,output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.fieldMapping.added",version:"1.0.0",when:"Mapping added",payload:b}]},acceptance:{scenarios:[{key:"add-mapping-happy-path",given:["Sync config exists"],when:["User adds field mapping"],then:["Mapping is added","FieldMappingAdded event is emitted"]}],examples:[{key:"map-email",input:{syncConfigId:"sync-123",sourceField:"email",targetField:"user_email"},output:{id:"map-456",type:"string"}}]}}),NK=OH({meta:{key:"integration.sync.trigger",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","trigger"],description:"Trigger a manual sync.",goal:"Start data synchronization.",context:"Manual sync or webhook trigger."},io:{input:PH,output:T},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.sync.started",version:"1.0.0",when:"Sync starts",payload:T}],audit:["integration.sync.triggered"]},acceptance:{scenarios:[{key:"trigger-sync-happy-path",given:["Sync config exists"],when:["User triggers sync"],then:["Sync run starts","SyncStarted event is emitted"]}],examples:[{key:"manual-trigger",input:{syncConfigId:"sync-123"},output:{id:"run-789",status:"pending"}}]}}),AK=BK({meta:{key:"integration.syncRun.list",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","run","list"],description:"List sync run history.",goal:"View sync history and status.",context:"Sync monitoring."},io:{input:WH,output:BH},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["User has access to syncs"],when:["User lists sync runs"],then:["List of runs is returned"]}],examples:[{key:"list-recent",input:{limit:10},output:{items:[],total:50}}]}});class SH{transform(H,Z){try{if(Z.startsWith("uppercase"))return typeof H==="string"?H.toUpperCase():H;if(Z.startsWith("lowercase"))return typeof H==="string"?H.toLowerCase():H;if(Z.startsWith("trim"))return typeof H==="string"?H.trim():H;if(Z.startsWith("default:")){let K=Z.replace("default:","");return H??JSON.parse(K)}if(Z.startsWith("concat:")){let K=Z.replace("concat:","")||" ";if(Array.isArray(H))return H.join(K);return H}if(Z.startsWith("split:")){let K=Z.replace("split:","")||",";if(typeof H==="string")return H.split(K);return H}if(Z.startsWith("number"))return Number(H);if(Z.startsWith("boolean"))return Boolean(H);if(Z.startsWith("string"))return String(H);return H}catch{return H}}}class gH{transformer;constructor(H){this.transformer=H??new SH}async sync(H){return{success:!0,recordsProcessed:0,recordsCreated:0,recordsUpdated:0,recordsDeleted:0,recordsFailed:0,recordsSkipped:0,errors:[]}}transformRecord(H,Z,K){let X={};for(let $ of Z){let q,G;switch($.mappingType){case"DIRECT":q=this.getNestedValue(H.data,$.sourceField);break;case"TRANSFORM":G=this.getNestedValue(H.data,$.sourceField),q=$.transformExpression?this.transformer.transform(G,$.transformExpression):G;break;case"CONSTANT":q=$.constantValue;break;case"LOOKUP":q=this.getNestedValue(H.data,$.sourceField);break;case"COMPUTED":q=$.transformExpression?this.evaluateComputed(H.data,$.transformExpression):null;break;default:q=this.getNestedValue(H.data,$.sourceField)}if(q===void 0||q===null)q=$.defaultValue;this.setNestedValue(X,$.targetField,q)}return{id:H.id,data:X}}validateRecord(H,Z){let K=[];for(let X of Z)if(X.isRequired){let $=this.getNestedValue(H.data,X.targetField);if($===void 0||$===null)K.push({recordId:H.id,field:X.targetField,message:`Required field ${X.targetField} is missing`,code:"REQUIRED_FIELD_MISSING"})}return{valid:K.length===0,errors:K}}getNestedValue(H,Z){let K=Z.split("."),X=H;for(let $ of K){if(X===null||X===void 0)return;X=X[$]}return X}setNestedValue(H,Z,K){let X=Z.split("."),$=H;for(let G=0;G<X.length-1;G++){let W=X[G];if(W===void 0)continue;if(!(W in $))$[W]={};$=$[W]}let q=X[X.length-1];if(q!==void 0)$[q]=K}evaluateComputed(H,Z){try{return Z.replace(/\$\{([^}]+)\}/g,(X,$)=>{let q=this.getNestedValue(H,$);return String(q??"")})}catch{return null}}}function gX(H){return new gH(H)}function yX(H){let Z=JSON.stringify(H,Object.keys(H).sort()),K=0;for(let X=0;X<Z.length;X++){let $=Z.charCodeAt(X);K=(K<<5)-K+$,K=K&K}return K.toString(16)}function dX(H,Z){if(!H||!Z)return!0;return H!==Z}import{useTemplateRuntime as FK}from"@contractspec/lib.example-shared-ui";import{useCallback as _K,useEffect as zK,useState as w}from"react";function LH(H="local-project"){let{handlers:Z}=FK(),K=Z.integration,[X,$]=w([]),[q,G]=w([]),[W,A]=w([]),[O,U]=w(!0),[D,F]=w(null),V=_K(async()=>{try{U(!0),F(null);let[Y,P,B]=await Promise.all([K.listIntegrations({projectId:H,limit:100}),K.listConnections({limit:100}),K.listSyncConfigs({limit:100})]);$(Y.integrations),G(P.connections),A(B.configs)}catch(Y){F(Y instanceof Error?Y:Error("Failed to load integrations"))}finally{U(!1)}},[K,H]);zK(()=>{V()},[V]);let Q={totalIntegrations:X.length,activeIntegrations:X.filter((Y)=>Y.status==="ACTIVE").length,totalConnections:q.length,connectedCount:q.filter((Y)=>Y.status==="CONNECTED").length,totalSyncs:W.length,activeSyncs:W.filter((Y)=>Y.status==="ACTIVE").length};return{integrations:X,connections:q,syncConfigs:W,loading:O,error:D,stats:Q,refetch:V}}import{defineVisualization as o,VisualizationRegistry as RK}from"@contractspec/lib.contracts-spec/visualizations";var VK={key:"integration.list",version:"1.0.0"},MK={key:"integration.connection.list",version:"1.0.0"},yH={key:"integration.syncConfig.list",version:"1.0.0"},t={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},NH=o({meta:{...t,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:VK,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),AH=o({meta:{...t,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:MK,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),FH=o({meta:{...t,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:yH,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),_H=o({meta:{...t,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:yH,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),dH=[NH,AH,FH,_H],oX=new RK([...dH]),tX=dH.map((H)=>({key:H.meta.key,version:H.meta.version}));function IK(H){return H==="ACTIVE"||H==="SUCCESS"}function s(H,Z,K){let X=new Map,$=new Map,q=0,G=0;for(let O of H)X.set(O.type,(X.get(O.type)??0)+1);for(let O of Z)$.set(O.status,($.get(O.status)??0)+1);for(let O of K)if(IK(O.status))q+=1;else G+=1;return{primaryItems:[{key:"integration-types",spec:NH,data:{data:Array.from(X.entries()).map(([O,U])=>({type:O,count:U}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:AH,data:{data:Array.from($.entries()).map(([O,U])=>({status:O,count:U}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:FH,data:{data:[{value:q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:_H,data:{data:[{value:G}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{ComparisonView as kK,VisualizationCard as fK,VisualizationGrid as CK}from"@contractspec/lib.design-system";import{jsx as S,jsxs as mH}from"react/jsx-runtime";function pH({integrations:H,connections:Z,syncConfigs:K}){let{primaryItems:X,comparisonItems:$}=s(H,Z,K);return mH("section",{className:"space-y-4",children:[mH("div",{children:[S("h3",{className:"font-semibold text-lg",children:"Integration Visualizations"}),S("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for integration coverage and sync health."})]}),S(CK,{children:X.map((q)=>S(fK,{data:q.data,description:q.description,height:q.height,spec:q.spec,title:q.title},q.key))}),S(kK,{description:"Comparison surface for healthy versus attention-needed syncs.",items:$,title:"Sync-State Comparison"})]})}import{ChatWithSidebar as jK}from"@contractspec/module.ai-chat";import{jsx as uH}from"react/jsx-runtime";var hK=["List my integrations","Show sync status","Add a connection"],xK="You are an Integration Hub assistant. Help users manage integrations, connections, and sync configurations. When asked about integrations, connections, or syncs, provide clear, actionable guidance.";function zH({proxyUrl:H="/api/chat",mcpServers:Z,thinkingLevel:K="thinking",suggestions:X=hK,systemPrompt:$=xK,className:q}){return uH("div",{className:q??"flex h-[500px] flex-col",children:uH(jK,{className:"flex-1",systemPrompt:$,proxyUrl:H,mcpServers:Z,thinkingLevel:K,suggestions:X,showSuggestionsWhenEmpty:!0})})}import{Button as a}from"@contractspec/lib.design-system";import{Badge as lH}from"@contractspec/lib.ui-kit-web/ui/badge";import{HStack as EK}from"@contractspec/lib.ui-kit-web/ui/stack";import{jsx as E,jsxs as bK}from"react/jsx-runtime";var vK={ACTIVE:"default",CONNECTED:"default",SUCCESS:"default",PENDING:"secondary",PAUSED:"secondary",ERROR:"destructive",DISCONNECTED:"outline"};function g(H){return H?H.toLocaleString():"Never"}function RH(H){return H?JSON.stringify(H,null,2):"No configuration"}function n({status:H}){return E(lH,{variant:vK[H]??"outline",children:H})}function e({controller:H,label:Z,toggleColumnId:K,toggleVisibleLabel:X,toggleHiddenLabel:$,pinColumnId:q,pinLabel:G,resizeColumnId:W,resizeLabel:A}){let O=H.rows[0],U=H.columns.find((Q)=>Q.id===K),D=H.columns.find((Q)=>Q.id===q),F=H.columns.find((Q)=>Q.id===W),V=D?.pinState==="left"?!1:"left";return bK(EK,{gap:"sm",className:"flex-wrap",children:[E(lH,{variant:"outline",children:Z}),E(a,{variant:"outline",size:"sm",onPress:()=>O?.toggleExpanded?.(!O?.isExpanded),children:"Expand First Row"}),E(a,{variant:"outline",size:"sm",onPress:()=>U?.toggleVisibility?.(!U?.visible),children:U?.visible?X:$}),E(a,{variant:"outline",size:"sm",onPress:()=>D?.pin?.(V),children:D?.pinState==="left"?`Unpin ${G}`:`Pin ${G}`}),E(a,{variant:"outline",size:"sm",onPress:()=>F?.resizeBy?.(40),children:A})]})}import{DataTable as TK}from"@contractspec/lib.design-system";import{useContractTable as wK}from"@contractspec/lib.presentation-runtime-react";import{VStack as cH}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as y}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as k,jsxs as VH}from"react/jsx-runtime";function MH({connections:H}){let Z=wK({data:H,columns:[{id:"connection",header:"Connection",label:"Connection",accessor:(K)=>K.name,cell:({item:K})=>VH(cH,{gap:"xs",children:[k(y,{className:"font-medium text-sm",children:K.name}),VH(y,{className:"text-muted-foreground text-xs",children:["Created ",K.createdAt.toLocaleDateString()]})]}),size:240,minSize:180,canSort:!0,canPin:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:K})=>k(n,{status:String(K)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"lastSyncAt",header:"Last Sync",label:"Last Sync",accessor:(K)=>K.lastSyncAt?.getTime()??0,cell:({item:K})=>g(K.lastSyncAt),size:200,canSort:!0,canHide:!0,canResize:!0},{id:"errorMessage",header:"Errors",label:"Errors",accessor:(K)=>K.errorMessage??"",cell:({value:K})=>String(K||"No errors"),size:240,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{errorMessage:!1},columnPinning:{left:["connection"],right:[]}},renderExpandedContent:(K)=>VH(cH,{gap:"sm",className:"py-2",children:[k(y,{className:"font-medium text-sm",children:"Credentials"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RH(K.credentials)}),k(y,{className:"font-medium text-sm",children:"Config"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RH(K.config)}),k(y,{className:"text-muted-foreground text-sm",children:K.errorMessage??"No sync errors recorded."})]}),getCanExpand:()=>!0});return k(TK,{controller:Z,title:"Connections",description:"Client-mode ContractSpec table with visibility, pinning, resizing, and expanded diagnostics.",toolbar:k(e,{controller:Z,label:`${H.length} total connections`,toggleColumnId:"errorMessage",toggleVisibleLabel:"Hide Error Column",toggleHiddenLabel:"Show Error Column",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"connection",resizeLabel:"Widen Connection"}),emptyState:k("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No connections found"})})}import{DataTable as SK}from"@contractspec/lib.design-system";import{useContractTable as gK}from"@contractspec/lib.presentation-runtime-react";import{VStack as rH}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as v}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as d,jsxs as h}from"react/jsx-runtime";function IH({syncConfigs:H}){let Z=gK({data:H,columns:[{id:"sync",header:"Sync Config",label:"Sync Config",accessor:(K)=>K.name,cell:({item:K})=>h(rH,{gap:"xs",children:[d(v,{className:"font-medium text-sm",children:K.name}),h(v,{className:"text-muted-foreground text-xs",children:[K.sourceEntity," → ",K.targetEntity]})]}),size:260,minSize:200,canSort:!0,canPin:!0,canResize:!0},{id:"frequency",header:"Frequency",label:"Frequency",accessorKey:"frequency",size:160,canSort:!0,canHide:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:K})=>d(n,{status:String(K)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"recordsSynced",header:"Records",label:"Records",accessorKey:"recordsSynced",align:"right",size:140,canSort:!0,canResize:!0},{id:"lastRunAt",header:"Last Run",label:"Last Run",accessor:(K)=>K.lastRunAt?.getTime()??0,cell:({item:K})=>g(K.lastRunAt),size:200,canSort:!0,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{lastRunAt:!1},columnPinning:{left:["sync"],right:[]}},renderExpandedContent:(K)=>h(rH,{gap:"sm",className:"py-2",children:[h(v,{className:"text-muted-foreground text-sm",children:["Connection ",K.connectionId]}),h(v,{className:"text-muted-foreground text-sm",children:["Last run: ",g(K.lastRunAt)]}),h(v,{className:"text-muted-foreground text-sm",children:["Last status: ",K.lastRunStatus??"No runs recorded"]}),h(v,{className:"text-muted-foreground text-sm",children:["Updated ",K.updatedAt.toLocaleString()]})]}),getCanExpand:()=>!0});return d(SK,{controller:Z,title:"Sync Configs",description:"Shared table primitives applied to sync monitoring without changing the surrounding dashboard layout.",toolbar:d(e,{controller:Z,label:`${H.length} syncs`,toggleColumnId:"lastRunAt",toggleVisibleLabel:"Hide Last Run",toggleHiddenLabel:"Show Last Run",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"sync",resizeLabel:"Widen Sync"}),emptyState:d("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No sync configurations found"})})}import{Button as iH,ErrorState as yK,LoaderBlock as dK,StatCard as kH,StatCardGroup as mK}from"@contractspec/lib.design-system";import{useState as pK}from"react";import{jsx as L,jsxs as I}from"react/jsx-runtime";var uK={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",INACTIVE:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",CONNECTED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DISCONNECTED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",PENDING:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",ERROR:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",PAUSED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"},lK={CRM:"\uD83D\uDCCA",MARKETING:"\uD83D\uDCE3",PAYMENT:"\uD83D\uDCB3",COMMUNICATION:"\uD83D\uDCAC",DATA:"\uD83D\uDDC4️",CUSTOM:"⚙️"};function cK(){let[H,Z]=pK("integrations"),{integrations:K,connections:X,syncConfigs:$,loading:q,error:G,stats:W,refetch:A}=LH(),O=[{id:"integrations",label:"Integrations",icon:"\uD83D\uDD0C"},{id:"connections",label:"Connections",icon:"\uD83D\uDD17"},{id:"syncs",label:"Sync Configs",icon:"\uD83D\uDD04"},{id:"chat",label:"Chat",icon:"\uD83D\uDCAC"}];if(q)return L(dK,{label:"Loading Integrations..."});if(G)return L(yK,{title:"Failed to load Integrations",description:G.message,onRetry:A,retryLabel:"Retry"});return I("div",{className:"space-y-6",children:[I("div",{className:"flex items-center justify-between",children:[L("h2",{className:"font-bold text-2xl",children:"Integration Hub"}),I(iH,{onClick:()=>alert("Add integration modal"),children:[L("span",{className:"mr-2",children:"+"})," Add Integration"]})]}),I(mK,{children:[L(kH,{label:"Integrations",value:W.totalIntegrations,hint:`${W.activeIntegrations} active`}),L(kH,{label:"Connections",value:W.totalConnections,hint:`${W.connectedCount} connected`}),L(kH,{label:"Syncs",value:W.totalSyncs,hint:`${W.activeSyncs} active`})]}),L(pH,{connections:X,integrations:K,syncConfigs:$}),L("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:O.map((U)=>I(iH,{type:"button",role:"tab","aria-selected":H===U.id,onClick:()=>Z(U.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${H===U.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[L("span",{children:U.icon}),U.label]},U.id))}),I("div",{className:"min-h-[400px]",role:"tabpanel",children:[H==="integrations"&&I("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[K.map((U)=>I("div",{className:"cursor-pointer rounded-lg border border-border bg-card p-4 transition-colors hover:bg-muted/50",children:[I("div",{className:"mb-3 flex items-center gap-3",children:[L("span",{className:"text-2xl",children:lK[U.type]??"⚙️"}),I("div",{children:[L("h3",{className:"font-medium",children:U.name}),L("p",{className:"text-muted-foreground text-sm",children:U.type})]})]}),I("div",{className:"flex items-center justify-between",children:[L("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${uK[U.status]??""}`,children:U.status}),L("span",{className:"text-muted-foreground text-xs",children:U.createdAt.toLocaleDateString()})]})]},U.id)),K.length===0&&L("div",{className:"col-span-full flex h-64 items-center justify-center text-muted-foreground",children:"No integrations configured"})]}),H==="connections"&&L(MH,{connections:X}),H==="chat"&&L(zH,{proxyUrl:"/api/chat",thinkingLevel:"thinking",suggestions:["List my integrations","Show sync status","Add a connection"],className:"min-h-[400px]"}),H==="syncs"&&L(IH,{syncConfigs:$})]})]})}var oH=[{id:"int-1",name:"Salesforce",type:"CRM",status:"ACTIVE",connectionCount:3},{id:"int-2",name:"HubSpot",type:"MARKETING",status:"ACTIVE",connectionCount:2},{id:"int-3",name:"Stripe",type:"PAYMENT",status:"ACTIVE",connectionCount:1},{id:"int-4",name:"Slack",type:"COMMUNICATION",status:"INACTIVE",connectionCount:0},{id:"int-5",name:"Google Sheets",type:"DATA",status:"ACTIVE",connectionCount:5},{id:"int-6",name:"PostHog",type:"ANALYTICS",status:"ACTIVE",connectionCount:1}],fH=[{id:"conn-1",integrationId:"int-1",name:"Production Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-16T10:00:00Z"},{id:"conn-2",integrationId:"int-1",name:"Sandbox Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-15T14:00:00Z"},{id:"conn-3",integrationId:"int-2",name:"Marketing HubSpot",status:"CONNECTED",lastSyncAt:"2024-01-16T08:00:00Z"},{id:"conn-4",integrationId:"int-3",name:"Stripe Live",status:"CONNECTED",lastSyncAt:"2024-01-16T12:00:00Z"},{id:"conn-5",integrationId:"int-5",name:"Analytics Sheet",status:"ERROR",lastSyncAt:"2024-01-14T09:00:00Z",error:"Authentication expired"},{id:"conn-6",integrationId:"int-6",name:"PostHog Workspace",status:"CONNECTED",lastSyncAt:"2024-01-16T11:45:00Z"}],tH=[{id:"sync-1",connectionId:"conn-1",name:"Contacts Sync",frequency:"HOURLY",lastRunAt:"2024-01-16T10:00:00Z",status:"SUCCESS",recordsSynced:1250},{id:"sync-2",connectionId:"conn-1",name:"Opportunities Sync",frequency:"DAILY",lastRunAt:"2024-01-16T00:00:00Z",status:"SUCCESS",recordsSynced:340},{id:"sync-3",connectionId:"conn-3",name:"Orders Sync",frequency:"REALTIME",lastRunAt:"2024-01-16T12:30:00Z",status:"SUCCESS",recordsSynced:89},{id:"sync-4",connectionId:"conn-5",name:"Metrics Export",frequency:"DAILY",lastRunAt:"2024-01-14T09:00:00Z",status:"FAILED",recordsSynced:0}],rK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="IntegrationDashboard")throw Error("integrationDashboardMarkdownRenderer: not IntegrationDashboard");let Z=oH,K=fH,X=tH,$=s(Z,K,X),q=Z.filter((D)=>D.status==="ACTIVE"),G=K.filter((D)=>D.status==="CONNECTED"),W=K.filter((D)=>D.status==="ERROR"),O=X.filter((D)=>D.status==="SUCCESS").reduce((D,F)=>D+F.recordsSynced,0),U=["# Integration Hub","","> Connect and sync data with external services","","## Overview","","| Metric | Value |","|--------|-------|",`| Active Integrations | ${q.length} |`,`| Connected Services | ${G.length} |`,`| Error Connections | ${W.length} |`,`| Sync Configs | ${X.length} |`,`| Records Synced (24h) | ${O.toLocaleString()} |`,""];U.push("## Visualization Overview"),U.push("");for(let D of[...$.primaryItems,...$.comparisonItems])U.push(`- **${D.title}** via \`${D.spec.meta.key}\``);U.push(""),U.push("## Integrations"),U.push(""),U.push("| Name | Type | Connections | Status |"),U.push("|------|------|-------------|--------|");for(let D of Z){let F=D.status==="ACTIVE"?"\uD83D\uDFE2":"⚫";U.push(`| ${D.name} | ${D.type} | ${D.connectionCount} | ${F} ${D.status} |`)}U.push(""),U.push("## Recent Sync Activity"),U.push(""),U.push("| Sync | Frequency | Last Run | Records | Status |"),U.push("|------|-----------|----------|---------|--------|");for(let D of X){let F=new Date(D.lastRunAt).toLocaleString(),V=D.status==="SUCCESS"?"✅":"❌";U.push(`| ${D.name} | ${D.frequency} | ${F} | ${D.recordsSynced} | ${V} ${D.status} |`)}if(W.length>0){U.push(""),U.push("## ⚠️ Connections with Errors"),U.push("");for(let D of W){let F=Z.find((V)=>V.id===D.integrationId);U.push(`- **${D.name}** (${F?.name??"Unknown"}): ${D.error??"Unknown error"}`)}}return{mimeType:"text/markdown",body:U.join(`
6
- `)}}},iK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="ConnectionList")throw Error("connectionListMarkdownRenderer: not ConnectionList");let Z=fH,K=oH,X=["# Connections","","> Manage connections to external services",""];for(let $ of K){let q=Z.filter((G)=>G.integrationId===$.id);if(q.length===0)continue;X.push(`## ${$.name}`),X.push(""),X.push("| Connection | Status | Last Sync |"),X.push("|------------|--------|-----------|");for(let G of q){let W=new Date(G.lastSyncAt).toLocaleString(),A=G.status==="CONNECTED"?"\uD83D\uDFE2":G.status==="ERROR"?"\uD83D\uDD34":"⚫";X.push(`| ${G.name} | ${A} ${G.status} | ${W} |`)}X.push("")}return{mimeType:"text/markdown",body:X.join(`
7
- `)}}},oK={target:"markdown",render:async(H)=>{if(H.source.type!=="component"||H.source.componentKey!=="SyncConfigEditor")throw Error("syncConfigMarkdownRenderer: not SyncConfigEditor");let Z=tH,K=fH,X=["# Sync Configurations","","> Configure automated data synchronization",""];for(let $ of Z){let q=K.find((W)=>W.id===$.connectionId),G=$.status==="SUCCESS"?"✅":"❌";X.push(`## ${$.name}`),X.push(""),X.push(`**Connection:** ${q?.name??"Unknown"}`),X.push(`**Frequency:** ${$.frequency}`),X.push(`**Status:** ${G} ${$.status}`),X.push(`**Last Run:** ${new Date($.lastRunAt).toLocaleString()}`),X.push(`**Records Synced:** ${$.recordsSynced.toLocaleString()}`),X.push("")}return X.push("## Frequency Options"),X.push(""),X.push("- **REALTIME**: Sync on every change"),X.push("- **HOURLY**: Sync every hour"),X.push("- **DAILY**: Sync once per day"),X.push("- **WEEKLY**: Sync once per week"),X.push("- **MANUAL**: Sync only when triggered"),{mimeType:"text/markdown",body:X.join(`
8
- `)}}};export{LH as useIntegrationData,oK as syncConfigMarkdownRenderer,MX as runIntegrationHubMcpExampleFromEnv,rK as integrationDashboardMarkdownRenderer,dX as hasChanges,gX as createSyncEngine,s as createIntegrationVisualizationSections,KK as createIntegrationHandlers,iK as connectionListMarkdownRenderer,yX as computeChecksum,PH as TriggerSyncInputModel,NK as TriggerSyncContract,l as SyncStatusEnum,T as SyncRunModel,x as SyncDirectionEnum,r as SyncConfigModel,c as MappingTypeEnum,BH as ListSyncRunsOutputModel,WH as ListSyncRunsInputModel,AK as ListSyncRunsContract,dH as IntegrationVisualizationSpecs,oX as IntegrationVisualizationRegistry,tX as IntegrationVisualizationRefs,NH as IntegrationTypeVisualization,UH as IntegrationStatusEnum,u as IntegrationModel,zH as IntegrationHubChat,cK as IntegrationDashboard,FH as HealthySyncMetricVisualization,b as FieldMappingModel,DH as CreateSyncConfigInputModel,OK as CreateSyncConfigContract,JH as CreateIntegrationInputModel,$K as CreateIntegrationContract,$H as CreateConnectionInputModel,eH as CreateConnectionContract,AH as ConnectionStatusVisualization,KH as ConnectionStatusEnum,m as ConnectionModel,gH as BasicSyncEngine,SH as BasicFieldTransformer,_H as AttentionSyncMetricVisualization,GH as AddFieldMappingInputModel,LK as AddFieldMappingContract};
1
+ import{defineEnum as KK}from"@contractspec/lib.schema";var XK=KK("ConnectionStatus",["PENDING","CONNECTED","DISCONNECTED","ERROR","EXPIRED"]),ZK=KK("AuthType",["api_key","oauth2","bearer","header","basic","webhook_signing","service_account"]),$K=KK("TransportType",["rest","mcp","webhook","sdk"]);import{defineSchemaModel as jK,ScalarTypeEnum as N}from"@contractspec/lib.schema";var m=jK({name:"ConnectionModel",fields:{id:{type:N.String_unsecure(),isOptional:!1},integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.String_unsecure(),isOptional:!1},status:{type:XK,isOptional:!1},authType:{type:N.String_unsecure(),isOptional:!1},externalAccountName:{type:N.String_unsecure(),isOptional:!0},connectedAt:{type:N.DateTime(),isOptional:!0},lastHealthCheck:{type:N.DateTime(),isOptional:!0},healthStatus:{type:N.String_unsecure(),isOptional:!0},transport:{type:$K,isOptional:!0},authMethod:{type:ZK,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}}),QK=jK({name:"CreateConnectionInput",fields:{integrationId:{type:N.String_unsecure(),isOptional:!1},name:{type:N.NonEmptyString(),isOptional:!1},authType:{type:N.NonEmptyString(),isOptional:!1},credentials:{type:N.JSON(),isOptional:!0},transport:{type:$K,isOptional:!0},authMethod:{type:ZK,isOptional:!0},apiVersion:{type:N.String_unsecure(),isOptional:!0},ownershipMode:{type:N.String_unsecure(),isOptional:!0}}});import{defineCommand as aK}from"@contractspec/lib.contracts-spec/operations";var nK=["@example.integration-hub"],eK=aK({meta:{key:"integration.connection.create",version:"1.0.0",stability:"stable",owners:[...nK],tags:["integration","connection","create"],description:"Create a connection to an external system.",goal:"Authenticate with external systems.",context:"Connection setup."},io:{input:QK,output:m},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.connection.created",version:"1.0.0",when:"Connection created",payload:m}],audit:["integration.connection.created"]},acceptance:{scenarios:[{key:"create-connection-happy-path",given:["User is authenticated"],when:["User creates connection with valid credentials"],then:["Connection is created","ConnectionCreated event is emitted"]}],examples:[{key:"connect-crm",input:{name:"Salesforce Prod",integrationId:"salesforce",credentials:{clientId:"xxx"}},output:{id:"conn-123",status:"connected",connectedAt:"2025-01-01T12:00:00Z"}}]}});import{defineExample as KX}from"@contractspec/lib.contracts-spec/examples";var XX=KX({meta:{key:"examples.integration-hub",version:"1.0.0",title:"Integration Hub",description:"Integration Hub example with sync engine and field mappings for ContractSpec",kind:"template",visibility:"experimental",stability:"experimental",owners:["@contractspec-core"],tags:["package","examples","integration-hub"]},surfaces:{templates:!0,sandbox:{enabled:!0,modes:["playground","specs"]},studio:{enabled:!1,installable:!1},mcp:{enabled:!1}},entrypoints:{packageName:"@contractspec/example.integration-hub"}}),PZ=XX;import{web as ZX}from"@contractspec/lib.runtime-sandbox";var{generateId:p}=ZX;function hK(K){return{id:K.id,projectId:K.projectId,organizationId:K.organizationId,name:K.name,description:K.description??void 0,type:K.type,status:K.status,iconUrl:K.iconUrl??void 0,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function qK(K){return{id:K.id,integrationId:K.integrationId,name:K.name,status:K.status,credentials:K.credentials?JSON.parse(K.credentials):void 0,config:K.config?JSON.parse(K.config):void 0,lastSyncAt:K.lastSyncAt?new Date(K.lastSyncAt):void 0,errorMessage:K.errorMessage??void 0,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function HK(K){return{id:K.id,connectionId:K.connectionId,name:K.name,sourceEntity:K.sourceEntity,targetEntity:K.targetEntity,frequency:K.frequency,status:K.status,lastRunAt:K.lastRunAt?new Date(K.lastRunAt):void 0,lastRunStatus:K.lastRunStatus??void 0,recordsSynced:K.recordsSynced,createdAt:new Date(K.createdAt),updatedAt:new Date(K.updatedAt)}}function xK(K){return{id:K.id,syncConfigId:K.syncConfigId,sourceField:K.sourceField,targetField:K.targetField,transformType:K.transformType??void 0,transformConfig:K.transformConfig?JSON.parse(K.transformConfig):void 0,createdAt:new Date(K.createdAt)}}function $X(K){async function $(q){let{projectId:Y,type:P,status:B,search:_,limit:z=20,offset:M=0}=q,j="WHERE projectId = ?",f=[Y];if(P&&P!=="all")j+=" AND type = ?",f.push(P);if(B&&B!=="all")j+=" AND status = ?",f.push(B);if(_)j+=" AND name LIKE ?",f.push(`%${_}%`);let sK=(await K.query(`SELECT COUNT(*) as count FROM integration ${j}`,f)).rows[0]?.count??0;return{integrations:(await K.query(`SELECT * FROM integration ${j} ORDER BY name LIMIT ? OFFSET ?`,[...f,z,M])).rows.map(hK),total:sK}}async function X(q,Y){let P=p("integ"),B=new Date().toISOString();await K.execute(`INSERT INTO integration (id, projectId, organizationId, name, description, type, status, iconUrl, createdAt, updatedAt)
2
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[P,Y.projectId,Y.organizationId,q.name,q.description??null,q.type,"INACTIVE",q.iconUrl??null,B,B]);let _=(await K.query("SELECT * FROM integration WHERE id = ?",[P])).rows;return hK(_[0])}async function Z(q){let{integrationId:Y,status:P,limit:B=20,offset:_=0}=q,z="WHERE 1=1",M=[];if(Y)z+=" AND integrationId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await K.query(`SELECT COUNT(*) as count FROM integration_connection ${z}`,M)).rows[0]?.count??0;return{connections:(await K.query(`SELECT * FROM integration_connection ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(qK),total:f}}async function Q(q){let Y=p("conn"),P=new Date().toISOString();await K.execute(`INSERT INTO integration_connection (id, integrationId, name, status, credentials, config, createdAt, updatedAt)
3
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,[Y,q.integrationId,q.name,"PENDING",q.credentials?JSON.stringify(q.credentials):null,q.config?JSON.stringify(q.config):null,P,P]),await K.execute("UPDATE integration_connection SET status = 'CONNECTED', updatedAt = ? WHERE id = ?",[P,Y]),await K.execute("UPDATE integration SET status = 'ACTIVE', updatedAt = ? WHERE id = ?",[P,q.integrationId]);let B=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[Y])).rows;return qK(B[0])}async function H(q){let Y=new Date().toISOString();await K.execute("UPDATE integration_connection SET status = 'DISCONNECTED', updatedAt = ? WHERE id = ?",[Y,q]);let P=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[q])).rows;return qK(P[0])}async function G(q){let{connectionId:Y,status:P,limit:B=20,offset:_=0}=q,z="WHERE 1=1",M=[];if(Y)z+=" AND connectionId = ?",M.push(Y);if(P&&P!=="all")z+=" AND status = ?",M.push(P);let f=(await K.query(`SELECT COUNT(*) as count FROM integration_sync_config ${z}`,M)).rows[0]?.count??0;return{configs:(await K.query(`SELECT * FROM integration_sync_config ${z} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`,[...M,B,_])).rows.map(HK),total:f}}async function W(q){let Y=p("sync"),P=new Date().toISOString();await K.execute(`INSERT INTO integration_sync_config (id, connectionId, name, sourceEntity, targetEntity, frequency, status, recordsSynced, createdAt, updatedAt)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[Y,q.connectionId,q.name,q.sourceEntity,q.targetEntity,q.frequency??"DAILY","ACTIVE",0,P,P]);let B=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[Y])).rows;return HK(B[0])}async function A(q){let Y=new Date().toISOString(),P=[];await K.execute("DELETE FROM integration_field_mapping WHERE syncConfigId = ?",[q.syncConfigId]);for(let B of q.mappings){let _=p("fmap");await K.execute(`INSERT INTO integration_field_mapping (id, syncConfigId, sourceField, targetField, transformType, transformConfig, createdAt)
5
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,[_,q.syncConfigId,B.sourceField,B.targetField,B.transformType??null,B.transformConfig?JSON.stringify(B.transformConfig):null,Y]);let z=(await K.query("SELECT * FROM integration_field_mapping WHERE id = ?",[_])).rows;P.push(xK(z[0]))}return P}async function O(q){return(await K.query("SELECT * FROM integration_field_mapping WHERE syncConfigId = ?",[q])).rows.map(xK)}async function U(q){let Y=new Date().toISOString(),P=Math.floor(Math.random()*1000)+50;await K.execute("UPDATE integration_sync_config SET lastRunAt = ?, lastRunStatus = 'SUCCESS', recordsSynced = recordsSynced + ?, updatedAt = ? WHERE id = ?",[Y,P,Y,q]);let B=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[q])).rows;if(B[0])await K.execute("UPDATE integration_connection SET lastSyncAt = ?, updatedAt = ? WHERE id = ?",[Y,Y,B[0].connectionId]);let _=(await K.query("SELECT * FROM integration_sync_config WHERE id = ?",[q])).rows;return HK(_[0])}async function D(q){let Y=(await K.query("SELECT * FROM integration_connection WHERE id = ?",[q.connectionId])).rows;if(!Y[0])return{valid:!1,provider:"unknown",keyPrefix:"",error:`Connection ${q.connectionId} not found`};let P=q.providerKey.slice(0,8),B=q.providerKey.length>=16;return{valid:B,provider:Y[0].name,keyPrefix:`${P}...`,expiresAt:B?new Date(Date.now()+7776000000).toISOString():void 0,error:B?void 0:"Key must be at least 16 characters"}}async function F(q){let Y=new Date().toISOString();return await K.execute("UPDATE integration_connection SET updatedAt = ? WHERE id = ?",[Y,q.connectionId]),{refreshed:!0,expiresAt:new Date(Date.now()+3600000).toISOString(),tokenType:"Bearer",scopes:["read","write","sync"]}}async function V(q){return{integrationId:q.integrationId,transports:[{transport:"rest",supported:!0,defaultVersion:"v2"},{transport:"mcp",supported:!0,defaultVersion:"v1"},{transport:"webhook",supported:!0},{transport:"sdk",supported:!1}]}}return{listIntegrations:$,createIntegration:X,listConnections:Z,connectService:Q,disconnectService:H,listSyncConfigs:G,configureSync:W,mapFields:A,getFieldMappings:O,runSync:U,validateByokKey:D,refreshOAuth2Token:F,getTransportOptions:V}}import{defineEnum as QX}from"@contractspec/lib.schema";var UK=QX("IntegrationStatus",["DRAFT","ACTIVE","PAUSED","ERROR","ARCHIVED"]);import{defineSchemaModel as EK,ScalarTypeEnum as R}from"@contractspec/lib.schema";var u=EK({name:"IntegrationModel",fields:{id:{type:R.String_unsecure(),isOptional:!1},name:{type:R.String_unsecure(),isOptional:!1},slug:{type:R.String_unsecure(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.String_unsecure(),isOptional:!1},status:{type:UK,isOptional:!1},createdAt:{type:R.DateTime(),isOptional:!1}}}),JK=EK({name:"CreateIntegrationInput",fields:{name:{type:R.NonEmptyString(),isOptional:!1},slug:{type:R.NonEmptyString(),isOptional:!1},description:{type:R.String_unsecure(),isOptional:!0},provider:{type:R.NonEmptyString(),isOptional:!1},config:{type:R.JSON(),isOptional:!0},featureFlagKey:{type:R.String_unsecure(),isOptional:!0}}});import{defineCommand as qX}from"@contractspec/lib.contracts-spec/operations";var HX=qX({meta:{key:"integration.create",version:"1.0.0",stability:"stable",owners:["@example.integration-hub"],tags:["integration","create"],description:"Create a new integration.",goal:"Allow users to set up integrations with external systems.",context:"Integration setup."},io:{input:JK,output:u},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.created",version:"1.0.0",when:"Integration created",payload:u}],audit:["integration.created"]},acceptance:{scenarios:[{key:"create-integration-happy-path",given:["User is admin"],when:["User defines new integration type"],then:["Integration definition is created","IntegrationCreated event is emitted"]}],examples:[{key:"create-slack",input:{name:"Slack",category:"communication",authType:"oauth2"},output:{id:"slack",status:"active"}}]}});import{createMcpToolsets as UX}from"@contractspec/lib.ai-agent/tools/mcp-client";import{randomUUID as JX}from"crypto";var YX=["-y","@modelcontextprotocol/server-filesystem","."];async function jZ(){let K=GX(),$=vK(),X=DX(),Z=await UX([X],{onNameCollision:"error"});try{let Q=Object.keys(Z.tools).sort(),H={mode:K,server:{name:X.name,transport:$},authMethod:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_AUTH_METHOD,apiVersion:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_API_VERSION,tools:Q};if(K==="call"){let G=wK("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_NAME"),W=WX("CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_ARGS_JSON",{}),A=Z.tools[G];if(!A?.execute)throw Error(`Tool "${G}" was not found. Available tools: ${Q.join(", ")}`);let O=await A.execute(W,{toolCallId:`integration-hub-${JX()}`,messages:[]});H.toolCall={name:G,args:W,output:O}}return H}finally{await Z.cleanup().catch(()=>{return})}}function DX(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_NAME??"filesystem",$=vK(),X=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TOOL_PREFIX;if($==="stdio")return{name:K,transport:$,command:process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_COMMAND??"npx",args:PX("CONTRACTSPEC_INTEGRATION_HUB_MCP_ARGS_JSON",YX),toolPrefix:X};let Z=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN,Q=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_ACCESS_TOKEN_ENV;return{name:K,transport:$==="webhook"||$==="http"?"http":"sse",url:wK("CONTRACTSPEC_INTEGRATION_HUB_MCP_URL"),headers:BX("CONTRACTSPEC_INTEGRATION_HUB_MCP_HEADERS_JSON"),accessToken:Z,accessTokenEnvVar:Q,toolPrefix:X}}function GX(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE?.toLowerCase()??"list";if(K==="list"||K==="call")return K;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_MODE: ${K}. Use "list" or "call".`)}function vK(){let K=process.env.CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT?.toLowerCase()??"stdio";if(K==="stdio"||K==="http"||K==="sse"||K==="webhook")return K;throw Error(`Unsupported CONTRACTSPEC_INTEGRATION_HUB_MCP_TRANSPORT: ${K}. Use "stdio", "http", "sse", or "webhook".`)}function PX(K,$){if(!process.env[K])return $;let Z=TK(K);if(!Array.isArray(Z)||Z.some((Q)=>typeof Q!=="string"))throw Error(`${K} must be a JSON string array.`);return Z}function bK(K){if(!process.env[K])return;let X=TK(K);if(!OX(X))throw Error(`${K} must be a JSON object.`);return X}function WX(K,$){return bK(K)??$}function BX(K){let $=bK(K);if(!$)return;let X=Object.entries($);if(X.find(([,Q])=>typeof Q!=="string"))throw Error(`${K} must contain only string values.`);return Object.fromEntries(X)}function TK(K){let $=process.env[K];if(!$)return;try{return JSON.parse($)}catch{throw Error(`${K} contains invalid JSON.`)}}function wK(K){let $=process.env[K];if(!$)throw Error(`Missing required env var: ${K}`);return $}function OX(K){return typeof K==="object"&&K!==null&&!Array.isArray(K)}import{defineEnum as YK}from"@contractspec/lib.schema";var x=YK("SyncDirection",["INBOUND","OUTBOUND","BIDIRECTIONAL"]),l=YK("SyncStatus",["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED"]),c=YK("MappingType",["DIRECT","TRANSFORM","LOOKUP","CONSTANT","COMPUTED"]);import{defineSchemaModel as C,ScalarTypeEnum as J}from"@contractspec/lib.schema";var b=C({name:"FieldMappingModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.String_unsecure(),isOptional:!1},targetField:{type:J.String_unsecure(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!1}}}),r=C({name:"SyncConfigModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.String_unsecure(),isOptional:!1},targetObject:{type:J.String_unsecure(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!1},scheduleCron:{type:J.String_unsecure(),isOptional:!0},isActive:{type:J.Boolean(),isOptional:!1},lastSyncAt:{type:J.DateTime(),isOptional:!0},fieldMappings:{type:b,isArray:!0,isOptional:!0}}}),T=C({name:"SyncRunModel",fields:{id:{type:J.String_unsecure(),isOptional:!1},syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!1},direction:{type:x,isOptional:!1},trigger:{type:J.String_unsecure(),isOptional:!1},recordsProcessed:{type:J.Int_unsecure(),isOptional:!1},recordsCreated:{type:J.Int_unsecure(),isOptional:!1},recordsUpdated:{type:J.Int_unsecure(),isOptional:!1},recordsFailed:{type:J.Int_unsecure(),isOptional:!1},errorMessage:{type:J.String_unsecure(),isOptional:!0},startedAt:{type:J.DateTime(),isOptional:!0},completedAt:{type:J.DateTime(),isOptional:!0},createdAt:{type:J.DateTime(),isOptional:!1}}}),DK=C({name:"CreateSyncConfigInput",fields:{integrationId:{type:J.String_unsecure(),isOptional:!1},connectionId:{type:J.String_unsecure(),isOptional:!1},name:{type:J.NonEmptyString(),isOptional:!1},direction:{type:x,isOptional:!1},sourceObject:{type:J.NonEmptyString(),isOptional:!1},targetObject:{type:J.NonEmptyString(),isOptional:!1},scheduleEnabled:{type:J.Boolean(),isOptional:!0},scheduleCron:{type:J.String_unsecure(),isOptional:!0}}}),GK=C({name:"AddFieldMappingInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},sourceField:{type:J.NonEmptyString(),isOptional:!1},targetField:{type:J.NonEmptyString(),isOptional:!1},mappingType:{type:c,isOptional:!1},transformExpression:{type:J.String_unsecure(),isOptional:!0},lookupConfig:{type:J.JSON(),isOptional:!0},constantValue:{type:J.JSON(),isOptional:!0},isRequired:{type:J.Boolean(),isOptional:!0},defaultValue:{type:J.JSON(),isOptional:!0}}}),PK=C({name:"TriggerSyncInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},direction:{type:x,isOptional:!0},fullSync:{type:J.Boolean(),isOptional:!0}}}),WK=C({name:"ListSyncRunsInput",fields:{syncConfigId:{type:J.String_unsecure(),isOptional:!1},status:{type:l,isOptional:!0},limit:{type:J.Int_unsecure(),isOptional:!0,defaultValue:20},offset:{type:J.Int_unsecure(),isOptional:!0,defaultValue:0}}}),BK=C({name:"ListSyncRunsOutput",fields:{runs:{type:T,isArray:!0,isOptional:!1},total:{type:J.Int_unsecure(),isOptional:!1}}});import{defineCommand as OK,defineQuery as LX}from"@contractspec/lib.contracts-spec/operations";var i=["@example.integration-hub"],NX=OK({meta:{key:"integration.syncConfig.create",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","config","create"],description:"Create a sync configuration.",goal:"Define how data should be synchronized.",context:"Sync setup."},io:{input:DK,output:r},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.syncConfig.created",version:"1.0.0",when:"Sync config created",payload:r}],audit:["integration.syncConfig.created"]},acceptance:{scenarios:[{key:"create-sync-happy-path",given:["User is authenticated"],when:["User creates sync config"],then:["Sync config is created","SyncConfigCreated event is emitted"]}],examples:[{key:"create-contact-sync",input:{name:"Contacts Sync",sourceConnectionId:"conn-1",targetConnectionId:"conn-2"},output:{id:"sync-123",status:"active"}}]}}),AX=OK({meta:{key:"integration.fieldMapping.add",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","mapping","field"],description:"Add a field mapping to a sync config.",goal:"Map fields between systems.",context:"Mapping configuration."},io:{input:GK,output:b},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.fieldMapping.added",version:"1.0.0",when:"Mapping added",payload:b}]},acceptance:{scenarios:[{key:"add-mapping-happy-path",given:["Sync config exists"],when:["User adds field mapping"],then:["Mapping is added","FieldMappingAdded event is emitted"]}],examples:[{key:"map-email",input:{syncConfigId:"sync-123",sourceField:"email",targetField:"user_email"},output:{id:"map-456",type:"string"}}]}}),FX=OK({meta:{key:"integration.sync.trigger",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","trigger"],description:"Trigger a manual sync.",goal:"Start data synchronization.",context:"Manual sync or webhook trigger."},io:{input:PK,output:T},policy:{auth:"user"},sideEffects:{emits:[{key:"integration.sync.started",version:"1.0.0",when:"Sync starts",payload:T}],audit:["integration.sync.triggered"]},acceptance:{scenarios:[{key:"trigger-sync-happy-path",given:["Sync config exists"],when:["User triggers sync"],then:["Sync run starts","SyncStarted event is emitted"]}],examples:[{key:"manual-trigger",input:{syncConfigId:"sync-123"},output:{id:"run-789",status:"pending"}}]}}),_X=LX({meta:{key:"integration.syncRun.list",version:"1.0.0",stability:"stable",owners:[...i],tags:["integration","sync","run","list"],description:"List sync run history.",goal:"View sync history and status.",context:"Sync monitoring."},io:{input:WK,output:BK},policy:{auth:"user"},acceptance:{scenarios:[{key:"list-runs-happy-path",given:["User has access to syncs"],when:["User lists sync runs"],then:["List of runs is returned"]}],examples:[{key:"list-recent",input:{limit:10},output:{items:[],total:50}}]}});class SK{transform(K,$){try{if($.startsWith("uppercase"))return typeof K==="string"?K.toUpperCase():K;if($.startsWith("lowercase"))return typeof K==="string"?K.toLowerCase():K;if($.startsWith("trim"))return typeof K==="string"?K.trim():K;if($.startsWith("default:")){let X=$.replace("default:","");return K??JSON.parse(X)}if($.startsWith("concat:")){let X=$.replace("concat:","")||" ";if(Array.isArray(K))return K.join(X);return K}if($.startsWith("split:")){let X=$.replace("split:","")||",";if(typeof K==="string")return K.split(X);return K}if($.startsWith("number"))return Number(K);if($.startsWith("boolean"))return Boolean(K);if($.startsWith("string"))return String(K);return K}catch{return K}}}class gK{transformer;constructor(K){this.transformer=K??new SK}async sync(K){return{success:!0,recordsProcessed:0,recordsCreated:0,recordsUpdated:0,recordsDeleted:0,recordsFailed:0,recordsSkipped:0,errors:[]}}transformRecord(K,$,X){let Z={};for(let Q of $){let H,G;switch(Q.mappingType){case"DIRECT":H=this.getNestedValue(K.data,Q.sourceField);break;case"TRANSFORM":G=this.getNestedValue(K.data,Q.sourceField),H=Q.transformExpression?this.transformer.transform(G,Q.transformExpression):G;break;case"CONSTANT":H=Q.constantValue;break;case"LOOKUP":H=this.getNestedValue(K.data,Q.sourceField);break;case"COMPUTED":H=Q.transformExpression?this.evaluateComputed(K.data,Q.transformExpression):null;break;default:H=this.getNestedValue(K.data,Q.sourceField)}if(H===void 0||H===null)H=Q.defaultValue;this.setNestedValue(Z,Q.targetField,H)}return{id:K.id,data:Z}}validateRecord(K,$){let X=[];for(let Z of $)if(Z.isRequired){let Q=this.getNestedValue(K.data,Z.targetField);if(Q===void 0||Q===null)X.push({recordId:K.id,field:Z.targetField,message:`Required field ${Z.targetField} is missing`,code:"REQUIRED_FIELD_MISSING"})}return{valid:X.length===0,errors:X}}getNestedValue(K,$){let X=$.split("."),Z=K;for(let Q of X){if(Z===null||Z===void 0)return;Z=Z[Q]}return Z}setNestedValue(K,$,X){let Z=$.split("."),Q=K;for(let G=0;G<Z.length-1;G++){let W=Z[G];if(W===void 0)continue;if(!(W in Q))Q[W]={};Q=Q[W]}let H=Z[Z.length-1];if(H!==void 0)Q[H]=X}evaluateComputed(K,$){try{return $.replace(/\$\{([^}]+)\}/g,(Z,Q)=>{let H=this.getNestedValue(K,Q);return String(H??"")})}catch{return null}}}function uZ(K){return new gK(K)}function lZ(K){let $=JSON.stringify(K,Object.keys(K).sort()),X=0;for(let Z=0;Z<$.length;Z++){let Q=$.charCodeAt(Z);X=(X<<5)-X+Q,X=X&X}return X.toString(16)}function cZ(K,$){if(!K||!$)return!0;return K!==$}import{useTemplateRuntime as zX}from"@contractspec/lib.example-shared-ui";import{useCallback as RX,useEffect as VX,useState as w}from"react";function LK(K="local-project"){let{handlers:$}=zX(),X=$.integration,[Z,Q]=w([]),[H,G]=w([]),[W,A]=w([]),[O,U]=w(!0),[D,F]=w(null),V=RX(async()=>{try{U(!0),F(null);let[Y,P,B]=await Promise.all([X.listIntegrations({projectId:K,limit:100}),X.listConnections({limit:100}),X.listSyncConfigs({limit:100})]);Q(Y.integrations),G(P.connections),A(B.configs)}catch(Y){F(Y instanceof Error?Y:Error("Failed to load integrations"))}finally{U(!1)}},[X,K]);VX(()=>{V()},[V]);let q={totalIntegrations:Z.length,activeIntegrations:Z.filter((Y)=>Y.status==="ACTIVE").length,totalConnections:H.length,connectedCount:H.filter((Y)=>Y.status==="CONNECTED").length,totalSyncs:W.length,activeSyncs:W.filter((Y)=>Y.status==="ACTIVE").length};return{integrations:Z,connections:H,syncConfigs:W,loading:O,error:D,stats:q,refetch:V}}import{defineVisualization as o,VisualizationRegistry as MX}from"@contractspec/lib.contracts-spec/visualizations";var IX={key:"integration.list",version:"1.0.0"},kX={key:"integration.connection.list",version:"1.0.0"},yK={key:"integration.syncConfig.list",version:"1.0.0"},t={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},NK=o({meta:{...t,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:IX,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),AK=o({meta:{...t,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:kX,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),FK=o({meta:{...t,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:yK,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),_K=o({meta:{...t,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:yK,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),dK=[NK,AK,FK,_K],eZ=new MX([...dK]),K0=dK.map((K)=>({key:K.meta.key,version:K.meta.version}));function fX(K){return K==="ACTIVE"||K==="SUCCESS"}function s(K,$,X){let Z=new Map,Q=new Map,H=0,G=0;for(let O of K)Z.set(O.type,(Z.get(O.type)??0)+1);for(let O of $)Q.set(O.status,(Q.get(O.status)??0)+1);for(let O of X)if(fX(O.status))H+=1;else G+=1;return{primaryItems:[{key:"integration-types",spec:NK,data:{data:Array.from(Z.entries()).map(([O,U])=>({type:O,count:U}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:AK,data:{data:Array.from(Q.entries()).map(([O,U])=>({status:O,count:U}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:FK,data:{data:[{value:H}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:_K,data:{data:[{value:G}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{ComparisonView as CX,VisualizationCard as jX,VisualizationGrid as hX}from"@contractspec/lib.design-system";import{jsx as S,jsxs as mK}from"react/jsx-runtime";function pK({integrations:K,connections:$,syncConfigs:X}){let{primaryItems:Z,comparisonItems:Q}=s(K,$,X);return mK("section",{className:"space-y-4",children:[mK("div",{children:[S("h3",{className:"font-semibold text-lg",children:"Integration Visualizations"}),S("p",{className:"text-muted-foreground text-sm",children:"Contract-backed charts for integration coverage and sync health."})]}),S(hX,{children:Z.map((H)=>S(jX,{data:H.data,description:H.description,height:H.height,spec:H.spec,title:H.title},H.key))}),S(CX,{description:"Comparison surface for healthy versus attention-needed syncs.",items:Q,title:"Sync-State Comparison"})]})}import{ChatWithSidebar as xX}from"@contractspec/module.ai-chat";import{jsx as uK}from"react/jsx-runtime";var EX=["List my integrations","Show sync status","Add a connection"],vX="You are an Integration Hub assistant. Help users manage integrations, connections, and sync configurations. When asked about integrations, connections, or syncs, provide clear, actionable guidance.";function zK({proxyUrl:K="/api/chat",mcpServers:$,thinkingLevel:X="thinking",suggestions:Z=EX,systemPrompt:Q=vX,className:H}){return uK("div",{className:H??"flex h-[500px] flex-col",children:uK(xX,{className:"flex-1",systemPrompt:Q,proxyUrl:K,mcpServers:$,thinkingLevel:X,suggestions:Z,showSuggestionsWhenEmpty:!0})})}import{Button as a}from"@contractspec/lib.design-system";import{Badge as lK}from"@contractspec/lib.ui-kit-web/ui/badge";import{HStack as bX}from"@contractspec/lib.ui-kit-web/ui/stack";import{jsx as E,jsxs as wX}from"react/jsx-runtime";var TX={ACTIVE:"default",CONNECTED:"default",SUCCESS:"default",PENDING:"secondary",PAUSED:"secondary",ERROR:"destructive",DISCONNECTED:"outline"};function g(K){return K?K.toLocaleString():"Never"}function RK(K){return K?JSON.stringify(K,null,2):"No configuration"}function n({status:K}){return E(lK,{variant:TX[K]??"outline",children:K})}function e({controller:K,label:$,toggleColumnId:X,toggleVisibleLabel:Z,toggleHiddenLabel:Q,pinColumnId:H,pinLabel:G,resizeColumnId:W,resizeLabel:A}){let O=K.rows[0],U=K.columns.find((q)=>q.id===X),D=K.columns.find((q)=>q.id===H),F=K.columns.find((q)=>q.id===W),V=D?.pinState==="left"?!1:"left";return wX(bX,{gap:"sm",className:"flex-wrap",children:[E(lK,{variant:"outline",children:$}),E(a,{variant:"outline",size:"sm",onPress:()=>O?.toggleExpanded?.(!O?.isExpanded),children:"Expand First Row"}),E(a,{variant:"outline",size:"sm",onPress:()=>U?.toggleVisibility?.(!U?.visible),children:U?.visible?Z:Q}),E(a,{variant:"outline",size:"sm",onPress:()=>D?.pin?.(V),children:D?.pinState==="left"?`Unpin ${G}`:`Pin ${G}`}),E(a,{variant:"outline",size:"sm",onPress:()=>F?.resizeBy?.(40),children:A})]})}import{DataTable as SX}from"@contractspec/lib.design-system";import{useContractTable as gX}from"@contractspec/lib.presentation-runtime-react";import{VStack as cK}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as y}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as k,jsxs as VK}from"react/jsx-runtime";function MK({connections:K}){let $=gX({data:K,columns:[{id:"connection",header:"Connection",label:"Connection",accessor:(X)=>X.name,cell:({item:X})=>VK(cK,{gap:"xs",children:[k(y,{className:"font-medium text-sm",children:X.name}),VK(y,{className:"text-muted-foreground text-xs",children:["Created ",X.createdAt.toLocaleDateString()]})]}),size:240,minSize:180,canSort:!0,canPin:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:X})=>k(n,{status:String(X)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"lastSyncAt",header:"Last Sync",label:"Last Sync",accessor:(X)=>X.lastSyncAt?.getTime()??0,cell:({item:X})=>g(X.lastSyncAt),size:200,canSort:!0,canHide:!0,canResize:!0},{id:"errorMessage",header:"Errors",label:"Errors",accessor:(X)=>X.errorMessage??"",cell:({value:X})=>String(X||"No errors"),size:240,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{errorMessage:!1},columnPinning:{left:["connection"],right:[]}},renderExpandedContent:(X)=>VK(cK,{gap:"sm",className:"py-2",children:[k(y,{className:"font-medium text-sm",children:"Credentials"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RK(X.credentials)}),k(y,{className:"font-medium text-sm",children:"Config"}),k("pre",{className:"overflow-auto rounded-md bg-muted/40 p-3 text-xs",children:RK(X.config)}),k(y,{className:"text-muted-foreground text-sm",children:X.errorMessage??"No sync errors recorded."})]}),getCanExpand:()=>!0});return k(SX,{controller:$,title:"Connections",description:"Client-mode ContractSpec table with visibility, pinning, resizing, and expanded diagnostics.",toolbar:k(e,{controller:$,label:`${K.length} total connections`,toggleColumnId:"errorMessage",toggleVisibleLabel:"Hide Error Column",toggleHiddenLabel:"Show Error Column",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"connection",resizeLabel:"Widen Connection"}),emptyState:k("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No connections found"})})}import{DataTable as yX}from"@contractspec/lib.design-system";import{useContractTable as dX}from"@contractspec/lib.presentation-runtime-react";import{VStack as rK}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as v}from"@contractspec/lib.ui-kit-web/ui/text";import{jsx as d,jsxs as h}from"react/jsx-runtime";function IK({syncConfigs:K}){let $=dX({data:K,columns:[{id:"sync",header:"Sync Config",label:"Sync Config",accessor:(X)=>X.name,cell:({item:X})=>h(rK,{gap:"xs",children:[d(v,{className:"font-medium text-sm",children:X.name}),h(v,{className:"text-muted-foreground text-xs",children:[X.sourceEntity," → ",X.targetEntity]})]}),size:260,minSize:200,canSort:!0,canPin:!0,canResize:!0},{id:"frequency",header:"Frequency",label:"Frequency",accessorKey:"frequency",size:160,canSort:!0,canHide:!0,canResize:!0},{id:"status",header:"Status",label:"Status",accessorKey:"status",cell:({value:X})=>d(n,{status:String(X)}),size:150,canSort:!0,canPin:!0,canResize:!0},{id:"recordsSynced",header:"Records",label:"Records",accessorKey:"recordsSynced",align:"right",size:140,canSort:!0,canResize:!0},{id:"lastRunAt",header:"Last Run",label:"Last Run",accessor:(X)=>X.lastRunAt?.getTime()??0,cell:({item:X})=>g(X.lastRunAt),size:200,canSort:!0,canHide:!0,canResize:!0}],initialState:{pagination:{pageIndex:0,pageSize:3},columnVisibility:{lastRunAt:!1},columnPinning:{left:["sync"],right:[]}},renderExpandedContent:(X)=>h(rK,{gap:"sm",className:"py-2",children:[h(v,{className:"text-muted-foreground text-sm",children:["Connection ",X.connectionId]}),h(v,{className:"text-muted-foreground text-sm",children:["Last run: ",g(X.lastRunAt)]}),h(v,{className:"text-muted-foreground text-sm",children:["Last status: ",X.lastRunStatus??"No runs recorded"]}),h(v,{className:"text-muted-foreground text-sm",children:["Updated ",X.updatedAt.toLocaleString()]})]}),getCanExpand:()=>!0});return d(yX,{controller:$,title:"Sync Configs",description:"Shared table primitives applied to sync monitoring without changing the surrounding dashboard layout.",toolbar:d(e,{controller:$,label:`${K.length} syncs`,toggleColumnId:"lastRunAt",toggleVisibleLabel:"Hide Last Run",toggleHiddenLabel:"Show Last Run",pinColumnId:"status",pinLabel:"Status",resizeColumnId:"sync",resizeLabel:"Widen Sync"}),emptyState:d("div",{className:"rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",children:"No sync configurations found"})})}import{Button as iK,ErrorState as mX,LoaderBlock as pX,StatCard as kK,StatCardGroup as uX}from"@contractspec/lib.design-system";import{useState as lX}from"react";import{jsx as L,jsxs as I}from"react/jsx-runtime";var cX={ACTIVE:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",INACTIVE:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",CONNECTED:"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",DISCONNECTED:"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400",PENDING:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",ERROR:"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400",PAUSED:"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"},rX={CRM:"\uD83D\uDCCA",MARKETING:"\uD83D\uDCE3",PAYMENT:"\uD83D\uDCB3",COMMUNICATION:"\uD83D\uDCAC",DATA:"\uD83D\uDDC4️",CUSTOM:"⚙️"};function iX(){let[K,$]=lX("integrations"),{integrations:X,connections:Z,syncConfigs:Q,loading:H,error:G,stats:W,refetch:A}=LK(),O=[{id:"integrations",label:"Integrations",icon:"\uD83D\uDD0C"},{id:"connections",label:"Connections",icon:"\uD83D\uDD17"},{id:"syncs",label:"Sync Configs",icon:"\uD83D\uDD04"},{id:"chat",label:"Chat",icon:"\uD83D\uDCAC"}];if(H)return L(pX,{label:"Loading Integrations..."});if(G)return L(mX,{title:"Failed to load Integrations",description:G.message,onRetry:A,retryLabel:"Retry"});return I("div",{className:"space-y-6",children:[I("div",{className:"flex items-center justify-between",children:[L("h2",{className:"font-bold text-2xl",children:"Integration Hub"}),I(iK,{onClick:()=>alert("Add integration modal"),children:[L("span",{className:"mr-2",children:"+"})," Add Integration"]})]}),I(uX,{children:[L(kK,{label:"Integrations",value:W.totalIntegrations,hint:`${W.activeIntegrations} active`}),L(kK,{label:"Connections",value:W.totalConnections,hint:`${W.connectedCount} connected`}),L(kK,{label:"Syncs",value:W.totalSyncs,hint:`${W.activeSyncs} active`})]}),L(pK,{connections:Z,integrations:X,syncConfigs:Q}),L("nav",{className:"flex gap-1 rounded-lg bg-muted p-1",role:"tablist",children:O.map((U)=>I(iK,{type:"button",role:"tab","aria-selected":K===U.id,onClick:()=>$(U.id),className:`flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 font-medium text-sm transition-colors ${K===U.id?"bg-background text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:[L("span",{children:U.icon}),U.label]},U.id))}),I("div",{className:"min-h-[400px]",role:"tabpanel",children:[K==="integrations"&&I("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[X.map((U)=>I("div",{className:"cursor-pointer rounded-lg border border-border bg-card p-4 transition-colors hover:bg-muted/50",children:[I("div",{className:"mb-3 flex items-center gap-3",children:[L("span",{className:"text-2xl",children:rX[U.type]??"⚙️"}),I("div",{children:[L("h3",{className:"font-medium",children:U.name}),L("p",{className:"text-muted-foreground text-sm",children:U.type})]})]}),I("div",{className:"flex items-center justify-between",children:[L("span",{className:`inline-flex rounded-full px-2 py-0.5 font-medium text-xs ${cX[U.status]??""}`,children:U.status}),L("span",{className:"text-muted-foreground text-xs",children:U.createdAt.toLocaleDateString()})]})]},U.id)),X.length===0&&L("div",{className:"col-span-full flex h-64 items-center justify-center text-muted-foreground",children:"No integrations configured"})]}),K==="connections"&&L(MK,{connections:Z}),K==="chat"&&L(zK,{proxyUrl:"/api/chat",thinkingLevel:"thinking",suggestions:["List my integrations","Show sync status","Add a connection"],className:"min-h-[400px]"}),K==="syncs"&&L(IK,{syncConfigs:Q})]})]})}var oK=[{id:"int-1",name:"Salesforce",type:"CRM",status:"ACTIVE",connectionCount:3},{id:"int-2",name:"HubSpot",type:"MARKETING",status:"ACTIVE",connectionCount:2},{id:"int-3",name:"Stripe",type:"PAYMENT",status:"ACTIVE",connectionCount:1},{id:"int-4",name:"Slack",type:"COMMUNICATION",status:"INACTIVE",connectionCount:0},{id:"int-5",name:"Google Sheets",type:"DATA",status:"ACTIVE",connectionCount:5},{id:"int-6",name:"PostHog",type:"ANALYTICS",status:"ACTIVE",connectionCount:1}],fK=[{id:"conn-1",integrationId:"int-1",name:"Production Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-16T10:00:00Z"},{id:"conn-2",integrationId:"int-1",name:"Sandbox Salesforce",status:"CONNECTED",lastSyncAt:"2024-01-15T14:00:00Z"},{id:"conn-3",integrationId:"int-2",name:"Marketing HubSpot",status:"CONNECTED",lastSyncAt:"2024-01-16T08:00:00Z"},{id:"conn-4",integrationId:"int-3",name:"Stripe Live",status:"CONNECTED",lastSyncAt:"2024-01-16T12:00:00Z"},{id:"conn-5",integrationId:"int-5",name:"Analytics Sheet",status:"ERROR",lastSyncAt:"2024-01-14T09:00:00Z",error:"Authentication expired"},{id:"conn-6",integrationId:"int-6",name:"PostHog Workspace",status:"CONNECTED",lastSyncAt:"2024-01-16T11:45:00Z"}],tK=[{id:"sync-1",connectionId:"conn-1",name:"Contacts Sync",frequency:"HOURLY",lastRunAt:"2024-01-16T10:00:00Z",status:"SUCCESS",recordsSynced:1250},{id:"sync-2",connectionId:"conn-1",name:"Opportunities Sync",frequency:"DAILY",lastRunAt:"2024-01-16T00:00:00Z",status:"SUCCESS",recordsSynced:340},{id:"sync-3",connectionId:"conn-3",name:"Orders Sync",frequency:"REALTIME",lastRunAt:"2024-01-16T12:30:00Z",status:"SUCCESS",recordsSynced:89},{id:"sync-4",connectionId:"conn-5",name:"Metrics Export",frequency:"DAILY",lastRunAt:"2024-01-14T09:00:00Z",status:"FAILED",recordsSynced:0}],oX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="IntegrationDashboard")throw Error("integrationDashboardMarkdownRenderer: not IntegrationDashboard");let $=oK,X=fK,Z=tK,Q=s($,X,Z),H=$.filter((D)=>D.status==="ACTIVE"),G=X.filter((D)=>D.status==="CONNECTED"),W=X.filter((D)=>D.status==="ERROR"),O=Z.filter((D)=>D.status==="SUCCESS").reduce((D,F)=>D+F.recordsSynced,0),U=["# Integration Hub","","> Connect and sync data with external services","","## Overview","","| Metric | Value |","|--------|-------|",`| Active Integrations | ${H.length} |`,`| Connected Services | ${G.length} |`,`| Error Connections | ${W.length} |`,`| Sync Configs | ${Z.length} |`,`| Records Synced (24h) | ${O.toLocaleString()} |`,""];U.push("## Visualization Overview"),U.push("");for(let D of[...Q.primaryItems,...Q.comparisonItems])U.push(`- **${D.title}** via \`${D.spec.meta.key}\``);U.push(""),U.push("## Integrations"),U.push(""),U.push("| Name | Type | Connections | Status |"),U.push("|------|------|-------------|--------|");for(let D of $){let F=D.status==="ACTIVE"?"\uD83D\uDFE2":"⚫";U.push(`| ${D.name} | ${D.type} | ${D.connectionCount} | ${F} ${D.status} |`)}U.push(""),U.push("## Recent Sync Activity"),U.push(""),U.push("| Sync | Frequency | Last Run | Records | Status |"),U.push("|------|-----------|----------|---------|--------|");for(let D of Z){let F=new Date(D.lastRunAt).toLocaleString(),V=D.status==="SUCCESS"?"✅":"❌";U.push(`| ${D.name} | ${D.frequency} | ${F} | ${D.recordsSynced} | ${V} ${D.status} |`)}if(W.length>0){U.push(""),U.push("## ⚠️ Connections with Errors"),U.push("");for(let D of W){let F=$.find((V)=>V.id===D.integrationId);U.push(`- **${D.name}** (${F?.name??"Unknown"}): ${D.error??"Unknown error"}`)}}return{mimeType:"text/markdown",body:U.join(`
6
+ `)}}},tX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="ConnectionList")throw Error("connectionListMarkdownRenderer: not ConnectionList");let $=fK,X=oK,Z=["# Connections","","> Manage connections to external services",""];for(let Q of X){let H=$.filter((G)=>G.integrationId===Q.id);if(H.length===0)continue;Z.push(`## ${Q.name}`),Z.push(""),Z.push("| Connection | Status | Last Sync |"),Z.push("|------------|--------|-----------|");for(let G of H){let W=new Date(G.lastSyncAt).toLocaleString(),A=G.status==="CONNECTED"?"\uD83D\uDFE2":G.status==="ERROR"?"\uD83D\uDD34":"⚫";Z.push(`| ${G.name} | ${A} ${G.status} | ${W} |`)}Z.push("")}return{mimeType:"text/markdown",body:Z.join(`
7
+ `)}}},sX={target:"markdown",render:async(K)=>{if(K.source.type!=="component"||K.source.componentKey!=="SyncConfigEditor")throw Error("syncConfigMarkdownRenderer: not SyncConfigEditor");let $=tK,X=fK,Z=["# Sync Configurations","","> Configure automated data synchronization",""];for(let Q of $){let H=X.find((W)=>W.id===Q.connectionId),G=Q.status==="SUCCESS"?"✅":"❌";Z.push(`## ${Q.name}`),Z.push(""),Z.push(`**Connection:** ${H?.name??"Unknown"}`),Z.push(`**Frequency:** ${Q.frequency}`),Z.push(`**Status:** ${G} ${Q.status}`),Z.push(`**Last Run:** ${new Date(Q.lastRunAt).toLocaleString()}`),Z.push(`**Records Synced:** ${Q.recordsSynced.toLocaleString()}`),Z.push("")}return Z.push("## Frequency Options"),Z.push(""),Z.push("- **REALTIME**: Sync on every change"),Z.push("- **HOURLY**: Sync every hour"),Z.push("- **DAILY**: Sync once per day"),Z.push("- **WEEKLY**: Sync once per week"),Z.push("- **MANUAL**: Sync only when triggered"),{mimeType:"text/markdown",body:Z.join(`
8
+ `)}}};export{LK as useIntegrationData,sX as syncConfigMarkdownRenderer,jZ as runIntegrationHubMcpExampleFromEnv,oX as integrationDashboardMarkdownRenderer,cZ as hasChanges,uZ as createSyncEngine,s as createIntegrationVisualizationSections,$X as createIntegrationHandlers,tX as connectionListMarkdownRenderer,lZ as computeChecksum,PK as TriggerSyncInputModel,FX as TriggerSyncContract,l as SyncStatusEnum,T as SyncRunModel,x as SyncDirectionEnum,r as SyncConfigModel,c as MappingTypeEnum,BK as ListSyncRunsOutputModel,WK as ListSyncRunsInputModel,_X as ListSyncRunsContract,dK as IntegrationVisualizationSpecs,eZ as IntegrationVisualizationRegistry,K0 as IntegrationVisualizationRefs,NK as IntegrationTypeVisualization,UK as IntegrationStatusEnum,u as IntegrationModel,zK as IntegrationHubChat,iX as IntegrationDashboard,FK as HealthySyncMetricVisualization,b as FieldMappingModel,XX as ExamplesIntegrationHubExample,DK as CreateSyncConfigInputModel,NX as CreateSyncConfigContract,JK as CreateIntegrationInputModel,HX as CreateIntegrationContract,QK as CreateConnectionInputModel,eK as CreateConnectionContract,AK as ConnectionStatusVisualization,XK as ConnectionStatusEnum,m as ConnectionModel,gK as BasicSyncEngine,SK as BasicFieldTransformer,_K as AttentionSyncMetricVisualization,GK as AddFieldMappingInputModel,AX as AddFieldMappingContract};
@@ -1 +1 @@
1
- import{defineVisualization as j,VisualizationRegistry as v}from"@contractspec/lib.contracts-spec/visualizations";var L={key:"integration.list",version:"1.0.0"},Y={key:"integration.connection.list",version:"1.0.0"},W={key:"integration.syncConfig.list",version:"1.0.0"},k={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},D=j({meta:{...k,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:L,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),J=j({meta:{...k,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:Y,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),K=j({meta:{...k,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),P=j({meta:{...k,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),X=[D,J,K,P],f=new v([...X]),Z=X.map((x)=>({key:x.meta.key,version:x.meta.version}));function G(x){return x==="ACTIVE"||x==="SUCCESS"}function F(x,$,b){let q=new Map,w=new Map,Q=0,U=0;for(let m of x)q.set(m.type,(q.get(m.type)??0)+1);for(let m of $)w.set(m.status,(w.get(m.status)??0)+1);for(let m of b)if(G(m.status))Q+=1;else U+=1;return{primaryItems:[{key:"integration-types",spec:D,data:{data:Array.from(q.entries()).map(([m,B])=>({type:m,count:B}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:J,data:{data:Array.from(w.entries()).map(([m,B])=>({status:m,count:B}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:K,data:{data:[{value:Q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:P,data:{data:[{value:U}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{defineFeature as H}from"@contractspec/lib.contracts-spec";var p=H({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Connect and sync data with external systems through configurable integrations",domain:"integration",owners:["@integration-team"],tags:["integration","sync","etl","connectors"],stability:"experimental"},operations:[{key:"integration.create",version:"1.0.0"},{key:"integration.connection.create",version:"1.0.0"},{key:"integration.syncConfig.create",version:"1.0.0"},{key:"integration.fieldMapping.add",version:"1.0.0"},{key:"integration.sync.trigger",version:"1.0.0"},{key:"integration.syncRun.list",version:"1.0.0"}],events:[{key:"integration.created",version:"1.0.0"},{key:"integration.connection.created",version:"1.0.0"},{key:"integration.connection.statusChanged",version:"1.0.0"},{key:"integration.syncConfig.created",version:"1.0.0"},{key:"integration.sync.started",version:"1.0.0"},{key:"integration.sync.completed",version:"1.0.0"},{key:"integration.sync.failed",version:"1.0.0"},{key:"integration.record.synced",version:"1.0.0"},{key:"integration.fieldMapping.added",version:"1.0.0"}],presentations:[{key:"integration.list",version:"1.0.0"},{key:"integration.detail",version:"1.0.0"},{key:"integration.connection.list",version:"1.0.0"},{key:"integration.connection.setup",version:"1.0.0"},{key:"integration.syncConfig.list",version:"1.0.0"},{key:"integration.syncConfig.editor",version:"1.0.0"},{key:"integration.fieldMapping.editor",version:"1.0.0"},{key:"integration.syncRun.viewList",version:"1.0.0"},{key:"integration.syncRun.detail",version:"1.0.0"},{key:"integration.health",version:"1.0.0"},{key:"integration.sync.activity",version:"1.0.0"}],opToPresentation:[{op:{key:"integration.syncConfig.create",version:"1.0.0"},pres:{key:"integration.syncConfig.editor",version:"1.0.0"}},{op:{key:"integration.fieldMapping.add",version:"1.0.0"},pres:{key:"integration.fieldMapping.editor",version:"1.0.0"}},{op:{key:"integration.syncRun.list",version:"1.0.0"},pres:{key:"integration.syncRun.viewList",version:"1.0.0"}}],presentationsTargets:[{key:"integration.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.detail",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.editor",version:"1.0.0",targets:["react"]},{key:"integration.fieldMapping.editor",version:"1.0.0",targets:["react"]},{key:"integration.syncRun.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncRun.detail",version:"1.0.0",targets:["react","markdown"]}],visualizations:Z,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"},{key:"jobs",version:"1.0.0"},{key:"files",version:"1.0.0"}],provides:[{key:"integration",version:"1.0.0"},{key:"sync",version:"1.0.0"},{key:"etl",version:"1.0.0"}]},integrations:[{key:"integration-hub.integration.default-connector",version:"1.0.0"}],telemetry:[{key:"integration-hub.telemetry",version:"1.0.0"}],jobs:[{key:"integration-hub.job.sync-run",version:"1.0.0"},{key:"integration-hub.job.health-check",version:"1.0.0"}],docs:["docs.examples.integration-hub","docs.examples.integration-hub.goal","docs.examples.integration-hub.usage","docs.examples.integration-hub.constraints"]});export{p as IntegrationHubFeature};
1
+ import{defineVisualization as j,VisualizationRegistry as v}from"@contractspec/lib.contracts-spec/visualizations";var L={key:"integration.list",version:"1.0.0"},Y={key:"integration.connection.list",version:"1.0.0"},W={key:"integration.syncConfig.list",version:"1.0.0"},k={version:"1.0.0",domain:"integration",stability:"experimental",owners:["@example.integration-hub"],tags:["integration","visualization","sync"]},D=j({meta:{...k,key:"integration-hub.visualization.integration-types",title:"Integration Types",description:"Distribution of configured integration categories.",goal:"Show where integration coverage is concentrated.",context:"Integration overview."},source:{primary:L,resultPath:"data"},visualization:{kind:"pie",nameDimension:"type",valueMeasure:"count",dimensions:[{key:"type",label:"Type",dataPath:"type",type:"category"}],measures:[{key:"count",label:"Count",dataPath:"count",format:"number"}],table:{caption:"Integration counts by type."}}}),J=j({meta:{...k,key:"integration-hub.visualization.connection-status",title:"Connection Status",description:"Status distribution across configured connections.",goal:"Highlight connection health and instability.",context:"Connection monitoring."},source:{primary:Y,resultPath:"data"},visualization:{kind:"cartesian",variant:"bar",xDimension:"status",yMeasures:["count"],dimensions:[{key:"status",label:"Status",dataPath:"status",type:"category"}],measures:[{key:"count",label:"Connections",dataPath:"count",format:"number",color:"#1d4ed8"}],table:{caption:"Connection counts by status."}}}),K=j({meta:{...k,key:"integration-hub.visualization.sync-healthy",title:"Healthy Syncs",description:"Sync configurations currently healthy or recently successful.",goal:"Summarize healthy synchronization capacity.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Healthy sync count."}}}),P=j({meta:{...k,key:"integration-hub.visualization.sync-attention",title:"Attention Needed",description:"Sync configurations paused, failing, or otherwise needing review.",goal:"Summarize syncs needing action.",context:"Sync-state comparison."},source:{primary:W,resultPath:"data"},visualization:{kind:"metric",measure:"value",measures:[{key:"value",label:"Syncs",dataPath:"value",format:"number"}],table:{caption:"Syncs requiring attention."}}}),X=[D,J,K,P],h=new v([...X]),Z=X.map((x)=>({key:x.meta.key,version:x.meta.version}));function G(x){return x==="ACTIVE"||x==="SUCCESS"}function f(x,$,b){let q=new Map,w=new Map,Q=0,U=0;for(let m of x)q.set(m.type,(q.get(m.type)??0)+1);for(let m of $)w.set(m.status,(w.get(m.status)??0)+1);for(let m of b)if(G(m.status))Q+=1;else U+=1;return{primaryItems:[{key:"integration-types",spec:D,data:{data:Array.from(q.entries()).map(([m,B])=>({type:m,count:B}))},title:"Integration Types",description:"Configured integrations grouped by category.",height:260},{key:"connection-status",spec:J,data:{data:Array.from(w.entries()).map(([m,B])=>({status:m,count:B}))},title:"Connection Status",description:"Operational health across current connections."}],comparisonItems:[{key:"healthy-syncs",spec:K,data:{data:[{value:Q}]},title:"Healthy Syncs",description:"Active or recently successful sync configurations.",height:200},{key:"attention-syncs",spec:P,data:{data:[{value:U}]},title:"Attention Needed",description:"Paused, failed, or degraded sync configurations.",height:200}]}}import{defineFeature as H}from"@contractspec/lib.contracts-spec/features";var p=H({meta:{key:"integration-hub",version:"1.0.0",title:"Integration Hub",description:"Connect and sync data with external systems through configurable integrations",domain:"integration",owners:["@integration-team"],tags:["integration","sync","etl","connectors"],stability:"experimental"},operations:[{key:"integration.create",version:"1.0.0"},{key:"integration.connection.create",version:"1.0.0"},{key:"integration.syncConfig.create",version:"1.0.0"},{key:"integration.fieldMapping.add",version:"1.0.0"},{key:"integration.sync.trigger",version:"1.0.0"},{key:"integration.syncRun.list",version:"1.0.0"}],events:[{key:"integration.created",version:"1.0.0"},{key:"integration.connection.created",version:"1.0.0"},{key:"integration.connection.statusChanged",version:"1.0.0"},{key:"integration.syncConfig.created",version:"1.0.0"},{key:"integration.sync.started",version:"1.0.0"},{key:"integration.sync.completed",version:"1.0.0"},{key:"integration.sync.failed",version:"1.0.0"},{key:"integration.record.synced",version:"1.0.0"},{key:"integration.fieldMapping.added",version:"1.0.0"}],presentations:[{key:"integration.list",version:"1.0.0"},{key:"integration.detail",version:"1.0.0"},{key:"integration.connection.list",version:"1.0.0"},{key:"integration.connection.setup",version:"1.0.0"},{key:"integration.syncConfig.list",version:"1.0.0"},{key:"integration.syncConfig.editor",version:"1.0.0"},{key:"integration.fieldMapping.editor",version:"1.0.0"},{key:"integration.syncRun.viewList",version:"1.0.0"},{key:"integration.syncRun.detail",version:"1.0.0"},{key:"integration.health",version:"1.0.0"},{key:"integration.sync.activity",version:"1.0.0"}],opToPresentation:[{op:{key:"integration.syncConfig.create",version:"1.0.0"},pres:{key:"integration.syncConfig.editor",version:"1.0.0"}},{op:{key:"integration.fieldMapping.add",version:"1.0.0"},pres:{key:"integration.fieldMapping.editor",version:"1.0.0"}},{op:{key:"integration.syncRun.list",version:"1.0.0"},pres:{key:"integration.syncRun.viewList",version:"1.0.0"}}],presentationsTargets:[{key:"integration.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.detail",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.list",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncConfig.editor",version:"1.0.0",targets:["react"]},{key:"integration.fieldMapping.editor",version:"1.0.0",targets:["react"]},{key:"integration.syncRun.viewList",version:"1.0.0",targets:["react","markdown"]},{key:"integration.syncRun.detail",version:"1.0.0",targets:["react","markdown"]}],visualizations:Z,capabilities:{requires:[{key:"identity",version:"1.0.0"},{key:"audit-trail",version:"1.0.0"},{key:"feature-flags",version:"1.0.0"},{key:"jobs",version:"1.0.0"},{key:"files",version:"1.0.0"}],provides:[{key:"integration",version:"1.0.0"},{key:"sync",version:"1.0.0"},{key:"etl",version:"1.0.0"}]},integrations:[{key:"integration-hub.integration.default-connector",version:"1.0.0"}],telemetry:[{key:"integration-hub.telemetry",version:"1.0.0"}],jobs:[{key:"integration-hub.job.sync-run",version:"1.0.0"},{key:"integration-hub.job.health-check",version:"1.0.0"}],docs:["docs.examples.integration-hub","docs.examples.integration-hub.goal","docs.examples.integration-hub.usage","docs.examples.integration-hub.constraints"]});export{p as IntegrationHubFeature};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/example.integration-hub",
3
- "version": "3.8.12",
3
+ "version": "3.8.15",
4
4
  "description": "Integration Hub example with sync engine and field mappings for ContractSpec",
5
5
  "types": "./dist/index.d.ts",
6
6
  "type": "module",
@@ -22,23 +22,23 @@
22
22
  "typecheck": "tsc --noEmit"
23
23
  },
24
24
  "dependencies": {
25
- "@contractspec/lib.ai-agent": "8.0.8",
26
- "@contractspec/module.ai-chat": "4.3.20",
25
+ "@contractspec/lib.ai-agent": "8.0.9",
26
+ "@contractspec/module.ai-chat": "4.3.23",
27
27
  "@contractspec/lib.schema": "3.7.14",
28
- "@contractspec/lib.contracts-spec": "5.4.0",
29
- "@contractspec/lib.example-shared-ui": "6.0.20",
30
- "@contractspec/lib.design-system": "3.10.0",
31
- "@contractspec/lib.runtime-sandbox": "2.7.14",
28
+ "@contractspec/lib.contracts-spec": "5.5.0",
29
+ "@contractspec/lib.example-shared-ui": "7.0.0",
30
+ "@contractspec/lib.design-system": "3.11.1",
31
+ "@contractspec/lib.runtime-sandbox": "3.0.0",
32
32
  "react": "19.2.0",
33
33
  "react-dom": "19.2.0",
34
- "@contractspec/lib.presentation-runtime-core": "3.9.8"
34
+ "@contractspec/lib.presentation-runtime-core": "5.0.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@contractspec/tool.typescript": "3.7.13",
38
38
  "typescript": "^5.9.3",
39
39
  "@types/react": "^19.2.14",
40
40
  "@types/react-dom": "^19.2.2",
41
- "@contractspec/tool.bun": "3.7.14",
41
+ "@contractspec/tool.bun": "3.7.16",
42
42
  "happy-dom": "^20.8.9"
43
43
  },
44
44
  "exports": {