{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/workflowCatalogChannel/index.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport {\n  createWorkflowCatalogReader,\n  presentWorkflowCatalog,\n  type WorkflowCatalogReaderDeps,\n} from '../../services/webWorkflowCatalog';\nimport { defaultCatalogDeps } from '../../services/workflowCatalogDeps';\nimport { WORKFLOW_CATALOG_TYPE, type WorkflowCatalogPayload } from '../../types/webWorkflows';\n\nexport interface WorkflowCatalogChannelOptions {\n  deps?: WorkflowCatalogReaderDeps;\n}\n\n/**\n * The workflow catalog channel. Durable state seeds a session once, then\n * session lifecycle events deliver updates over the direct event bus.\n */\nexport function createWorkflowCatalogChannel(options: WorkflowCatalogChannelOptions = {}): DoomHubChannel {\n  const reader = createWorkflowCatalogReader(options.deps ?? defaultCatalogDeps());\n  return {\n    frameType: WORKFLOW_CATALOG_TYPE,\n    start(host) {\n      const scopes = new Map<string, DoomHubSessionScope>();\n      const latest = new Map<string, WorkflowCatalogPayload>();\n      const subscriptions = new Map<string, () => void>();\n      const publish = (scope: DoomHubSessionScope, payload: WorkflowCatalogPayload): void => {\n        latest.set(scope.sessionId, payload);\n        host.publish(scope.sessionId, payload);\n      };\n      const readInitial = async (scope: DoomHubSessionScope): Promise<void> => {\n        let payload: WorkflowCatalogPayload;\n        try {\n          payload = {\n            cwd: scope.cwd,\n            workflows: presentWorkflowCatalog(await reader.read(scope.cwd)),\n          };\n        } catch (error) {\n          const warning = error instanceof Error ? error.message : String(error);\n          payload = { cwd: scope.cwd, workflows: [], warning };\n          host.onNotice(`workflow catalog for ${scope.cwd} is unavailable (${warning})`);\n        }\n        if (scopes.get(scope.sessionId) === scope) publish(scope, payload);\n      };\n      const source: DoomHubChannelSource = {\n        payloadFor(scope) {\n          return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n        },\n        sessionAdded(scope) {\n          scopes.set(scope.sessionId, scope);\n          subscriptions.get(scope.sessionId)?.();\n          const unsubscribe = host.directEvents.subscribe(\n            WORKFLOW_CATALOG_TYPE,\n            scope.sessionId,\n            (value) => {\n              if (isWorkflowCatalogPayload(value)) publish(scope, value);\n            },\n            { replayLatest: true },\n          );\n          subscriptions.set(scope.sessionId, unsubscribe);\n          void readInitial(scope);\n        },\n        sessionRemoved(sessionId) {\n          subscriptions.get(sessionId)?.();\n          subscriptions.delete(sessionId);\n          scopes.delete(sessionId);\n          latest.delete(sessionId);\n        },\n        close() {\n          for (const unsubscribe of subscriptions.values()) unsubscribe();\n          subscriptions.clear();\n          scopes.clear();\n          latest.clear();\n        },\n      };\n      return source;\n    },\n  };\n}\n\nfunction isWorkflowCatalogPayload(value: unknown): value is WorkflowCatalogPayload {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof (value as { cwd?: unknown }).cwd === 'string' &&\n    Array.isArray((value as { workflows?: unknown }).workflows)\n  );\n}\n"],"mappings":";;;;;;;;AAkBA,SAAgB,6BAA6B,UAAyC,CAAC,GAAmB;CACxG,MAAM,SAAS,4BAA4B,QAAQ,QAAQ,mBAAmB,CAAC;CAC/E,OAAO;EACL,WAAW;EACX,MAAM,MAAM;GACV,MAAM,yBAAS,IAAI,IAAiC;GACpD,MAAM,yBAAS,IAAI,IAAoC;GACvD,MAAM,gCAAgB,IAAI,IAAwB;GAClD,MAAM,WAAW,OAA4B,YAA0C;IACrF,OAAO,IAAI,MAAM,WAAW,OAAO;IACnC,KAAK,QAAQ,MAAM,WAAW,OAAO;GACvC;GACA,MAAM,cAAc,OAAO,UAA8C;IACvE,IAAI;IACJ,IAAI;KACF,UAAU;MACR,KAAK,MAAM;MACX,WAAW,uBAAuB,MAAM,OAAO,KAAK,MAAM,GAAG,CAAC;KAChE;IACF,SAAS,OAAO;KACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;KACrE,UAAU;MAAE,KAAK,MAAM;MAAK,WAAW,CAAC;MAAG;KAAQ;KACnD,KAAK,SAAS,wBAAwB,MAAM,IAAI,mBAAmB,QAAQ,EAAE;IAC/E;IACA,IAAI,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO,QAAQ,OAAO,OAAO;GACnE;GAgCA,OAAO;IA9BL,WAAW,OAAO;KAChB,OAAO,OAAO,IAAI,MAAM,SAAS,IAAI,OAAO,IAAI,MAAM,SAAS,IAAI,KAAA;IACrE;IACA,aAAa,OAAO;KAClB,OAAO,IAAI,MAAM,WAAW,KAAK;KACjC,cAAc,IAAI,MAAM,SAAS,CAAC,GAAG;KACrC,MAAM,cAAc,KAAK,aAAa,UACpC,uBACA,MAAM,YACL,UAAU;MACT,IAAI,yBAAyB,KAAK,GAAG,QAAQ,OAAO,KAAK;KAC3D,GACA,EAAE,cAAc,KAAK,CACvB;KACA,cAAc,IAAI,MAAM,WAAW,WAAW;KAC9C,YAAiB,KAAK;IACxB;IACA,eAAe,WAAW;KACxB,cAAc,IAAI,SAAS,CAAC,GAAG;KAC/B,cAAc,OAAO,SAAS;KAC9B,OAAO,OAAO,SAAS;KACvB,OAAO,OAAO,SAAS;IACzB;IACA,QAAQ;KACN,KAAK,MAAM,eAAe,cAAc,OAAO,GAAG,YAAY;KAC9D,cAAc,MAAM;KACpB,OAAO,MAAM;KACb,OAAO,MAAM;IACf;GAEU;EACd;CACF;AACF;AAEA,SAAS,yBAAyB,OAAiD;CACjF,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA4B,QAAQ,YAC5C,MAAM,QAAS,MAAkC,SAAS;AAE9D"}