@kb-labs/workflow-entry 2.89.0 → 2.93.0

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 (39) hide show
  1. package/dist/commands/health.js +1 -1
  2. package/dist/commands/health.js.map +1 -1
  3. package/dist/commands/list.js +1 -1
  4. package/dist/commands/list.js.map +1 -1
  5. package/dist/commands/logs.js +1 -1
  6. package/dist/commands/logs.js.map +1 -1
  7. package/dist/commands/metrics.js +1 -1
  8. package/dist/commands/metrics.js.map +1 -1
  9. package/dist/commands/run.js +1 -1
  10. package/dist/commands/run.js.map +1 -1
  11. package/dist/commands/status.js +2 -2
  12. package/dist/commands/status.js.map +1 -1
  13. package/dist/commands/workflow-run.js +1 -1
  14. package/dist/commands/workflow-run.js.map +1 -1
  15. package/dist/rest/cron-list-handler.js.map +1 -1
  16. package/dist/rest/index.js.map +1 -1
  17. package/dist/rest/job-cancel-handler.js.map +1 -1
  18. package/dist/rest/job-detail-handler.js.map +1 -1
  19. package/dist/rest/job-logs-handler.js.map +1 -1
  20. package/dist/rest/job-steps-handler.js.map +1 -1
  21. package/dist/rest/jobs-list-handler.js.map +1 -1
  22. package/dist/rest/pending-approvals-handler.js.map +1 -1
  23. package/dist/rest/resolve-approval-handler.js.map +1 -1
  24. package/dist/rest/run-detail-handler.js.map +1 -1
  25. package/dist/rest/runs-list-handler.js.map +1 -1
  26. package/dist/rest/stats-handler.js.map +1 -1
  27. package/dist/rest/workflow-detail-handler.js.map +1 -1
  28. package/dist/rest/workflow-run-cancel-handler.js.map +1 -1
  29. package/dist/rest/workflow-run-handler.js.map +1 -1
  30. package/dist/rest/workflow-runs-handler.js.map +1 -1
  31. package/dist/rest/workflows-list-handler.js.map +1 -1
  32. package/dist/widgets/__federation_expose_RunDetail.js.map +1 -1
  33. package/dist/widgets/mf-manifest.json +5 -5
  34. package/dist/widgets/mf-stats.json +5 -5
  35. package/dist/widgets/remoteEntry.js +2 -2
  36. package/dist/widgets/remoteEntry.js.map +1 -1
  37. package/dist/ws/logs-channel.js.map +1 -1
  38. package/dist/ws/progress-channel.js.map +1 -1
  39. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ws/logs-channel.ts"],"names":["ctx"],"mappings":"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","file":"logs-channel.js","sourcesContent":["/**\n * @module @kb-labs/workflow-cli/ws/logs-channel\n * WebSocket channel for real-time job logs streaming\n *\n * Uses platform.logs.subscribe() to stream logs filtered by jobId (runId).\n * Clients send Subscribe message with jobId to start receiving logs.\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\nimport type { LogRecord, LogQuery } from '@kb-labs/core-platform';\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string; level?: string }>('subscribe');\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst LogMsg = defineMessage<{\n timestamp: string;\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n context?: Record<string, unknown>;\n}>('log');\n\nconst ErrorMsg = defineMessage<{ error: string }>('error');\n\n// Incoming/Outgoing types (discriminated unions)\ntype Incoming = ReturnType<typeof SubscribeMsg.create> | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof LogMsg.create>\n | ReturnType<ReturnType<typeof defineMessage<{ jobId: string; status: string }>>['create']>\n | ReturnType<typeof ErrorMsg.create>;\n\n// Store active subscriptions per connection\nconst subscriptions = new Map<string, () => void>();\n\n/**\n * Convert LogRecord level to channel level type\n */\nfunction normalizeLevel(level: LogRecord['level']): 'info' | 'warn' | 'error' | 'debug' {\n switch (level) {\n case 'trace':\n case 'debug':\n return 'debug';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'fatal':\n return 'error';\n default:\n return 'info';\n }\n}\n\n/**\n * Check if log level matches filter\n */\nfunction levelMatches(logLevel: LogRecord['level'], filterLevel?: string): boolean {\n if (!filterLevel || filterLevel === 'all') {\n return true;\n }\n\n const levelOrder: Record<string, number> = {\n debug: 0,\n trace: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 3,\n };\n\n const logPriority = levelOrder[logLevel] ?? 1;\n const filterPriority = levelOrder[filterLevel] ?? 0;\n\n return logPriority >= filterPriority;\n}\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/logs/:jobId',\n description: 'Real-time job logs streaming',\n\n handler: {\n async onConnect(ctx, sender) {\n const connectionId = sender.getConnectionId();\n ctx.platform.logger.info('[logs-channel] Client connected', { connectionId });\n\n // Check if streaming is available\n const capabilities = ctx.platform.logs.getCapabilities();\n if (!capabilities.hasStreaming) {\n await sender.send(\n ErrorMsg.create({\n error: 'Log streaming not available. Enable logRingBuffer adapter in config.',\n })\n );\n sender.close(1011, 'Streaming not available');\n }\n },\n\n async onMessage(ctx, message, sender) {\n const connectionId = sender.getConnectionId();\n\n const router = new MessageRouter()\n .on(SubscribeMsg, async (ctx, payload, _rawSender) => {\n const { jobId, level } = payload;\n\n ctx.platform.logger.info('[logs-channel] Subscribing to logs', { connectionId, jobId, level });\n\n // Unsubscribe from previous subscription if exists\n const existingUnsubscribe = subscriptions.get(connectionId);\n if (existingUnsubscribe) {\n existingUnsubscribe();\n }\n\n // Build filter for job logs\n const filter: LogQuery = {\n source: jobId, // Logs are tagged with jobId as source\n };\n\n // Subscribe to log stream\n const unsubscribe = ctx.platform.logs.subscribe((log: LogRecord) => {\n // Additional filtering by level\n if (!levelMatches(log.level, level)) {\n return;\n }\n\n // Also check if log belongs to this job via fields\n const logJobId = log.fields?.jobId ?? log.fields?.runId ?? log.source;\n if (logJobId !== jobId) {\n return;\n }\n\n // Send log to client\n sender.send(\n LogMsg.create({\n timestamp: new Date(log.timestamp).toISOString(),\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.fields,\n })\n ).catch((err) => {\n ctx.platform.logger.error('[logs-channel] Failed to send log', err instanceof Error ? err : undefined);\n });\n }, filter);\n\n // Store unsubscribe function\n subscriptions.set(connectionId, unsubscribe);\n\n // Send confirmation\n await sender.send(\n LogMsg.create({\n timestamp: new Date().toISOString(),\n level: 'info',\n message: `Subscribed to logs for job ${jobId} (level: ${level || 'all'})`,\n })\n );\n })\n .on(UnsubscribeMsg, async (ctx, _payload, _rawSender) => {\n ctx.platform.logger.info('[logs-channel] Unsubscribing from logs', { connectionId });\n\n // Cleanup subscription\n const unsubscribe = subscriptions.get(connectionId);\n if (unsubscribe) {\n unsubscribe();\n subscriptions.delete(connectionId);\n }\n\n await sender.send(\n LogMsg.create({\n timestamp: new Date().toISOString(),\n level: 'info',\n message: 'Unsubscribed from logs',\n })\n );\n });\n\n await router.handle(ctx, message as any, sender.raw);\n },\n\n async onDisconnect(ctx, code, reason) {\n // Note: We don't have access to sender here, need to cleanup by other means\n // The connectionId would need to be stored during onConnect\n ctx.platform.logger.info('[logs-channel] Client disconnected', { code, reason });\n\n // Cleanup is handled automatically when connection is removed from registry\n // The subscription will be cleaned up when the socket closes\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[logs-channel] Error', error);\n try {\n await sender.send(ErrorMsg.create({ error: error.message }));\n } catch (sendError) {\n ctx.platform.logger.error('[logs-channel] Failed to send error message', sendError instanceof Error ? sendError : undefined);\n }\n },\n\n cleanup() {\n // Note: This is called after each lifecycle event, not on final cleanup\n // For connection-specific cleanup, we handle it in onDisconnect and onMessage\n },\n },\n});\n\n// Export for testing\nexport { subscriptions, normalizeLevel, levelMatches };\n"]}
1
+ {"version":3,"sources":["../../src/ws/logs-channel.ts"],"names":["ctx"],"mappings":"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","file":"logs-channel.js","sourcesContent":["/**\n * @module @kb-labs/workflow-cli/ws/logs-channel\n * WebSocket channel for real-time job logs streaming\n *\n * Uses platform.logs.subscribe() to stream logs filtered by jobId (runId).\n * Clients send Subscribe message with jobId to start receiving logs.\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\nimport type { WSMessage } from '@kb-labs/sdk';\nimport type { LogRecord, LogQuery } from '@kb-labs/core-platform';\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string; level?: string }>('subscribe');\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst LogMsg = defineMessage<{\n timestamp: string;\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n context?: Record<string, unknown>;\n}>('log');\n\nconst ErrorMsg = defineMessage<{ error: string }>('error');\n\n// Incoming/Outgoing types (discriminated unions)\ntype Incoming = ReturnType<typeof SubscribeMsg.create> | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof LogMsg.create>\n | ReturnType<ReturnType<typeof defineMessage<{ jobId: string; status: string }>>['create']>\n | ReturnType<typeof ErrorMsg.create>;\n\n// Store active subscriptions per connection\nconst subscriptions = new Map<string, () => void>();\n\n/**\n * Convert LogRecord level to channel level type\n */\nfunction normalizeLevel(level: LogRecord['level']): 'info' | 'warn' | 'error' | 'debug' {\n switch (level) {\n case 'trace':\n case 'debug':\n return 'debug';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'fatal':\n return 'error';\n default:\n return 'info';\n }\n}\n\n/**\n * Check if log level matches filter\n */\nfunction levelMatches(logLevel: LogRecord['level'], filterLevel?: string): boolean {\n if (!filterLevel || filterLevel === 'all') {\n return true;\n }\n\n const levelOrder: Record<string, number> = {\n debug: 0,\n trace: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 3,\n };\n\n const logPriority = levelOrder[logLevel] ?? 1;\n const filterPriority = levelOrder[filterLevel] ?? 0;\n\n return logPriority >= filterPriority;\n}\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/logs/:jobId',\n description: 'Real-time job logs streaming',\n\n handler: {\n async onConnect(ctx, sender) {\n const connectionId = sender.getConnectionId();\n ctx.platform.logger.info('[logs-channel] Client connected', { connectionId });\n\n // Check if streaming is available\n const capabilities = ctx.platform.logs.getCapabilities();\n if (!capabilities.hasStreaming) {\n await sender.send(\n ErrorMsg.create({\n error: 'Log streaming not available. Enable logRingBuffer adapter in config.',\n })\n );\n sender.close(1011, 'Streaming not available');\n }\n },\n\n async onMessage(ctx, message, sender) {\n const connectionId = sender.getConnectionId();\n\n const router = new MessageRouter()\n .on(SubscribeMsg, async (ctx, payload, _rawSender) => {\n const { jobId, level } = payload;\n\n ctx.platform.logger.info('[logs-channel] Subscribing to logs', { connectionId, jobId, level });\n\n // Unsubscribe from previous subscription if exists\n const existingUnsubscribe = subscriptions.get(connectionId);\n if (existingUnsubscribe) {\n existingUnsubscribe();\n }\n\n // Build filter for job logs\n const filter: LogQuery = {\n source: jobId, // Logs are tagged with jobId as source\n };\n\n // Subscribe to log stream\n const unsubscribe = ctx.platform.logs.subscribe((log: LogRecord) => {\n // Additional filtering by level\n if (!levelMatches(log.level, level)) {\n return;\n }\n\n // Also check if log belongs to this job via fields\n const logJobId = log.fields?.jobId ?? log.fields?.runId ?? log.source;\n if (logJobId !== jobId) {\n return;\n }\n\n // Send log to client\n sender.send(\n LogMsg.create({\n timestamp: new Date(log.timestamp).toISOString(),\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.fields,\n })\n ).catch((err) => {\n ctx.platform.logger.error('[logs-channel] Failed to send log', err instanceof Error ? err : undefined);\n });\n }, filter);\n\n // Store unsubscribe function\n subscriptions.set(connectionId, unsubscribe);\n\n // Send confirmation\n await sender.send(\n LogMsg.create({\n timestamp: new Date().toISOString(),\n level: 'info',\n message: `Subscribed to logs for job ${jobId} (level: ${level || 'all'})`,\n })\n );\n })\n .on(UnsubscribeMsg, async (ctx, _payload, _rawSender) => {\n ctx.platform.logger.info('[logs-channel] Unsubscribing from logs', { connectionId });\n\n // Cleanup subscription\n const unsubscribe = subscriptions.get(connectionId);\n if (unsubscribe) {\n unsubscribe();\n subscriptions.delete(connectionId);\n }\n\n await sender.send(\n LogMsg.create({\n timestamp: new Date().toISOString(),\n level: 'info',\n message: 'Unsubscribed from logs',\n })\n );\n });\n\n await router.handle(ctx, message as WSMessage, sender.raw);\n },\n\n async onDisconnect(ctx, code, reason) {\n // Note: We don't have access to sender here, need to cleanup by other means\n // The connectionId would need to be stored during onConnect\n ctx.platform.logger.info('[logs-channel] Client disconnected', { code, reason });\n\n // Cleanup is handled automatically when connection is removed from registry\n // The subscription will be cleaned up when the socket closes\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[logs-channel] Error', error);\n try {\n await sender.send(ErrorMsg.create({ error: error.message }));\n } catch (sendError) {\n ctx.platform.logger.error('[logs-channel] Failed to send error message', sendError instanceof Error ? sendError : undefined);\n }\n },\n\n cleanup() {\n // Note: This is called after each lifecycle event, not on final cleanup\n // For connection-specific cleanup, we handle it in onDisconnect and onMessage\n },\n },\n});\n\n// Export for testing\nexport { subscriptions, normalizeLevel, levelMatches };\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ws/progress-channel.ts"],"names":["ctx"],"mappings":";;;AAQA,IAAM,YAAA,GAAe,cAAiC,WAAW,CAAA;AAEjE,IAAM,cAAA,GAAiB,cAAkB,aAAa,CAAA;AAEtD,IAAM,YAAA,GAAe,cAAuD,YAAY,CAAA;AAYxF,IAAM,QAAA,GAAW,cAAiC,OAAO,CAAA;AAYzD,IAAO,2BAAQ,eAAA,CAA6C;AAAA,EAC1D,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EAAa,gCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ;AAE3B,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,IAAA,CAAK,qCAAA,EAAuC,EAAE,YAAA,EAAc,MAAA,CAAO,eAAA,EAAgB,EAAG,CAAA;AAAA,IAI5G,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ;AACpC,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,EAAc,CAC9B,GAAG,YAAA,EAAc,OAAOA,IAAAA,EAAK,OAAA,EAAS,UAAA,KAAe;AACpD,QAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,QAAAA,KAAI,QAAA,CAAS,MAAA,CAAO,KAAK,mDAAA,EAAqD,EAAE,OAAO,CAAA;AAIvF,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UACX,aAAa,MAAA,CAAO;AAAA,YAClB,QAAA,EAAU,gBAAA;AAAA,YACV,SAAA,EAAW;AAAA,WACZ;AAAA,SACH;AAAA,MACF,CAAC,CAAA,CACA,EAAA,CAAG,gBAAgB,OAAOA,IAAAA,EAAK,UAAU,UAAA,KAAe;AACvD,QAAAA,IAAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,uDAAuD,CAAA;AAAA,MAElF,CAAC,CAAA;AAEH,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,OAAA,EAAgB,OAAO,GAAG,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ;AACpC,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,0CAA0C,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,IAErF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ;AAChC,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,KAAK,CAAA;AAC3D,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,KAAK,QAAA,CAAS,MAAA,CAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA;AAAA,MAC7D,SAAS,SAAA,EAAW;AAClB,QAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,mDAAmD,SAAA,YAAqB,KAAA,GAAQ,YAAY,MAAS,CAAA;AAAA,MACjI;AAAA,IACF;AAAA;AAEJ,CAAC","file":"progress-channel.js","sourcesContent":["/**\n * @module @kb-labs/workflow-cli/ws/progress-channel\n * WebSocket channel for real-time job progress updates\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string }>('subscribe');\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst StepStartMsg = defineMessage<{ stepName: string; stepIndex: number }>('step_start');\n\n// Type-only message definitions (used only in type unions)\ntype StepProgressMsg = ReturnType<typeof defineMessage<{ stepName: string; progress: number; message?: string }>>;\ntype StepCompleteMsg = ReturnType<typeof defineMessage<{\n stepName: string;\n status: 'completed' | 'failed';\n durationMs: number;\n error?: string;\n}>>;\ntype JobCompleteMsg = ReturnType<typeof defineMessage<{ jobId: string; status: string; durationMs: number }>>;\n\nconst ErrorMsg = defineMessage<{ error: string }>('error');\n\n// Incoming/Outgoing types\ntype Incoming = ReturnType<typeof SubscribeMsg.create> | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof StepStartMsg.create>\n | StepProgressMsg\n | StepCompleteMsg\n | JobCompleteMsg\n | ReturnType<typeof ErrorMsg.create>;\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/progress/:jobId',\n description: 'Real-time job progress updates',\n\n handler: {\n async onConnect(ctx, sender) {\n // Note: jobId will come from path params via runtime, not ctx.params\n ctx.platform.logger.info('[progress-channel] Client connected', { connectionId: sender.getConnectionId() });\n\n // TODO: Subscribe to progress events from daemon/engine\n // Client needs to send Subscribe message with jobId\n },\n\n async onMessage(ctx, message, sender) {\n const router = new MessageRouter()\n .on(SubscribeMsg, async (ctx, payload, _rawSender) => {\n const { jobId } = payload;\n\n ctx.platform.logger.info('[progress-channel] Subscribed to progress updates', { jobId });\n\n // TODO: Start streaming progress updates from engine\n // For now, send confirmation via step start message\n await sender.send(\n StepStartMsg.create({\n stepName: 'initialization',\n stepIndex: 0,\n })\n );\n })\n .on(UnsubscribeMsg, async (ctx, _payload, _rawSender) => {\n ctx.platform.logger.info('[progress-channel] Unsubscribed from progress updates');\n // TODO: Stop streaming\n });\n\n await router.handle(ctx, message as any, sender.raw);\n },\n\n async onDisconnect(ctx, code, reason) {\n ctx.platform.logger.info('[progress-channel] Client disconnected', { code, reason });\n // TODO: Cleanup subscriptions\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[progress-channel] Error', error);\n try {\n await sender.send(ErrorMsg.create({ error: error.message }));\n } catch (sendError) {\n ctx.platform.logger.error('[progress-channel] Failed to send error message', sendError instanceof Error ? sendError : undefined);\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/ws/progress-channel.ts"],"names":["ctx"],"mappings":";;;AASA,IAAM,YAAA,GAAe,cAAiC,WAAW,CAAA;AAEjE,IAAM,cAAA,GAAiB,cAAkB,aAAa,CAAA;AAEtD,IAAM,YAAA,GAAe,cAAuD,YAAY,CAAA;AAYxF,IAAM,QAAA,GAAW,cAAiC,OAAO,CAAA;AAYzD,IAAO,2BAAQ,eAAA,CAA6C;AAAA,EAC1D,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EAAa,gCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ;AAE3B,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,IAAA,CAAK,qCAAA,EAAuC,EAAE,YAAA,EAAc,MAAA,CAAO,eAAA,EAAgB,EAAG,CAAA;AAAA,IAI5G,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ;AACpC,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,EAAc,CAC9B,GAAG,YAAA,EAAc,OAAOA,IAAAA,EAAK,OAAA,EAAS,UAAA,KAAe;AACpD,QAAA,MAAM,EAAE,OAAM,GAAI,OAAA;AAElB,QAAAA,KAAI,QAAA,CAAS,MAAA,CAAO,KAAK,mDAAA,EAAqD,EAAE,OAAO,CAAA;AAIvF,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UACX,aAAa,MAAA,CAAO;AAAA,YAClB,QAAA,EAAU,gBAAA;AAAA,YACV,SAAA,EAAW;AAAA,WACZ;AAAA,SACH;AAAA,MACF,CAAC,CAAA,CACA,EAAA,CAAG,gBAAgB,OAAOA,IAAAA,EAAK,UAAU,UAAA,KAAe;AACvD,QAAAA,IAAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,uDAAuD,CAAA;AAAA,MAElF,CAAC,CAAA;AAEH,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,OAAA,EAAsB,OAAO,GAAG,CAAA;AAAA,IAC3D,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ;AACpC,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,0CAA0C,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,IAErF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ;AAChC,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,KAAK,CAAA;AAC3D,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,KAAK,QAAA,CAAS,MAAA,CAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA;AAAA,MAC7D,SAAS,SAAA,EAAW;AAClB,QAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,mDAAmD,SAAA,YAAqB,KAAA,GAAQ,YAAY,MAAS,CAAA;AAAA,MACjI;AAAA,IACF;AAAA;AAEJ,CAAC","file":"progress-channel.js","sourcesContent":["/**\n * @module @kb-labs/workflow-cli/ws/progress-channel\n * WebSocket channel for real-time job progress updates\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\nimport type { WSMessage } from '@kb-labs/sdk';\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string }>('subscribe');\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst StepStartMsg = defineMessage<{ stepName: string; stepIndex: number }>('step_start');\n\n// Type-only message definitions (used only in type unions)\ntype StepProgressMsg = ReturnType<typeof defineMessage<{ stepName: string; progress: number; message?: string }>>;\ntype StepCompleteMsg = ReturnType<typeof defineMessage<{\n stepName: string;\n status: 'completed' | 'failed';\n durationMs: number;\n error?: string;\n}>>;\ntype JobCompleteMsg = ReturnType<typeof defineMessage<{ jobId: string; status: string; durationMs: number }>>;\n\nconst ErrorMsg = defineMessage<{ error: string }>('error');\n\n// Incoming/Outgoing types\ntype Incoming = ReturnType<typeof SubscribeMsg.create> | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof StepStartMsg.create>\n | StepProgressMsg\n | StepCompleteMsg\n | JobCompleteMsg\n | ReturnType<typeof ErrorMsg.create>;\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/progress/:jobId',\n description: 'Real-time job progress updates',\n\n handler: {\n async onConnect(ctx, sender) {\n // Note: jobId will come from path params via runtime, not ctx.params\n ctx.platform.logger.info('[progress-channel] Client connected', { connectionId: sender.getConnectionId() });\n\n // TODO: Subscribe to progress events from daemon/engine\n // Client needs to send Subscribe message with jobId\n },\n\n async onMessage(ctx, message, sender) {\n const router = new MessageRouter()\n .on(SubscribeMsg, async (ctx, payload, _rawSender) => {\n const { jobId } = payload;\n\n ctx.platform.logger.info('[progress-channel] Subscribed to progress updates', { jobId });\n\n // TODO: Start streaming progress updates from engine\n // For now, send confirmation via step start message\n await sender.send(\n StepStartMsg.create({\n stepName: 'initialization',\n stepIndex: 0,\n })\n );\n })\n .on(UnsubscribeMsg, async (ctx, _payload, _rawSender) => {\n ctx.platform.logger.info('[progress-channel] Unsubscribed from progress updates');\n // TODO: Stop streaming\n });\n\n await router.handle(ctx, message as WSMessage, sender.raw);\n },\n\n async onDisconnect(ctx, code, reason) {\n ctx.platform.logger.info('[progress-channel] Client disconnected', { code, reason });\n // TODO: Cleanup subscriptions\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[progress-channel] Error', error);\n try {\n await sender.send(ErrorMsg.create({ error: error.message }));\n } catch (sendError) {\n ctx.platform.logger.error('[progress-channel] Failed to send error message', sendError instanceof Error ? sendError : undefined);\n }\n },\n },\n});\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/workflow-entry",
3
3
  "description": "CLI commands for KB Labs Workflow Daemon - interact with workflow daemon via HTTP API.",
4
- "version": "2.89.0",
4
+ "version": "2.93.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -21,9 +21,9 @@
21
21
  "README.md"
22
22
  ],
23
23
  "dependencies": {
24
- "@kb-labs/core-platform": "2.89.0",
25
- "@kb-labs/workflow-contracts": "2.89.0",
26
- "@kb-labs/sdk": "2.21.2"
24
+ "@kb-labs/sdk": "2.21.2",
25
+ "@kb-labs/core-platform": "2.93.0",
26
+ "@kb-labs/workflow-contracts": "2.93.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@rspack/cli": "^1.7.0",
@@ -37,8 +37,8 @@
37
37
  "tsup": "^8.5.0",
38
38
  "typescript": "^5.6.3",
39
39
  "vitest": "^3.2.4",
40
- "@kb-labs/devkit": "2.89.0",
41
- "@kb-labs/studio-plugin-tools": "2.89.0"
40
+ "@kb-labs/studio-plugin-tools": "2.93.0",
41
+ "@kb-labs/devkit": "2.93.0"
42
42
  },
43
43
  "engines": {
44
44
  "node": ">=20.0.0",