Commit Graph

7229 Commits

Author SHA1 Message Date
amhsirak 9d4b6703fc chore(deps): upgrade to 0.35.3 2026-07-26 17:09:44 +05:30
amhsirak 0c2fd1dff7 chore(deps): upgrade to 0.35.3 2026-07-26 17:09:21 +05:30
Karishma Shukla c0b315c05e Merge pull request #1153 from getmaxun/fix-icon-size
fix: override default MUI icon styles & remove redundant font size overrides
2026-07-25 18:32:17 +05:30
amhsirak 35e3fa02d5 fix: normalize tabs & btn icons 2026-07-25 18:30:10 +05:30
amhsirak 7c0e509fed fix: remove hardcoded font size 2026-07-25 18:29:11 +05:30
amhsirak c986aed0db fix(siddebar): custom mui tabs styles 2026-07-25 18:28:19 +05:30
amhsirak 3763ed7c74 feat: set fontSize to 17 2026-07-25 18:20:08 +05:30
amhsirak 7aad004369 chore: lint 2026-07-25 18:15:51 +05:30
amhsirak 0d3feae066 fix: remove hardcoded font size 2026-07-25 18:15:40 +05:30
amhsirak 1540ad78ce fix(sidebar): normalize MUI button icon sizes 2026-07-25 18:14:19 +05:30
Karishma Shukla ca3138a2db Merge pull request #1142 from getmaxun/pre-release-44
chore: pre-release v0.0.44
v0.0.44
2026-07-16 01:14:02 +05:30
amhsirak 4b73b76abd fix: core v0.0.37 2026-07-16 01:13:17 +05:30
amhsirak 1a6fa48395 chore: release v0.0.44 2026-07-16 01:12:53 +05:30
amhsirak 50b2aee7e7 fix: core v0.0.37 2026-07-16 01:12:24 +05:30
amhsirak f958da8209 chore: upgrade core v0.0.37 2026-07-16 01:11:55 +05:30
amhsirak 7c9be31609 chore: release v0.0.44 2026-07-16 01:11:07 +05:30
amhsirak 7eed8189ad chore: core v0.0.38 2026-07-16 01:08:00 +05:30
Karishma Shukla 81f24ad658 Merge pull request #1141 from getmaxun/sdk-valid
fix: add sdk api gen URL validation
2026-07-16 00:48:33 +05:30
Karishma Shukla 9f117a8890 Merge pull request #1140 from getmaxun/fix-norm
fix: hostname url normalization
2026-07-16 00:47:58 +05:30
Rohit Rajan 46e2911ebf fix: address cr reviews 2026-07-16 00:44:45 +05:30
amhsirak e8807096c3 fix: add sdk api gen URL validation 2026-07-16 00:29:30 +05:30
Rohit Rajan c9079ad72e fix: add url validation check 2026-07-16 00:25:37 +05:30
amhsirak f0ff1e2c11 fix: add ipv6 url validation check 2026-07-16 00:09:12 +05:30
amhsirak e09425002f fix: hostname url normalization 2026-07-16 00:07:02 +05:30
Karishma Shukla ae73f1f676 Merge pull request #1132 from getmaxun/wait-logic
fix: add wait for ready logic scrape
2026-07-15 23:28:08 +05:30
Karishma Shukla 79b1e995c8 Merge pull request #1130 from getmaxun/strip-hidden
fix: strip hidden base64-encoded data blobs
2026-07-15 23:06:42 +05:30
Karishma Shukla a5ea29ca29 Merge pull request #1128 from getmaxun/llm-config
fix: cover llm config setup for all robot types
2026-07-15 22:53:29 +05:30
Karishma Shukla b7d9998bff Merge pull request #1093 from getmaxun/urlid-fix
fix: url id resolution on run
2026-07-15 22:48:20 +05:30
Rohit Rajan 62027b7c7e fix: save fresh api key and provider 2026-07-15 21:36:36 +05:30
Rohit Rajan 5ae84cdb7e fix: check hex 64bit key 2026-07-15 21:35:51 +05:30
Karishma Shukla a078b9fea7 Merge pull request #1138 from hmhngx/feat/incremental-run-persistence
fix: persist crawl/search results incrementally instead of only at the end of the run
2026-07-15 13:58:36 +05:30
Karishma Shukla 7418664054 Merge pull request #1137 from moduvoice/feat/ko-i18n-translation
feat(i18n): add Korean (ko) translation
2026-07-15 13:57:51 +05:30
Karishma Shukla 922d7276be chore: add security.md 2026-07-15 13:39:47 +05:30
hmhngx 0c0033216f chore: drop jest test infra to keep PR scoped to persistence fix
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.
2026-07-13 21:16:32 +07:00
moduvoice 889f9aea8f fix: add missing space in supportedLngs array 2026-07-11 09:00:00 +07:00
Karishma Shukla 4731cce37c Merge pull request #1134 from sebastiondev/fix/cwe20-inputhandlers-onchangeur-522c
fix(browser-management): restrict handleChangeUrl to http(s) schemes
2026-07-10 18:42:38 +05:30
hmhngx 5b19898341 test(server): cover mergeSearchDelta empty-state and no-mutation cases
mergeCrawlDelta already had tests for an undefined starting state and
for not mutating its inputs; mergeSearchDelta was missing the same
coverage.
2026-07-10 14:36:06 +07:00
hmhngx 84c96baa24 fix(server): roll back crawl/search persist cursor on dropped writes
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.
2026-07-10 14:16:38 +07:00
hmhngx 3198a92041 fix(server): set partialDataExtracted before triggerIntegrationUpdates
If triggerIntegrationUpdates threw, the catch(_) swallowed it and left
partialDataExtracted false even though hasData was true, so isPartial
was persisted incorrectly on the failure path.
2026-07-10 14:16:29 +07:00
hmhngx 5b37919042 fix(server): correct isPartial detection for scrapeSchema/scrapeList
Addresses CodeRabbit review on #1138 (both findings confirmed valid
against the actual code, not just the review's claim):

- hasData's scrapeSchema/scrapeList checks used `.length > 0`, but both
  are always plain objects keyed by action name, never arrays -
  `.length` on a plain object is undefined, so the check could never
  be true. isPartial could never reflect a run whose only partial
  output was scrapeSchema/scrapeList. Pre-existing bug, not introduced
  by this PR, but copied into abortRun's check when extending it here.
- abortRun reloaded the run before checking for partial data but never
  forced the interpreter's persistence buffer to flush first -
  scrapeList isn't on the immediate-flush allowlist, so a buffered
  scrapeList page could be invisible to the reload.

Both fixes now live in one place (hasPartialOutput /
flushReloadAndCheckPartialOutput in output-validation.ts) instead of
duplicated inline in task-runner.ts's two call sites, which is how the
same bug ended up in two places to begin with.

Verified with mutation testing: reintroduced the .length > 0 bug,
confirmed 3 tests fail; reintroduced the reload-before-flush ordering
bug, confirmed the ordering test fails; restored the fix, all 14 pass.
2026-07-10 11:41:08 +07:00
hmhngx 54e88270c9 test(server): mock storage/mino in the delta-persistence tests
Rebasing onto the latest develop pulled in #1105's per-page screenshot
upload path, which added a BinaryOutputService import to Interpreter.ts
that attempts a real MinIO connection at module load. Mock it so these
tests stay hermetic instead of noisily (and potentially flakily)
failing to connect to a MinIO that isn't there in CI.
2026-07-10 10:56:02 +07:00
hmhngx af5198e172 fix(server): exclude tests from the production build
Same class of bug already fixed on the maxun-core side: `tsc -p
server/tsconfig.json` (the actual build:server script) was compiling
server/src/**/__tests__ into server/dist, since the base tsconfig's
include (src/**/*) picked them up with nothing excluding them. Found
by actually running the production build rather than trusting
--noEmit type-checks, which don't reveal what gets emitted.
2026-07-10 10:45:23 +07:00
hmhngx 675dc94b76 fix(maxun-core): exclude tests from the production build
Discovered while actually building maxun-core to verify the fix end-to-end:
running `npm run build` compiled with type errors (test files pulled into
the production tsconfig with no jest types, plus a pre-existing implicit-any
in concurrency.ts) and still silently emitted output anyway. Exclude
src/__tests__ from the shipped build and fix the implicit-any so `npm run
build` is actually clean, not just non-fatal.
2026-07-10 10:45:22 +07:00
hmhngx 616d3bf8d4 chore: core v0.0.37 2026-07-10 10:45:22 +07:00
hmhngx 52639c4c1e test(server): add delta/merge tests for crawl and search persistence
server had no test infra at all (no test script, no jest config). Add
jest/ts-jest scoped to server/, and directly unit test
computeCrawlSearchPersistDelta/mergeCrawlDelta/mergeSearchDelta - the
new delta-slicing and append-merge logic - without needing to mock
the database or drive a full interpreter run.

Verified these tests actually catch the regression they're meant to:
temporarily reverted the slicing to send full arrays again and
confirmed 4 of the 11 tests fail, including the end-to-end one showing
the exact page duplication the fix prevents.
2026-07-10 10:45:22 +07:00
hmhngx d5bfe00ef2 fix(server): persist crawl/search deltas instead of full snapshots
crawl/search deliver the full cumulative array on every page callback,
and persistDataToDatabase was writing that whole array to Postgres on
every single page - meaning page 1's data got re-sent on every write
for the rest of the run, an O(n^2) total-bytes cost that gets worse
the more pages a crawl visits (each carrying full page HTML).

Track how many items have already been persisted per action and slice
off just the new ones before they reach the persistence buffer, then
append (rather than overwrite) that delta into the existing DB state.
The in-memory cache and socket broadcast are untouched - only what
gets written to Postgres changes. Extracted as computeCrawlSearchPersistDelta/
mergeCrawlDelta/mergeSearchDelta so this can be tested directly.
2026-07-10 10:45:22 +07:00
hmhngx d8d42b9da6 test(maxun-core): add per-page persistence tests for crawl/search
maxun-core had no test infra at all (jest was declared in package.json
but never installed, no config, no test files). Add jest/ts-jest and a
jsdom-backed mock Page, and drive the real Interpreter through crawl
and search-scrape workflows to prove serializableCallback fires once
per page with a strictly growing snapshot - not once at the end - and
that a mid-run failure or abort still leaves prior pages recorded.
2026-07-10 10:45:22 +07:00
hmhngx 60951196bc feat(server): add isPartial flag for interrupted crawl/search runs
status alone doesn't distinguish a failed/aborted run that still has
usable partial data from one with nothing recovered - that signal only
existed transiently in socket/webhook payloads and was lost on reload.
Persist it as a real column, set from both the crash-catch path and
abortRun, and expose it via formatRunResponse.

Also fix abortRun's partial-data check, which only looked at
scrapeSchema/scrapeList and missed crawl/search entirely, and reload
the run before checking since the interpreter's persistence buffer
writes through a separate Run instance.
2026-07-10 10:45:22 +07:00
hmhngx 9c39ff9fcf fix(server): flush crawl/search persistence immediately
persistDataToDatabase only force-flushed the batched write immediately
for scrapeSchema; everything else, including per-page crawl/search
writes, sat in the buffer for up to 3s or 5 items before hitting
Postgres. A hard process kill inside that window would still lose
data. Extend the immediate-flush condition to crawl and search too.
2026-07-10 10:45:22 +07:00
hmhngx 728d03ece7 fix(maxun-core): persist crawl and search results after every page
The crawl and search-scrape actions accumulated every visited page into
a local array and only handed it to the persistence callback once,
after the whole page-by-page loop finished. If the run was killed,
timed out, or errored mid-loop, everything scraped so far was lost
even though it had already been extracted.

Persist the running snapshot after every page (success or failure),
matching the pattern scrapeList pagination already uses. Also stop the
search scrape loop promptly on abort, matching crawl's existing check.
2026-07-10 10:45:22 +07:00