@open-mercato/scheduler 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2876.8c589daa8f

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.
@@ -138,7 +138,7 @@ function JobLogsModal({
138
138
  job.failedReason && /* @__PURE__ */ jsxs(TabsContent, { value: "error", className: "space-y-4", children: [
139
139
  /* @__PURE__ */ jsxs("div", { children: [
140
140
  /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: t("scheduler.job_logs.error_message", "Error Message") }),
141
- /* @__PURE__ */ jsx("pre", { className: "mt-1 bg-red-50 dark:bg-red-950 p-3 rounded text-sm text-red-900 dark:text-red-100", children: job.failedReason })
141
+ /* @__PURE__ */ jsx("pre", { className: "mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text", children: job.failedReason })
142
142
  ] }),
143
143
  job.stacktrace && job.stacktrace.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
144
144
  /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: t("scheduler.job_logs.stack_trace", "Stack Trace") }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/scheduler/components/JobLogsModal.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\n\ntype BullMQJob = {\n id: string\n name: string\n data: Record<string, unknown>\n state: 'waiting' | 'active' | 'completed' | 'failed' | 'delayed'\n progress?: number\n returnvalue?: unknown\n failedReason?: string\n stacktrace?: string[]\n attemptsMade: number\n processedOn?: string\n finishedOn?: string\n logs: string[]\n}\n\ntype JobLogsModalProps = {\n open: boolean\n onClose: () => void\n queueJobId: string | null\n queueName: string | null\n scheduleName: string\n}\n\nexport function JobLogsModal({\n open,\n onClose,\n queueJobId,\n queueName,\n scheduleName,\n}: JobLogsModalProps) {\n const t = useT()\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [job, setJob] = React.useState<BullMQJob | null>(null)\n\n React.useEffect(() => {\n if (open && queueJobId && queueName) {\n fetchJobDetails()\n } else {\n setLoading(false)\n setError(null)\n setJob(null)\n }\n }, [open, queueJobId, queueName])\n\n const fetchJobDetails = async () => {\n setLoading(true)\n setError(null)\n \n try {\n const { result } = await apiCallOrThrow(\n `/api/scheduler/queue-jobs/${queueJobId}?queue=${queueName}`\n )\n setJob(result as BullMQJob)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : t('scheduler.job_logs.load_failed', 'Failed to load job details'))\n } finally {\n setLoading(false)\n }\n }\n\n const getStateBadgeVariant = (state: string): 'destructive' | 'secondary' | 'default' | 'outline' => {\n switch (state) {\n case 'completed':\n return 'default'\n case 'failed':\n return 'destructive'\n case 'active':\n return 'outline'\n default:\n return 'secondary'\n }\n }\n\n const formatDuration = (processedOn?: string, finishedOn?: string) => {\n if (!processedOn || !finishedOn) return null\n const duration = new Date(finishedOn).getTime() - new Date(processedOn).getTime()\n return `${(duration / 1000).toFixed(2)}s`\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-auto\">\n <DialogHeader className=\"overflow-hidden\">\n <DialogTitle>\n {t('scheduler.job_logs.title', 'Queue Job')}: {scheduleName}\n </DialogTitle>\n <p\n className=\"text-sm text-muted-foreground font-mono truncate cursor-pointer hover:text-primary transition-colors\"\n title={queueJobId ?? undefined}\n onClick={() => queueJobId && navigator.clipboard.writeText(queueJobId)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (queueJobId) navigator.clipboard.writeText(queueJobId)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {t('scheduler.job_logs.job_id', 'Job ID')}: {queueJobId}\n </p>\n </DialogHeader>\n\n {loading && (\n <div className=\"flex justify-center items-center py-8\">\n <Spinner />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {!loading && !error && job && (\n <Tabs defaultValue=\"overview\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"overview\">{t('scheduler.job_logs.tab_overview', 'Overview')}</TabsTrigger>\n <TabsTrigger value=\"logs\">{t('scheduler.job_logs.tab_logs', 'Logs')}</TabsTrigger>\n <TabsTrigger value=\"data\">{t('scheduler.job_logs.tab_payload', 'Payload')}</TabsTrigger>\n {job.failedReason && (\n <TabsTrigger value=\"error\">{t('scheduler.job_logs.tab_error', 'Error Details')}</TabsTrigger>\n )}\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.state', 'State')}</Label>\n <div className=\"mt-1\">\n <Badge variant={getStateBadgeVariant(job.state)}>\n {job.state}\n </Badge>\n </div>\n </div>\n\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.attempts', 'Attempts')}</Label>\n <p className=\"mt-1 text-sm\">{job.attemptsMade}</p>\n </div>\n\n {job.processedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.processed', 'Processed')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.processedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.finished', 'Finished')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.finishedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.processedOn && job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.duration', 'Duration')}</Label>\n <p className=\"mt-1 text-sm\">\n {formatDuration(job.processedOn, job.finishedOn)}\n </p>\n </div>\n )}\n\n {job.progress !== undefined && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.progress', 'Progress')}</Label>\n <p className=\"mt-1 text-sm\">{job.progress}%</p>\n </div>\n )}\n </div>\n\n {job.returnvalue !== undefined && job.returnvalue !== null && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.return_value', 'Return Value')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64\">\n {String(typeof job.returnvalue === 'string' ? job.returnvalue : JSON.stringify(job.returnvalue, null, 2))}\n </pre>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"logs\">\n {job.logs.length > 0 ? (\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96 font-mono\">\n {job.logs.join('\\n')}\n </pre>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('scheduler.job_logs.no_logs', 'No logs available')}</p>\n )}\n </TabsContent>\n\n <TabsContent value=\"data\">\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96\">\n {JSON.stringify(job.data, null, 2)}\n </pre>\n </TabsContent>\n\n {job.failedReason && (\n <TabsContent value=\"error\" className=\"space-y-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>\n <pre className=\"mt-1 bg-red-50 dark:bg-red-950 p-3 rounded text-sm text-red-900 dark:text-red-100\">\n {job.failedReason}\n </pre>\n </div>\n\n {job.stacktrace && job.stacktrace.length > 0 && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.stack_trace', 'Stack Trace')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64 font-mono\">\n {job.stacktrace.join('\\n')}\n </pre>\n </div>\n )}\n </TabsContent>\n )}\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\n\ntype BullMQJob = {\n id: string\n name: string\n data: Record<string, unknown>\n state: 'waiting' | 'active' | 'completed' | 'failed' | 'delayed'\n progress?: number\n returnvalue?: unknown\n failedReason?: string\n stacktrace?: string[]\n attemptsMade: number\n processedOn?: string\n finishedOn?: string\n logs: string[]\n}\n\ntype JobLogsModalProps = {\n open: boolean\n onClose: () => void\n queueJobId: string | null\n queueName: string | null\n scheduleName: string\n}\n\nexport function JobLogsModal({\n open,\n onClose,\n queueJobId,\n queueName,\n scheduleName,\n}: JobLogsModalProps) {\n const t = useT()\n const [loading, setLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [job, setJob] = React.useState<BullMQJob | null>(null)\n\n React.useEffect(() => {\n if (open && queueJobId && queueName) {\n fetchJobDetails()\n } else {\n setLoading(false)\n setError(null)\n setJob(null)\n }\n }, [open, queueJobId, queueName])\n\n const fetchJobDetails = async () => {\n setLoading(true)\n setError(null)\n \n try {\n const { result } = await apiCallOrThrow(\n `/api/scheduler/queue-jobs/${queueJobId}?queue=${queueName}`\n )\n setJob(result as BullMQJob)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : t('scheduler.job_logs.load_failed', 'Failed to load job details'))\n } finally {\n setLoading(false)\n }\n }\n\n const getStateBadgeVariant = (state: string): 'destructive' | 'secondary' | 'default' | 'outline' => {\n switch (state) {\n case 'completed':\n return 'default'\n case 'failed':\n return 'destructive'\n case 'active':\n return 'outline'\n default:\n return 'secondary'\n }\n }\n\n const formatDuration = (processedOn?: string, finishedOn?: string) => {\n if (!processedOn || !finishedOn) return null\n const duration = new Date(finishedOn).getTime() - new Date(processedOn).getTime()\n return `${(duration / 1000).toFixed(2)}s`\n }\n\n return (\n <Dialog open={open} onOpenChange={onClose}>\n <DialogContent className=\"max-w-4xl max-h-[80vh] overflow-auto\">\n <DialogHeader className=\"overflow-hidden\">\n <DialogTitle>\n {t('scheduler.job_logs.title', 'Queue Job')}: {scheduleName}\n </DialogTitle>\n <p\n className=\"text-sm text-muted-foreground font-mono truncate cursor-pointer hover:text-primary transition-colors\"\n title={queueJobId ?? undefined}\n onClick={() => queueJobId && navigator.clipboard.writeText(queueJobId)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (queueJobId) navigator.clipboard.writeText(queueJobId)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {t('scheduler.job_logs.job_id', 'Job ID')}: {queueJobId}\n </p>\n </DialogHeader>\n\n {loading && (\n <div className=\"flex justify-center items-center py-8\">\n <Spinner />\n </div>\n )}\n\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {!loading && !error && job && (\n <Tabs defaultValue=\"overview\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"overview\">{t('scheduler.job_logs.tab_overview', 'Overview')}</TabsTrigger>\n <TabsTrigger value=\"logs\">{t('scheduler.job_logs.tab_logs', 'Logs')}</TabsTrigger>\n <TabsTrigger value=\"data\">{t('scheduler.job_logs.tab_payload', 'Payload')}</TabsTrigger>\n {job.failedReason && (\n <TabsTrigger value=\"error\">{t('scheduler.job_logs.tab_error', 'Error Details')}</TabsTrigger>\n )}\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.state', 'State')}</Label>\n <div className=\"mt-1\">\n <Badge variant={getStateBadgeVariant(job.state)}>\n {job.state}\n </Badge>\n </div>\n </div>\n\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.attempts', 'Attempts')}</Label>\n <p className=\"mt-1 text-sm\">{job.attemptsMade}</p>\n </div>\n\n {job.processedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.processed', 'Processed')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.processedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.finished', 'Finished')}</Label>\n <p className=\"mt-1 text-sm\">\n {new Date(job.finishedOn).toLocaleString()}\n </p>\n </div>\n )}\n\n {job.processedOn && job.finishedOn && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.duration', 'Duration')}</Label>\n <p className=\"mt-1 text-sm\">\n {formatDuration(job.processedOn, job.finishedOn)}\n </p>\n </div>\n )}\n\n {job.progress !== undefined && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.progress', 'Progress')}</Label>\n <p className=\"mt-1 text-sm\">{job.progress}%</p>\n </div>\n )}\n </div>\n\n {job.returnvalue !== undefined && job.returnvalue !== null && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.return_value', 'Return Value')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64\">\n {String(typeof job.returnvalue === 'string' ? job.returnvalue : JSON.stringify(job.returnvalue, null, 2))}\n </pre>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"logs\">\n {job.logs.length > 0 ? (\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96 font-mono\">\n {job.logs.join('\\n')}\n </pre>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('scheduler.job_logs.no_logs', 'No logs available')}</p>\n )}\n </TabsContent>\n\n <TabsContent value=\"data\">\n <pre className=\"bg-muted p-4 rounded text-xs overflow-auto max-h-96\">\n {JSON.stringify(job.data, null, 2)}\n </pre>\n </TabsContent>\n\n {job.failedReason && (\n <TabsContent value=\"error\" className=\"space-y-4\">\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>\n <pre className=\"mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text\">\n {job.failedReason}\n </pre>\n </div>\n\n {job.stacktrace && job.stacktrace.length > 0 && (\n <div>\n <Label className=\"text-sm font-medium\">{t('scheduler.job_logs.stack_trace', 'Stack Trace')}</Label>\n <pre className=\"mt-1 bg-muted p-3 rounded text-xs overflow-auto max-h-64 font-mono\">\n {job.stacktrace.join('\\n')}\n </pre>\n </div>\n )}\n </TabsContent>\n )}\n </Tabs>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/scheduler",
3
- "version": "0.5.1-develop.2860.07af3a6a9d",
3
+ "version": "0.5.1-develop.2876.8c589daa8f",
4
4
  "description": "Database-managed scheduled jobs with admin UI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -58,13 +58,13 @@
58
58
  "./*/*/*/*/*/*.json": "./src/*/*/*/*/*/*.json"
59
59
  },
60
60
  "dependencies": {
61
- "@open-mercato/events": "0.5.1-develop.2860.07af3a6a9d",
62
- "@open-mercato/queue": "0.5.1-develop.2860.07af3a6a9d",
61
+ "@open-mercato/events": "0.5.1-develop.2876.8c589daa8f",
62
+ "@open-mercato/queue": "0.5.1-develop.2876.8c589daa8f",
63
63
  "cron-parser": "^5.5.0"
64
64
  },
65
65
  "peerDependencies": {
66
66
  "@mikro-orm/core": "^7.0.10",
67
- "@open-mercato/shared": "0.5.1-develop.2860.07af3a6a9d",
67
+ "@open-mercato/shared": "0.5.1-develop.2876.8c589daa8f",
68
68
  "bullmq": "^5.0.0",
69
69
  "ioredis": "^5.0.0",
70
70
  "zod": ">=3.23.0"
@@ -78,7 +78,7 @@
78
78
  }
79
79
  },
80
80
  "devDependencies": {
81
- "@open-mercato/shared": "0.5.1-develop.2860.07af3a6a9d",
81
+ "@open-mercato/shared": "0.5.1-develop.2876.8c589daa8f",
82
82
  "@types/jest": "^30.0.0",
83
83
  "@types/node": "^25.6.0",
84
84
  "jest": "^30.3.0",
@@ -219,7 +219,7 @@ export function JobLogsModal({
219
219
  <TabsContent value="error" className="space-y-4">
220
220
  <div>
221
221
  <Label className="text-sm font-medium">{t('scheduler.job_logs.error_message', 'Error Message')}</Label>
222
- <pre className="mt-1 bg-red-50 dark:bg-red-950 p-3 rounded text-sm text-red-900 dark:text-red-100">
222
+ <pre className="mt-1 bg-status-error-bg p-3 rounded text-sm text-status-error-text">
223
223
  {job.failedReason}
224
224
  </pre>
225
225
  </div>