Compare commits
75 Commits
fallenbage
...
fallenbage
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a4b8c1563 | ||
|
|
747b84d4c9 | ||
|
|
be58352925 | ||
|
|
e43777527e | ||
|
|
87dddbb879 | ||
|
|
04b9d87174 | ||
|
|
b499976902 | ||
|
|
87fb0dfd6c | ||
|
|
b6a913211a | ||
|
|
39ae32f509 | ||
|
|
c2977f6430 | ||
|
|
92504b7864 | ||
|
|
018e04a657 | ||
|
|
e503de323a | ||
|
|
bcd8002887 | ||
|
|
33a5d9a9ac | ||
|
|
15be3d7475 | ||
|
|
55c2d541e6 | ||
|
|
1ed86c14c0 | ||
|
|
91261f6a61 | ||
|
|
3dea58eead | ||
|
|
3eea8ee98e | ||
|
|
7cd3521cfd | ||
|
|
e53c2a34dc | ||
|
|
095784bf62 | ||
|
|
4f7819f028 | ||
|
|
028c7c2434 | ||
|
|
e3dc1c302d | ||
|
|
a44a3b1e14 | ||
|
|
186998b888 | ||
|
|
df54fb9451 | ||
|
|
673f3f2939 | ||
|
|
3cd66589ca | ||
|
|
dbee2fdf9f | ||
|
|
0ffe3e8067 | ||
|
|
2dac679f1b | ||
|
|
faa2c0a005 | ||
|
|
a0a784b976 | ||
|
|
0d270ac871 | ||
|
|
8fc68c3888 | ||
|
|
8b41685b31 | ||
|
|
5bd31040c0 | ||
|
|
127a91ca9c | ||
|
|
7d2e24a528 | ||
|
|
ddf347994a | ||
|
|
0f7d29624b | ||
|
|
f627a8e9db | ||
|
|
6031fab3b4 | ||
|
|
e1d3f29383 | ||
|
|
f8f90cb903 | ||
|
|
65844a2f23 | ||
|
|
62755692e9 | ||
|
|
beba2ea099 | ||
|
|
88b2e7843f | ||
|
|
dbd5935ade | ||
|
|
bb2120c14d | ||
|
|
c9037f77e6 | ||
|
|
48631db989 | ||
|
|
ac7c2983d3 | ||
|
|
767dc529e8 | ||
|
|
448a25e2a4 | ||
|
|
3f35b8c886 | ||
|
|
d0f029b46e | ||
|
|
e0a81038cd | ||
|
|
4ab919360a | ||
|
|
adbcf80333 | ||
|
|
f91a26befe | ||
|
|
0c95b5ec91 | ||
|
|
193d4dc668 | ||
|
|
d0c9afc16e | ||
|
|
57d583e1bd | ||
|
|
8bbe7864af | ||
|
|
66b4e2c871 | ||
|
|
3ee69663dc | ||
|
|
539d49879d |
@@ -16,6 +16,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
|
'@typescript-eslint/no-explicit-any': 'warn', // disable the rule for now to replicate previous behavior
|
||||||
'@typescript-eslint/camelcase': 0,
|
'@typescript-eslint/camelcase': 0,
|
||||||
'@typescript-eslint/no-use-before-define': 0,
|
'@typescript-eslint/no-use-before-define': 0,
|
||||||
'jsx-a11y/no-noninteractive-tabindex': 0,
|
'jsx-a11y/no-noninteractive-tabindex': 0,
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -91,6 +91,14 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Additional Context
|
label: Additional Context
|
||||||
description: Please provide any additional information that may be relevant or helpful.
|
description: Please provide any additional information that may be relevant or helpful.
|
||||||
|
- type: checkboxes
|
||||||
|
id: search-existing
|
||||||
|
attributes:
|
||||||
|
label: Search Existing Issues
|
||||||
|
description: Have you searched existing issues to see if this bug has already been reported?
|
||||||
|
options:
|
||||||
|
- label: Yes, I have searched existing issues.
|
||||||
|
required: true
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
id: terms
|
id: terms
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/enhancement.yml
vendored
@@ -27,6 +27,14 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Additional Context
|
label: Additional Context
|
||||||
description: Provide any additional information or screenshots that may be relevant or helpful.
|
description: Provide any additional information or screenshots that may be relevant or helpful.
|
||||||
|
- type: checkboxes
|
||||||
|
id: search-existing
|
||||||
|
attributes:
|
||||||
|
label: Search Existing Issues
|
||||||
|
description: Have you searched existing issues to see if this feature has already been requested?
|
||||||
|
options:
|
||||||
|
- label: Yes, I have searched existing issues.
|
||||||
|
required: true
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
id: terms
|
id: terms
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
4
.github/cliff.toml
vendored
@@ -33,9 +33,9 @@ body = """
|
|||||||
{{ self::print_commit(commit=commit) }}
|
{{ self::print_commit(commit=commit) }}
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
{%- for commit in commits %}
|
{%- for commit in commits %}
|
||||||
{%- if not commit.scope -%}
|
{%- if not commit.scope %}
|
||||||
{{ self::print_commit(commit=commit) }}
|
{{ self::print_commit(commit=commit) }}
|
||||||
{%- endif -%}
|
{%- endif %}
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
|
|
||||||
|
|||||||
2
.github/renovate/helm.json5
vendored
@@ -16,7 +16,7 @@
|
|||||||
description: 'Update appVersion in Chart.yaml to match Docker image',
|
description: 'Update appVersion in Chart.yaml to match Docker image',
|
||||||
fileMatch: ['(^|/)Chart\\.yaml$'],
|
fileMatch: ['(^|/)Chart\\.yaml$'],
|
||||||
matchStrings: [
|
matchStrings: [
|
||||||
'#\\s+renovate:\\s+image=(?<depName>\\S*)\nappVersion:\\s+"(?<currentValue>\\S*)"',
|
"#\\s+renovate:\\s+image=(?<depName>\\S*)\nappVersion:\\s+'(?<currentValue>\\S*)'",
|
||||||
],
|
],
|
||||||
datasourceTemplate: 'docker',
|
datasourceTemplate: 'docker',
|
||||||
},
|
},
|
||||||
|
|||||||
78
.github/workflows/ci.yml
vendored
@@ -22,14 +22,78 @@ concurrency:
|
|||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
i18n:
|
||||||
|
name: i18n Check
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
NUMBER: ${{ github.event.pull_request.number }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Pnpm Setup
|
||||||
|
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||||
|
with:
|
||||||
|
node-version-file: 'package.json'
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
shell: bash
|
||||||
|
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Setup pnpm cache
|
||||||
|
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||||
|
with:
|
||||||
|
path: ${{ env.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
CI: true
|
||||||
|
run: pnpm install
|
||||||
|
|
||||||
|
- name: i18n Check
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
I18N_LABEL: i18n-out-of-sync
|
||||||
|
BODY: |
|
||||||
|
The i18n check failed because translation messages are out of sync.
|
||||||
|
|
||||||
|
This usually happens when you've added or modified translation strings in your code but haven't updated the translation file.
|
||||||
|
|
||||||
|
Please run `pnpm i18n:extract` and commit the changes.
|
||||||
|
run: |
|
||||||
|
retry() { n=0; until "$@"; do n=$((n+1)); [ $n -ge 3 ] && break; echo "retry $n: $*" >&2; sleep 2; done; }
|
||||||
|
check_failed=0; node bin/check-i18n.js || check_failed=$?
|
||||||
|
pr_labels=$(gh pr view "$NUMBER" -R "$GH_REPO" --json labels -q '.labels[].name' 2>/dev/null) || true
|
||||||
|
has_label=0
|
||||||
|
while IFS= read -r name; do [ -n "$name" ] && [ "$name" = "$I18N_LABEL" ] && has_label=1 && break; done <<< "$pr_labels"
|
||||||
|
if [ "$check_failed" -eq 1 ]; then
|
||||||
|
[ "$has_label" -eq 0 ] && { retry gh pr edit "$NUMBER" -R "$GH_REPO" --add-label "$I18N_LABEL" || true; retry gh pr comment "$NUMBER" -R "$GH_REPO" -b "$BODY" || true; }
|
||||||
|
else
|
||||||
|
[ "$has_label" -eq 1 ] && retry gh pr edit "$NUMBER" -R "$GH_REPO" --remove-label "$I18N_LABEL" || true
|
||||||
|
fi
|
||||||
|
exit $check_failed
|
||||||
test:
|
test:
|
||||||
name: Lint & Test Build
|
name: Lint & Test Build
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
container: node:22.20.0-alpine3.22@sha256:dbcedd8aeab47fbc0f4dd4bffa55b7c3c729a707875968d467aaaea42d6225af
|
container: node:22.22.0-alpine3.22@sha256:0c49915657c1c77c64c8af4d91d2f13fe96853bbd957993ed00dd592cbecc284
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -78,7 +142,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -87,7 +151,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Warm cache (no push) — ${{ matrix.platform }}
|
- name: Warm cache (no push) — ${{ matrix.platform }}
|
||||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
@@ -114,7 +178,7 @@ jobs:
|
|||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -123,7 +187,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
@@ -140,7 +204,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Extract metadata
|
- name: Extract metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
${{ env.DOCKER_HUB }}
|
${{ env.DOCKER_HUB }}
|
||||||
|
|||||||
8
.github/workflows/codeql.yml
vendored
@@ -37,20 +37,20 @@ jobs:
|
|||||||
language: [actions, javascript]
|
language: [actions, javascript]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
|
uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
queries: +security-and-quality
|
queries: +security-and-quality
|
||||||
|
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
|
uses: github/codeql-action/autobuild@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
|
uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
|
||||||
with:
|
with:
|
||||||
category: '/language:${{ matrix.language }}'
|
category: '/language:${{ matrix.language }}'
|
||||||
|
|||||||
4
.github/workflows/cypress.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
run: pnpm exec cypress install
|
run: pnpm exec cypress install
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@b8ba51a856ba5f4c15cf39007636d4ab04f23e3c # v6.10.2
|
uses: cypress-io/github-action@f790eee7a50d9505912f50c2095510be7de06aa7 # v6.10.9
|
||||||
with:
|
with:
|
||||||
install: false
|
install: false
|
||||||
build: pnpm cypress:build
|
build: pnpm cypress:build
|
||||||
|
|||||||
83
.github/workflows/detect-duplicate.yml
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||||
|
name: Duplicate Issue Detector
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
env:
|
||||||
|
EMBEDDING_MODEL: ${{ vars.EMBEDDING_MODEL }}
|
||||||
|
GROQ_MODEL: ${{ vars.GROQ_MODEL }}
|
||||||
|
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect-duplicate:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
if: ${{ !github.event.issue.pull_request }}
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
|
|
||||||
|
- name: Pnpm Setup
|
||||||
|
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||||
|
with:
|
||||||
|
node-version-file: 'package.json'
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
shell: bash
|
||||||
|
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Setup pnpm cache
|
||||||
|
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||||
|
with:
|
||||||
|
path: ${{ env.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: bin/duplicate-detector
|
||||||
|
env:
|
||||||
|
CI: true
|
||||||
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Download issue index
|
||||||
|
uses: dawidd6/action-download-artifact@5c98f0b039f36ef966fdb7dfa9779262785ecb05 # v14
|
||||||
|
with:
|
||||||
|
name: issue-index
|
||||||
|
workflow: rebuild-issue-index.yml
|
||||||
|
path: bin/duplicate-detector
|
||||||
|
search_artifacts: true
|
||||||
|
if_no_artifact_found: warn
|
||||||
|
|
||||||
|
- name: Build index if missing
|
||||||
|
working-directory: bin/duplicate-detector
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
INDEX_PATH: issue_index.json
|
||||||
|
run: |
|
||||||
|
if [ ! -f issue_index.json ]; then
|
||||||
|
echo "No index found — building from scratch..."
|
||||||
|
node build-index.mjs
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Detect duplicates
|
||||||
|
working-directory: bin/duplicate-detector
|
||||||
|
continue-on-error: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||||
|
INDEX_PATH: issue_index.json
|
||||||
|
run: node detect.mjs
|
||||||
4
.github/workflows/docs-deploy.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- legacy-jellyseerr
|
- develop
|
||||||
paths:
|
paths:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'gen-docs/**'
|
- 'gen-docs/**'
|
||||||
@@ -23,7 +23,7 @@ jobs:
|
|||||||
name: Build Docusaurus
|
name: Build Docusaurus
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
4
.github/workflows/docs-link-check.yml
vendored
@@ -36,13 +36,13 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Run Lychee link checker
|
- name: Run Lychee link checker
|
||||||
uses: lycheeverse/lychee-action@885c65f3dc543b57c898c8099f4e08c8afd178a2 # v2.6.1
|
uses: lycheeverse/lychee-action@a8c4c7cb88f0c7386610c35eb25108e448569cb0 # v2.7.0
|
||||||
with:
|
with:
|
||||||
fail: false
|
fail: false
|
||||||
args: >-
|
args: >-
|
||||||
|
|||||||
6
.github/workflows/helm.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
has_artifacts: ${{ steps.check-artifacts.outputs.has_artifacts }}
|
has_artifacts: ${{ steps.check-artifacts.outputs.has_artifacts }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -93,7 +93,7 @@ jobs:
|
|||||||
if: needs.package-helm-chart.outputs.has_artifacts == 'true'
|
if: needs.package-helm-chart.outputs.has_artifacts == 'true'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -151,7 +151,7 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
4
.github/workflows/lint-helm-charts.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -37,7 +37,7 @@ jobs:
|
|||||||
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
|
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
|
||||||
|
|
||||||
- name: Set up chart-testing
|
- name: Set up chart-testing
|
||||||
uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b # v2.7.0
|
uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f # v2.8.0
|
||||||
|
|
||||||
- name: Ensure documentation is updated
|
- name: Ensure documentation is updated
|
||||||
uses: docker://jnorwood/helm-docs:v1.14.2@sha256:7e562b49ab6b1dbc50c3da8f2dd6ffa8a5c6bba327b1c6335cc15ce29267979c
|
uses: docker://jnorwood/helm-docs:v1.14.2@sha256:7e562b49ab6b1dbc50c3da8f2dd6ffa8a5c6bba327b1c6335cc15ce29267979c
|
||||||
|
|||||||
10
.github/workflows/preview.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Derive preview version from tag
|
- name: Derive preview version from tag
|
||||||
id: ver
|
id: ver
|
||||||
@@ -79,7 +79,7 @@ jobs:
|
|||||||
id-token: write
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
@@ -115,7 +115,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Extract metadata
|
- name: Extract metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
${{ env.DOCKER_HUB }}
|
${{ env.DOCKER_HUB }}
|
||||||
|
|||||||
65
.github/workflows/rebuild-issue-index.yml
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
|
||||||
|
name: Rebuild Issue Index
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 3 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
env:
|
||||||
|
EMBEDDING_MODEL: ${{ vars.EMBEDDING_MODEL }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-index:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
issues: read
|
||||||
|
actions: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
|
|
||||||
|
- name: Pnpm Setup
|
||||||
|
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||||
|
with:
|
||||||
|
node-version-file: 'package.json'
|
||||||
|
|
||||||
|
- name: Get pnpm store directory
|
||||||
|
shell: bash
|
||||||
|
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Setup pnpm cache
|
||||||
|
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||||
|
with:
|
||||||
|
path: ${{ env.STORE_PATH }}
|
||||||
|
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pnpm-store-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
working-directory: bin/duplicate-detector
|
||||||
|
env:
|
||||||
|
CI: true
|
||||||
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build issue index
|
||||||
|
working-directory: bin/duplicate-detector
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
INDEX_PATH: issue_index.json
|
||||||
|
run: node build-index.mjs
|
||||||
|
|
||||||
|
- name: Upload index artifact
|
||||||
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
|
with:
|
||||||
|
name: issue-index
|
||||||
|
path: bin/duplicate-detector/issue_index.json
|
||||||
|
retention-days: 7
|
||||||
40
.github/workflows/release.yml
vendored
@@ -27,14 +27,14 @@ jobs:
|
|||||||
release_body: ${{ steps.git-cliff.outputs.content }}
|
release_body: ${{ steps.git-cliff.outputs.content }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Generate changelog
|
- name: Generate changelog
|
||||||
id: git-cliff
|
id: git-cliff
|
||||||
uses: orhun/git-cliff-action@d77b37db2e3f7398432d34b72a12aa3e2ba87e51 # v4.6.0
|
uses: orhun/git-cliff-action@e16f179f0be49ecdfe63753837f20b9531642772 # v4.7.0
|
||||||
with:
|
with:
|
||||||
config: .github/cliff.toml
|
config: .github/cliff.toml
|
||||||
args: -vv --current
|
args: -vv --current
|
||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
needs: changelog
|
needs: changelog
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
VERSION: ${{ github.ref_name }}
|
VERSION: ${{ github.ref_name }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Warm cache [${{ matrix.platform }}]
|
- name: Warm cache [${{ matrix.platform }}]
|
||||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
@@ -115,7 +115,7 @@ jobs:
|
|||||||
VERSION: ${{ github.ref_name }}
|
VERSION: ${{ github.ref_name }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ jobs:
|
|||||||
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
@@ -141,7 +141,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Extract metadata
|
- name: Extract metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
|
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
${{ env.DOCKER_HUB }}
|
${{ env.DOCKER_HUB }}
|
||||||
@@ -201,7 +201,7 @@ jobs:
|
|||||||
COSIGN_YES: 'true'
|
COSIGN_YES: 'true'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ jobs:
|
|||||||
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||||
|
|
||||||
- name: Install Trivy
|
- name: Install Trivy
|
||||||
uses: aquasecurity/setup-trivy@e6c2c5e321ed9123bda567646e2f96565e34abe1 # v0.2.4
|
uses: aquasecurity/setup-trivy@3fb12ec12f41e471780db15c232d5dd185dcb514 # v0.2.5
|
||||||
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
@@ -279,17 +279,17 @@ jobs:
|
|||||||
--certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
--certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
||||||
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
|
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
|
||||||
|
|
||||||
- name: Verify attestations
|
# - name: Verify attestations
|
||||||
run: |
|
# run: |
|
||||||
cosign verify-attestation "ghcr.io/${{ github.repository }}@${{ needs.publish.outputs.image_digest }}" \
|
# cosign verify-attestation "ghcr.io/${{ github.repository }}@${{ needs.publish.outputs.image_digest }}" \
|
||||||
--type cyclonedx \
|
# --type cyclonedx \
|
||||||
--certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
# --certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
||||||
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" > /dev/null
|
# --certificate-oidc-issuer "https://token.actions.githubusercontent.com" > /dev/null
|
||||||
|
|
||||||
cosign verify-attestation "${{ env.DOCKER_HUB }}@${{ needs.publish.outputs.image_digest }}" \
|
# cosign verify-attestation "${{ env.DOCKER_HUB }}@${{ needs.publish.outputs.image_digest }}" \
|
||||||
--type cyclonedx \
|
# --type cyclonedx \
|
||||||
--certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
# --certificate-identity "https://github.com/${{ github.workflow_ref }}" \
|
||||||
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" > /dev/null
|
# --certificate-oidc-issuer "https://token.actions.githubusercontent.com" > /dev/null
|
||||||
|
|
||||||
publish-release:
|
publish-release:
|
||||||
name: Publish release
|
name: Publish release
|
||||||
|
|||||||
@@ -25,19 +25,19 @@ jobs:
|
|||||||
if: github.actor == 'renovate[bot]'
|
if: github.actor == 'renovate[bot]'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4
|
- uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: 2138788
|
app-id: 2138788
|
||||||
private-key: ${{ secrets.APP_SEERR_HELM_PRIVATE_KEY }}
|
private-key: ${{ secrets.APP_SEERR_HELM_PRIVATE_KEY }}
|
||||||
|
|
||||||
- name: Set up chart-testing
|
- name: Set up chart-testing
|
||||||
uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b # v2.7.0
|
uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f # v2.8.0
|
||||||
|
|
||||||
- name: Run chart-testing (list-changed)
|
- name: Run chart-testing (list-changed)
|
||||||
id: list-changed
|
id: list-changed
|
||||||
|
|||||||
2
.github/workflows/stale.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0
|
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
|
||||||
with:
|
with:
|
||||||
any-of-labels: "pending author's response"
|
any-of-labels: "pending author's response"
|
||||||
exempt-issue-labels: 'confirmed'
|
exempt-issue-labels: 'confirmed'
|
||||||
|
|||||||
2
.github/workflows/test-docs-deploy.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|||||||
4
.github/workflows/trivy-scan.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -56,6 +56,6 @@ jobs:
|
|||||||
ignore-unfixed: true
|
ignore-unfixed: true
|
||||||
|
|
||||||
- name: Upload SARIF to code scanning
|
- name: Upload SARIF to code scanning
|
||||||
uses: github/codeql-action/upload-sarif@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
|
uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
|
||||||
with:
|
with:
|
||||||
sarif_file: trivy.sarif
|
sarif_file: trivy.sarif
|
||||||
|
|||||||
@@ -4,15 +4,17 @@ dist/
|
|||||||
config/
|
config/
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
cypress/config/settings.cypress.json
|
cypress/config/settings.cypress.json
|
||||||
|
.github
|
||||||
|
.vscode
|
||||||
|
|
||||||
# assets
|
# assets
|
||||||
src/assets/
|
src/assets/
|
||||||
public/
|
|
||||||
!public/sw.js
|
|
||||||
docs/
|
docs/
|
||||||
!/public/
|
public/*
|
||||||
/public/*
|
!public/sw.js
|
||||||
!/public/sw.js
|
|
||||||
|
|
||||||
# helm charts
|
# helm charts
|
||||||
**/charts
|
**/charts
|
||||||
|
|
||||||
|
# Prettier breaks GitHub alert syntax in markdown
|
||||||
|
*.md
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
plugins: [require('./merged-prettier-plugin.js')],
|
plugins: ['prettier-plugin-organize-imports', 'prettier-plugin-tailwindcss'],
|
||||||
singleQuote: true,
|
singleQuote: true,
|
||||||
trailingComma: 'es5',
|
trailingComma: 'es5',
|
||||||
overrides: [
|
overrides: [
|
||||||
@@ -27,5 +27,11 @@ module.exports = {
|
|||||||
rangeEnd: 0,
|
rangeEnd: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
files: 'public/offline.html',
|
||||||
|
options: {
|
||||||
|
rangeEnd: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:22.20.0-alpine3.22@sha256:cb3143549582cc5f74f26f0992cdef4a422b22128cb517f94173a5f910fa4ee7 AS base
|
FROM node:22.22.0-alpine3.22@sha256:0c49915657c1c77c64c8af4d91d2f13fe96853bbd957993ed00dd592cbecc284 AS base
|
||||||
ARG SOURCE_DATE_EPOCH
|
ARG SOURCE_DATE_EPOCH
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
ENV TARGETPLATFORM=${TARGETPLATFORM:-linux/amd64}
|
ENV TARGETPLATFORM=${TARGETPLATFORM:-linux/amd64}
|
||||||
@@ -33,7 +33,7 @@ RUN pnpm build
|
|||||||
|
|
||||||
RUN rm -rf .next/cache
|
RUN rm -rf .next/cache
|
||||||
|
|
||||||
FROM node:22.20.0-alpine3.22@sha256:cb3143549582cc5f74f26f0992cdef4a422b22128cb517f94173a5f910fa4ee7
|
FROM node:22.22.0-alpine3.22@sha256:0c49915657c1c77c64c8af4d91d2f13fe96853bbd957993ed00dd592cbecc284
|
||||||
ARG SOURCE_DATE_EPOCH
|
ARG SOURCE_DATE_EPOCH
|
||||||
ARG COMMIT_TAG
|
ARG COMMIT_TAG
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:22.20.0-alpine3.22@sha256:cb3143549582cc5f74f26f0992cdef4a422b22128cb517f94173a5f910fa4ee7
|
FROM node:22.22.0-alpine3.22@sha256:0c49915657c1c77c64c8af4d91d2f13fe96853bbd957993ed00dd592cbecc284
|
||||||
|
|
||||||
ENV PNPM_HOME="/pnpm"
|
ENV PNPM_HOME="/pnpm"
|
||||||
ENV PATH="$PNPM_HOME:$PATH"
|
ENV PATH="$PNPM_HOME:$PATH"
|
||||||
|
|||||||
18
README.md
@@ -1,6 +1,6 @@
|
|||||||
<div align="center">⚠️ <strong>NOTE:</strong> We are currently in the process of merging Overseerr and Jellyseerr into this unified repository.</div>
|
<p align="center">
|
||||||
|
<img src="./public/logo_full.svg" alt="Seerr" style="margin: 20px 0;">
|
||||||
<h1 align="center" style="font-size: 4em;">🚧 Seerr</h1>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://github.com/seerr-team/seerr/actions/workflows/release.yml/badge.svg" alt="Seerr Release" />
|
<img src="https://github.com/seerr-team/seerr/actions/workflows/release.yml/badge.svg" alt="Seerr Release" />
|
||||||
<img src="https://github.com/seerr-team/seerr/actions/workflows/ci.yml/badge.svg" alt="Seerr CI">
|
<img src="https://github.com/seerr-team/seerr/actions/workflows/ci.yml/badge.svg" alt="Seerr CI">
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://discord.gg/seerr"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
|
<a href="https://discord.gg/seerr"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
|
||||||
<a href="https://hub.docker.com/r/seerr/seerr"><img src="https://img.shields.io/docker/pulls/seerr/seerr" alt="Docker pulls"></a>
|
<a href="https://hub.docker.com/r/seerr/seerr"><img src="https://img.shields.io/docker/pulls/seerr/seerr" alt="Docker pulls"></a>
|
||||||
<a href="https://translate.seerr.dev/engage/seerr/"><img src="https://translate.seerr.dev/widget/seerr/seerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
<a href="https://translate.seerr.dev/engage/seerr/"><img src="https://translate.seerr.dev/widget/seerr/svg-badge.svg" alt="Translation status" /></a>
|
||||||
<a href="https://github.com/seerr-team/seerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/seerr-team/seerr"></a>
|
<a href="https://github.com/seerr-team/seerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/seerr-team/seerr"></a>
|
||||||
|
|
||||||
**Seerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.
|
**Seerr** is a free and open source software application for managing requests for your media library. It integrates with the media server of your choice: [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), and [Emby](https://emby.media/). In addition, it integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**.
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
- Granular permission system.
|
- Granular permission system.
|
||||||
- Support for various notification agents.
|
- Support for various notification agents.
|
||||||
- Mobile-friendly design, for when you need to approve requests on the go!
|
- Mobile-friendly design, for when you need to approve requests on the go!
|
||||||
- Support for watchlisting & blacklisting media.
|
- Support for watchlisting & blocklisting media.
|
||||||
|
|
||||||
With more features on the way! Check out our [issue tracker](/../../issues) to see the features which have already been requested.
|
With more features on the way! Check out our [issue tracker](/../../issues) to see the features which have already been requested.
|
||||||
|
|
||||||
@@ -38,7 +38,13 @@ https://docs.seerr.dev/getting-started/
|
|||||||
|
|
||||||
## Preview
|
## Preview
|
||||||
|
|
||||||
<img src="./public/preview.jpg">
|
<img src="./public/preview.jpg" alt="Seerr application preview" />
|
||||||
|
|
||||||
|
## Migrating from Overseerr/Jellyseerr to Seerr
|
||||||
|
|
||||||
|
Read our [release announcement](https://docs.seerr.dev/blog/seerr-release) to learn what Seerr means for Jellyseerr and Overseerr users.
|
||||||
|
|
||||||
|
Please follow our [migration guide](https://docs.seerr.dev/migration-guide) for detailed instructions on migrating from Overseerr or Jellyseerr.
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
|
|||||||
39
bin/check-i18n.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that i18n locale files are in sync with extracted messages.
|
||||||
|
* Runs `pnpm i18n:extract` and compares en.json; exits 1 if they differ.
|
||||||
|
*/
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const localePath = path.join(
|
||||||
|
__dirname,
|
||||||
|
'..',
|
||||||
|
'src',
|
||||||
|
'i18n',
|
||||||
|
'locale',
|
||||||
|
'en.json'
|
||||||
|
);
|
||||||
|
const backupPath = `${localePath}.bak`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.copyFileSync(localePath, backupPath);
|
||||||
|
execSync('pnpm i18n:extract', { stdio: 'inherit' });
|
||||||
|
const original = fs.readFileSync(backupPath, 'utf8');
|
||||||
|
const extracted = fs.readFileSync(localePath, 'utf8');
|
||||||
|
fs.unlinkSync(backupPath);
|
||||||
|
|
||||||
|
if (original !== extracted) {
|
||||||
|
console.error(
|
||||||
|
"i18n messages are out of sync. Please run 'pnpm i18n:extract' and commit the changes."
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
if (fs.existsSync(backupPath)) {
|
||||||
|
fs.unlinkSync(backupPath);
|
||||||
|
}
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
1
bin/duplicate-detector/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
120
bin/duplicate-detector/build-index.mjs
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
/**
|
||||||
|
* Build Issue Embedding Index
|
||||||
|
*
|
||||||
|
* Fetches all open issues and recently closed ones,
|
||||||
|
* generates embeddings using a local ONNX transformer model,
|
||||||
|
* and saves them as a JSON artifact for the duplicate detector.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pipeline } from '@huggingface/transformers';
|
||||||
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
||||||
|
import { dirname } from 'node:path';
|
||||||
|
import { fetchIssues, issueText } from './utils.mjs';
|
||||||
|
|
||||||
|
const MODEL_NAME = process.env.EMBEDDING_MODEL || 'Xenova/all-MiniLM-L6-v2';
|
||||||
|
const OUTPUT_PATH = 'issue_index.json';
|
||||||
|
const INCLUDE_CLOSED_DAYS = 90;
|
||||||
|
const MAX_ISSUES = 5000;
|
||||||
|
const BATCH_SIZE = 64;
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
console.log('Fetching open issues...');
|
||||||
|
const openIssues = await fetchIssues({
|
||||||
|
state: 'open',
|
||||||
|
maxIssues: MAX_ISSUES,
|
||||||
|
});
|
||||||
|
console.log(`Fetched ${openIssues.length} open issues`);
|
||||||
|
|
||||||
|
const since = new Date(
|
||||||
|
Date.now() - INCLUDE_CLOSED_DAYS * 24 * 60 * 60 * 1000
|
||||||
|
).toISOString();
|
||||||
|
console.log(
|
||||||
|
`Fetching closed issues from last ${INCLUDE_CLOSED_DAYS} days...`
|
||||||
|
);
|
||||||
|
|
||||||
|
const closedIssues = await fetchIssues({
|
||||||
|
state: 'closed',
|
||||||
|
since,
|
||||||
|
maxIssues: MAX_ISSUES,
|
||||||
|
});
|
||||||
|
console.log(`Fetched ${closedIssues.length} closed issues`);
|
||||||
|
let allIssues = [...openIssues, ...closedIssues];
|
||||||
|
|
||||||
|
const seen = new Set();
|
||||||
|
allIssues = allIssues.filter((issue) => {
|
||||||
|
if (seen.has(issue.number)) return false;
|
||||||
|
seen.add(issue.number);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Total unique issues to index: ${allIssues.length}`);
|
||||||
|
|
||||||
|
if (allIssues.length === 0) {
|
||||||
|
console.warn('No issues found - writing empty index');
|
||||||
|
writeFileSync(OUTPUT_PATH, JSON.stringify({ issues: [], embeddings: [] }));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Loading model: ${MODEL_NAME}`);
|
||||||
|
const extractor = await pipeline('feature-extraction', MODEL_NAME, {
|
||||||
|
dtype: 'fp32',
|
||||||
|
});
|
||||||
|
|
||||||
|
const texts = allIssues.map((issue) => issueText(issue.title, issue.body));
|
||||||
|
const allEmbeddings = [];
|
||||||
|
|
||||||
|
console.log(`Generating embeddings for ${texts.length} issues...`);
|
||||||
|
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
||||||
|
const batch = texts.slice(i, i + BATCH_SIZE);
|
||||||
|
const output = await extractor(batch, {
|
||||||
|
pooling: 'mean',
|
||||||
|
normalize: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const vectors = output.tolist();
|
||||||
|
allEmbeddings.push(...vectors);
|
||||||
|
|
||||||
|
const progress = Math.min(i + BATCH_SIZE, texts.length);
|
||||||
|
console.log(` ${progress}/${texts.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const issueMetadata = allIssues.map((issue) => {
|
||||||
|
const body = (issue.body || '').trim();
|
||||||
|
return {
|
||||||
|
number: issue.number,
|
||||||
|
title: issue.title,
|
||||||
|
state: issue.state,
|
||||||
|
url: issue.html_url,
|
||||||
|
body_preview: body.slice(0, 500) || '',
|
||||||
|
labels: (issue.labels || []).map((l) => l.name),
|
||||||
|
created_at: issue.created_at,
|
||||||
|
updated_at: issue.updated_at,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const indexData = {
|
||||||
|
issues: issueMetadata,
|
||||||
|
embeddings: allEmbeddings,
|
||||||
|
model: MODEL_NAME,
|
||||||
|
issue_count: issueMetadata.length,
|
||||||
|
built_at: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
|
||||||
|
const dir = dirname(OUTPUT_PATH);
|
||||||
|
if (dir && dir !== '.') mkdirSync(dir, { recursive: true });
|
||||||
|
writeFileSync(OUTPUT_PATH, JSON.stringify(indexData));
|
||||||
|
|
||||||
|
const sizeMb = (
|
||||||
|
Buffer.byteLength(JSON.stringify(indexData)) /
|
||||||
|
(1024 * 1024)
|
||||||
|
).toFixed(1);
|
||||||
|
console.log(
|
||||||
|
`Index saved to ${OUTPUT_PATH} (${sizeMb} MB, ${issueMetadata.length} issues)`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((err) => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
274
bin/duplicate-detector/detect.mjs
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
/**
|
||||||
|
* Duplicate Issue Detector
|
||||||
|
*
|
||||||
|
* Triggered on new issue creation. Compares the new issue against an
|
||||||
|
* existing embedding index, then uses an LLM to
|
||||||
|
* confirm duplicates before posting a comment for maintainer review.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { pipeline } from '@huggingface/transformers';
|
||||||
|
import { existsSync, readFileSync } from 'node:fs';
|
||||||
|
import {
|
||||||
|
addLabel,
|
||||||
|
dotProduct,
|
||||||
|
fetchIssues,
|
||||||
|
getIssue,
|
||||||
|
issueText,
|
||||||
|
postComment,
|
||||||
|
} from './utils.mjs';
|
||||||
|
|
||||||
|
const SIMILARITY_THRESHOLD = 0.55;
|
||||||
|
const TOP_K = 5;
|
||||||
|
const MAX_COMMENT_CANDIDATES = 3;
|
||||||
|
const MODEL_NAME = process.env.EMBEDDING_MODEL || 'Xenova/all-MiniLM-L6-v2';
|
||||||
|
const GROQ_MODEL = process.env.GROQ_MODEL || 'llama-3.3-70b-versatile';
|
||||||
|
const INDEX_PATH = 'issue_index.json';
|
||||||
|
const LABEL_NAME = 'possible-duplicate';
|
||||||
|
|
||||||
|
const GROQ_API_KEY = process.env.GROQ_API_KEY || '';
|
||||||
|
const ISSUE_NUMBER = parseInt(process.env.ISSUE_NUMBER, 10);
|
||||||
|
|
||||||
|
function loadIndex(path) {
|
||||||
|
if (!existsSync(path)) {
|
||||||
|
console.error(
|
||||||
|
`Index file not found at ${path}. Run build-index.mjs first.`
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = JSON.parse(readFileSync(path, 'utf-8'));
|
||||||
|
console.log(`Loaded index with ${data.issues.length} issues`);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSimilar(
|
||||||
|
queryEmbedding,
|
||||||
|
index,
|
||||||
|
{ topK = TOP_K, threshold = SIMILARITY_THRESHOLD, excludeNumber } = {}
|
||||||
|
) {
|
||||||
|
const { issues, embeddings } = index;
|
||||||
|
if (!issues.length) return [];
|
||||||
|
|
||||||
|
const scored = issues.map((issue, i) => ({
|
||||||
|
...issue,
|
||||||
|
score: dotProduct(queryEmbedding, embeddings[i]),
|
||||||
|
}));
|
||||||
|
|
||||||
|
return scored
|
||||||
|
.sort((a, b) => b.score - a.score)
|
||||||
|
.filter(
|
||||||
|
(c) =>
|
||||||
|
c.score >= threshold && (!excludeNumber || c.number !== excludeNumber)
|
||||||
|
)
|
||||||
|
.slice(0, topK);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CONFIRM_SYSTEM_PROMPT = `You are a GitHub issue triage assistant. You will be given a NEW issue and one \
|
||||||
|
or more CANDIDATE issues that may be duplicates.
|
||||||
|
|
||||||
|
For each candidate, determine if the new issue is truly a duplicate (same root \
|
||||||
|
problem/request) or merely related (similar area but different issue).
|
||||||
|
|
||||||
|
Respond ONLY with a JSON array of objects, each with:
|
||||||
|
- "number": the candidate issue number
|
||||||
|
- "duplicate": true or false
|
||||||
|
- "reason": one-sentence explanation
|
||||||
|
|
||||||
|
Example:
|
||||||
|
[{"number": 123, "duplicate": true, "reason": "Both report the same crash when ..."}]`;
|
||||||
|
|
||||||
|
async function confirmWithLlm(newIssue, candidates) {
|
||||||
|
if (!GROQ_API_KEY) {
|
||||||
|
console.warn('GROQ_API_KEY not set — skipping LLM confirmation');
|
||||||
|
return candidates;
|
||||||
|
}
|
||||||
|
|
||||||
|
const candidateText = candidates
|
||||||
|
.map(
|
||||||
|
(c) =>
|
||||||
|
`### Candidate #${c.number} (similarity: ${c.score.toFixed(2)})\n` +
|
||||||
|
`**Title:** ${c.title}\n` +
|
||||||
|
`**State:** ${c.state}\n` +
|
||||||
|
`**Body preview:** ${(c.body_preview || 'N/A').slice(0, 500)}`
|
||||||
|
)
|
||||||
|
.join('\n\n');
|
||||||
|
|
||||||
|
const userPrompt =
|
||||||
|
`## NEW ISSUE #${newIssue.number}\n` +
|
||||||
|
`**Title:** ${newIssue.title}\n` +
|
||||||
|
`**Body:**\n${(newIssue.body || 'No body').slice(0, 1500)}\n\n` +
|
||||||
|
`---\n\n` +
|
||||||
|
`## CANDIDATES\n${candidateText}`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const resp = await fetch(
|
||||||
|
'https://api.groq.com/openai/v1/chat/completions',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${GROQ_API_KEY}`,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
model: GROQ_MODEL,
|
||||||
|
messages: [
|
||||||
|
{ role: 'system', content: CONFIRM_SYSTEM_PROMPT },
|
||||||
|
{ role: 'user', content: userPrompt },
|
||||||
|
],
|
||||||
|
temperature: 0.1,
|
||||||
|
max_tokens: 1024,
|
||||||
|
}),
|
||||||
|
signal: AbortSignal.timeout(30_000),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!resp.ok) {
|
||||||
|
const text = await resp.text();
|
||||||
|
throw new Error(`Groq API error ${resp.status}: ${text}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let content = (await resp.json()).choices[0].message.content.trim();
|
||||||
|
|
||||||
|
if (content.startsWith('```')) {
|
||||||
|
content = content
|
||||||
|
.split('\n')
|
||||||
|
.slice(1)
|
||||||
|
.join('\n')
|
||||||
|
.replace(/```\s*$/, '')
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
const verdicts = JSON.parse(content);
|
||||||
|
if (!Array.isArray(verdicts)) {
|
||||||
|
throw new Error('Invalid LLM response format - expected array');
|
||||||
|
}
|
||||||
|
|
||||||
|
const verdictMap = new Map(verdicts.map((v) => [v.number, v]));
|
||||||
|
|
||||||
|
const confirmed = [];
|
||||||
|
for (const c of candidates) {
|
||||||
|
const verdict = verdictMap.get(c.number);
|
||||||
|
if (verdict?.duplicate) {
|
||||||
|
c.llm_reason = verdict.reason || '';
|
||||||
|
confirmed.push(c);
|
||||||
|
} else {
|
||||||
|
const reason = verdict?.reason || 'not evaluated';
|
||||||
|
console.log(` #${c.number} ruled out by LLM: ${reason}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return confirmed;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(
|
||||||
|
`LLM confirmation failed: ${err.message} - falling back to all candidates`
|
||||||
|
);
|
||||||
|
return candidates;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatComment(candidates) {
|
||||||
|
const lines = [
|
||||||
|
'**Possible duplicate detected**',
|
||||||
|
'',
|
||||||
|
'This issue may be a duplicate of the following (detected via semantic similarity + LLM review):',
|
||||||
|
'',
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const c of candidates.slice(0, MAX_COMMENT_CANDIDATES)) {
|
||||||
|
const confidence = `${(c.score * 100).toFixed(0)}%`;
|
||||||
|
let line = `- #${c.number} (${confidence} match) — ${c.title}`;
|
||||||
|
if (c.llm_reason) {
|
||||||
|
line += `\n > *${c.llm_reason}*`;
|
||||||
|
}
|
||||||
|
lines.push(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
lines.push(
|
||||||
|
'',
|
||||||
|
'A maintainer will review this. If this is **not** a duplicate, no action is needed.',
|
||||||
|
'',
|
||||||
|
`<!-- duplicate-bot: candidates=${candidates.map((c) => c.number).join(',')} -->`
|
||||||
|
);
|
||||||
|
|
||||||
|
return lines.join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
if (!ISSUE_NUMBER) {
|
||||||
|
console.error('ISSUE_NUMBER not set');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Processing issue #${ISSUE_NUMBER}`);
|
||||||
|
const issue = await getIssue(ISSUE_NUMBER);
|
||||||
|
|
||||||
|
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000).toISOString();
|
||||||
|
const recentIssues = await fetchIssues({
|
||||||
|
creator: issue.user.login,
|
||||||
|
since: oneHourAgo,
|
||||||
|
state: 'all',
|
||||||
|
});
|
||||||
|
|
||||||
|
if (recentIssues.length > 10) {
|
||||||
|
console.log(
|
||||||
|
`User ${issue.user.login} created ${recentIssues.length} issues in the last hour - skipping to prevent spam`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (issue.pull_request) {
|
||||||
|
console.log('Skipping - this is a pull request');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (issue.user.type === 'Bot') {
|
||||||
|
console.log('Skipping - issue created by bot');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Loading model: ${MODEL_NAME}`);
|
||||||
|
const extractor = await pipeline('feature-extraction', MODEL_NAME, {
|
||||||
|
dtype: 'fp32',
|
||||||
|
});
|
||||||
|
const index = loadIndex(INDEX_PATH);
|
||||||
|
|
||||||
|
const text = issueText(issue.title, issue.body);
|
||||||
|
const output = await extractor(text, { pooling: 'mean', normalize: true });
|
||||||
|
const queryEmbedding = output.tolist()[0];
|
||||||
|
|
||||||
|
let candidates = findSimilar(queryEmbedding, index, {
|
||||||
|
topK: TOP_K,
|
||||||
|
threshold: SIMILARITY_THRESHOLD,
|
||||||
|
excludeNumber: issue.number,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!candidates.length) {
|
||||||
|
console.log('No similar issues found above threshold - done');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Found ${candidates.length} candidates above threshold:`);
|
||||||
|
for (const c of candidates) {
|
||||||
|
console.log(` #${c.number} (${c.score.toFixed(3)}) - ${c.title}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Running LLM confirmation via Groq...');
|
||||||
|
candidates = await confirmWithLlm(issue, candidates);
|
||||||
|
|
||||||
|
if (!candidates.length) {
|
||||||
|
console.log('LLM ruled out all candidates - done');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const comment = formatComment(candidates);
|
||||||
|
await postComment(ISSUE_NUMBER, comment);
|
||||||
|
await addLabel(ISSUE_NUMBER, LABEL_NAME);
|
||||||
|
|
||||||
|
console.log('Done!');
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((err) => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
17
bin/duplicate-detector/package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": "duplicate-detector",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"packageManager": "pnpm@10.17.1",
|
||||||
|
"scripts": {
|
||||||
|
"build-index": "node build-index.mjs",
|
||||||
|
"detect": "node detect.mjs"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@huggingface/transformers": "^3.8.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=22.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
655
bin/duplicate-detector/pnpm-lock.yaml
generated
Normal file
@@ -0,0 +1,655 @@
|
|||||||
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
dependencies:
|
||||||
|
'@huggingface/transformers':
|
||||||
|
specifier: ^3.8.1
|
||||||
|
version: 3.8.1
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
'@emnapi/runtime@1.8.1':
|
||||||
|
resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
|
||||||
|
|
||||||
|
'@huggingface/jinja@0.5.5':
|
||||||
|
resolution: {integrity: sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
'@huggingface/transformers@3.8.1':
|
||||||
|
resolution: {integrity: sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==}
|
||||||
|
|
||||||
|
'@img/colour@1.0.0':
|
||||||
|
resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
'@img/sharp-darwin-arm64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@img/sharp-darwin-x64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-darwin-x64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-arm64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-arm@1.2.4':
|
||||||
|
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
|
||||||
|
cpu: [arm]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
|
||||||
|
cpu: [ppc64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
|
||||||
|
cpu: [riscv64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-s390x@1.2.4':
|
||||||
|
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
|
||||||
|
cpu: [s390x]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-x64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
||||||
|
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-arm64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-arm@0.34.5':
|
||||||
|
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [arm]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-ppc64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [ppc64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-riscv64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [riscv64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-s390x@0.34.5':
|
||||||
|
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [s390x]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linux-x64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linuxmusl-arm64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-linuxmusl-x64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@img/sharp-wasm32@0.34.5':
|
||||||
|
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [wasm32]
|
||||||
|
|
||||||
|
'@img/sharp-win32-arm64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@img/sharp-win32-ia32@0.34.5':
|
||||||
|
resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [ia32]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@img/sharp-win32-x64@0.34.5':
|
||||||
|
resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@isaacs/fs-minipass@4.0.1':
|
||||||
|
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
|
||||||
|
engines: {node: '>=18.0.0'}
|
||||||
|
|
||||||
|
'@protobufjs/aspromise@1.1.2':
|
||||||
|
resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
|
||||||
|
|
||||||
|
'@protobufjs/base64@1.1.2':
|
||||||
|
resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
|
||||||
|
|
||||||
|
'@protobufjs/codegen@2.0.4':
|
||||||
|
resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
|
||||||
|
|
||||||
|
'@protobufjs/eventemitter@1.1.0':
|
||||||
|
resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
|
||||||
|
|
||||||
|
'@protobufjs/fetch@1.1.0':
|
||||||
|
resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
|
||||||
|
|
||||||
|
'@protobufjs/float@1.0.2':
|
||||||
|
resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
|
||||||
|
|
||||||
|
'@protobufjs/inquire@1.1.0':
|
||||||
|
resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
|
||||||
|
|
||||||
|
'@protobufjs/path@1.1.2':
|
||||||
|
resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
|
||||||
|
|
||||||
|
'@protobufjs/pool@1.1.0':
|
||||||
|
resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
|
||||||
|
|
||||||
|
'@protobufjs/utf8@1.1.0':
|
||||||
|
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
|
||||||
|
|
||||||
|
'@types/node@25.2.2':
|
||||||
|
resolution: {integrity: sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==}
|
||||||
|
|
||||||
|
boolean@3.2.0:
|
||||||
|
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
|
||||||
|
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||||
|
|
||||||
|
chownr@3.0.0:
|
||||||
|
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
define-data-property@1.1.4:
|
||||||
|
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
define-properties@1.2.1:
|
||||||
|
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
detect-libc@2.1.2:
|
||||||
|
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
detect-node@2.1.0:
|
||||||
|
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
|
||||||
|
|
||||||
|
es-define-property@1.0.1:
|
||||||
|
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
es-errors@1.3.0:
|
||||||
|
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
es6-error@4.1.1:
|
||||||
|
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
|
||||||
|
|
||||||
|
escape-string-regexp@4.0.0:
|
||||||
|
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
flatbuffers@25.9.23:
|
||||||
|
resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==}
|
||||||
|
|
||||||
|
global-agent@3.0.0:
|
||||||
|
resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
|
||||||
|
engines: {node: '>=10.0'}
|
||||||
|
|
||||||
|
globalthis@1.0.4:
|
||||||
|
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
gopd@1.2.0:
|
||||||
|
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
guid-typescript@1.0.9:
|
||||||
|
resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==}
|
||||||
|
|
||||||
|
has-property-descriptors@1.0.2:
|
||||||
|
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
|
||||||
|
|
||||||
|
json-stringify-safe@5.0.1:
|
||||||
|
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
|
||||||
|
|
||||||
|
long@5.3.2:
|
||||||
|
resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
|
||||||
|
|
||||||
|
matcher@3.0.0:
|
||||||
|
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
minipass@7.1.2:
|
||||||
|
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
|
||||||
|
engines: {node: '>=16 || 14 >=14.17'}
|
||||||
|
|
||||||
|
minizlib@3.1.0:
|
||||||
|
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
|
||||||
|
engines: {node: '>= 18'}
|
||||||
|
|
||||||
|
object-keys@1.1.1:
|
||||||
|
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
onnxruntime-common@1.21.0:
|
||||||
|
resolution: {integrity: sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==}
|
||||||
|
|
||||||
|
onnxruntime-common@1.22.0-dev.20250409-89f8206ba4:
|
||||||
|
resolution: {integrity: sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==}
|
||||||
|
|
||||||
|
onnxruntime-node@1.21.0:
|
||||||
|
resolution: {integrity: sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==}
|
||||||
|
os: [win32, darwin, linux]
|
||||||
|
|
||||||
|
onnxruntime-web@1.22.0-dev.20250409-89f8206ba4:
|
||||||
|
resolution: {integrity: sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==}
|
||||||
|
|
||||||
|
platform@1.3.6:
|
||||||
|
resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
|
||||||
|
|
||||||
|
protobufjs@7.5.4:
|
||||||
|
resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
|
roarr@2.15.4:
|
||||||
|
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
|
||||||
|
engines: {node: '>=8.0'}
|
||||||
|
|
||||||
|
semver-compare@1.0.0:
|
||||||
|
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
|
||||||
|
|
||||||
|
semver@7.7.4:
|
||||||
|
resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
|
serialize-error@7.0.1:
|
||||||
|
resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
sharp@0.34.5:
|
||||||
|
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
|
||||||
|
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||||
|
|
||||||
|
sprintf-js@1.1.3:
|
||||||
|
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
|
||||||
|
|
||||||
|
tar@7.5.7:
|
||||||
|
resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
tslib@2.8.1:
|
||||||
|
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
|
||||||
|
|
||||||
|
type-fest@0.13.1:
|
||||||
|
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
undici-types@7.16.0:
|
||||||
|
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
|
||||||
|
|
||||||
|
yallist@5.0.0:
|
||||||
|
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
snapshots:
|
||||||
|
|
||||||
|
'@emnapi/runtime@1.8.1':
|
||||||
|
dependencies:
|
||||||
|
tslib: 2.8.1
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@huggingface/jinja@0.5.5': {}
|
||||||
|
|
||||||
|
'@huggingface/transformers@3.8.1':
|
||||||
|
dependencies:
|
||||||
|
'@huggingface/jinja': 0.5.5
|
||||||
|
onnxruntime-node: 1.21.0
|
||||||
|
onnxruntime-web: 1.22.0-dev.20250409-89f8206ba4
|
||||||
|
sharp: 0.34.5
|
||||||
|
|
||||||
|
'@img/colour@1.0.0': {}
|
||||||
|
|
||||||
|
'@img/sharp-darwin-arm64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-darwin-x64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-darwin-x64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-darwin-arm64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-darwin-x64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-arm64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-arm@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-ppc64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-riscv64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-s390x@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linux-x64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-arm64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-arm64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-arm@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-arm': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-ppc64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-riscv64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-s390x@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-s390x': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linux-x64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linux-x64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linuxmusl-arm64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-linuxmusl-x64@0.34.5':
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-wasm32@0.34.5':
|
||||||
|
dependencies:
|
||||||
|
'@emnapi/runtime': 1.8.1
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-win32-arm64@0.34.5':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-win32-ia32@0.34.5':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@img/sharp-win32-x64@0.34.5':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@isaacs/fs-minipass@4.0.1':
|
||||||
|
dependencies:
|
||||||
|
minipass: 7.1.2
|
||||||
|
|
||||||
|
'@protobufjs/aspromise@1.1.2': {}
|
||||||
|
|
||||||
|
'@protobufjs/base64@1.1.2': {}
|
||||||
|
|
||||||
|
'@protobufjs/codegen@2.0.4': {}
|
||||||
|
|
||||||
|
'@protobufjs/eventemitter@1.1.0': {}
|
||||||
|
|
||||||
|
'@protobufjs/fetch@1.1.0':
|
||||||
|
dependencies:
|
||||||
|
'@protobufjs/aspromise': 1.1.2
|
||||||
|
'@protobufjs/inquire': 1.1.0
|
||||||
|
|
||||||
|
'@protobufjs/float@1.0.2': {}
|
||||||
|
|
||||||
|
'@protobufjs/inquire@1.1.0': {}
|
||||||
|
|
||||||
|
'@protobufjs/path@1.1.2': {}
|
||||||
|
|
||||||
|
'@protobufjs/pool@1.1.0': {}
|
||||||
|
|
||||||
|
'@protobufjs/utf8@1.1.0': {}
|
||||||
|
|
||||||
|
'@types/node@25.2.2':
|
||||||
|
dependencies:
|
||||||
|
undici-types: 7.16.0
|
||||||
|
|
||||||
|
boolean@3.2.0: {}
|
||||||
|
|
||||||
|
chownr@3.0.0: {}
|
||||||
|
|
||||||
|
define-data-property@1.1.4:
|
||||||
|
dependencies:
|
||||||
|
es-define-property: 1.0.1
|
||||||
|
es-errors: 1.3.0
|
||||||
|
gopd: 1.2.0
|
||||||
|
|
||||||
|
define-properties@1.2.1:
|
||||||
|
dependencies:
|
||||||
|
define-data-property: 1.1.4
|
||||||
|
has-property-descriptors: 1.0.2
|
||||||
|
object-keys: 1.1.1
|
||||||
|
|
||||||
|
detect-libc@2.1.2: {}
|
||||||
|
|
||||||
|
detect-node@2.1.0: {}
|
||||||
|
|
||||||
|
es-define-property@1.0.1: {}
|
||||||
|
|
||||||
|
es-errors@1.3.0: {}
|
||||||
|
|
||||||
|
es6-error@4.1.1: {}
|
||||||
|
|
||||||
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
|
flatbuffers@25.9.23: {}
|
||||||
|
|
||||||
|
global-agent@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
boolean: 3.2.0
|
||||||
|
es6-error: 4.1.1
|
||||||
|
matcher: 3.0.0
|
||||||
|
roarr: 2.15.4
|
||||||
|
semver: 7.7.4
|
||||||
|
serialize-error: 7.0.1
|
||||||
|
|
||||||
|
globalthis@1.0.4:
|
||||||
|
dependencies:
|
||||||
|
define-properties: 1.2.1
|
||||||
|
gopd: 1.2.0
|
||||||
|
|
||||||
|
gopd@1.2.0: {}
|
||||||
|
|
||||||
|
guid-typescript@1.0.9: {}
|
||||||
|
|
||||||
|
has-property-descriptors@1.0.2:
|
||||||
|
dependencies:
|
||||||
|
es-define-property: 1.0.1
|
||||||
|
|
||||||
|
json-stringify-safe@5.0.1: {}
|
||||||
|
|
||||||
|
long@5.3.2: {}
|
||||||
|
|
||||||
|
matcher@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
escape-string-regexp: 4.0.0
|
||||||
|
|
||||||
|
minipass@7.1.2: {}
|
||||||
|
|
||||||
|
minizlib@3.1.0:
|
||||||
|
dependencies:
|
||||||
|
minipass: 7.1.2
|
||||||
|
|
||||||
|
object-keys@1.1.1: {}
|
||||||
|
|
||||||
|
onnxruntime-common@1.21.0: {}
|
||||||
|
|
||||||
|
onnxruntime-common@1.22.0-dev.20250409-89f8206ba4: {}
|
||||||
|
|
||||||
|
onnxruntime-node@1.21.0:
|
||||||
|
dependencies:
|
||||||
|
global-agent: 3.0.0
|
||||||
|
onnxruntime-common: 1.21.0
|
||||||
|
tar: 7.5.7
|
||||||
|
|
||||||
|
onnxruntime-web@1.22.0-dev.20250409-89f8206ba4:
|
||||||
|
dependencies:
|
||||||
|
flatbuffers: 25.9.23
|
||||||
|
guid-typescript: 1.0.9
|
||||||
|
long: 5.3.2
|
||||||
|
onnxruntime-common: 1.22.0-dev.20250409-89f8206ba4
|
||||||
|
platform: 1.3.6
|
||||||
|
protobufjs: 7.5.4
|
||||||
|
|
||||||
|
platform@1.3.6: {}
|
||||||
|
|
||||||
|
protobufjs@7.5.4:
|
||||||
|
dependencies:
|
||||||
|
'@protobufjs/aspromise': 1.1.2
|
||||||
|
'@protobufjs/base64': 1.1.2
|
||||||
|
'@protobufjs/codegen': 2.0.4
|
||||||
|
'@protobufjs/eventemitter': 1.1.0
|
||||||
|
'@protobufjs/fetch': 1.1.0
|
||||||
|
'@protobufjs/float': 1.0.2
|
||||||
|
'@protobufjs/inquire': 1.1.0
|
||||||
|
'@protobufjs/path': 1.1.2
|
||||||
|
'@protobufjs/pool': 1.1.0
|
||||||
|
'@protobufjs/utf8': 1.1.0
|
||||||
|
'@types/node': 25.2.2
|
||||||
|
long: 5.3.2
|
||||||
|
|
||||||
|
roarr@2.15.4:
|
||||||
|
dependencies:
|
||||||
|
boolean: 3.2.0
|
||||||
|
detect-node: 2.1.0
|
||||||
|
globalthis: 1.0.4
|
||||||
|
json-stringify-safe: 5.0.1
|
||||||
|
semver-compare: 1.0.0
|
||||||
|
sprintf-js: 1.1.3
|
||||||
|
|
||||||
|
semver-compare@1.0.0: {}
|
||||||
|
|
||||||
|
semver@7.7.4: {}
|
||||||
|
|
||||||
|
serialize-error@7.0.1:
|
||||||
|
dependencies:
|
||||||
|
type-fest: 0.13.1
|
||||||
|
|
||||||
|
sharp@0.34.5:
|
||||||
|
dependencies:
|
||||||
|
'@img/colour': 1.0.0
|
||||||
|
detect-libc: 2.1.2
|
||||||
|
semver: 7.7.4
|
||||||
|
optionalDependencies:
|
||||||
|
'@img/sharp-darwin-arm64': 0.34.5
|
||||||
|
'@img/sharp-darwin-x64': 0.34.5
|
||||||
|
'@img/sharp-libvips-darwin-arm64': 1.2.4
|
||||||
|
'@img/sharp-libvips-darwin-x64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-arm': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-arm64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-ppc64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-riscv64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-s390x': 1.2.4
|
||||||
|
'@img/sharp-libvips-linux-x64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linuxmusl-arm64': 1.2.4
|
||||||
|
'@img/sharp-libvips-linuxmusl-x64': 1.2.4
|
||||||
|
'@img/sharp-linux-arm': 0.34.5
|
||||||
|
'@img/sharp-linux-arm64': 0.34.5
|
||||||
|
'@img/sharp-linux-ppc64': 0.34.5
|
||||||
|
'@img/sharp-linux-riscv64': 0.34.5
|
||||||
|
'@img/sharp-linux-s390x': 0.34.5
|
||||||
|
'@img/sharp-linux-x64': 0.34.5
|
||||||
|
'@img/sharp-linuxmusl-arm64': 0.34.5
|
||||||
|
'@img/sharp-linuxmusl-x64': 0.34.5
|
||||||
|
'@img/sharp-wasm32': 0.34.5
|
||||||
|
'@img/sharp-win32-arm64': 0.34.5
|
||||||
|
'@img/sharp-win32-ia32': 0.34.5
|
||||||
|
'@img/sharp-win32-x64': 0.34.5
|
||||||
|
|
||||||
|
sprintf-js@1.1.3: {}
|
||||||
|
|
||||||
|
tar@7.5.7:
|
||||||
|
dependencies:
|
||||||
|
'@isaacs/fs-minipass': 4.0.1
|
||||||
|
chownr: 3.0.0
|
||||||
|
minipass: 7.1.2
|
||||||
|
minizlib: 3.1.0
|
||||||
|
yallist: 5.0.0
|
||||||
|
|
||||||
|
tslib@2.8.1:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
type-fest@0.13.1: {}
|
||||||
|
|
||||||
|
undici-types@7.16.0: {}
|
||||||
|
|
||||||
|
yallist@5.0.0: {}
|
||||||
116
bin/duplicate-detector/utils.mjs
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
const GITHUB_API = 'https://api.github.com';
|
||||||
|
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
||||||
|
const GITHUB_REPOSITORY = process.env.GITHUB_REPOSITORY;
|
||||||
|
|
||||||
|
function ghHeaders() {
|
||||||
|
return {
|
||||||
|
Authorization: `token ${GITHUB_TOKEN}`,
|
||||||
|
Accept: 'application/vnd.github+json',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchIssues({
|
||||||
|
state = 'open',
|
||||||
|
since,
|
||||||
|
maxIssues = 5000,
|
||||||
|
} = {}) {
|
||||||
|
const issues = [];
|
||||||
|
let page = 1;
|
||||||
|
const perPage = 100;
|
||||||
|
|
||||||
|
while (issues.length < maxIssues) {
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
state,
|
||||||
|
per_page: String(perPage),
|
||||||
|
page: String(page),
|
||||||
|
sort: 'updated',
|
||||||
|
direction: 'desc',
|
||||||
|
});
|
||||||
|
if (since) params.set('since', since);
|
||||||
|
|
||||||
|
const url = `${GITHUB_API}/repos/${GITHUB_REPOSITORY}/issues?${params}`;
|
||||||
|
const resp = await fetch(url, { headers: ghHeaders() });
|
||||||
|
|
||||||
|
if (!resp.ok) {
|
||||||
|
throw new Error(`GitHub API error: ${resp.status} ${resp.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const batch = await resp.json();
|
||||||
|
if (!batch.length) break;
|
||||||
|
|
||||||
|
for (const item of batch) {
|
||||||
|
if (!item.pull_request) {
|
||||||
|
issues.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page++;
|
||||||
|
if (batch.length < perPage) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return issues.slice(0, maxIssues);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getIssue(issueNumber) {
|
||||||
|
const url = `${GITHUB_API}/repos/${GITHUB_REPOSITORY}/issues/${issueNumber}`;
|
||||||
|
const resp = await fetch(url, { headers: ghHeaders() });
|
||||||
|
|
||||||
|
if (!resp.ok) {
|
||||||
|
throw new Error(`GitHub API error: ${resp.status} ${resp.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function postComment(issueNumber, body) {
|
||||||
|
const url = `${GITHUB_API}/repos/${GITHUB_REPOSITORY}/issues/${issueNumber}/comments`;
|
||||||
|
const resp = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { ...ghHeaders(), 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ body }),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!resp.ok) {
|
||||||
|
throw new Error(
|
||||||
|
`Failed to post comment: ${resp.status} ${resp.statusText}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Posted comment on #${issueNumber}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addLabel(issueNumber, label) {
|
||||||
|
const url = `${GITHUB_API}/repos/${GITHUB_REPOSITORY}/issues/${issueNumber}/labels`;
|
||||||
|
const resp = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { ...ghHeaders(), 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ labels: [label] }),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (resp.status === 404) {
|
||||||
|
console.warn(
|
||||||
|
`Label '${label}' does not exist - skipping. Create it manually.`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resp.ok) {
|
||||||
|
throw new Error(`Failed to add label: ${resp.status} ${resp.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Added label '${label}' to #${issueNumber}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function issueText(title, body) {
|
||||||
|
body = (body || '').trim();
|
||||||
|
if (body.length > 2000) body = body.slice(0, 2000) + '...';
|
||||||
|
return body ? `${title}\n\n${body}` : title;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function dotProduct(a, b) {
|
||||||
|
let sum = 0;
|
||||||
|
for (let i = 0; i < a.length; i++) {
|
||||||
|
sum += a[i] * b[i];
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
@@ -3,9 +3,9 @@ kubeVersion: '>=1.23.0-0'
|
|||||||
name: seerr-chart
|
name: seerr-chart
|
||||||
description: Seerr helm chart for Kubernetes
|
description: Seerr helm chart for Kubernetes
|
||||||
type: application
|
type: application
|
||||||
version: 3.0.0
|
version: 3.0.2
|
||||||
# renovate: image=ghcr.io/seerr-team/seerr
|
# renovate: image=ghcr.io/seerr-team/seerr
|
||||||
appVersion: '3.0.0'
|
appVersion: 'v3.0.1'
|
||||||
maintainers:
|
maintainers:
|
||||||
- name: Seerr Team
|
- name: Seerr Team
|
||||||
url: https://github.com/orgs/seerr-team/people
|
url: https://github.com/orgs/seerr-team/people
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# seerr-chart
|
# seerr-chart
|
||||||
|
|
||||||
  
|
  
|
||||||
|
|
||||||
Seerr helm chart for Kubernetes
|
Seerr helm chart for Kubernetes
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
"discoverRegion": "",
|
"discoverRegion": "",
|
||||||
"streamingRegion": "",
|
"streamingRegion": "",
|
||||||
"originalLanguage": "",
|
"originalLanguage": "",
|
||||||
"blacklistedTags": "",
|
"blocklistedTags": "",
|
||||||
"blacklistedTagsLimit": 50,
|
"blocklistedTagsLimit": 50,
|
||||||
"trustProxy": false,
|
"trustProxy": false,
|
||||||
"mediaServerType": 1,
|
"mediaServerType": 1,
|
||||||
"partialRequestsEnabled": true,
|
"partialRequestsEnabled": true,
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ Welcome to the Seerr Documentation.
|
|||||||
- Localization into other languages.
|
- Localization into other languages.
|
||||||
- Support for **PostgreSQL** and **SQLite** databases.
|
- Support for **PostgreSQL** and **SQLite** databases.
|
||||||
- Support for various notification agents.
|
- Support for various notification agents.
|
||||||
- Easily **Watchlist** or **Blacklist** media.
|
- Easily **Watchlist** or **Blocklist** media.
|
||||||
- More features to come!
|
- More features to come!
|
||||||
|
|
||||||
## We need your help!
|
## We need your help!
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ Refer to [Configuring Databases](/extending-seerr/database-config#postgresql-opt
|
|||||||
|
|
||||||
:::info
|
:::info
|
||||||
An alternative Docker image is available on Docker Hub for this project. You can find it at [Docker Hub Repository Link](https://hub.docker.com/r/seerr/seerr)
|
An alternative Docker image is available on Docker Hub for this project. You can find it at [Docker Hub Repository Link](https://hub.docker.com/r/seerr/seerr)
|
||||||
|
|
||||||
|
Our Docker images are available with the following tags:
|
||||||
|
|
||||||
|
- `latest`: Always points to the most recent stable release.
|
||||||
|
- Version tags (e.g., `v3.0.0`): For specific stable versions.
|
||||||
|
- `develop`: Rolling release/nightly builds for using the latest changes (use with caution).
|
||||||
:::
|
:::
|
||||||
|
|
||||||
:::info
|
:::info
|
||||||
@@ -38,6 +44,13 @@ For details on the Docker CLI, please [review the official `docker run` document
|
|||||||
|
|
||||||
#### Installation:
|
#### Installation:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the appdata folder
|
||||||
|
mkdir /path/to/appdata/config
|
||||||
|
# Chown the folder as the container runs as the `node` user (UID 1000).
|
||||||
|
chown -R 1000:1000 /path/to/appdata/config
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d \
|
docker run -d \
|
||||||
--name seerr \
|
--name seerr \
|
||||||
@@ -48,20 +61,16 @@ docker run -d \
|
|||||||
-p 5055:5055 \
|
-p 5055:5055 \
|
||||||
-v /path/to/appdata/config:/app/config \
|
-v /path/to/appdata/config:/app/config \
|
||||||
--restart unless-stopped \
|
--restart unless-stopped \
|
||||||
ghcr.io/seerr-team/seerr:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
The argument `-e PORT=5055` is optional.
|
|
||||||
|
|
||||||
If you want to add a healthcheck to the above command, you can add the following flags :
|
|
||||||
```
|
|
||||||
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1" \
|
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1" \
|
||||||
--health-start-period 20s \
|
--health-start-period 20s \
|
||||||
--health-timeout 3s \
|
--health-timeout 3s \
|
||||||
--health-interval 15s \
|
--health-interval 15s \
|
||||||
--health-retries 3 \
|
--health-retries 3 \
|
||||||
|
ghcr.io/seerr-team/seerr:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The argument `-e PORT=5055` is optional.
|
||||||
|
|
||||||
To run the container as a specific user/group, you may optionally add `--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]` to the above command.
|
To run the container as a specific user/group, you may optionally add `--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]` to the above command.
|
||||||
|
|
||||||
#### Updating:
|
#### Updating:
|
||||||
@@ -115,6 +124,13 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create the appdata folder
|
||||||
|
mkdir /path/to/appdata/config
|
||||||
|
# Chown the folder as the container runs as the `node` user (UID 1000).
|
||||||
|
chown -R 1000:1000 /path/to/appdata/config
|
||||||
|
```
|
||||||
|
|
||||||
Then, start all services defined in the Compose file:
|
Then, start all services defined in the Compose file:
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
@@ -129,9 +145,6 @@ Then, restart all services defined in the Compose file:
|
|||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
:::tip
|
|
||||||
You may alternatively use a third-party mechanism like [dockge](https://github.com/louislam/dockge) to manage your docker compose files.
|
|
||||||
:::
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
@@ -166,20 +179,16 @@ docker run -d \
|
|||||||
-p 5055:5055 \
|
-p 5055:5055 \
|
||||||
-v seerr-data:/app/config \
|
-v seerr-data:/app/config \
|
||||||
--restart unless-stopped \
|
--restart unless-stopped \
|
||||||
ghcr.io/seerr-team/seerr:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
The argument `-e PORT=5055` is optional.
|
|
||||||
|
|
||||||
If you want to add a healthcheck to the above command, you can add the following flags :
|
|
||||||
```
|
|
||||||
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1" \
|
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1" \
|
||||||
--health-start-period 20s \
|
--health-start-period 20s \
|
||||||
--health-timeout 3s \
|
--health-timeout 3s \
|
||||||
--health-interval 15s \
|
--health-interval 15s \
|
||||||
--health-retries 3 \
|
--health-retries 3 \
|
||||||
|
ghcr.io/seerr-team/seerr:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The argument `-e PORT=5055` is optional.
|
||||||
|
|
||||||
#### Updating:
|
#### Updating:
|
||||||
Pull the latest image:
|
Pull the latest image:
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -7,5 +7,9 @@ import DocCardList from '@theme/DocCardList';
|
|||||||
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
:::info
|
||||||
|
Want to add a third-party installation method? Contributions are welcome! Feel free to open a pull request.
|
||||||
|
:::
|
||||||
|
|
||||||
|
|
||||||
<DocCardList />
|
<DocCardList />
|
||||||
|
|||||||
@@ -10,8 +10,21 @@ import Tabs from '@theme/Tabs';
|
|||||||
import TabItem from '@theme/TabItem';
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
# Nix Package Manager
|
# Nix Package Manager
|
||||||
|
:::danger
|
||||||
|
This method has not yet been updated for Seerr and is currently a work in progress.
|
||||||
|
You can follow the ongoing work on these pull requests:
|
||||||
|
- https://github.com/NixOS/nixpkgs/pull/450096
|
||||||
|
- https://github.com/NixOS/nixpkgs/pull/450093
|
||||||
|
:::
|
||||||
|
|
||||||
|
<!--
|
||||||
:::warning
|
:::warning
|
||||||
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This method is not recommended for most users. It is intended for advanced users who are using NixOS distribution.
|
||||||
|
:::
|
||||||
|
|
||||||
Refer to [NixOS documentation](https://search.nixos.org/options?channel=25.05&query=seerr)
|
Refer to [NixOS documentation](https://search.nixos.org/options?channel=25.05&query=seerr)
|
||||||
|
-->
|
||||||
|
|||||||
20
docs/getting-started/third-parties/truenas.mdx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: TrueNAS (Advanced)
|
||||||
|
description: Install Seerr using TrueNAS
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
# TrueNAS
|
||||||
|
:::danger
|
||||||
|
This method has not yet been updated for Seerr and is currently a work in progress.
|
||||||
|
You can follow the ongoing work on this issue https://github.com/truenas/apps/issues/3374.
|
||||||
|
:::
|
||||||
|
|
||||||
|
<!--
|
||||||
|
:::warning
|
||||||
|
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
||||||
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
This method is not recommended for most users. It is intended for advanced users who are using TrueNAS distribution.
|
||||||
|
:::
|
||||||
|
-->
|
||||||
@@ -5,6 +5,7 @@ sidebar_position: 3
|
|||||||
---
|
---
|
||||||
|
|
||||||
# Unraid
|
# Unraid
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
Third-party installation methods are maintained by the community. The Seerr team is not responsible for these packages.
|
||||||
:::
|
:::
|
||||||
@@ -13,8 +14,68 @@ Third-party installation methods are maintained by the community. The Seerr team
|
|||||||
This method is not recommended for most users. It is intended for advanced users who are using Unraid.
|
This method is not recommended for most users. It is intended for advanced users who are using Unraid.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
1. Ensure you have the **Community Applications** plugin installed.
|
|
||||||
2. Inside the **Community Applications** app store, search for **Seerr**.
|
If an official Unraid Community Applications template for Seerr isn't available in your catalog, you can install Seerr manually using Unraid's Docker UI.
|
||||||
3. Click the **Install Button**.
|
|
||||||
4. On the following **Add Container** screen, make changes to the **Host Port** and **Host Path 1** \(Appdata\) as needed.
|
## Fresh Installation
|
||||||
5. Click apply and access "Seerr" at your `<ServerIP:HostPort>` in a web browser.
|
|
||||||
|
### 1. Create the config directory
|
||||||
|
|
||||||
|
Open the Unraid terminal and run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p /mnt/user/appdata/seerr
|
||||||
|
chown -R 1000:1000 /mnt/user/appdata/seerr
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Add the Docker container
|
||||||
|
|
||||||
|
Navigate to the **Docker** tab in Unraid and click **Add Container**. Fill in the following:
|
||||||
|
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| **Name** | `seerr` |
|
||||||
|
| **Repository** | `ghcr.io/seerr-team/seerr:latest` |
|
||||||
|
| **Registry URL** (optional) | `https://ghcr.io` |
|
||||||
|
| **Icon URL** | `https://raw.githubusercontent.com/seerr-team/seerr/develop/public/android-chrome-512x512.png` |
|
||||||
|
| **WebUI** | `http://[IP]:[PORT:5055]` |
|
||||||
|
| **Extra Parameters** | `--init` |
|
||||||
|
| **Network Type** | `bridge` |
|
||||||
|
| **Privileged** | `Off` |
|
||||||
|
|
||||||
|
Then click **Add another Path, Port, Variable** to add:
|
||||||
|
|
||||||
|
**Port:**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Container Port | `5055` |
|
||||||
|
| Host Port | `5055` |
|
||||||
|
| Connection Type | `TCP` |
|
||||||
|
|
||||||
|
**Path:**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Container Path | `/app/config` |
|
||||||
|
| Host Path | `/mnt/user/appdata/seerr` |
|
||||||
|
|
||||||
|
**Variable:**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Key | `TZ` |
|
||||||
|
| Value | Your [TZ database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (e.g., `America/New_York`) |
|
||||||
|
|
||||||
|
**Variable (optional):**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Key | `LOG_LEVEL` |
|
||||||
|
| Value | `info` |
|
||||||
|
|
||||||
|
Click **Apply** to create and start the container.
|
||||||
|
|
||||||
|
### 3. Access Seerr
|
||||||
|
|
||||||
|
Open the WebUI at `http://<your-unraid-ip>:5055` and follow the setup wizard.
|
||||||
|
|
||||||
|
:::info
|
||||||
|
The `--init` flag in **Extra Parameters** is required. Seerr does not include its own init process, so `--init` ensures proper signal handling and clean container shutdowns.
|
||||||
|
:::
|
||||||
@@ -5,26 +5,52 @@ title: Migration guide
|
|||||||
import Tabs from '@theme/Tabs';
|
import Tabs from '@theme/Tabs';
|
||||||
import TabItem from '@theme/TabItem';
|
import TabItem from '@theme/TabItem';
|
||||||
|
|
||||||
|
:::important
|
||||||
|
Read our [release announcement](/blog/seerr-release) to learn what Seerr means for Jellyseerr and Overseerr users.
|
||||||
|
:::
|
||||||
|
|
||||||
Whether you come from Overseerr or Jellyseerr, you don't need to perform any manual migration steps, your instance will automatically be migrated to Seerr.
|
Whether you come from Overseerr or Jellyseerr, you don't need to perform any manual migration steps, your instance will automatically be migrated to Seerr.
|
||||||
This migration will run automatically the first time you start your instance using the Seerr codebase (Docker image or source build or Kubernetes, etc.).
|
This migration will run automatically the first time you start your instance using the Seerr codebase (Docker image or source build or Kubernetes, etc.).
|
||||||
An additional migration will happen for Overseerr users, to migrate their configuration to the new codebase.
|
An additional migration will happen for Overseerr users, to migrate their configuration to the new codebase.
|
||||||
|
|
||||||
:::warning
|
:::danger
|
||||||
Before doing anything you should backup your existing instance so that you can rollback in case something goes wrong.
|
Before doing anything you should backup your existing instance so that you can rollback in case something goes wrong.
|
||||||
See [Backups](/using-seerr/backups) for details on how to properly backup your instance.
|
See [Backups](/using-seerr/backups) for details on how to properly backup your instance.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Installation methods are now divided into two categories: official and third-party methods.
|
||||||
|
The Seerr team is only responsible for official installation methods, while third-party methods are maintained by the community.
|
||||||
|
Some methods are currently not maintained, but this does not mean they are permanently discontinued. The community may restore and support them if they choose to do so.
|
||||||
|
|
||||||
|
- **Snap package:** Not maintained
|
||||||
|
:::
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
Refer to [Seerr Docker Documentation](/getting-started/docker), all of our examples have been updated to reflect the below change.
|
Refer to [Seerr Docker Documentation](/getting-started/docker), all of our examples have been updated to reflect the below change.
|
||||||
|
|
||||||
|
:::info
|
||||||
|
Seerr provides a secure, fully featured image with everything you need included.
|
||||||
|
We sincerely appreciate the past contributions from third-party maintainers, which helped enhance this image and its capabilities.
|
||||||
|
To maintain consistency and security, we encourage everyone to use the features available in the official Seerr image.
|
||||||
|
If you feel something is missing, please submit a feature request—your feedback is always welcome!
|
||||||
|
|
||||||
|
Our Docker images are available with the following tags:
|
||||||
|
|
||||||
|
- `latest`: Always points to the most recent stable release.
|
||||||
|
- Version tags (e.g., `v3.0.0`): For specific stable versions.
|
||||||
|
- `develop`: Rolling release/nightly builds for using the latest changes (use with caution).
|
||||||
|
:::
|
||||||
|
|
||||||
Changes :
|
Changes :
|
||||||
- Renamed all references from `overseerr` or `jellyseerr` to `seerr`.
|
- Renamed all references from `overseerr` or `jellyseerr` to `seerr`.
|
||||||
- The container image reference has been updated.
|
- The container image reference has been updated.
|
||||||
- The container can now be run as a non-root user (`node` user); remove the `user` directive if you have configured it.
|
- The container can now be run as a non-root user (`node` user); remove the `user` directive if you have configured it.
|
||||||
- The container no longer provides an init process, so you must configure it by adding `init: true` for Docker Compose or `--init` for the Docker CLI.
|
- The container no longer provides an init process, so you must configure it by adding `init: true` for Docker Compose or `--init` for the Docker CLI.
|
||||||
|
|
||||||
|
#### Config folder permissions
|
||||||
:::info
|
:::info
|
||||||
**Config folder permissions**: Since the container now runs as the `node` user (UID 1000), you must ensure your config folder has the correct permissions. The `node` user must have read and write access to the `/app/config` directory.
|
Since the container now runs as the `node` user (UID 1000), you must ensure your config folder has the correct permissions. The `node` user must have read and write access to the `/app/config` directory.
|
||||||
|
|
||||||
If you're migrating from a previous installation, you may need to update the ownership of your config folder:
|
If you're migrating from a previous installation, you may need to update the ownership of your config folder:
|
||||||
```bash
|
```bash
|
||||||
@@ -126,6 +152,12 @@ Summary of changes :
|
|||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
|
|
||||||
|
## Build From Source
|
||||||
|
Refer to [Seerr Build From Source Documentation](/getting-started/buildfromsource), all of our examples have been updated to reflect the below change.
|
||||||
|
|
||||||
|
Install from scratch by following the documentation, restore your data as described in [Backups](/using-seerr/backups), and then start Seerr. No additional steps are required.
|
||||||
|
|
||||||
## Kubernetes
|
## Kubernetes
|
||||||
Refer to [Seerr Kubernetes Documentation](/getting-started/kubernetes), all of our examples have been updated to reflect the below change.
|
Refer to [Seerr Kubernetes Documentation](/getting-started/kubernetes), all of our examples have been updated to reflect the below change.
|
||||||
|
|
||||||
@@ -166,3 +198,83 @@ Summary of changes :
|
|||||||
```
|
```
|
||||||
</TabItem>
|
</TabItem>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
|
## Third-party installation methods
|
||||||
|
### Nix
|
||||||
|
|
||||||
|
Waiting for https://github.com/NixOS/nixpkgs/pull/450096 and https://github.com/NixOS/nixpkgs/pull/450093
|
||||||
|
|
||||||
|
### AUR
|
||||||
|
|
||||||
|
See https://aur.archlinux.org/packages/seerr
|
||||||
|
|
||||||
|
### TrueNAS
|
||||||
|
|
||||||
|
Waiting for https://github.com/truenas/apps/issues/3374
|
||||||
|
|
||||||
|
### Unraid
|
||||||
|
|
||||||
|
Refer to [Seerr Unraid Documentation](/getting-started/third-parties/unraid), all of our examples have been updated to reflect the below change.
|
||||||
|
|
||||||
|
Seerr will automatically migrate your existing Overseerr or Jellyseerr data on first startup. No manual database migration is needed.
|
||||||
|
|
||||||
|
1. Stop and remove the old Overseerr (or Jellyseerr) container from the Unraid **Docker** tab. Click the container icon, then **Stop**, then **Remove**. **⚠️ Do not delete the appdata folder ⚠️**
|
||||||
|
|
||||||
|
2. Back up your existing appdata folder:
|
||||||
|
```bash
|
||||||
|
cp -a /mnt/user/appdata/overseerr /mnt/user/appdata/overseerr-backup
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Fix config folder permissions — Seerr runs as the `node` user (UID 1000) instead of root:
|
||||||
|
```bash
|
||||||
|
chown -R 1000:1000 /mnt/user/appdata/overseerr
|
||||||
|
```
|
||||||
|
For Jellyseerr users, replace `overseerr` with `jellyseerr` in the path above.
|
||||||
|
|
||||||
|
4. Add a new container in the Unraid **Docker** tab. Click **Add Container** and fill in the following:
|
||||||
|
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| **Name** | `seerr` |
|
||||||
|
| **Repository** | `ghcr.io/seerr-team/seerr:latest` |
|
||||||
|
| **Registry URL** (optional) | `https://ghcr.io` |
|
||||||
|
| **Icon URL** | `https://raw.githubusercontent.com/seerr-team/seerr/develop/public/android-chrome-512x512.png` |
|
||||||
|
| **WebUI** | `http://[IP]:[PORT:5055]` |
|
||||||
|
| **Extra Parameters** | `--init` |
|
||||||
|
| **Network Type** | `bridge` |
|
||||||
|
| **Privileged** | `Off` |
|
||||||
|
|
||||||
|
Then click **Add another Path, Port, Variable** to add:
|
||||||
|
|
||||||
|
**Port:**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Container Port | `5055` |
|
||||||
|
| Host Port | `5055` |
|
||||||
|
| Connection Type | `TCP` |
|
||||||
|
|
||||||
|
**Path** — point this to your existing config folder:
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Container Path | `/app/config` |
|
||||||
|
| Host Path | `/mnt/user/appdata/overseerr` |
|
||||||
|
|
||||||
|
For Jellyseerr users, use `/mnt/user/appdata/jellyseerr`.
|
||||||
|
|
||||||
|
**Variable:**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Key | `TZ` |
|
||||||
|
| Value | Your [TZ database name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (e.g., `America/New_York`) |
|
||||||
|
|
||||||
|
**Variable (optional):**
|
||||||
|
| Field | Value |
|
||||||
|
|---|---|
|
||||||
|
| Key | `LOG_LEVEL` |
|
||||||
|
| Value | `info` |
|
||||||
|
|
||||||
|
5. Click **Apply** to start the container. Check the container logs to confirm the automatic migration completed successfully.
|
||||||
|
|
||||||
|
:::tip
|
||||||
|
If you are using a reverse proxy (such as SWAG or Nginx Proxy Manager), update your proxy configuration to point to the new container name `seerr`. The default port remains `5055`.
|
||||||
|
:::
|
||||||
@@ -13,7 +13,7 @@ These settings are stored in the `settings.json` file located in the Seerr data
|
|||||||
|
|
||||||
## User Data
|
## User Data
|
||||||
|
|
||||||
Apart from the settings, all other data—including user accounts, media requests, blacklist etc. are stored in the database (either SQLite or PostgreSQL).
|
Apart from the settings, all other data—including user accounts, media requests, blocklist etc. are stored in the database (either SQLite or PostgreSQL).
|
||||||
|
|
||||||
# Backup
|
# Backup
|
||||||
|
|
||||||
|
|||||||
@@ -62,13 +62,13 @@ Set the default display language for Seerr. Users can override this setting in t
|
|||||||
|
|
||||||
These settings filter content shown on the "Discover" home page based on regional availability and original language, respectively. The Streaming Region filters the available streaming providers on the media page. Users can override these global settings by configuring these same options in their user settings.
|
These settings filter content shown on the "Discover" home page based on regional availability and original language, respectively. The Streaming Region filters the available streaming providers on the media page. Users can override these global settings by configuring these same options in their user settings.
|
||||||
|
|
||||||
## Blacklist Content with Tags and Limit Content Blacklisted per Tag
|
## Blocklist Content with Tags and Limit Content Blocklisted per Tag
|
||||||
|
|
||||||
These settings blacklist any TV shows or movies that have one of the entered tags. The "Process Blacklisted Tags" job adds entries to the blacklist based on the configured blacklisted tags. If a blacklisted tag is removed, any media blacklisted under that tag will be removed from the blacklist when the "Process Blacklisted Tags" job runs.
|
These settings blocklist any TV shows or movies that have one of the entered tags. The "Process Blocklisted Tags" job adds entries to the blocklist based on the configured blocklisted tags. If a blocklisted tag is removed, any media blocklisted under that tag will be removed from the blocklist when the "Process Blocklisted Tags" job runs.
|
||||||
|
|
||||||
The limit setting determines how many pages per tag the job will process, with each page containing 20 entries. The job cycles through all 16 available discovery sort options, querying the defined number of pages to blacklist media that is most likely to appear at the top of each sort. Higher limits will create a more accurate blacklist, but will require more storage.
|
The limit setting determines how many pages per tag the job will process, with each page containing 20 entries. The job cycles through all 16 available discovery sort options, querying the defined number of pages to blocklist media that is most likely to appear at the top of each sort. Higher limits will create a more accurate blocklist, but will require more storage.
|
||||||
|
|
||||||
Blacklisted tags are disabled until at least one tag is entered. These settings cannot be overridden in user settings.
|
Blocklisted tags are disabled until at least one tag is entered. These settings cannot be overridden in user settings.
|
||||||
|
|
||||||
## Hide Available Media
|
## Hide Available Media
|
||||||
|
|
||||||
@@ -78,9 +78,9 @@ Available media will still appear in search results, however, so it is possible
|
|||||||
|
|
||||||
This setting is **disabled** by default.
|
This setting is **disabled** by default.
|
||||||
|
|
||||||
## Hide Blacklisted Items
|
## Hide Blocklisted Items
|
||||||
|
|
||||||
When enabled, media that has been blacklisted will not appear on the "Discover" home page, for all administrators. This can be useful to hide content that you don't want to see, such as content with specific tags or content that has been manually blacklisted when you have the "Manage Blacklist" permission.
|
When enabled, media that has been blocklisted will not appear on the "Discover" home page, for all administrators. This can be useful to hide content that you don't want to see, such as content with specific tags or content that has been manually blocklisted when you have the "Manage Blocklist" permission.
|
||||||
|
|
||||||
This setting is **disabled** by default.
|
This setting is **disabled** by default.
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Seerr docs will be available at [docs.seerr.dev](https://docs.seerr.dev).
|
|||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
```
|
```
|
||||||
$ pnpm
|
$ pnpm install
|
||||||
```
|
```
|
||||||
|
|
||||||
### Local Development
|
### Local Development
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ description: The official Seerr blog for release notes, technical updates, and c
|
|||||||
slug: welcome
|
slug: welcome
|
||||||
authors: [fallenbagel, gauthier-th]
|
authors: [fallenbagel, gauthier-th]
|
||||||
tags: [announcement, seerr, blog]
|
tags: [announcement, seerr, blog]
|
||||||
image: https://raw.githubusercontent.com/seerr-team/seerr/refs/heads/develop/gen-docs/static/img/logo.svg
|
image: https://raw.githubusercontent.com/seerr-team/seerr/refs/heads/develop/gen-docs/static/img/logo_full.svg
|
||||||
hide_table_of_contents: false
|
hide_table_of_contents: false
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
BIN
gen-docs/blog/2026-02-10/dns-cache.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
gen-docs/blog/2026-02-10/metadata-providers.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
127
gen-docs/blog/2026-02-10/seerr-release.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
---
|
||||||
|
title: "Seerr Release: Unifying Overseerr and Jellyseerr"
|
||||||
|
description: "Overseerr and Jellyseerr are merging into a unified project: Seerr"
|
||||||
|
slug: seerr-release
|
||||||
|
authors: [seerr-team]
|
||||||
|
image: https://raw.githubusercontent.com/seerr-team/seerr/refs/heads/develop/gen-docs/static/img/logo_full.svg
|
||||||
|
hide_table_of_contents: false
|
||||||
|
---
|
||||||
|
|
||||||
|
We're excited to announce a major update: the Jellyseerr and Overseerr teams are officially merging into a single team called **Seerr**. This unification marks an important step forward as we bring our efforts together under one banner.
|
||||||
|
|
||||||
|
For users, this means one shared codebase combining all existing Overseerr functionalities with the latest Jellyseerr features, along with Jellyfin and Emby support, allowing us to deliver updates more efficiently and keep the project moving forward.
|
||||||
|
|
||||||
|
Please check how to migrate to Seerr in our [migration guide](https://docs.seerr.dev/migration-guide) and stay tuned for more updates on the project!
|
||||||
|
|
||||||
|
<!--truncate-->
|
||||||
|
|
||||||
|
## What's new in Seerr for Overseerr users
|
||||||
|
|
||||||
|
Seerr brings several features that were previously available in Jellyseerr but missing from Overseerr. These additions improve flexibility, performance, and overall control for admins and power users:
|
||||||
|
|
||||||
|
* **Alternative media solution:** Added support for Jellyfin and Emby in addition to the existing Plex integration.
|
||||||
|
* **PostgreSQL support**: In addition to SQLite, you can now opt in to using a PostgreSQL database.
|
||||||
|
* **Blocklist for movies, series, and tags**: Allows permitted users to hide movies, series, or tags from regular users.
|
||||||
|
* **Override rules**: Adjust default request settings based on conditions such as user, tag, or other criteria.
|
||||||
|
* **TVDB metadata**: Option to use TheTVDB metadata for series (as in Sonarr) instead of TMDB.
|
||||||
|
* **DNS caching**: Reduces lookup times and external requests, especially useful when using systems like Pi-Hole/Adguard Home.
|
||||||
|
* **Helm chart included**: Enables easier installation and maintenance in Kubernetes environments.
|
||||||
|
* **ntfy.sh notifications**: Support for sending notifications via ntfy.sh.
|
||||||
|
* **Disable special seasons:** Adds a setting to prevent special seasons from being shown or requested.
|
||||||
|
* **New languages**: Turkish and Basque
|
||||||
|
|
||||||
|
## What's new since the previous Jellyseerr release
|
||||||
|
|
||||||
|
This release also brings several important improvements and long-requested features, including **TheTVDB metadata support**, **DNS caching**, and **dynamic webhook placeholders**, along with a few quality-of-life improvements for developers and users alike.
|
||||||
|
|
||||||
|
### PNPM v10 Upgrade
|
||||||
|
|
||||||
|
We're updating Seerr to **PNPM v10** to keep up-to-date development tools. If you are building Seerr from source or if you contribute to Seerr, you'll need to **update your local PNPM installation** before working on the project.
|
||||||
|
|
||||||
|
This doesn't concern you if you're using Docker.
|
||||||
|
|
||||||
|
To update, run the following command:
|
||||||
|
`pnpm self-update`
|
||||||
|
|
||||||
|
After updating, verify your version with:
|
||||||
|
`pnpm -v`
|
||||||
|
|
||||||
|
You should see version **10.x.x**.
|
||||||
|
|
||||||
|
### TVDB Metadata Provider (Experimental)
|
||||||
|
|
||||||
|
We're excited to introduce support for **TheTVDB** as a new metadata provider!
|
||||||
|
Previously, Seerr relied solely on **TMDB** for movie and TV show information, which sometimes led to discrepancies in season and episode numbering when working with **Sonarr**, since Sonarr uses **TheTVDB** as its metadata source.
|
||||||
|
|
||||||
|
With this new integration, Seerr can now use **the same data source as Sonarr** for series and anime, ensuring consistent and accurate season and episode information across both platforms.
|
||||||
|
|
||||||
|
You can try this new experimental feature in the new “Metadata Providers” tab of the settings page:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### DNS Caching (Experimental)
|
||||||
|
|
||||||
|
By default, Node.js doesn't cache any DNS requests. Our DNS cache manager addresses the problems caused by extremely high DNS query rates, particularly for large Jellyfin libraries as each HTTP request was also resulting in another DNS request. Therefore, by caching these DNS lookups, **Seerr will now reduce stress on DNS servers** and avoid rate-limiting or blocks encountered with services like **Pi-Hole**/**Adguard Home**.
|
||||||
|
|
||||||
|
We will post another blog post soon on all the issues we encountered with DNS caching in Node.js.
|
||||||
|
|
||||||
|
You can enable this by checking the “DNS Cache” setting in the network tabs of the Seerr settings:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### AniDB for Jellyfin Libraries
|
||||||
|
|
||||||
|
This new version also brings additional metadata to Jellyfin-managed collections. When there's no provider ID from TMDB or TVDB, Seerr will automatically **fall back on AniDB**, expanding coverage for lesser-known or region-specific anime.
|
||||||
|
|
||||||
|
### Dynamic Placeholders in Webhook URLs
|
||||||
|
|
||||||
|
Webhook notifications are now more powerful and adaptable with **dynamic placeholder support in webhook URLs**. This allows Seerr to automatically replace placeholders in the webhook URL with real values at runtime.
|
||||||
|
|
||||||
|
For example, you can include the requester's username directly in your webhook URL to better integrate with third-party services or user-specific endpoints.
|
||||||
|
|
||||||
|
This feature can be enabled from the **Notifications** settings page, where available placeholders are listed for reference. It's currently marked as **experimental**, and we welcome community feedback to help refine and expand support for additional placeholders in future releases.
|
||||||
|
|
||||||
|
### Optional Images in Notifications
|
||||||
|
|
||||||
|
Another small feature: **images in notifications are now optional** (but still enabled by default). Previous versions always included images in notifications, which could lead to broken links or failed requests if images were missing or unavailable.
|
||||||
|
|
||||||
|
### Security improvement
|
||||||
|
|
||||||
|
Some outdated dependencies have been updated (some work is still in progress). Helm charts and containers are now cryptographically signed and can be verified and enforced client-side. Containers now run as rootless. Workflows have been completely reworked to minimize third-party actions. Permissions have been strengthened, and actions are now pinned to specific hashes for better traceability. The release process has been updated to remove many outdated and plugin dependencies, replacing them with more standard industry solutions.
|
||||||
|
|
||||||
|
:::important
|
||||||
|
## Note for PostgreSQL users (optional)
|
||||||
|
|
||||||
|
If you're migrating Postgres from version 17 to 18 in Docker, note that the data mount point has changed. Instead of using `/var/lib/postgresql/data`, the correct mount path is now `/var/lib/postgresql`. This update of the mount point is required to ensure the container functions correctly after the upgrade.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Seerr is built and maintained by dedicated volunteer contributors, whose skills and commitment make it all possible. Many thanks to everyone who contributed to this version:
|
||||||
|
|
||||||
|
* [0xsysr3ll](https://github.com/0xSysR3ll)
|
||||||
|
* [ale183](https://github.com/ale183)
|
||||||
|
* [Brandon Cohen](https://github.com/OwsleyJr)
|
||||||
|
* [Disparate2761](https://github.com/Disparate2761)
|
||||||
|
* [fallenbagel](https://github.com/fallenbagel)
|
||||||
|
* [Gauthier](https://github.com/gauthier-th)
|
||||||
|
* [Gauvain](https://github.com/Gauvino)
|
||||||
|
* [Georgy](https://github.com/tarasverq)
|
||||||
|
* [Ishan Jain](https://github.com/ishanjain28)
|
||||||
|
* [James Kruger](https://github.com/theGunner295)
|
||||||
|
* [Joe Harrison](https://github.com/sudo-kraken)
|
||||||
|
* [J. Winters-Brown](https://github.com/ofgrenudo)
|
||||||
|
* [Ludovic Ortega](https://github.com/M0NsTeRRR)
|
||||||
|
* [RolliePollie18](https://github.com/RolliePollie18)
|
||||||
|
* [Ryan Cohen](https://github.com/sct)
|
||||||
|
* [salty](https://github.com/saltydk)
|
||||||
|
* [samohtxotom](https://github.com/samohtxotom)
|
||||||
|
* [Sergii Bogomolov](https://github.com/sbogomolov)
|
||||||
|
* [Someone](https://github.com/InterN0te)
|
||||||
|
* [TacoCake](https://github.com/TacoCake)
|
||||||
|
* [Terry Sposato](https://github.com/tsposato)
|
||||||
|
* [TheCatLady](https://github.com/TheCatLady)
|
||||||
|
* [Thibaut Noah](https://github.com/tirrorex)
|
||||||
|
* [THOMAS B](https://github.com/TOomaAh)
|
||||||
|
|
||||||
|
Keep an eye on our blog for in-depth looks at our work and upcoming releases!
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
fallenbagel:
|
fallenbagel:
|
||||||
name: Fallenbagel
|
name: Fallenbagel
|
||||||
page: true
|
page: true
|
||||||
title: Developer & Maintainer of Jellyseerr
|
title: Developer & Maintainer of Seerr
|
||||||
description: Core Maintainer & Developer of Jellyseerr | Full-Stack Software Engineer | MSc Software Engineering Candidate.
|
description: Core Maintainer & Developer of Seerr | Full-Stack Software Engineer | MSc Software Engineering Student.
|
||||||
url: https://github.com/fallenbagel
|
url: https://github.com/fallenbagel
|
||||||
image_url: https://github.com/fallenbagel.png
|
image_url: https://github.com/fallenbagel.png
|
||||||
email: hello@fallenbagel.com
|
email: hello@fallenbagel.com
|
||||||
@@ -12,10 +12,18 @@ fallenbagel:
|
|||||||
gauthier-th:
|
gauthier-th:
|
||||||
name: Gauthier
|
name: Gauthier
|
||||||
page: true
|
page: true
|
||||||
title: Co-Developer & Co-Maintainer of Jellyseerr
|
title: Developer & Maintainer of Seerr
|
||||||
description: Co-Maintainer & Developer of Jellyseerr | PhD Student in AI at ICB, Dijon
|
description: Core Maintainer & Developer of Seerr | PhD Student in AI at ICB, Dijon
|
||||||
url: https://gauthierth.fr
|
url: https://gauthierth.fr
|
||||||
image_url: https://github.com/gauthier-th.png
|
image_url: https://github.com/gauthier-th.png
|
||||||
email: mail@gauthierth.fr
|
email: mail@gauthierth.fr
|
||||||
socials:
|
socials:
|
||||||
github: gauthier-th
|
github: gauthier-th
|
||||||
|
|
||||||
|
seerr-team:
|
||||||
|
name: Seerr Team
|
||||||
|
title: The team behind Seerr, formerly known as the Jellyseerr and Overseerr teams.
|
||||||
|
url: https://seerr.dev
|
||||||
|
image_url: https://github.com/seerr-team.png
|
||||||
|
socials:
|
||||||
|
github: seerr-team
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ const config: Config = {
|
|||||||
navbar: {
|
navbar: {
|
||||||
logo: {
|
logo: {
|
||||||
alt: 'Seerr',
|
alt: 'Seerr',
|
||||||
src: 'img/logo.svg',
|
src: 'img/logo_full.svg',
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
@@ -72,6 +72,11 @@ const config: Config = {
|
|||||||
label: 'Blog',
|
label: 'Blog',
|
||||||
position: 'right',
|
position: 'right',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
href: 'https://discord.gg/seerr',
|
||||||
|
label: 'Discord',
|
||||||
|
position: 'right',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
href: 'https://github.com/seerr-team/seerr',
|
href: 'https://github.com/seerr-team/seerr',
|
||||||
label: 'GitHub',
|
label: 'GitHub',
|
||||||
|
|||||||
@@ -60,12 +60,12 @@
|
|||||||
|
|
||||||
.table-of-contents__link--active,
|
.table-of-contents__link--active,
|
||||||
a:not(
|
a:not(
|
||||||
.card,
|
.card,
|
||||||
.menu__link,
|
.menu__link,
|
||||||
.menu__link--sublist,
|
.menu__link--sublist,
|
||||||
.menu__link--sublist-item,
|
.menu__link--sublist-item,
|
||||||
.table-of-contents__link
|
.table-of-contents__link
|
||||||
) {
|
) {
|
||||||
/* color: #793ae8; */
|
/* color: #793ae8; */
|
||||||
color: #6366f1;
|
color: #6366f1;
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 25 KiB |
21
gen-docs/static/img/logo_full.svg
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<svg width="322" height="96" viewBox="0 0 322 96" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="52" cy="52" r="28" fill="#131928"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M48 96C74.5097 96 96 74.5097 96 48C96 21.4903 74.5097 0 48 0C21.4903 0 0 21.4903 0 48C0 74.5097 21.4903 96 48 96ZM80.0001 52C80.0001 67.464 67.4641 80 52.0001 80C36.5361 80 24.0001 67.464 24.0001 52C24.0001 49.1303 24.4318 46.3615 25.2338 43.7548C27.4288 48.6165 32.3194 52 38.0001 52C45.7321 52 52.0001 45.732 52.0001 38C52.0001 32.3192 48.6166 27.4287 43.755 25.2337C46.3616 24.4317 49.1304 24 52.0001 24C67.4641 24 80.0001 36.536 80.0001 52Z" fill="url(#paint0_linear_311_158)"/>
|
||||||
|
<path opacity="0.2" fill-rule="evenodd" clip-rule="evenodd" d="M80.0002 52C80.0002 67.464 67.4642 80 52.0002 80C36.864 80 24.5329 67.9897 24.017 52.9791C24.0057 53.318 24 53.6583 24 54C24 70.5685 37.4315 84 54 84C70.5685 84 84 70.5685 84 54C84 37.4315 70.5685 24 54 24C53.6597 24 53.3207 24.0057 52.9831 24.0169C67.9919 24.5347 80.0002 36.865 80.0002 52Z" fill="#131928"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M48 12C28.1177 12 12 28.1177 12 48C12 50.2091 10.2091 52 8 52C5.79086 52 4 50.2091 4 48C4 23.6995 23.6995 4 48 4C50.2091 4 52 5.79086 52 8C52 10.2091 50.2091 12 48 12Z" fill="url(#paint1_linear_311_158)"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M298.984 30.8668V70.2724H308.169V46.8278C308.169 42.3005 309.082 39.1207 310.909 37.2882C312.789 35.4558 315.528 34.5395 319.127 34.5395H321.463V25C318.402 25 315.743 25.6467 313.487 26.9402C311.285 28.1798 309.512 29.9315 308.169 32.1951V25.7276H307.886L298.984 30.8668Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M269.573 31.1166V70.2724H278.758V46.8278C278.758 42.3005 279.671 39.1207 281.498 37.2882C283.377 35.4558 286.117 34.5395 289.716 34.5395H292.052V25C288.99 25 286.332 25.6467 284.076 26.9402C281.874 28.1798 280.101 29.9315 278.758 32.1951V25.8137L269.573 31.1166Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M260.689 43.8748C260.922 45.5294 261.026 47.0387 261 48.4029L232.595 52.395L233.533 44.7524L250.79 42.3272C250.264 38.9722 248.689 36.4452 246.063 34.746C243.438 33.0468 240.396 32.4402 236.939 32.9261C233.801 33.3671 231.257 34.7587 229.308 37.1008C227.756 38.9167 226.837 41.1061 226.55 43.6692C226.192 46.3457 226.195 50.8608 227.977 55.1055C228.886 57.629 230.398 59.6138 232.513 61.0602C235.153 62.8661 238.176 63.5299 241.58 63.0514C246.473 62.3637 249.642 59.823 251.085 55.4294L260.899 54.0501C260.139 58.2932 258.188 61.9691 255.045 65.0776C251.948 68.1254 247.819 70.0118 242.66 70.7369C238.458 71.3274 234.55 70.9242 230.936 69.5272C227.369 68.0693 224.387 65.767 221.992 62.6204C219.643 59.4129 218.15 55.5408 217.512 51.0043C216.875 46.4677 217.22 42.3645 218.549 38.6946C219.923 34.9638 222.127 31.9327 225.163 29.6012C228.251 27.2623 231.949 25.7901 236.258 25.1846C240.407 24.6015 244.231 24.9892 247.731 26.3479C251.23 27.7065 254.117 29.9132 256.39 32.9681C258.656 35.9696 260.089 39.6051 260.689 43.8748Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M209.921 43.8748C210.154 45.5293 210.258 47.0387 210.232 48.4029L181.827 52.395L182.765 44.7524L200.022 42.3272C199.496 38.9722 197.921 36.4452 195.295 34.746C192.67 33.0468 189.628 32.4402 186.171 32.9261C183.033 33.3671 180.489 34.7587 178.54 37.1008C176.988 38.9166 176.069 41.1059 175.782 43.6688C175.424 46.3453 175.427 50.8605 177.209 55.1055C178.118 57.629 179.63 59.6138 181.745 61.0602C184.385 62.8661 187.407 63.5299 190.812 63.0514C195.705 62.3637 198.874 59.823 200.317 55.4294L210.131 54.0501C209.371 58.2932 207.42 61.9691 204.277 65.0776C201.18 68.1254 197.051 70.0118 191.892 70.7369C187.69 71.3274 183.782 70.9242 180.168 69.5272C176.601 68.0693 173.619 65.767 171.224 62.6204C168.875 59.4129 167.382 55.5408 166.744 51.0043C166.107 46.4677 166.452 42.3645 167.78 38.6946C169.155 34.9638 171.359 31.9327 174.395 29.6012C177.483 27.2623 181.181 25.7901 185.49 25.1846C189.639 24.6015 193.463 24.9892 196.962 26.3479C200.462 27.7065 203.349 29.9132 205.622 32.9681C207.888 35.9696 209.321 39.6051 209.921 43.8748Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M143.297 71C139.806 71 136.664 70.3802 133.87 69.1406C131.131 67.8471 128.956 66.1224 127.344 63.9666C126.751 63.153 126.26 62.3066 125.87 61.4272L134.397 57.451C134.721 58.9735 135.566 60.2831 136.932 61.3796C138.597 62.6192 140.665 63.239 143.136 63.239C145.714 63.239 147.702 62.754 149.098 61.7838C150.548 60.7598 151.273 59.4663 151.273 57.9033C151.273 56.2326 150.468 54.993 148.856 54.1845C147.299 53.3761 144.801 52.4868 141.363 51.5167C138.033 50.6005 135.321 49.7112 133.226 48.8489C131.131 47.9865 129.305 46.6661 127.747 44.8875C126.243 43.109 125.491 40.7645 125.491 37.8541C125.491 35.4827 126.189 33.3269 127.586 31.3866C128.983 29.3925 130.97 27.8295 133.548 26.6977C136.18 25.5659 139.188 25 142.572 25C147.621 25 151.676 26.2935 154.738 28.8805C156.667 30.4488 158.04 32.3787 158.857 34.6701L150.459 38.5862C150.177 36.9271 149.402 35.5782 148.131 34.5395C146.681 33.3538 144.72 32.761 142.25 32.761C139.833 32.761 137.979 33.2191 136.69 34.1353C135.401 35.0516 134.757 36.2642 134.757 37.7733C134.757 38.959 135.186 39.9561 136.046 40.7645C136.905 41.5729 137.953 42.2197 139.188 42.7047C140.423 43.1359 142.25 43.7018 144.667 44.4025C147.89 45.2648 150.521 46.1541 152.563 47.0703C154.657 47.9326 156.457 49.2261 157.961 50.9508C159.465 52.6755 160.244 54.966 160.297 57.8225C160.297 60.3556 159.599 62.6192 158.202 64.6134C156.806 66.6075 154.818 68.1705 152.24 69.3023C149.716 70.4341 146.735 71 143.297 71Z" fill="white"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_311_158" x1="48" y1="-2.07126e-06" x2="117.5" y2="69.5" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#C395FC"/>
|
||||||
|
<stop offset="1" stop-color="#4F65F5"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_311_158" x1="28" y1="8" x2="28" y2="48" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white" stop-opacity="0.4"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.0 KiB |
1
gen-docs/static/img/os_icon.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" fill="none" viewBox="0 0 96 96"><path fill="url(#paint0_linear)" fill-rule="evenodd" d="M48 96C74.5097 96 96 74.5097 96 48C96 21.4903 74.5097 0 48 0C21.4903 0 0 21.4903 0 48C0 74.5097 21.4903 96 48 96ZM80.0001 52C80.0001 67.464 67.4641 80 52.0001 80C36.5361 80 24.0001 67.464 24.0001 52C24.0001 49.1303 24.4318 46.3615 25.2338 43.7548C27.4288 48.6165 32.3194 52 38.0001 52C45.7321 52 52.0001 45.732 52.0001 38C52.0001 32.3192 48.6166 27.4287 43.755 25.2337C46.3616 24.4317 49.1304 24 52.0001 24C67.4641 24 80.0001 36.536 80.0001 52Z" clip-rule="evenodd"/><path fill="#131928" fill-rule="evenodd" d="M80.0002 52C80.0002 67.464 67.4642 80 52.0002 80C36.864 80 24.5329 67.9897 24.017 52.9791C24.0057 53.318 24 53.6583 24 54C24 70.5685 37.4315 84 54 84C70.5685 84 84 70.5685 84 54C84 37.4315 70.5685 24 54 24C53.6597 24 53.3207 24.0057 52.9831 24.0169C67.9919 24.5347 80.0002 36.865 80.0002 52Z" clip-rule="evenodd" opacity=".2"/><path fill="url(#paint1_linear)" fill-rule="evenodd" d="M48 12C28.1177 12 12 28.1177 12 48C12 50.2091 10.2091 52 8 52C5.79086 52 4 50.2091 4 48C4 23.6995 23.6995 4 48 4C50.2091 4 52 5.79086 52 8C52 10.2091 50.2091 12 48 12Z" clip-rule="evenodd"/><defs><linearGradient id="paint0_linear" x1="48" x2="117.5" y1="0" y2="69.5" gradientUnits="userSpaceOnUse"><stop stop-color="#C395FC"/><stop offset="1" stop-color="#4F65F5"/></linearGradient><linearGradient id="paint1_linear" x1="28" x2="28" y1="8" y2="48" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" stop-opacity=".4"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -1,21 +0,0 @@
|
|||||||
/* eslint-disable */
|
|
||||||
const tailwind = require('prettier-plugin-tailwindcss');
|
|
||||||
const organizeImports = require('prettier-plugin-organize-imports');
|
|
||||||
|
|
||||||
const combinedFormatter = {
|
|
||||||
...tailwind,
|
|
||||||
parsers: {
|
|
||||||
...tailwind.parsers,
|
|
||||||
...Object.keys(organizeImports.parsers).reduce((acc, key) => {
|
|
||||||
acc[key] = {
|
|
||||||
...tailwind.parsers[key],
|
|
||||||
preprocess(code, options) {
|
|
||||||
return organizeImports.parsers[key].preprocess(code, options);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
return acc;
|
|
||||||
}, {}),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = combinedFormatter;
|
|
||||||
@@ -24,6 +24,6 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
experimental: {
|
experimental: {
|
||||||
scrollRestoration: true,
|
scrollRestoration: true,
|
||||||
largePageDataBytes: 256000,
|
largePageDataBytes: 512 * 1000,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
80
package.json
@@ -5,7 +5,6 @@
|
|||||||
"packageManager": "pnpm@10.24.0",
|
"packageManager": "pnpm@10.24.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "npx only-allow pnpm",
|
"preinstall": "npx only-allow pnpm",
|
||||||
"postinstall": "node postinstall-win.js",
|
|
||||||
"dev": "nodemon -e ts --watch server --watch seerr-api.yml -e .json,.ts,.yml -x ts-node -r tsconfig-paths/register --files --project server/tsconfig.json server/index.ts",
|
"dev": "nodemon -e ts --watch server --watch seerr-api.yml -e .json,.ts,.yml -x ts-node -r tsconfig-paths/register --files --project server/tsconfig.json server/index.ts",
|
||||||
"build:server": "tsc --project server/tsconfig.json && copyfiles -u 2 server/templates/**/*.{html,pug} dist/templates && tsc-alias -p server/tsconfig.json",
|
"build:server": "tsc --project server/tsconfig.json && copyfiles -u 2 server/templates/**/*.{html,pug} dist/templates && tsc-alias -p server/tsconfig.json",
|
||||||
"build:next": "next build",
|
"build:next": "next build",
|
||||||
@@ -17,7 +16,7 @@
|
|||||||
"migration:generate": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:generate -d server/datasource.ts",
|
"migration:generate": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:generate -d server/datasource.ts",
|
||||||
"migration:create": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:create -d server/datasource.ts",
|
"migration:create": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:create -d server/datasource.ts",
|
||||||
"migration:run": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:run -d server/datasource.ts",
|
"migration:run": "ts-node -r tsconfig-paths/register --project server/tsconfig.json ./node_modules/typeorm/cli.js migration:run -d server/datasource.ts",
|
||||||
"format": "prettier --loglevel warn --write --cache .",
|
"format": "prettier --log-level warn --write --cache .",
|
||||||
"format:check": "prettier --check --cache .",
|
"format:check": "prettier --check --cache .",
|
||||||
"typecheck": "pnpm typecheck:server && pnpm typecheck:client",
|
"typecheck": "pnpm typecheck:server && pnpm typecheck:client",
|
||||||
"typecheck:server": "tsc --project server/tsconfig.json --noEmit",
|
"typecheck:server": "tsc --project server/tsconfig.json --noEmit",
|
||||||
@@ -38,18 +37,18 @@
|
|||||||
"@formatjs/intl-locale": "3.1.1",
|
"@formatjs/intl-locale": "3.1.1",
|
||||||
"@formatjs/intl-pluralrules": "5.4.6",
|
"@formatjs/intl-pluralrules": "5.4.6",
|
||||||
"@formatjs/intl-utils": "3.8.4",
|
"@formatjs/intl-utils": "3.8.4",
|
||||||
"@formatjs/swc-plugin-experimental": "^0.4.0",
|
|
||||||
"@headlessui/react": "1.7.12",
|
"@headlessui/react": "1.7.12",
|
||||||
"@heroicons/react": "2.2.0",
|
"@heroicons/react": "2.2.0",
|
||||||
|
"@seerr-team/react-tailwindcss-datepicker": "^1.3.4",
|
||||||
"@supercharge/request-ip": "1.2.0",
|
"@supercharge/request-ip": "1.2.0",
|
||||||
"@svgr/webpack": "6.5.1",
|
"@svgr/webpack": "6.5.1",
|
||||||
"@tanem/react-nprogress": "5.0.56",
|
"@tanem/react-nprogress": "5.0.56",
|
||||||
"@types/ua-parser-js": "^0.7.36",
|
"@types/ua-parser-js": "^0.7.36",
|
||||||
"@types/wink-jaro-distance": "^2.0.2",
|
"@types/wink-jaro-distance": "^2.0.2",
|
||||||
"ace-builds": "1.43.4",
|
"ace-builds": "1.43.4",
|
||||||
"axios": "1.13.2",
|
"axios": "1.13.3",
|
||||||
"axios-rate-limit": "1.4.0",
|
"axios-rate-limit": "1.4.0",
|
||||||
"bcrypt": "5.1.0",
|
"bcrypt": "6.0.0",
|
||||||
"bowser": "2.13.1",
|
"bowser": "2.13.1",
|
||||||
"connect-typeorm": "1.1.4",
|
"connect-typeorm": "1.1.4",
|
||||||
"cookie-parser": "1.4.7",
|
"cookie-parser": "1.4.7",
|
||||||
@@ -57,7 +56,6 @@
|
|||||||
"country-flag-icons": "1.6.4",
|
"country-flag-icons": "1.6.4",
|
||||||
"cronstrue": "2.23.0",
|
"cronstrue": "2.23.0",
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"dayjs": "1.11.19",
|
|
||||||
"dns-caching": "^0.2.7",
|
"dns-caching": "^0.2.7",
|
||||||
"email-templates": "12.0.3",
|
"email-templates": "12.0.3",
|
||||||
"express": "4.21.2",
|
"express": "4.21.2",
|
||||||
@@ -68,16 +66,15 @@
|
|||||||
"gravatar-url": "3.1.0",
|
"gravatar-url": "3.1.0",
|
||||||
"http-proxy-agent": "^7.0.2",
|
"http-proxy-agent": "^7.0.2",
|
||||||
"https-proxy-agent": "^7.0.6",
|
"https-proxy-agent": "^7.0.6",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.23",
|
||||||
"mime": "3",
|
"mime": "3",
|
||||||
"next": "^14.2.25",
|
"next": "^14.2.35",
|
||||||
"node-cache": "5.1.2",
|
"node-cache": "5.1.2",
|
||||||
"node-gyp": "9.3.1",
|
"node-gyp": "9.3.1",
|
||||||
"node-schedule": "2.1.1",
|
"node-schedule": "2.1.1",
|
||||||
"nodemailer": "6.10.0",
|
"nodemailer": "7.0.12",
|
||||||
"openpgp": "5.11.2",
|
"openpgp": "6.3.0",
|
||||||
"pg": "8.16.3",
|
"pg": "8.17.2",
|
||||||
"plex-api": "5.3.2",
|
|
||||||
"pug": "3.0.3",
|
"pug": "3.0.3",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-ace": "10.1.0",
|
"react-ace": "10.1.0",
|
||||||
@@ -90,7 +87,6 @@
|
|||||||
"react-popper-tooltip": "4.4.2",
|
"react-popper-tooltip": "4.4.2",
|
||||||
"react-select": "5.10.2",
|
"react-select": "5.10.2",
|
||||||
"react-spring": "9.7.1",
|
"react-spring": "9.7.1",
|
||||||
"react-tailwindcss-datepicker-sct": "1.3.4",
|
|
||||||
"react-toast-notifications": "2.5.1",
|
"react-toast-notifications": "2.5.1",
|
||||||
"react-transition-group": "^4.4.5",
|
"react-transition-group": "^4.4.5",
|
||||||
"react-truncate-markup": "5.1.2",
|
"react-truncate-markup": "5.1.2",
|
||||||
@@ -101,28 +97,28 @@
|
|||||||
"sharp": "^0.33.4",
|
"sharp": "^0.33.4",
|
||||||
"sqlite3": "5.1.7",
|
"sqlite3": "5.1.7",
|
||||||
"swagger-ui-express": "4.6.2",
|
"swagger-ui-express": "4.6.2",
|
||||||
"swr": "2.3.7",
|
"swr": "2.3.8",
|
||||||
"tailwind-merge": "^2.6.0",
|
"tailwind-merge": "^2.6.0",
|
||||||
"typeorm": "0.3.12",
|
"typeorm": "0.3.28",
|
||||||
"ua-parser-js": "^1.0.35",
|
"ua-parser-js": "^1.0.35",
|
||||||
"undici": "^7.16.0",
|
"undici": "^7.18.2",
|
||||||
"validator": "^13.15.23",
|
"validator": "^13.15.23",
|
||||||
"web-push": "3.6.7",
|
"web-push": "3.6.7",
|
||||||
"wink-jaro-distance": "^2.0.0",
|
"wink-jaro-distance": "^2.0.0",
|
||||||
"winston": "3.18.3",
|
"winston": "3.19.0",
|
||||||
"winston-daily-rotate-file": "4.7.1",
|
"winston-daily-rotate-file": "4.7.1",
|
||||||
"xml2js": "0.4.23",
|
"xml2js": "0.5.0",
|
||||||
"yamljs": "0.3.0",
|
"yamljs": "0.3.0",
|
||||||
"yup": "0.32.11",
|
"yup": "0.32.11",
|
||||||
"zod": "3.24.2"
|
"zod": "4.3.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "17.4.4",
|
"@commitlint/cli": "17.4.4",
|
||||||
"@commitlint/config-conventional": "17.4.4",
|
"@commitlint/config-conventional": "17.4.4",
|
||||||
"@tailwindcss/aspect-ratio": "0.4.2",
|
"@tailwindcss/aspect-ratio": "^0.4.2",
|
||||||
"@tailwindcss/forms": "0.5.10",
|
"@tailwindcss/forms": "^0.5.10",
|
||||||
"@tailwindcss/typography": "0.5.16",
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
"@types/bcrypt": "5.0.0",
|
"@types/bcrypt": "6.0.0",
|
||||||
"@types/cookie-parser": "1.4.10",
|
"@types/cookie-parser": "1.4.10",
|
||||||
"@types/country-flag-icons": "1.2.2",
|
"@types/country-flag-icons": "1.2.2",
|
||||||
"@types/csurf": "1.11.5",
|
"@types/csurf": "1.11.5",
|
||||||
@@ -133,7 +129,7 @@
|
|||||||
"@types/mime": "3",
|
"@types/mime": "3",
|
||||||
"@types/node": "22.10.5",
|
"@types/node": "22.10.5",
|
||||||
"@types/node-schedule": "2.1.8",
|
"@types/node-schedule": "2.1.8",
|
||||||
"@types/nodemailer": "6.4.7",
|
"@types/nodemailer": "7",
|
||||||
"@types/react": "^18.3.3",
|
"@types/react": "^18.3.3",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@types/react-transition-group": "4.4.12",
|
"@types/react-transition-group": "4.4.12",
|
||||||
@@ -142,20 +138,20 @@
|
|||||||
"@types/swagger-ui-express": "4.1.8",
|
"@types/swagger-ui-express": "4.1.8",
|
||||||
"@types/validator": "^13.15.10",
|
"@types/validator": "^13.15.10",
|
||||||
"@types/web-push": "3.6.4",
|
"@types/web-push": "3.6.4",
|
||||||
"@types/xml2js": "0.4.11",
|
"@types/xml2js": "0.4.14",
|
||||||
"@types/yamljs": "0.2.31",
|
"@types/yamljs": "0.2.31",
|
||||||
"@types/yup": "0.29.14",
|
"@types/yup": "0.29.14",
|
||||||
"@typescript-eslint/eslint-plugin": "5.54.0",
|
"@typescript-eslint/eslint-plugin": "7.18.0",
|
||||||
"@typescript-eslint/parser": "5.54.0",
|
"@typescript-eslint/parser": "7.18.0",
|
||||||
"autoprefixer": "10.4.22",
|
"autoprefixer": "^10.4.23",
|
||||||
"baseline-browser-mapping": "^2.8.32",
|
"baseline-browser-mapping": "^2.8.32",
|
||||||
"commitizen": "4.3.1",
|
"commitizen": "4.3.1",
|
||||||
"copyfiles": "2.4.1",
|
"copyfiles": "2.4.1",
|
||||||
"cy-mobile-commands": "0.3.0",
|
"cy-mobile-commands": "0.3.0",
|
||||||
"cypress": "14.1.0",
|
"cypress": "14.5.4",
|
||||||
"cz-conventional-changelog": "3.3.0",
|
"cz-conventional-changelog": "3.3.0",
|
||||||
"eslint": "8.35.0",
|
"eslint": "8.57.1",
|
||||||
"eslint-config-next": "^14.2.4",
|
"eslint-config-next": "^14.2.35",
|
||||||
"eslint-config-prettier": "8.6.0",
|
"eslint-config-prettier": "8.6.0",
|
||||||
"eslint-plugin-formatjs": "4.9.0",
|
"eslint-plugin-formatjs": "4.9.0",
|
||||||
"eslint-plugin-jsx-a11y": "6.10.2",
|
"eslint-plugin-jsx-a11y": "6.10.2",
|
||||||
@@ -166,24 +162,20 @@
|
|||||||
"husky": "8.0.3",
|
"husky": "8.0.3",
|
||||||
"lint-staged": "13.1.2",
|
"lint-staged": "13.1.2",
|
||||||
"nodemon": "3.1.11",
|
"nodemon": "3.1.11",
|
||||||
"postcss": "8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"prettier": "2.8.4",
|
"prettier": "3.8.1",
|
||||||
"prettier-plugin-organize-imports": "3.2.2",
|
"prettier-plugin-organize-imports": "4.3.0",
|
||||||
"prettier-plugin-tailwindcss": "0.2.3",
|
"prettier-plugin-tailwindcss": "0.6.14",
|
||||||
"tailwindcss": "3.2.7",
|
"tailwindcss": "3.4.19",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
"tsc-alias": "1.8.16",
|
"tsc-alias": "1.8.16",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typescript": "4.9.5"
|
"typescript": "5.4.5"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^22.0.0",
|
"node": "^22.0.0",
|
||||||
"pnpm": "^10.0.0"
|
"pnpm": "^10.0.0"
|
||||||
},
|
},
|
||||||
"overrides": {
|
|
||||||
"sqlite3/node-gyp": "8.4.1",
|
|
||||||
"@types/express-session": "1.18.2"
|
|
||||||
},
|
|
||||||
"config": {
|
"config": {
|
||||||
"commitizen": {
|
"commitizen": {
|
||||||
"path": "./node_modules/cz-conventional-changelog"
|
"path": "./node_modules/cz-conventional-changelog"
|
||||||
@@ -210,6 +202,10 @@
|
|||||||
"cypress",
|
"cypress",
|
||||||
"sharp",
|
"sharp",
|
||||||
"sqlite3"
|
"sqlite3"
|
||||||
]
|
],
|
||||||
|
"overrides": {
|
||||||
|
"sqlite3>node-gyp": "8.4.1",
|
||||||
|
"@types/express-session": "1.18.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6209
pnpm-lock.yaml
generated
@@ -1,13 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const { execSync } = require('child_process');
|
|
||||||
|
|
||||||
if (process.platform === 'win32') {
|
|
||||||
const typeormPath = path.resolve('node_modules/typeorm');
|
|
||||||
|
|
||||||
if (fs.existsSync(typeormPath)) {
|
|
||||||
process.stdout.write('> Installing typeorm@0.3.11 for Windows\n');
|
|
||||||
execSync('pnpm add typeorm@0.3.11', { stdio: 'inherit' });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 7.0 KiB |