@rubytech/create-maxy-code 0.1.601 → 0.1.602
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.
- package/package.json +1 -1
- package/payload/platform/plugins/admin/hooks/video-frames-inject.sh +141 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +5 -1
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
- package/payload/platform/plugins/docs/references/telegram-guide.md +2 -0
- package/payload/platform/plugins/scheduling/PLUGIN.md +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js +67 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-audits.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js +89 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.js +160 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/outage-marker.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +16 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts +31 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js +42 -4
- package/payload/platform/plugins/scheduling/mcp/dist/lib/gate.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.d.ts +101 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.js +130 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/outage-marker.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +10 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +24 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +89 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +67 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js +31 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/gate-dispatch-wiring.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +10 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +46 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +72 -4
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +81 -4
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +50 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +48 -7
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
- package/payload/platform/plugins/telegram/PLUGIN.md +4 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js +33 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin-registry.test.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js +166 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/public-pin.test.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/index.js +39 -14
- package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts +95 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js +125 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +6 -0
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +12 -5
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +5 -0
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +9 -3
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/templates/account-settings.json +6 -0
- package/payload/server/chunk-CYU75QAV.js +377 -0
- package/payload/server/{chunk-34FPJYHN.js → chunk-GI5AVCRG.js} +87 -146
- package/payload/server/chunk-KUVNCAE4.js +77 -0
- package/payload/server/{manager-7BXVB76I.js → manager-VDHT3YYI.js} +2 -1
- package/payload/server/maxy-edge.js +33 -1
- package/payload/server/public/activity.html +6 -6
- package/payload/server/public/agents.html +5 -5
- package/payload/server/public/assets/{AdminLoginScreens-B3W6J6Bl.js → AdminLoginScreens-CaQqLuxZ.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-CaQqLuxZ.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-CaQqLuxZ.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-C3R-vMZ5.js → AdminShell-D8WTrqem.js} +1 -1
- package/payload/server/public/assets/AdminShell-D8WTrqem.js.br +0 -0
- package/payload/server/public/assets/AdminShell-D8WTrqem.js.gz +0 -0
- package/payload/server/public/assets/{activity-tzv68iBs.js → activity-B3fiJrC2.js} +1 -1
- package/payload/server/public/assets/activity-B3fiJrC2.js.br +0 -0
- package/payload/server/public/assets/activity-B3fiJrC2.js.gz +0 -0
- package/payload/server/public/assets/admin-ouF-DflP.js +1 -0
- package/payload/server/public/assets/admin-ouF-DflP.js.br +0 -0
- package/payload/server/public/assets/admin-ouF-DflP.js.gz +0 -0
- package/payload/server/public/assets/{agents-DUZfeY3X.js → agents-C8RSXHdh.js} +1 -1
- package/payload/server/public/assets/agents-C8RSXHdh.js.br +0 -0
- package/payload/server/public/assets/agents-C8RSXHdh.js.gz +0 -0
- package/payload/server/public/assets/{browser-DwLaXqjO.js → browser-Dbv6-Rag.js} +1 -1
- package/payload/server/public/assets/browser-Dbv6-Rag.js.br +0 -0
- package/payload/server/public/assets/browser-Dbv6-Rag.js.gz +0 -0
- package/payload/server/public/assets/{calendar-Cli8Qjl9.js → calendar-vJjtsH9n.js} +1 -1
- package/payload/server/public/assets/calendar-vJjtsH9n.js.br +0 -0
- package/payload/server/public/assets/calendar-vJjtsH9n.js.gz +0 -0
- package/payload/server/public/assets/chat-cqL4qPUy.js +1 -0
- package/payload/server/public/assets/chat-cqL4qPUy.js.br +1 -0
- package/payload/server/public/assets/chat-cqL4qPUy.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-DB98DSG3.js +1 -0
- package/payload/server/public/assets/chevron-left-DB98DSG3.js.br +0 -0
- package/payload/server/public/assets/clock-4YwsYe4L.js +1 -0
- package/payload/server/public/assets/clock-4YwsYe4L.js.br +0 -0
- package/payload/server/public/assets/clock-4YwsYe4L.js.gz +0 -0
- package/payload/server/public/assets/{copy-yhhwfEbQ.js → copy-DyG7sC5o.js} +1 -1
- package/payload/server/public/assets/copy-DyG7sC5o.js.br +0 -0
- package/payload/server/public/assets/copy-DyG7sC5o.js.gz +0 -0
- package/payload/server/public/assets/data-BAzLtx9C.js +1 -0
- package/payload/server/public/assets/data-BAzLtx9C.js.br +0 -0
- package/payload/server/public/assets/data-BAzLtx9C.js.gz +0 -0
- package/payload/server/public/assets/{field-jg0YQNDy.js → field-Bx6pM-vq.js} +1 -1
- package/payload/server/public/assets/field-Bx6pM-vq.js.br +0 -0
- package/payload/server/public/assets/field-Bx6pM-vq.js.gz +0 -0
- package/payload/server/public/assets/{file-text-D0EdW7h4.js → file-text-CpHWsMGe.js} +1 -1
- package/payload/server/public/assets/file-text-CpHWsMGe.js.br +0 -0
- package/payload/server/public/assets/file-text-CpHWsMGe.js.gz +0 -0
- package/payload/server/public/assets/{graph--AUr4uBc.js → graph-DjOywuv_.js} +1 -1
- package/payload/server/public/assets/graph-DjOywuv_.js.br +0 -0
- package/payload/server/public/assets/graph-DjOywuv_.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-DM0CiAX1.js → graph-labels-CGWtqa-m.js} +1 -1
- package/payload/server/public/assets/graph-labels-CGWtqa-m.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CGWtqa-m.js.gz +0 -0
- package/payload/server/public/assets/{jsx-runtime-lfcjzaWi.css → jsx-runtime-D75_aR1J.css} +1 -1
- package/payload/server/public/assets/jsx-runtime-D75_aR1J.css.br +0 -0
- package/payload/server/public/assets/{jsx-runtime-lfcjzaWi.css.gz → jsx-runtime-D75_aR1J.css.gz} +0 -0
- package/payload/server/public/assets/{operator-CNYKStFX.js → operator-_DN0RF1R.js} +1 -1
- package/payload/server/public/assets/operator-_DN0RF1R.js.br +0 -0
- package/payload/server/public/assets/operator-_DN0RF1R.js.gz +0 -0
- package/payload/server/public/assets/page-DI4qQIK0.js +1 -0
- package/payload/server/public/assets/page-DI4qQIK0.js.br +0 -0
- package/payload/server/public/assets/page-DI4qQIK0.js.gz +0 -0
- package/payload/server/public/assets/page-zCwgrs8m.js +32 -0
- package/payload/server/public/assets/page-zCwgrs8m.js.br +0 -0
- package/payload/server/public/assets/page-zCwgrs8m.js.gz +0 -0
- package/payload/server/public/assets/play-CHQ5a9yh.js +1 -0
- package/payload/server/public/assets/play-CHQ5a9yh.js.br +0 -0
- package/payload/server/public/assets/play-CHQ5a9yh.js.gz +0 -0
- package/payload/server/public/assets/{public-7gXDqCog.js → public-DDVWBNSH.js} +1 -1
- package/payload/server/public/assets/public-DDVWBNSH.js.br +0 -0
- package/payload/server/public/assets/public-DDVWBNSH.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DhqNTPpo.js → rotate-ccw-xTwkf-m7.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-xTwkf-m7.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-xTwkf-m7.js.gz +0 -0
- package/payload/server/public/assets/{routines-DN_yDtEj.js → routines-Bu5MdNmG.js} +1 -1
- package/payload/server/public/assets/routines-Bu5MdNmG.js.br +0 -0
- package/payload/server/public/assets/routines-Bu5MdNmG.js.gz +0 -0
- package/payload/server/public/assets/{skills-pb_3BdOl.js → skills-DRunh5vy.js} +1 -1
- package/payload/server/public/assets/skills-DRunh5vy.js.br +0 -0
- package/payload/server/public/assets/skills-DRunh5vy.js.gz +0 -0
- package/payload/server/public/assets/{tasks-BQm4boat.js → tasks-DI2fznvd.js} +1 -1
- package/payload/server/public/assets/tasks-DI2fznvd.js.br +0 -0
- package/payload/server/public/assets/tasks-DI2fznvd.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-d7yjaIqv.js → triangle-alert-B6CHZeUf.js} +1 -1
- package/payload/server/public/assets/triangle-alert-B6CHZeUf.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-B6CHZeUf.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-CZ6Qhfkj.js → useCopyFeedback-6rU2IEPk.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-6rU2IEPk.js.br +2 -0
- package/payload/server/public/assets/useCopyFeedback-6rU2IEPk.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-R1smYLx4.js → useMediaQuery-D7A5Bzs3.js} +1 -1
- package/payload/server/public/assets/useMediaQuery-D7A5Bzs3.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-D7A5Bzs3.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js +2 -0
- package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-CptrerVA.js.gz +0 -0
- package/payload/server/public/assets/{wrench-DL1pbaCs.js → wrench-DyX4C8aY.js} +1 -1
- package/payload/server/public/assets/wrench-DyX4C8aY.js.br +0 -0
- package/payload/server/public/assets/wrench-DyX4C8aY.js.gz +0 -0
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +14 -14
- package/payload/server/public/data.html +12 -12
- package/payload/server/public/field.html +3 -3
- package/payload/server/public/graph.html +10 -10
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +15 -15
- package/payload/server/public/public.html +14 -14
- package/payload/server/public/routines.html +8 -8
- package/payload/server/public/skills.html +6 -6
- package/payload/server/public/tasks.html +7 -7
- package/payload/server/server.js +634 -461
- package/payload/server/video-extract.js +36 -0
- package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-B3W6J6Bl.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.br +0 -0
- package/payload/server/public/assets/AdminShell-C3R-vMZ5.js.gz +0 -0
- package/payload/server/public/assets/activity-tzv68iBs.js.br +0 -0
- package/payload/server/public/assets/activity-tzv68iBs.js.gz +0 -0
- package/payload/server/public/assets/admin-CzW_9jm3.js +0 -1
- package/payload/server/public/assets/admin-CzW_9jm3.js.br +0 -0
- package/payload/server/public/assets/admin-CzW_9jm3.js.gz +0 -0
- package/payload/server/public/assets/agents-DUZfeY3X.js.br +0 -0
- package/payload/server/public/assets/agents-DUZfeY3X.js.gz +0 -0
- package/payload/server/public/assets/browser-DwLaXqjO.js.br +0 -0
- package/payload/server/public/assets/browser-DwLaXqjO.js.gz +0 -0
- package/payload/server/public/assets/calendar-Cli8Qjl9.js.br +0 -0
- package/payload/server/public/assets/calendar-Cli8Qjl9.js.gz +0 -0
- package/payload/server/public/assets/chat-ByAgBgm1.js +0 -1
- package/payload/server/public/assets/chat-ByAgBgm1.js.br +0 -1
- package/payload/server/public/assets/chat-ByAgBgm1.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BIYVnwvk.js +0 -1
- package/payload/server/public/assets/chevron-left-BIYVnwvk.js.br +0 -0
- package/payload/server/public/assets/clock-Dzy79hq3.js +0 -1
- package/payload/server/public/assets/clock-Dzy79hq3.js.br +0 -0
- package/payload/server/public/assets/clock-Dzy79hq3.js.gz +0 -0
- package/payload/server/public/assets/copy-yhhwfEbQ.js.br +0 -0
- package/payload/server/public/assets/copy-yhhwfEbQ.js.gz +0 -0
- package/payload/server/public/assets/data-CsMMki2A.js +0 -1
- package/payload/server/public/assets/data-CsMMki2A.js.br +0 -0
- package/payload/server/public/assets/data-CsMMki2A.js.gz +0 -0
- package/payload/server/public/assets/field-jg0YQNDy.js.br +0 -0
- package/payload/server/public/assets/field-jg0YQNDy.js.gz +0 -0
- package/payload/server/public/assets/file-text-D0EdW7h4.js.br +0 -0
- package/payload/server/public/assets/file-text-D0EdW7h4.js.gz +0 -0
- package/payload/server/public/assets/graph--AUr4uBc.js.br +0 -0
- package/payload/server/public/assets/graph--AUr4uBc.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-DM0CiAX1.js.br +0 -0
- package/payload/server/public/assets/graph-labels-DM0CiAX1.js.gz +0 -0
- package/payload/server/public/assets/jsx-runtime-lfcjzaWi.css.br +0 -0
- package/payload/server/public/assets/operator-CNYKStFX.js.br +0 -0
- package/payload/server/public/assets/operator-CNYKStFX.js.gz +0 -0
- package/payload/server/public/assets/page-DSsEpl8J.js +0 -32
- package/payload/server/public/assets/page-DSsEpl8J.js.br +0 -0
- package/payload/server/public/assets/page-DSsEpl8J.js.gz +0 -0
- package/payload/server/public/assets/page-DjhmwxnY.js +0 -1
- package/payload/server/public/assets/page-DjhmwxnY.js.br +0 -0
- package/payload/server/public/assets/page-DjhmwxnY.js.gz +0 -0
- package/payload/server/public/assets/play-DhZlml5b.js +0 -1
- package/payload/server/public/assets/play-DhZlml5b.js.br +0 -0
- package/payload/server/public/assets/play-DhZlml5b.js.gz +0 -0
- package/payload/server/public/assets/public-7gXDqCog.js.br +0 -0
- package/payload/server/public/assets/public-7gXDqCog.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DhqNTPpo.js.gz +0 -0
- package/payload/server/public/assets/routines-DN_yDtEj.js.br +0 -0
- package/payload/server/public/assets/routines-DN_yDtEj.js.gz +0 -0
- package/payload/server/public/assets/skills-pb_3BdOl.js.br +0 -0
- package/payload/server/public/assets/skills-pb_3BdOl.js.gz +0 -0
- package/payload/server/public/assets/tasks-BQm4boat.js.br +0 -0
- package/payload/server/public/assets/tasks-BQm4boat.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-d7yjaIqv.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-CZ6Qhfkj.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-R1smYLx4.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js +0 -2
- package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DM1v6sRa.js.gz +0 -0
- package/payload/server/public/assets/wrench-DL1pbaCs.js.br +0 -0
- package/payload/server/public/assets/wrench-DL1pbaCs.js.gz +0 -0
- /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js → jsx-runtime-B2Q1UOSJ.js} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js.br → jsx-runtime-B2Q1UOSJ.js.br} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-BtDK2X5t.js.gz → jsx-runtime-B2Q1UOSJ.js.gz} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,yEAAyE;
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,12 @@
|
|
|
87
87
|
"hooks": [
|
|
88
88
|
{ "type": "command", "command": "bash $PLATFORM_ROOT/plugins/admin/hooks/preference-consult-gate.sh" }
|
|
89
89
|
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"matcher": "Read",
|
|
93
|
+
"hooks": [
|
|
94
|
+
{ "type": "command", "command": "bash $PLATFORM_ROOT/plugins/admin/hooks/video-frames-inject.sh" }
|
|
95
|
+
]
|
|
90
96
|
}
|
|
91
97
|
],
|
|
92
98
|
"PostToolUse": [
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// app/lib/stt/index.ts
|
|
4
|
+
import { execFile } from "child_process";
|
|
5
|
+
import { unlink, stat } from "fs/promises";
|
|
6
|
+
import { promisify } from "util";
|
|
7
|
+
var execFileAsync = promisify(execFile);
|
|
8
|
+
var TAG = "[stt]";
|
|
9
|
+
var WHISPER_BINARY = process.env.WHISPER_BINARY ?? "/opt/whisper.cpp/build/bin/whisper-cli";
|
|
10
|
+
var WHISPER_MODEL = process.env.WHISPER_MODEL ?? "/opt/whisper.cpp/models/ggml-base.bin";
|
|
11
|
+
var WHISPER_TIMEOUT_MS = 20 * 60 * 1e3;
|
|
12
|
+
var SPECIAL_TOKEN_RE = /\[_[A-Z]+(?:_\d+)?_?\]/g;
|
|
13
|
+
function stripSpecialTokens(input) {
|
|
14
|
+
const matches = input.match(SPECIAL_TOKEN_RE);
|
|
15
|
+
const count = matches ? matches.length : 0;
|
|
16
|
+
if (!count) return { text: input, count: 0 };
|
|
17
|
+
const text = input.replace(SPECIAL_TOKEN_RE, "").replace(/[ \t]{2,}/g, " ").trim();
|
|
18
|
+
return { text, count };
|
|
19
|
+
}
|
|
20
|
+
var SEGMENT_RE = /^\[(\d{2}):(\d{2}):(\d{2})\.(\d{3})\s*-->\s*(\d{2}):(\d{2}):(\d{2})\.(\d{3})\]\s*(.*)$/;
|
|
21
|
+
function toMs(h, m, s, ms) {
|
|
22
|
+
return ((Number(h) * 60 + Number(m)) * 60 + Number(s)) * 1e3 + Number(ms);
|
|
23
|
+
}
|
|
24
|
+
function parseWhisperSegments(stdout) {
|
|
25
|
+
const segments = [];
|
|
26
|
+
for (const line of stdout.split("\n")) {
|
|
27
|
+
const m = SEGMENT_RE.exec(line.trim());
|
|
28
|
+
if (!m) continue;
|
|
29
|
+
const { text } = stripSpecialTokens(m[9].trim());
|
|
30
|
+
if (!text) continue;
|
|
31
|
+
segments.push({
|
|
32
|
+
startMs: toMs(m[1], m[2], m[3], m[4]),
|
|
33
|
+
endMs: toMs(m[5], m[6], m[7], m[8]),
|
|
34
|
+
text
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return segments;
|
|
38
|
+
}
|
|
39
|
+
async function transcribeWithTimestamps(audioPath, mimetype) {
|
|
40
|
+
const startMs = Date.now();
|
|
41
|
+
const wavPath = audioPath.replace(/\.[^.]+$/, "") + ".video.wav";
|
|
42
|
+
try {
|
|
43
|
+
await execFileAsync("ffmpeg", [
|
|
44
|
+
"-i",
|
|
45
|
+
audioPath,
|
|
46
|
+
"-ar",
|
|
47
|
+
"16000",
|
|
48
|
+
"-ac",
|
|
49
|
+
"1",
|
|
50
|
+
"-c:a",
|
|
51
|
+
"pcm_s16le",
|
|
52
|
+
"-y",
|
|
53
|
+
wavPath
|
|
54
|
+
], { timeout: 6e4 });
|
|
55
|
+
} catch (err) {
|
|
56
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
57
|
+
console.error(`${TAG} timestamps failed: ffmpeg conversion error=${reason}`);
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const { stdout } = await execFileAsync(WHISPER_BINARY, [
|
|
62
|
+
"-m",
|
|
63
|
+
WHISPER_MODEL,
|
|
64
|
+
"-f",
|
|
65
|
+
wavPath,
|
|
66
|
+
"-l",
|
|
67
|
+
"auto"
|
|
68
|
+
], { timeout: WHISPER_TIMEOUT_MS, maxBuffer: 10 * 1024 * 1024 });
|
|
69
|
+
const segments = parseWhisperSegments(stdout);
|
|
70
|
+
const durationMs = Date.now() - startMs;
|
|
71
|
+
if (segments.length === 0) {
|
|
72
|
+
console.error(
|
|
73
|
+
`${TAG} timestamps: no segments parsed duration_ms=${durationMs} mimetype=${mimetype}`
|
|
74
|
+
);
|
|
75
|
+
return void 0;
|
|
76
|
+
}
|
|
77
|
+
console.error(
|
|
78
|
+
`${TAG} timestamps done segments=${segments.length} duration_ms=${durationMs}`
|
|
79
|
+
);
|
|
80
|
+
return segments;
|
|
81
|
+
} catch (err) {
|
|
82
|
+
const durationMs = Date.now() - startMs;
|
|
83
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
84
|
+
console.error(`${TAG} timestamps failed duration_ms=${durationMs} error=${reason}`);
|
|
85
|
+
return void 0;
|
|
86
|
+
} finally {
|
|
87
|
+
unlink(wavPath).catch(() => {
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function transcribe(audioPath, mimetype) {
|
|
92
|
+
const startMs = Date.now();
|
|
93
|
+
let audioBytes = 0;
|
|
94
|
+
try {
|
|
95
|
+
const s = await stat(audioPath);
|
|
96
|
+
audioBytes = s.size;
|
|
97
|
+
} catch {
|
|
98
|
+
console.error(`${TAG} failed: file not readable path=${audioPath}`);
|
|
99
|
+
return void 0;
|
|
100
|
+
}
|
|
101
|
+
console.error(
|
|
102
|
+
`${TAG} start provider=whisper-local audio_bytes=${audioBytes} mimetype=${mimetype} path=${audioPath}`
|
|
103
|
+
);
|
|
104
|
+
const wavPath = audioPath.replace(/\.[^.]+$/, "") + ".wav";
|
|
105
|
+
try {
|
|
106
|
+
await execFileAsync("ffmpeg", [
|
|
107
|
+
"-i",
|
|
108
|
+
audioPath,
|
|
109
|
+
"-ar",
|
|
110
|
+
"16000",
|
|
111
|
+
"-ac",
|
|
112
|
+
"1",
|
|
113
|
+
"-c:a",
|
|
114
|
+
"pcm_s16le",
|
|
115
|
+
"-y",
|
|
116
|
+
// overwrite without prompting
|
|
117
|
+
wavPath
|
|
118
|
+
], { timeout: 3e4 });
|
|
119
|
+
} catch (err) {
|
|
120
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
121
|
+
console.error(`${TAG} failed: ffmpeg conversion error=${reason}`);
|
|
122
|
+
return void 0;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const { stdout, stderr } = await execFileAsync(WHISPER_BINARY, [
|
|
126
|
+
"-m",
|
|
127
|
+
WHISPER_MODEL,
|
|
128
|
+
"-f",
|
|
129
|
+
wavPath,
|
|
130
|
+
"--no-timestamps",
|
|
131
|
+
"-l",
|
|
132
|
+
"auto"
|
|
133
|
+
], { timeout: WHISPER_TIMEOUT_MS, maxBuffer: 10 * 1024 * 1024 });
|
|
134
|
+
const durationMs = Date.now() - startMs;
|
|
135
|
+
const { text, count: stripped } = stripSpecialTokens(stdout.trim());
|
|
136
|
+
if (!text) {
|
|
137
|
+
console.error(`${TAG} failed: whisper returned empty output duration_ms=${durationMs}`);
|
|
138
|
+
return void 0;
|
|
139
|
+
}
|
|
140
|
+
const langMatch = stderr.match(/auto-detected language:\s*(\w+)/);
|
|
141
|
+
const language = langMatch?.[1] ?? "unknown";
|
|
142
|
+
const words = text.split(/\s+/).filter(Boolean).length;
|
|
143
|
+
console.error(
|
|
144
|
+
`${TAG} done provider=whisper-local duration_ms=${durationMs} words=${words} stripped=${stripped} lang=${language}`
|
|
145
|
+
);
|
|
146
|
+
return { text, language, durationMs };
|
|
147
|
+
} catch (err) {
|
|
148
|
+
const durationMs = Date.now() - startMs;
|
|
149
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
150
|
+
console.error(`${TAG} failed provider=whisper-local duration_ms=${durationMs} error=${reason}`);
|
|
151
|
+
return void 0;
|
|
152
|
+
} finally {
|
|
153
|
+
unlink(wavPath).catch(() => {
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// app/lib/video/frames.ts
|
|
159
|
+
import { execFile as execFile2 } from "child_process";
|
|
160
|
+
import { join } from "path";
|
|
161
|
+
import { promisify as promisify2 } from "util";
|
|
162
|
+
var execFileAsync2 = promisify2(execFile2);
|
|
163
|
+
var TAG2 = "[video]";
|
|
164
|
+
var SCENE_THRESHOLD = 0.3;
|
|
165
|
+
var DENSITY_INTERVAL_S = 4;
|
|
166
|
+
var MIN_FRAMES = 3;
|
|
167
|
+
var MAX_FRAMES = 24;
|
|
168
|
+
var DEDUPE_TOLERANCE_S = 0.5;
|
|
169
|
+
function round3(n) {
|
|
170
|
+
return Math.round(n * 1e3) / 1e3;
|
|
171
|
+
}
|
|
172
|
+
function selectFrameTimestamps(durationSec, sceneTimes) {
|
|
173
|
+
if (!Number.isFinite(durationSec) || durationSec <= 0) return [];
|
|
174
|
+
const floorTimes = [];
|
|
175
|
+
for (let t = 0; t < durationSec; t += DENSITY_INTERVAL_S) floorTimes.push(round3(t));
|
|
176
|
+
const inRange = sceneTimes.filter((t) => Number.isFinite(t) && t >= 0 && t < durationSec);
|
|
177
|
+
const sorted = [...floorTimes, ...inRange].sort((a, b) => a - b);
|
|
178
|
+
const merged = [];
|
|
179
|
+
for (const t of sorted) {
|
|
180
|
+
if (merged.length === 0 || t - merged[merged.length - 1] >= DEDUPE_TOLERANCE_S) {
|
|
181
|
+
merged.push(round3(t));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (merged.length < MIN_FRAMES) {
|
|
185
|
+
const step = durationSec / MIN_FRAMES;
|
|
186
|
+
return Array.from({ length: MIN_FRAMES }, (_, i) => round3(i * step));
|
|
187
|
+
}
|
|
188
|
+
if (merged.length > MAX_FRAMES) {
|
|
189
|
+
const last = merged.length - 1;
|
|
190
|
+
const picked = [];
|
|
191
|
+
for (let i = 0; i < MAX_FRAMES; i++) {
|
|
192
|
+
picked.push(merged[Math.round(i * last / (MAX_FRAMES - 1))]);
|
|
193
|
+
}
|
|
194
|
+
return picked;
|
|
195
|
+
}
|
|
196
|
+
return merged;
|
|
197
|
+
}
|
|
198
|
+
var defaultExec = async (file, args) => {
|
|
199
|
+
const { stdout, stderr } = await execFileAsync2(file, args, {
|
|
200
|
+
timeout: 12e4,
|
|
201
|
+
maxBuffer: 10 * 1024 * 1024
|
|
202
|
+
});
|
|
203
|
+
return { stdout, stderr };
|
|
204
|
+
};
|
|
205
|
+
var PTS_TIME_RE = /pts_time:([0-9]+(?:\.[0-9]+)?)/g;
|
|
206
|
+
async function detectSceneTimes(path, execImpl = defaultExec) {
|
|
207
|
+
try {
|
|
208
|
+
const { stdout, stderr } = await execImpl("ffmpeg", [
|
|
209
|
+
"-v",
|
|
210
|
+
"error",
|
|
211
|
+
"-i",
|
|
212
|
+
path,
|
|
213
|
+
"-vf",
|
|
214
|
+
`select='gt(scene,${SCENE_THRESHOLD})',metadata=print:file=-`,
|
|
215
|
+
"-an",
|
|
216
|
+
"-f",
|
|
217
|
+
"null",
|
|
218
|
+
"-"
|
|
219
|
+
]);
|
|
220
|
+
const times = [];
|
|
221
|
+
for (const m of `${stdout}
|
|
222
|
+
${stderr}`.matchAll(PTS_TIME_RE)) {
|
|
223
|
+
const t = Number(m[1]);
|
|
224
|
+
if (Number.isFinite(t)) times.push(t);
|
|
225
|
+
}
|
|
226
|
+
return times.sort((a, b) => a - b);
|
|
227
|
+
} catch (err) {
|
|
228
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
229
|
+
console.error(`${TAG2} scene detect failed error=${reason} path=${path}`);
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function extractFrames(path, timestamps, outDir, execImpl = defaultExec) {
|
|
234
|
+
const stem = `video-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
235
|
+
const refs = [];
|
|
236
|
+
for (const tSec of timestamps) {
|
|
237
|
+
const out = join(outDir, `${stem}-${tSec.toFixed(3).replace(".", "_")}.jpg`);
|
|
238
|
+
try {
|
|
239
|
+
await execImpl("ffmpeg", [
|
|
240
|
+
"-v",
|
|
241
|
+
"error",
|
|
242
|
+
"-ss",
|
|
243
|
+
String(tSec),
|
|
244
|
+
"-i",
|
|
245
|
+
path,
|
|
246
|
+
"-frames:v",
|
|
247
|
+
"1",
|
|
248
|
+
"-q:v",
|
|
249
|
+
"4",
|
|
250
|
+
"-y",
|
|
251
|
+
out
|
|
252
|
+
]);
|
|
253
|
+
refs.push({ tSec, path: out });
|
|
254
|
+
} catch (err) {
|
|
255
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
256
|
+
console.error(`${TAG2} frame extract failed t=${tSec} error=${reason}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return refs;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// app/lib/video/probe.ts
|
|
263
|
+
import { execFile as execFile3 } from "child_process";
|
|
264
|
+
import { promisify as promisify3 } from "util";
|
|
265
|
+
var execFileAsync3 = promisify3(execFile3);
|
|
266
|
+
var TAG3 = "[video]";
|
|
267
|
+
var defaultExec2 = async (file, args) => {
|
|
268
|
+
const { stdout } = await execFileAsync3(file, args, { timeout: 3e4 });
|
|
269
|
+
return { stdout };
|
|
270
|
+
};
|
|
271
|
+
async function probeVideo(path, execImpl = defaultExec2) {
|
|
272
|
+
try {
|
|
273
|
+
const { stdout } = await execImpl("ffprobe", [
|
|
274
|
+
"-v",
|
|
275
|
+
"error",
|
|
276
|
+
"-show_entries",
|
|
277
|
+
"format=duration",
|
|
278
|
+
"-show_entries",
|
|
279
|
+
"stream=codec_type",
|
|
280
|
+
"-of",
|
|
281
|
+
"json",
|
|
282
|
+
path
|
|
283
|
+
]);
|
|
284
|
+
const parsed = JSON.parse(stdout);
|
|
285
|
+
const durationSec = Number(parsed.format?.duration);
|
|
286
|
+
if (!Number.isFinite(durationSec) || durationSec <= 0) {
|
|
287
|
+
console.error(`${TAG3} probe failed: unparseable duration path=${path}`);
|
|
288
|
+
return void 0;
|
|
289
|
+
}
|
|
290
|
+
const kinds = (parsed.streams ?? []).map((s) => s.codec_type);
|
|
291
|
+
return {
|
|
292
|
+
durationSec,
|
|
293
|
+
hasAudio: kinds.includes("audio"),
|
|
294
|
+
hasVideo: kinds.includes("video")
|
|
295
|
+
};
|
|
296
|
+
} catch (err) {
|
|
297
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
298
|
+
console.error(`${TAG3} probe failed: ffprobe error=${reason} path=${path}`);
|
|
299
|
+
return void 0;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// app/lib/video/timeline.ts
|
|
304
|
+
function stamp(totalSec) {
|
|
305
|
+
const s = Math.floor(totalSec % 60);
|
|
306
|
+
const m = Math.floor(totalSec / 60 % 60);
|
|
307
|
+
const h = Math.floor(totalSec / 3600);
|
|
308
|
+
const mm = String(m).padStart(2, "0");
|
|
309
|
+
const ss = String(s).padStart(2, "0");
|
|
310
|
+
return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;
|
|
311
|
+
}
|
|
312
|
+
function renderTimeline(frames, segments) {
|
|
313
|
+
const events = [];
|
|
314
|
+
for (const s of segments) {
|
|
315
|
+
const tSec = s.startMs / 1e3;
|
|
316
|
+
events.push({ tSec, rank: 0, line: `[${stamp(tSec)}] ${s.text}` });
|
|
317
|
+
}
|
|
318
|
+
for (const f of frames) {
|
|
319
|
+
events.push({ tSec: f.tSec, rank: 1, line: `[${stamp(f.tSec)}] frame \u2192 ${f.path}` });
|
|
320
|
+
}
|
|
321
|
+
events.sort((a, b) => a.tSec - b.tSec || a.rank - b.rank);
|
|
322
|
+
const header = segments.length > 0 ? `Video timeline \u2014 ${frames.length} frame(s) and the spoken transcript, on the video's own clock.` : `Video timeline \u2014 ${frames.length} frame(s); no speech was transcribed from this video.`;
|
|
323
|
+
return [
|
|
324
|
+
header,
|
|
325
|
+
"Read each frame path below to see that moment.",
|
|
326
|
+
"",
|
|
327
|
+
...events.map((e) => e.line)
|
|
328
|
+
].join("\n");
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// app/lib/video/index.ts
|
|
332
|
+
var TAG4 = "[video]";
|
|
333
|
+
var MAX_DURATION_S = 300;
|
|
334
|
+
var MEDIA_DIR = "/tmp/maxy-media";
|
|
335
|
+
var defaults = {
|
|
336
|
+
probe: probeVideo,
|
|
337
|
+
detectScenes: detectSceneTimes,
|
|
338
|
+
extract: extractFrames,
|
|
339
|
+
transcribe: transcribeWithTimestamps,
|
|
340
|
+
outDir: MEDIA_DIR
|
|
341
|
+
};
|
|
342
|
+
async function extractVideo(path, mimetype, deps = {}) {
|
|
343
|
+
const d = { ...defaults, ...deps };
|
|
344
|
+
const startedMs = Date.now();
|
|
345
|
+
const probe = await d.probe(path);
|
|
346
|
+
if (!probe) {
|
|
347
|
+
console.error(`${TAG4} skipped=probe-failed path=${path}`);
|
|
348
|
+
return void 0;
|
|
349
|
+
}
|
|
350
|
+
if (!probe.hasVideo) {
|
|
351
|
+
console.error(`${TAG4} skipped=no-video-stream path=${path}`);
|
|
352
|
+
return void 0;
|
|
353
|
+
}
|
|
354
|
+
if (probe.durationSec > MAX_DURATION_S) {
|
|
355
|
+
console.error(
|
|
356
|
+
`${TAG4} skipped=duration duration_s=${probe.durationSec.toFixed(1)} max_s=${MAX_DURATION_S} path=${path}`
|
|
357
|
+
);
|
|
358
|
+
return void 0;
|
|
359
|
+
}
|
|
360
|
+
const sceneTimes = await d.detectScenes(path);
|
|
361
|
+
const timestamps = selectFrameTimestamps(probe.durationSec, sceneTimes);
|
|
362
|
+
const frames = await d.extract(path, timestamps, d.outDir);
|
|
363
|
+
if (frames.length === 0) {
|
|
364
|
+
console.error(`${TAG4} skipped=no-frames path=${path}`);
|
|
365
|
+
return void 0;
|
|
366
|
+
}
|
|
367
|
+
const segments = probe.hasAudio ? await d.transcribe(path, mimetype) : void 0;
|
|
368
|
+
console.error(
|
|
369
|
+
`${TAG4} done frames=${frames.length} segments=${segments?.length ?? 0} duration_ms=${Date.now() - startedMs} video_s=${probe.durationSec.toFixed(1)}`
|
|
370
|
+
);
|
|
371
|
+
return renderTimeline(frames, segments ?? []);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export {
|
|
375
|
+
transcribe,
|
|
376
|
+
extractVideo
|
|
377
|
+
};
|