{"version":3,"file":"monitor-CJ13g7zy.mjs","names":[],"sources":["../src/services/authorCatalog/monitor.ts"],"sourcesContent":["import type { DoomToolRestriction } from '@agimon-ai/doompi-core/toolSurface';\n\nimport { AUTHOR_DESCRIBE_TOOL_NAME, AUTHOR_USE_TOOL_NAME } from '../../constants/author';\nimport { OPEN_AUTHORING_FILE_TOOL_NAME, type AuthorViewportCatalogSnapshot } from '../../types/author';\nimport type { AuthorCatalog } from './type';\n\nconst CATALOG_POLL_MS = 500;\n\nexport interface AuthorModeMonitorClock {\n  schedule(callback: () => void, delayMs: number): () => void;\n}\n\nexport interface AuthorCatalogMonitor {\n  snapshot(): AuthorViewportCatalogSnapshot | undefined;\n  subscribe(listener: () => void): () => void;\n  start(): void;\n  stop(): void;\n  dispose(): void;\n}\n\n/** Hide Author tools until the mode and viewport catalog can serve them. */\nexport function authorToolRestriction(active: boolean, _catalogReady: boolean): DoomToolRestriction {\n  const hidden = new Set<string>([\n    ...(active ? [] : [OPEN_AUTHORING_FILE_TOOL_NAME]),\n    ...(active ? [] : [AUTHOR_DESCRIBE_TOOL_NAME, AUTHOR_USE_TOOL_NAME]),\n  ]);\n  return (incoming) => (hidden.size === 0 ? incoming : incoming.filter((name) => !hidden.has(name)));\n}\n\n/** Author-specific viewport polling; the shared minor-mode factory owns activation. */\nexport function createAuthorCatalogMonitor(\n  catalog: AuthorCatalog,\n  clock: AuthorModeMonitorClock,\n): AuthorCatalogMonitor {\n  let current: AuthorViewportCatalogSnapshot | undefined;\n  let active = false;\n  let disposed = false;\n  let generation = 0;\n  let cancelTimer: (() => void) | undefined;\n  let request: AbortController | undefined;\n  const listeners = new Set<() => void>();\n  const setCatalog = (snapshot: AuthorViewportCatalogSnapshot | undefined): void => {\n    const previous = current;\n    current = snapshot;\n    if (\n      previous?.catalogToken !== snapshot?.catalogToken ||\n      previous?.tools.length !== snapshot?.tools.length ||\n      (previous === undefined) !== (snapshot === undefined)\n    )\n      listeners.forEach((listener) => listener());\n  };\n  const poll = (owner: number): void => {\n    if (!active || owner !== generation || disposed) return;\n    const controller = new AbortController();\n    request = controller;\n    void catalog\n      .describe(controller.signal)\n      .then((snapshot) => {\n        if (active && owner === generation) setCatalog(snapshot);\n      })\n      .catch(() => {\n        if (active && owner === generation) setCatalog(undefined);\n      })\n      .finally(() => {\n        if (request === controller) request = undefined;\n        if (!active || owner !== generation || disposed) return;\n        cancelTimer = clock.schedule(() => poll(owner), CATALOG_POLL_MS);\n      });\n  };\n  const stop = (): void => {\n    active = false;\n    generation += 1;\n    cancelTimer?.();\n    cancelTimer = undefined;\n    request?.abort();\n    request = undefined;\n    setCatalog(undefined);\n  };\n  return {\n    snapshot: () => current,\n    subscribe(listener) {\n      listeners.add(listener);\n      return () => listeners.delete(listener);\n    },\n    start() {\n      if (active || disposed) return;\n      active = true;\n      generation += 1;\n      poll(generation);\n    },\n    stop,\n    dispose() {\n      if (disposed) return;\n      disposed = true;\n      stop();\n      listeners.clear();\n    },\n  };\n}\n"],"mappings":";;AAMA,MAAM,kBAAkB;;AAexB,SAAgB,sBAAsB,QAAiB,eAA6C;CAClG,MAAM,yBAAS,IAAI,IAAY,CAC7B,GAAI,SAAS,CAAC,IAAI,CAAC,6BAA6B,GAChD,GAAI,SAAS,CAAC,IAAI,CAAC,2BAA2B,oBAAoB,CACpE,CAAC;CACD,QAAQ,aAAc,OAAO,SAAS,IAAI,WAAW,SAAS,QAAQ,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;AAClG;;AAGA,SAAgB,2BACd,SACA,OACsB;CACtB,IAAI;CACJ,IAAI,SAAS;CACb,IAAI,WAAW;CACf,IAAI,aAAa;CACjB,IAAI;CACJ,IAAI;CACJ,MAAM,4BAAY,IAAI,IAAgB;CACtC,MAAM,cAAc,aAA8D;EAChF,MAAM,WAAW;EACjB,UAAU;EACV,IACE,UAAU,iBAAiB,UAAU,gBACrC,UAAU,MAAM,WAAW,UAAU,MAAM,UAC1C,aAAa,KAAA,OAAgB,aAAa,KAAA,IAE3C,UAAU,SAAS,aAAa,SAAS,CAAC;CAC9C;CACA,MAAM,QAAQ,UAAwB;EACpC,IAAI,CAAC,UAAU,UAAU,cAAc,UAAU;EACjD,MAAM,aAAa,IAAI,gBAAgB;EACvC,UAAU;EACV,QACG,SAAS,WAAW,MAAM,CAAC,CAC3B,MAAM,aAAa;GAClB,IAAI,UAAU,UAAU,YAAY,WAAW,QAAQ;EACzD,CAAC,CAAC,CACD,YAAY;GACX,IAAI,UAAU,UAAU,YAAY,WAAW,KAAA,CAAS;EAC1D,CAAC,CAAC,CACD,cAAc;GACb,IAAI,YAAY,YAAY,UAAU,KAAA;GACtC,IAAI,CAAC,UAAU,UAAU,cAAc,UAAU;GACjD,cAAc,MAAM,eAAe,KAAK,KAAK,GAAG,eAAe;EACjE,CAAC;CACL;CACA,MAAM,aAAmB;EACvB,SAAS;EACT,cAAc;EACd,cAAc;EACd,cAAc,KAAA;EACd,SAAS,MAAM;EACf,UAAU,KAAA;EACV,WAAW,KAAA,CAAS;CACtB;CACA,OAAO;EACL,gBAAgB;EAChB,UAAU,UAAU;GAClB,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;EACA,QAAQ;GACN,IAAI,UAAU,UAAU;GACxB,SAAS;GACT,cAAc;GACd,KAAK,UAAU;EACjB;EACA;EACA,UAAU;GACR,IAAI,UAAU;GACd,WAAW;GACX,KAAK;GACL,UAAU,MAAM;EAClB;CACF;AACF"}