@camstack/addon-post-analysis 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/embedding-encoder/index.js +1 -1
  2. package/dist/embedding-encoder/index.mjs +1 -1
  3. package/dist/enrichment-engine/index.js +1 -1
  4. package/dist/enrichment-engine/index.mjs +1 -1
  5. package/dist/{index-BFbwYH1P.js → index-B0RhVv1c.js} +3514 -750
  6. package/dist/index-B0RhVv1c.js.map +1 -0
  7. package/dist/{index-BrTlzsrE.mjs → index-ot5PeFg_.mjs} +3517 -753
  8. package/dist/index-ot5PeFg_.mjs.map +1 -0
  9. package/dist/pipeline-analytics/@mf-types.zip +0 -0
  10. package/dist/pipeline-analytics/{__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_sdk__loadShare__.mjs-h5aXOPSA.mjs → __mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_sdk__loadShare__.mjs-lantnv8e.mjs} +1 -1
  11. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-BD3oMNGB.mjs +29 -0
  12. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-BgOHCakr.mjs +18 -0
  13. package/dist/pipeline-analytics/{__mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.mjs-BZTB2scQ.mjs → __mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.mjs-D1qPKjvR.mjs} +2 -1
  14. package/dist/pipeline-analytics/{__mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.mjs_commonjs-proxy-CJO5YKGV.mjs → __mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.mjs_commonjs-proxy-B5X50Xa4.mjs} +1 -1
  15. package/dist/pipeline-analytics/{__mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-B0h0AGOH.mjs → __mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-B10b5k5J.mjs} +1 -1
  16. package/dist/pipeline-analytics/_stub.js +2 -3
  17. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-kZBmgzMg.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DWB3apaJ.mjs} +6 -6
  18. package/dist/pipeline-analytics/{client-BlxIUpgf.mjs → client-C6xdgLZU.mjs} +2 -2
  19. package/dist/pipeline-analytics/{hostInit-qBB1Thhi.mjs → hostInit-3cyL9eyG.mjs} +12 -12
  20. package/dist/pipeline-analytics/{index-Dw6Q30NI.mjs → index-BCTHeI2m.mjs} +253 -267
  21. package/dist/pipeline-analytics/{index-DlhiA9R0.mjs → index-BuWLz0GG.mjs} +1 -1
  22. package/dist/pipeline-analytics/{index-DtdgkNgf.mjs → index-CIwq-tQL.mjs} +1 -1
  23. package/dist/pipeline-analytics/{index-BoL0rgZt.mjs → index-CWBMDbou.mjs} +1 -1
  24. package/dist/pipeline-analytics/index-CZhagnlH.mjs +67784 -0
  25. package/dist/pipeline-analytics/{index-CR1aiZDH.mjs → index-D883Q5B8.mjs} +1 -1
  26. package/dist/pipeline-analytics/{index-Dy2V7VOm.mjs → index-DtOI1aTU.mjs} +10112 -5987
  27. package/dist/pipeline-analytics/index.js +605 -42
  28. package/dist/pipeline-analytics/index.js.map +1 -1
  29. package/dist/pipeline-analytics/index.mjs +604 -42
  30. package/dist/pipeline-analytics/index.mjs.map +1 -1
  31. package/dist/pipeline-analytics/{jsx-runtime-Dlbl3gpr.mjs → jsx-runtime-DdLhuHmJ.mjs} +1 -1
  32. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  33. package/dist/pipeline-analytics/{schemas-ClCuS4qa.mjs → schemas-B7L0qZtq.mjs} +411 -406
  34. package/package.json +12 -27
  35. package/dist/ffmpeg-config-DRONlBsj.mjs +0 -56
  36. package/dist/ffmpeg-config-DRONlBsj.mjs.map +0 -1
  37. package/dist/ffmpeg-config-uANz3sV5.js +0 -73
  38. package/dist/ffmpeg-config-uANz3sV5.js.map +0 -1
  39. package/dist/index-BFbwYH1P.js.map +0 -1
  40. package/dist/index-BrTlzsrE.mjs.map +0 -1
  41. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-NjF4kxzW.mjs +0 -19
  42. package/dist/pipeline-analytics/__mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-7HAAnpQu.mjs +0 -18
  43. package/dist/pipeline-analytics/index-i47purqY.mjs +0 -37880
  44. package/dist/playlist-generator-EhPaB7Hn.js +0 -48
  45. package/dist/playlist-generator-EhPaB7Hn.js.map +0 -1
  46. package/dist/playlist-generator-VTkgn53O.mjs +0 -48
  47. package/dist/playlist-generator-VTkgn53O.mjs.map +0 -1
  48. package/dist/recording/index.js +0 -257
  49. package/dist/recording/index.js.map +0 -1
  50. package/dist/recording/index.mjs +0 -235
  51. package/dist/recording/index.mjs.map +0 -1
  52. package/dist/recording-coordinator-BoGr5moz.js +0 -1052
  53. package/dist/recording-coordinator-BoGr5moz.js.map +0 -1
  54. package/dist/recording-coordinator-CsYH9LqF.mjs +0 -1012
  55. package/dist/recording-coordinator-CsYH9LqF.mjs.map +0 -1
  56. package/dist/recording-db-gOgaoQh0.js +0 -348
  57. package/dist/recording-db-gOgaoQh0.js.map +0 -1
  58. package/dist/recording-db-lIkSMTLq.mjs +0 -348
  59. package/dist/recording-db-lIkSMTLq.mjs.map +0 -1
  60. package/dist/recording-service-facade-B9lG6OFn.mjs +0 -123
  61. package/dist/recording-service-facade-B9lG6OFn.mjs.map +0 -1
  62. package/dist/recording-service-facade-Do1PKlAL.js +0 -123
  63. package/dist/recording-service-facade-Do1PKlAL.js.map +0 -1
  64. package/dist/storage-estimator-CRpoQc9j.js +0 -72
  65. package/dist/storage-estimator-CRpoQc9j.js.map +0 -1
  66. package/dist/storage-estimator-DzD8gWJH.mjs +0 -72
  67. package/dist/storage-estimator-DzD8gWJH.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/recording/index.ts"],"sourcesContent":["import type {\n ProviderRegistration,\n FfmpegConfig,\n IStreamingEngine,\n IPipelineManager,\n INetworkQualityTracker,\n} from '@camstack/types'\nimport { BaseAddon, recordingEngineCapability, errMsg } from '@camstack/types'\n\n// Dynamic imports to avoid hard dep on better-sqlite3 at load time\ntype RecordingCoordinator = import('./recording/recording-coordinator.js').RecordingCoordinator\ntype RecordingDb = import('./recording/recording-db.js').RecordingDb\n\nexport interface RecordingEngineDependencies {\n readonly streamingEngine: IStreamingEngine\n readonly pipelineManager: IPipelineManager\n readonly networkTracker: INetworkQualityTracker\n}\n\ninterface RecordingConfig {\n ffmpegPath: string\n hwaccel: string\n threads: number\n segmentDurationSeconds: number\n defaultRetentionDays: number\n storageWarningThreshold: number\n storageCriticalThreshold: number\n storageHighUsageThreshold: number\n retentionCheckIntervalMin: number\n}\n\nexport class RecordingAddon extends BaseAddon<RecordingConfig> {\n private coordinator: RecordingCoordinator | null = null\n private recordingDb: RecordingDb | null = null\n private sqliteDb: import('better-sqlite3').Database | null = null\n private recordingDeps: RecordingEngineDependencies | null = null\n private serviceFacade: import('./recording-service-facade.js').RecordingServiceFacade | null = null\n\n constructor() {\n super({\n ffmpegPath: 'ffmpeg',\n hwaccel: 'none',\n threads: 0,\n segmentDurationSeconds: 4,\n defaultRetentionDays: 30,\n storageWarningThreshold: 80,\n storageCriticalThreshold: 95,\n storageHighUsageThreshold: 90,\n retentionCheckIntervalMin: 5,\n })\n }\n\n setRecordingDependencies(deps: RecordingEngineDependencies): void {\n this.recordingDeps = deps\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[] | void> {\n if (!this.recordingDeps) {\n this.ctx.logger.info('Recording Engine: optional dependencies not wired — skipping init')\n return\n }\n\n try {\n const Database = (await import('better-sqlite3')).default\n const path = await import('node:path')\n const { detectPlatformDefaults } = await import('./recording/ffmpeg-config.js')\n const { RecordingDb: RecDb } = await import('./recording/recording-db.js')\n const { RecordingCoordinator: RecCoord } = await import('./recording/recording-coordinator.js')\n\n const storage = this.ctx.kernel.storage\n const dbPath = path.join(storage?.resolve({ location: 'data', relativePath: '' }) ?? 'camstack-data', 'camstack.db')\n this.sqliteDb = new Database(dbPath)\n this.recordingDb = new RecDb(this.sqliteDb)\n this.recordingDb.initialize()\n\n const ffmpegPath = this.config.ffmpegPath\n const detectedFfmpegConfig = detectPlatformDefaults(ffmpegPath)\n\n const globalFfmpegConfig: Partial<FfmpegConfig> = {\n path: ffmpegPath,\n hwaccel: this.config.hwaccel as FfmpegConfig['hwaccel'],\n threads: this.config.threads,\n }\n\n const segmentDurationSeconds = this.config.segmentDurationSeconds\n\n if (!storage) {\n throw new Error('RecordingAddon: storage capability not available')\n }\n\n this.coordinator = new RecCoord({\n db: this.recordingDb,\n logger: this.ctx.logger,\n eventBus: this.ctx.eventBus,\n streamingEngine: this.recordingDeps.streamingEngine,\n pipelineManager: this.recordingDeps.pipelineManager,\n networkTracker: this.recordingDeps.networkTracker,\n storageProvider: storage,\n globalFfmpegConfig,\n detectedFfmpegConfig,\n segmentDurationSec: segmentDurationSeconds,\n })\n await this.coordinator.start()\n\n // Create service facade wrapping all internal services.\n // The facade is the capability provider — the auto-generated cap router\n // dispatches typed tRPC procedures directly to facade methods.\n const { PlaylistGenerator } = await import('./recording/playlist-generator.js')\n const { StorageEstimator } = await import('./recording/storage-estimator.js')\n const playlistGenerator = new PlaylistGenerator(this.recordingDb)\n const storageEstimator = new StorageEstimator(this.recordingDb, this.recordingDeps.networkTracker)\n\n const { RecordingServiceFacade } = await import('./recording-service-facade.js')\n this.serviceFacade = new RecordingServiceFacade({\n coordinator: this.coordinator,\n db: this.recordingDb,\n playlistGenerator,\n storageEstimator,\n })\n this.ctx.logger.info('Recording Engine initialized')\n return [{ capability: recordingEngineCapability, provider: this.serviceFacade }]\n } catch (error: unknown) {\n const msg = errMsg(error)\n this.ctx.logger.warn('Recording Engine failed to initialize', { meta: { error: msg } })\n }\n }\n\n protected async onShutdown(): Promise<void> {\n if (this.coordinator) {\n this.coordinator.stop()\n this.coordinator = null\n }\n if (this.sqliteDb) {\n this.sqliteDb.close()\n this.sqliteDb = null\n }\n this.recordingDb = null\n }\n\n // --- Recording engine accessors ---\n\n getCoordinator(): RecordingCoordinator {\n if (!this.coordinator) throw new Error('RecordingAddon: recording not initialized')\n return this.coordinator\n }\n\n getRecordingDb(): RecordingDb {\n if (!this.recordingDb) throw new Error('RecordingAddon: recording not initialized')\n return this.recordingDb\n }\n\n // --- Three-level settings API (Phase 3) ---\n //\n // Recording is post-detection infra. Until the dedicated post-detection\n // UI exists, it exposes `getGlobalSettings` so the knobs surface under\n // Cluster → Settings alongside other node-level infra.\n\n protected globalSettingsSchema() {\n return this.schema({\n sections: [\n {\n id: 'recording-general',\n title: 'Recording Settings',\n columns: 2,\n fields: [\n {\n type: 'number',\n key: 'segmentDurationSeconds',\n label: 'Segment Duration',\n description: 'Duration of each recording segment',\n min: 10,\n max: 3600,\n step: 10,\n default: 300,\n unit: 's',\n },\n {\n type: 'number',\n key: 'defaultRetentionDays',\n label: 'Retention',\n description: 'Days to keep recordings before automatic deletion',\n min: 1,\n max: 365,\n step: 1,\n default: 30,\n unit: 'days',\n },\n ],\n },\n {\n id: 'recording-ffmpeg',\n title: 'FFmpeg',\n columns: 3,\n fields: [\n {\n type: 'text',\n key: 'ffmpegPath',\n label: 'FFmpeg Path',\n description: 'Path to ffmpeg binary',\n placeholder: 'ffmpeg',\n default: 'ffmpeg',\n },\n {\n type: 'select',\n key: 'hwaccel',\n label: 'Hardware Acceleration',\n options: [\n { value: 'none', label: 'None (CPU)' },\n { value: 'vaapi', label: 'VAAPI (Intel/AMD)' },\n { value: 'cuda', label: 'CUDA (NVIDIA)' },\n { value: 'videotoolbox', label: 'VideoToolbox (macOS)' },\n ],\n },\n {\n type: 'number',\n key: 'threads',\n label: 'Threads',\n description: 'FFmpeg encoding threads (0 = auto)',\n min: 0,\n max: 32,\n step: 1,\n default: 0,\n },\n ],\n },\n {\n id: 'recording-retention',\n title: 'Storage & Retention',\n description: 'Thresholds for storage usage alerts and retention enforcement frequency.',\n columns: 2,\n fields: [\n {\n type: 'number',\n key: 'storageWarningThreshold',\n label: 'Warning Threshold',\n description: 'Storage usage percentage that triggers a warning event.',\n min: 50, max: 99, step: 1, default: 80, unit: '%',\n },\n {\n type: 'number',\n key: 'storageCriticalThreshold',\n label: 'Critical Threshold',\n description: 'Storage usage percentage that triggers a critical event.',\n min: 50, max: 99, step: 1, default: 95, unit: '%',\n },\n {\n type: 'number',\n key: 'storageHighUsageThreshold',\n label: 'High Usage Threshold',\n description: 'Storage usage percentage that increases retention check frequency.',\n min: 50, max: 99, step: 1, default: 90, unit: '%',\n },\n {\n type: 'number',\n key: 'retentionCheckIntervalMin',\n label: 'Check Interval',\n description: 'Normal interval between retention cleanup cycles.',\n min: 1, max: 60, step: 1, default: 5, unit: 'min',\n },\n ],\n },\n ],\n })\n }\n\n}\n\nexport default RecordingAddon\n"],"names":[],"mappings":"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"}