- MONTHS: drop the appended day-of-week field that produced a 6-field cron
(node-cron reads 6-field crons seconds-first, shifting the schedule)
- MONTHS: validate dayOfMonth (1-31) and emit the parsed integer
- MINUTES/HOURS: constrain the schedule to the atTimeStart/atTimeEnd window
instead of ignoring atTimeEnd; require end after start, and an hour-spanning
window for hourly intervals
- WEEKS: reject runEvery > 1 since cron cannot express multi-week intervals
Add POST/GET/DELETE /api/robots/:id/schedule to the Website-to-API
feature so robots can be scheduled through the API, using the same
fields as the dashboard schedule form. Cron building and validation
are pulled into a shared helper so the dashboard and API routes stay
in sync.
Add 'summary' as a selectable output format for the doc-parse robot type,
matching the existing summary capability in crawl and search robots.
- Add 'summary' to DOC_PARSE_FORMAT_OPTIONS (frontend + backend constants)
- Extend DocumentInterpreter.parse() to generate summaries via the shared
summarizeMarkdown() utility (same logic crawl/search already use)
- Wire LLM config (provider, model, API key) through the doc-parse creation
endpoint, robot record, and run execution path
- Validate LLM API keys when summary is requested with a non-Ollama provider
- Serialize summary output in executeDocumentParseRun for run results
- Display summary in the frontend run results UI with copy/download actions
Closes#1106
Per maintainer review (RohitR311 on #1138): the repo has no existing
test infra or CI to run tests, so introducing jest here is out of
scope. Removes jest configs, test files, tsconfig.test.json, the
test:server script, and jest/ts-jest/@types/jest/jest-environment-jsdom
dependencies from both maxun-core and server.
output-validation.ts stays - it's a real production module (not test
code) extracted to fix the duplicated isPartial bug CodeRabbit flagged;
only its test file is dropped.
computeCrawlSearchPersistDelta advances lastPersistedResultCount as
soon as a delta is computed, before the write is confirmed. If
flushPersistenceBuffer exhausts its retries and drops the batch, that
data was never actually written, but the cursor had already moved
past it - so it was silently lost forever instead of being resent
with the next page's delta.
Roll the cursor back by the dropped delta's size when a batch is
dropped, so the next page recovers the lost items instead of skipping
them. Covered by two new tests exercising the real retry-exhaustion
path via a rejecting sequelize.transaction mock.