- ApiClient: strip query string from ApiError messages so API keys
(e.g. TMDb's api_key query param) never leak into 500 response
bodies or logs.
- LlmTool: accept an optional defaultModel, wired from AppConfig's
LLM_MODEL, so Langfuse prompts that omit a model config fall back
to the configured LLM rather than silently requesting gpt-4o-mini.
- RecommendationPipeline: restore the Go original's graceful
degradation — library/Radarr fetch failures, per-suggestion TMDb
resolution failures, and per-signal TMDb similarity/recommendation
failures are now logged and skipped instead of aborting the whole
run (applies to both runInternal and searchAsync).
- RecommendationsController: validate the ?count= query param
(must be a positive integer) instead of silently producing NaN.
- Commit the Langfuse prompt definitions (langfuse/*.prompt.json) and
add a README covering setup, prompt seeding, cache invalidation,
and the HTTP API surface — the branch was not otherwise runnable by
anyone but the author.
Matches the Go original's behavior: a lookup/addMovie failure for one
recommendation is logged and skipped rather than aborting the whole
auto-request batch.
- authHook: use crypto.timingSafeEqual for the bearer token comparison
instead of !==, avoiding a timing side-channel on the secret key.
- .eslintrc.cjs: add argsIgnorePattern for underscore-prefixed unused
params, fixing false-positive no-unused-vars errors on intentional
_ctx/_params placeholders used throughout the LlmTool hierarchy.