diff --git a/.github/workflows/build-artifacts.yml b/.github/workflows/build-artifacts.yml
index 4b0a518b..64b7bb09 100644
--- a/.github/workflows/build-artifacts.yml
+++ b/.github/workflows/build-artifacts.yml
@@ -104,6 +104,14 @@ jobs:
go build -tags wails,production -trimpath -buildvcs=false -ldflags="${{ matrix.target.desktop_ldflags }} $version_ldflag" -o "bin/oneagent-desktop${{ matrix.target.suffix }}" ./cmd/oneagent-desktop
go build -trimpath -buildvcs=false -ldflags="-w -s $version_ldflag" -o "bin/oneagent${{ matrix.target.suffix }}" ./cmd/oneagent
+ - name: Verify production Go dependency inventory
+ shell: bash
+ run: |
+ python3 scripts/generate_third_party_licenses.py \
+ --verify-platform "${{ matrix.target.platform }}-${{ matrix.arch }}" \
+ --verify-go-binary "bin/oneagent-desktop${{ matrix.target.suffix }}" \
+ --verify-go-binary "bin/oneagent${{ matrix.target.suffix }}"
+
- name: Package macOS app
if: matrix.target.platform == 'macos'
shell: bash
@@ -118,6 +126,35 @@ jobs:
codesign --force --deep --sign - "bin/OneAgent.app"
rm "bin/oneagent-desktop"
+ - name: Add license material to artifact
+ shell: bash
+ run: |
+ cp LICENSE NOTICE third_party/THIRD_PARTY_NOTICES.md bin/
+ cp -R third_party/licenses bin/licenses
+ if [[ "${{ matrix.target.platform }}" == "macos" ]]; then
+ compliance="bin/OneAgent.app/Contents/Resources/compliance"
+ mkdir -p "$compliance"
+ cp LICENSE NOTICE third_party/THIRD_PARTY_NOTICES.md "$compliance/"
+ cp -R third_party/licenses "$compliance/licenses"
+ fi
+
+ - name: Verify artifact license material
+ shell: bash
+ run: |
+ test -f bin/LICENSE
+ test -f bin/NOTICE
+ test -f bin/THIRD_PARTY_NOTICES.md
+ test -f bin/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE
+ test -f bin/licenses/npm/react-router@7.18.1/LICENSE.md
+ test -f bin/licenses/npm/scheduler@0.27.0/LICENSE
+ test -f bin/licenses/npm/cookie@1.0.1/LICENSE
+ test -f bin/licenses/npm/set-cookie-parser@2.6.0/LICENSE
+ if [[ "${{ matrix.target.platform }}" == "macos" ]]; then
+ test -f bin/OneAgent.app/Contents/Resources/compliance/LICENSE
+ test -f bin/OneAgent.app/Contents/Resources/compliance/NOTICE
+ test -f bin/OneAgent.app/Contents/Resources/compliance/THIRD_PARTY_NOTICES.md
+ fi
+
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 11d9ca9d..0b44483f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -31,9 +31,41 @@ jobs:
# thing a plain run will not exercise.
- run: go test -race ./...
+ # The Linux CI runner does not provide Wails' GTK/WebKitGTK native
+ # libraries. The default package graph still checks the portable Go code;
+ # target-specific release builds run in build-artifacts.yml.
- uses: dominikh/staticcheck-action@v1.4.1
+
+ compliance:
+ name: Release compliance
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+
+ - uses: actions/setup-go@v7
with:
- build-tags: wails,production
+ go-version-file: go.mod
+ cache-dependency-path: go.sum
+
+ - uses: pnpm/action-setup@v6
+ with:
+ version: 11.17.0
+
+ - uses: actions/setup-node@v7
+ with:
+ node-version: 26
+ cache: pnpm
+ cache-dependency-path: frontend/pnpm-lock.yaml
+
+ - name: Install frontend dependencies
+ working-directory: frontend
+ run: pnpm install --frozen-lockfile
+
+ - name: Test license generator
+ run: python3 -m unittest scripts/test_generate_third_party_licenses.py
+
+ - name: Verify third-party license bundle
+ run: python3 scripts/generate_third_party_licenses.py --check
docs:
name: Docs
diff --git a/NOTICE b/NOTICE
index c59c6ac9..d2c78f40 100644
--- a/NOTICE
+++ b/NOTICE
@@ -9,25 +9,14 @@ Licensed under the Apache License, Version 2.0. See LICENSE for the full text.
Third-party software redistributed in OneAgent binaries
================================================================================
-The following components are compiled into, or bundled with, the OneAgent
-desktop application and CLI. Their license texts are reproduced in the
-directories named below, inside each dependency's own distribution.
-
-Go modules (linked into the binary)
-
- github.com/wailsapp/wails/v3 v3.0.0-beta.3 MIT
- github.com/pelletier/go-toml/v2 v2.4.3 MIT
- github.com/adrg/xdg v0.5.3 MIT
- github.com/mattn/go-isatty v0.0.24 MIT
- golang.org/x/sys v0.47.0 BSD-3-Clause
-
-JavaScript packages (bundled into the embedded frontend)
-
- react 19.2.8 MIT
- react-dom 19.2.8 MIT
- react-router-dom 7.18.1 MIT
- lucide-react 1.25.0 ISC
- @wailsio/runtime 3.0.0-alpha2.117 MIT
+The target-specific dependency inventory is generated from the production Go
+build graph and the frozen frontend production dependency graph. The complete
+inventory is distributed as THIRD_PARTY_NOTICES.md, with the corresponding
+license and notice texts under licenses/ in every binary artifact.
+
+The tracked source of that generated material is third_party/. Run
+`scripts/generate_third_party_licenses.py --check` to verify that it still
+matches go.mod, go.sum, frontend/package.json and frontend/pnpm-lock.yaml.
================================================================================
Third-party software downloaded at runtime, not redistributed
diff --git a/docs/distribution-compliance-policy.md b/docs/distribution-compliance-policy.md
index 0d19fa89..99312617 100644
--- a/docs/distribution-compliance-policy.md
+++ b/docs/distribution-compliance-policy.md
@@ -42,12 +42,12 @@ Every public release contains at least:
- The OneAgent binary archive.
- The SHA-256 matching that archive.
- The version, the build time, the target environments, and the release status.
-- The third-party licence inventory. This is currently carried by [NOTICE](../NOTICE) at
- the repository root; it also separates the components redistributed inside the package
- from the components downloaded at run time and no longer redistributed (Node.js, uv,
- Agent packages). `cmd/oneagent-release`, which generated this inventory, was removed
- in `23805b0`, so `NOTICE` is now a hand-maintained source of truth and must be updated
- whenever a bundled dependency or an in-app third-party marking is added.
+- The third-party licence inventory and full licence texts. The generated source is
+ [third_party/THIRD_PARTY_NOTICES.md](../third_party/THIRD_PARTY_NOTICES.md), with
+ dependency texts under `third_party/licenses/`; every binary artifact carries the same
+ files at its root. `scripts/generate_third_party_licenses.py --check` derives the
+ inventory from the production Go targets and frozen frontend dependency graph, and CI
+ blocks a stale or incomplete bundle.
- The Agent version pinning manifest and the official sources.
- Release notes, known issues, and a withdrawal contact.
diff --git a/scripts/generate_third_party_licenses.py b/scripts/generate_third_party_licenses.py
new file mode 100755
index 00000000..d5826ef1
--- /dev/null
+++ b/scripts/generate_third_party_licenses.py
@@ -0,0 +1,343 @@
+#!/usr/bin/env python3
+"""Generate and verify the license material shipped in OneAgent artifacts.
+
+The inventory is derived from the same production build tags and frozen pnpm
+installation used by release builds. Generated output is tracked so a release
+does not depend on registry or module-cache availability after compilation.
+"""
+
+from __future__ import annotations
+
+import argparse
+import dataclasses
+import difflib
+import json
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+from collections.abc import Iterable, Iterator, Sequence
+from pathlib import Path
+from typing import Any
+
+ROOT = Path(__file__).resolve().parent.parent
+DEFAULT_OUTPUT = ROOT / "third_party"
+FRONTEND = ROOT / "frontend"
+TARGETS = (
+ ("macos-x64", "darwin", "amd64", "1"),
+ ("macos-arm64", "darwin", "arm64", "1"),
+ ("windows-x64", "windows", "amd64", "0"),
+ ("windows-arm64", "windows", "arm64", "0"),
+)
+GO_LICENSES = {
+ "github.com/adrg/xdg": "MIT",
+ "github.com/go-ole/go-ole": "MIT",
+ "github.com/pelletier/go-toml/v2": "MIT",
+ "github.com/wailsapp/wails/v3": "MIT",
+ "golang.org/x/sys": "BSD-3-Clause",
+}
+LICENSE_PREFIXES = ("license", "licence", "copying", "notice", "copyright")
+
+
+@dataclasses.dataclass(frozen=True, order=True)
+class Dependency:
+ ecosystem: str
+ name: str
+ version: str
+ license: str
+ platforms: tuple[str, ...]
+ license_files: tuple[str, ...]
+
+ def as_json(self) -> dict[str, Any]:
+ return dataclasses.asdict(self)
+
+
+def parse_json_stream(text: str) -> Iterator[dict[str, Any]]:
+ """Parse the concatenated JSON objects emitted by `go list -json`."""
+ decoder = json.JSONDecoder()
+ index = 0
+ while index < len(text):
+ while index < len(text) and text[index].isspace():
+ index += 1
+ if index >= len(text):
+ return
+ value, index = decoder.raw_decode(text, index)
+ if not isinstance(value, dict):
+ raise ValueError("expected a JSON object in go list output")
+ yield value
+
+
+def run(argv: Sequence[str], *, cwd: Path = ROOT, env: dict[str, str] | None = None) -> str:
+ result = subprocess.run(
+ argv,
+ cwd=cwd,
+ env=env,
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ return result.stdout
+
+
+def safe_component(value: str) -> str:
+ return re.sub(r"[^A-Za-z0-9._+-]+", "_", value).strip("_")
+
+
+def find_license_files(directory: Path) -> list[Path]:
+ files = [
+ path
+ for path in directory.iterdir()
+ if path.is_file() and path.name.casefold().startswith(LICENSE_PREFIXES)
+ ]
+ return sorted(files, key=lambda path: path.name.casefold())
+
+
+def copy_license_files(
+ source_directory: Path,
+ destination_directory: Path,
+ relative_root: Path,
+) -> tuple[str, ...]:
+ sources = find_license_files(source_directory)
+ if not sources:
+ raise RuntimeError(f"no license or notice file found in {source_directory}")
+ destination_directory.mkdir(parents=True, exist_ok=True)
+ copied: list[str] = []
+ for source in sources:
+ destination = destination_directory / source.name
+ text = source.read_text(encoding="utf-8")
+ normalized = "\n".join(line.rstrip() for line in text.splitlines()).rstrip() + "\n"
+ destination.write_text(normalized, encoding="utf-8")
+ copied.append(destination.relative_to(relative_root).as_posix())
+ return tuple(copied)
+
+
+def collect_go_module_platforms() -> dict[tuple[str, str], set[str]]:
+ modules: dict[tuple[str, str], set[str]] = {}
+ for platform, goos, goarch, cgo in TARGETS:
+ env = os.environ.copy()
+ env.update({"GOOS": goos, "GOARCH": goarch, "CGO_ENABLED": cgo})
+ output = run(
+ [
+ "go",
+ "list",
+ "-tags",
+ "wails,production",
+ "-deps",
+ "-json",
+ "./cmd/oneagent-desktop",
+ "./cmd/oneagent",
+ ],
+ env=env,
+ )
+ for package in parse_json_stream(output):
+ module = package.get("Module")
+ if not isinstance(module, dict) or module.get("Main"):
+ continue
+ path = str(module.get("Path", "")).strip()
+ version = str(module.get("Version", "")).strip()
+ if path and version:
+ modules.setdefault((path, version), set()).add(platform)
+ return modules
+
+
+def module_directory(path: str, version: str) -> Path:
+ output = run(["go", "mod", "download", "-json", f"{path}@{version}"])
+ metadata = json.loads(output)
+ directory = metadata.get("Dir")
+ if not directory:
+ raise RuntimeError(f"go mod download did not return a directory for {path}@{version}")
+ return Path(directory)
+
+
+def collect_go_dependencies(output: Path) -> list[Dependency]:
+ dependencies: list[Dependency] = []
+ for (name, version), platforms in sorted(collect_go_module_platforms().items()):
+ license_name = GO_LICENSES.get(name)
+ if license_name is None:
+ raise RuntimeError(
+ f"Go module {name}@{version} has no reviewed license classification; "
+ "add it to GO_LICENSES after review"
+ )
+ destination = output / "licenses" / "go" / f"{safe_component(name)}@{safe_component(version)}"
+ copied = copy_license_files(module_directory(name, version), destination, output)
+ dependencies.append(
+ Dependency(
+ ecosystem="go",
+ name=name,
+ version=version,
+ license=license_name,
+ platforms=tuple(sorted(platforms)),
+ license_files=copied,
+ )
+ )
+ return dependencies
+
+
+def pnpm_license_inventory() -> dict[str, list[dict[str, Any]]]:
+ return json.loads(run(["pnpm", "licenses", "list", "--prod", "--json"], cwd=FRONTEND))
+
+
+def npm_license_source(name: str, package_path: Path) -> Path:
+ if find_license_files(package_path):
+ return package_path
+ if name == "@wailsio/runtime":
+ return module_directory("github.com/wailsapp/wails/v3", "v3.0.0-beta.3")
+ raise RuntimeError(f"npm package {name} has no bundled license file in {package_path}")
+
+
+def collect_npm_dependencies(output: Path) -> list[Dependency]:
+ dependencies: list[Dependency] = []
+ inventory = pnpm_license_inventory()
+ for license_name, packages in sorted(inventory.items()):
+ for package in sorted(packages, key=lambda value: str(value.get("name", ""))):
+ name = str(package.get("name", "")).strip()
+ versions = package.get("versions") or []
+ paths = package.get("paths") or []
+ if not name or len(versions) != 1 or not paths:
+ raise RuntimeError(f"unexpected pnpm license entry: {package!r}")
+ version = str(versions[0])
+ package_path = Path(str(paths[0]))
+ source = npm_license_source(name, package_path)
+ destination = output / "licenses" / "npm" / f"{safe_component(name)}@{safe_component(version)}"
+ copied = copy_license_files(source, destination, output)
+ dependencies.append(
+ Dependency(
+ ecosystem="npm",
+ name=name,
+ version=version,
+ license=license_name,
+ platforms=("frontend",),
+ license_files=copied,
+ )
+ )
+ return dependencies
+
+
+def render_notice(dependencies: Iterable[Dependency]) -> str:
+ rows = sorted(dependencies)
+ lines = [
+ "# OneAgent Third-Party Notices",
+ "",
+ "This file is generated by `scripts/generate_third_party_licenses.py`.",
+ "Do not edit it or the adjacent license copies by hand.",
+ "",
+ "The packages below are linked into a production Go binary or bundled into",
+ "the embedded frontend. Full license and notice texts are included under",
+ "`licenses/` and are shipped with every binary artifact.",
+ "",
+ "| Ecosystem | Package | Version | Targets | License | License files |",
+ "| --- | --- | --- | --- | --- | --- |",
+ ]
+ for dependency in rows:
+ files = "
".join(f"`{path}`" for path in dependency.license_files)
+ platforms = ", ".join(dependency.platforms)
+ lines.append(
+ f"| {dependency.ecosystem} | `{dependency.name}` | `{dependency.version}` | "
+ f"{platforms} | {dependency.license} | {files} |"
+ )
+ lines.append("")
+ return "\n".join(lines)
+
+
+def generate(output: Path) -> None:
+ if output.exists():
+ shutil.rmtree(output)
+ output.mkdir(parents=True)
+ dependencies = collect_go_dependencies(output) + collect_npm_dependencies(output)
+ dependencies.sort()
+ (output / "THIRD_PARTY_NOTICES.md").write_text(render_notice(dependencies), encoding="utf-8")
+ manifest = {
+ "schema_version": 1,
+ "generated_by": "scripts/generate_third_party_licenses.py",
+ "dependencies": [dependency.as_json() for dependency in dependencies],
+ }
+ (output / "manifest.json").write_text(
+ json.dumps(manifest, indent=2, sort_keys=True) + "\n",
+ encoding="utf-8",
+ )
+
+
+def tree_files(root: Path) -> dict[str, bytes]:
+ if not root.exists():
+ return {}
+ return {
+ path.relative_to(root).as_posix(): path.read_bytes()
+ for path in sorted(root.rglob("*"))
+ if path.is_file()
+ }
+
+
+def compare_trees(actual: Path, expected: Path) -> list[str]:
+ actual_files = tree_files(actual)
+ expected_files = tree_files(expected)
+ differences: list[str] = []
+ for name in sorted(expected_files.keys() - actual_files.keys()):
+ differences.append(f"missing: {name}")
+ for name in sorted(actual_files.keys() - expected_files.keys()):
+ differences.append(f"unexpected: {name}")
+ for name in sorted(actual_files.keys() & expected_files.keys()):
+ if actual_files[name] != expected_files[name]:
+ differences.append(f"changed: {name}")
+ if name.endswith((".md", ".json", ".txt", "LICENSE", "NOTICE")):
+ before = actual_files[name].decode("utf-8", errors="replace").splitlines()
+ after = expected_files[name].decode("utf-8", errors="replace").splitlines()
+ differences.extend(
+ difflib.unified_diff(before, after, fromfile=f"tracked/{name}", tofile=f"generated/{name}", lineterm="")
+ )
+ return differences
+
+
+def verify_binary(binary: Path, platform: str, manifest_path: Path) -> None:
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
+ allowed = {
+ (entry["name"], entry["version"])
+ for entry in manifest["dependencies"]
+ if entry["ecosystem"] == "go" and platform in entry["platforms"]
+ }
+ actual: set[tuple[str, str]] = set()
+ for line in run(["go", "version", "-m", str(binary)]).splitlines():
+ fields = line.split("\t")
+ if len(fields) >= 4 and fields[1] == "dep":
+ actual.add((fields[2], fields[3]))
+ missing = sorted(actual - allowed)
+ if missing:
+ formatted = ", ".join(f"{name}@{version}" for name, version in missing)
+ raise RuntimeError(f"{binary} contains unreviewed Go modules for {platform}: {formatted}")
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT)
+ parser.add_argument("--check", action="store_true", help="fail if tracked output differs")
+ parser.add_argument("--verify-go-binary", type=Path, action="append", default=[])
+ parser.add_argument("--verify-platform")
+ return parser.parse_args()
+
+
+def main() -> int:
+ args = parse_args()
+ if args.verify_go_binary:
+ if not args.verify_platform:
+ raise SystemExit("--verify-platform is required with --verify-go-binary")
+ for binary in args.verify_go_binary:
+ verify_binary(binary, args.verify_platform, args.output / "manifest.json")
+ return 0
+ if args.check:
+ with tempfile.TemporaryDirectory(prefix="oneagent-licenses-") as directory:
+ generated = Path(directory) / "third_party"
+ generate(generated)
+ differences = compare_trees(args.output, generated)
+ if differences:
+ print("third-party license bundle is stale; regenerate with:", file=sys.stderr)
+ print(" python3 scripts/generate_third_party_licenses.py", file=sys.stderr)
+ print("\n".join(differences), file=sys.stderr)
+ return 1
+ return 0
+ generate(args.output)
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/scripts/test_generate_third_party_licenses.py b/scripts/test_generate_third_party_licenses.py
new file mode 100644
index 00000000..d4913688
--- /dev/null
+++ b/scripts/test_generate_third_party_licenses.py
@@ -0,0 +1,86 @@
+from __future__ import annotations
+
+import json
+import tempfile
+import unittest
+from pathlib import Path
+
+from scripts.generate_third_party_licenses import (
+ Dependency,
+ compare_trees,
+ copy_license_files,
+ parse_json_stream,
+ render_notice,
+)
+
+
+class ParseJSONStreamTests(unittest.TestCase):
+ def test_parses_concatenated_go_list_objects(self) -> None:
+ payload = '{"ImportPath":"one","Module":{"Path":"example.com/a","Version":"v1.0.0"}}\n' \
+ '{"ImportPath":"two","Module":{"Path":"example.com/b","Version":"v2.0.0"}}\n'
+
+ values = list(parse_json_stream(payload))
+
+ self.assertEqual([value["ImportPath"] for value in values], ["one", "two"])
+
+
+class LicenseCopyTests(unittest.TestCase):
+ def test_normalizes_line_endings_and_trailing_whitespace(self) -> None:
+ with tempfile.TemporaryDirectory() as source_dir, tempfile.TemporaryDirectory() as output_dir:
+ source = Path(source_dir)
+ output = Path(output_dir)
+ (source / "LICENSE").write_bytes(b"Line one \r\nLine two\r\n\r\n")
+
+ copied = copy_license_files(source, output / "licenses" / "pkg", output)
+
+ self.assertEqual(copied, ("licenses/pkg/LICENSE",))
+ self.assertEqual((output / "licenses/pkg/LICENSE").read_bytes(), b"Line one\nLine two\n")
+
+
+class NoticeRenderingTests(unittest.TestCase):
+ def test_renders_target_platforms_and_license_paths_deterministically(self) -> None:
+ dependencies = [
+ Dependency(
+ ecosystem="go",
+ name="example.com/windows-only",
+ version="v1.2.3",
+ license="MIT",
+ platforms=("windows",),
+ license_files=("licenses/go/example.com_windows-only@v1.2.3/LICENSE",),
+ ),
+ Dependency(
+ ecosystem="npm",
+ name="react",
+ version="19.2.8",
+ license="MIT",
+ platforms=("frontend",),
+ license_files=("licenses/npm/react@19.2.8/LICENSE",),
+ ),
+ ]
+
+ notice = render_notice(dependencies)
+
+ self.assertIn("`example.com/windows-only` | `v1.2.3` | windows | MIT", notice)
+ self.assertIn("`react` | `19.2.8` | frontend | MIT", notice)
+ self.assertLess(notice.index("example.com/windows-only"), notice.index("react"))
+
+
+class TreeComparisonTests(unittest.TestCase):
+ def test_reports_missing_and_changed_generated_files(self) -> None:
+ with tempfile.TemporaryDirectory() as actual_dir, tempfile.TemporaryDirectory() as expected_dir:
+ actual = Path(actual_dir)
+ expected = Path(expected_dir)
+ (actual / "same.txt").write_text("same", encoding="utf-8")
+ (expected / "same.txt").write_text("same", encoding="utf-8")
+ (actual / "changed.txt").write_text("old", encoding="utf-8")
+ (expected / "changed.txt").write_text("new", encoding="utf-8")
+ (expected / "missing.txt").write_text("missing", encoding="utf-8")
+
+ differences = compare_trees(actual, expected)
+
+ self.assertIn("changed: changed.txt", differences)
+ self.assertIn("missing: missing.txt", differences)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/third_party/THIRD_PARTY_NOTICES.md b/third_party/THIRD_PARTY_NOTICES.md
new file mode 100644
index 00000000..8b92327d
--- /dev/null
+++ b/third_party/THIRD_PARTY_NOTICES.md
@@ -0,0 +1,25 @@
+# OneAgent Third-Party Notices
+
+This file is generated by `scripts/generate_third_party_licenses.py`.
+Do not edit it or the adjacent license copies by hand.
+
+The packages below are linked into a production Go binary or bundled into
+the embedded frontend. Full license and notice texts are included under
+`licenses/` and are shipped with every binary artifact.
+
+| Ecosystem | Package | Version | Targets | License | License files |
+| --- | --- | --- | --- | --- | --- |
+| go | `github.com/adrg/xdg` | `v0.5.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE` |
+| go | `github.com/go-ole/go-ole` | `v1.3.0` | windows-arm64, windows-x64 | MIT | `licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE` |
+| go | `github.com/pelletier/go-toml/v2` | `v2.4.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE` |
+| go | `github.com/wailsapp/wails/v3` | `v3.0.0-beta.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE` |
+| go | `golang.org/x/sys` | `v0.47.0` | windows-arm64, windows-x64 | BSD-3-Clause | `licenses/go/golang.org_x_sys@v0.47.0/LICENSE` |
+| npm | `@wailsio/runtime` | `3.0.0-alpha2.117` | frontend | MIT | `licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE` |
+| npm | `cookie` | `1.0.1` | frontend | MIT | `licenses/npm/cookie@1.0.1/LICENSE` |
+| npm | `lucide-react` | `1.25.0` | frontend | ISC | `licenses/npm/lucide-react@1.25.0/LICENSE` |
+| npm | `react` | `19.2.8` | frontend | MIT | `licenses/npm/react@19.2.8/LICENSE` |
+| npm | `react-dom` | `19.2.8` | frontend | MIT | `licenses/npm/react-dom@19.2.8/LICENSE` |
+| npm | `react-router` | `7.18.1` | frontend | MIT | `licenses/npm/react-router@7.18.1/LICENSE.md` |
+| npm | `react-router-dom` | `7.18.1` | frontend | MIT | `licenses/npm/react-router-dom@7.18.1/LICENSE.md` |
+| npm | `scheduler` | `0.27.0` | frontend | MIT | `licenses/npm/scheduler@0.27.0/LICENSE` |
+| npm | `set-cookie-parser` | `2.6.0` | frontend | MIT | `licenses/npm/set-cookie-parser@2.6.0/LICENSE` |
diff --git a/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE b/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE
new file mode 100644
index 00000000..7307e1b7
--- /dev/null
+++ b/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Adrian-George Bostan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE b/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE
new file mode 100644
index 00000000..623ec06f
--- /dev/null
+++ b/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright © 2013-2017 Yasuhiro Matsumoto,
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the “Software”), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE b/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE
new file mode 100644
index 00000000..991e2ae9
--- /dev/null
+++ b/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+go-toml v2
+Copyright (c) 2021 - 2023 Thomas Pelletier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE b/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE
new file mode 100644
index 00000000..28f2a368
--- /dev/null
+++ b/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018-Present Lea Anthony
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE b/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE
new file mode 100644
index 00000000..2a7cf70d
--- /dev/null
+++ b/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE
@@ -0,0 +1,27 @@
+Copyright 2009 The Go Authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google LLC nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/licenses/npm/cookie@1.0.1/LICENSE b/third_party/licenses/npm/cookie@1.0.1/LICENSE
new file mode 100644
index 00000000..f92d7211
--- /dev/null
+++ b/third_party/licenses/npm/cookie@1.0.1/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2012-2014 Roman Shtylman
+Copyright (c) 2015 Douglas Christopher Wilson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/third_party/licenses/npm/lucide-react@1.25.0/LICENSE b/third_party/licenses/npm/lucide-react@1.25.0/LICENSE
new file mode 100644
index 00000000..718bb3f0
--- /dev/null
+++ b/third_party/licenses/npm/lucide-react@1.25.0/LICENSE
@@ -0,0 +1,43 @@
+ISC License
+
+Copyright (c) 2026 Lucide Icons and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+---
+
+The following Lucide icons are derived from the Feather project:
+
+airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
+
+The MIT License (MIT) (for the icons listed above)
+
+Copyright (c) 2013-present Cole Bemis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/react-dom@19.2.8/LICENSE b/third_party/licenses/npm/react-dom@19.2.8/LICENSE
new file mode 100644
index 00000000..b93be905
--- /dev/null
+++ b/third_party/licenses/npm/react-dom@19.2.8/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Meta Platforms, Inc. and affiliates.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md b/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md
new file mode 100644
index 00000000..7d0a32c3
--- /dev/null
+++ b/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) React Training LLC 2015-2019
+Copyright (c) Remix Software Inc. 2020-2021
+Copyright (c) Shopify Inc. 2022-2023
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/react-router@7.18.1/LICENSE.md b/third_party/licenses/npm/react-router@7.18.1/LICENSE.md
new file mode 100644
index 00000000..7d0a32c3
--- /dev/null
+++ b/third_party/licenses/npm/react-router@7.18.1/LICENSE.md
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) React Training LLC 2015-2019
+Copyright (c) Remix Software Inc. 2020-2021
+Copyright (c) Shopify Inc. 2022-2023
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/react@19.2.8/LICENSE b/third_party/licenses/npm/react@19.2.8/LICENSE
new file mode 100644
index 00000000..b93be905
--- /dev/null
+++ b/third_party/licenses/npm/react@19.2.8/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Meta Platforms, Inc. and affiliates.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/scheduler@0.27.0/LICENSE b/third_party/licenses/npm/scheduler@0.27.0/LICENSE
new file mode 100644
index 00000000..b93be905
--- /dev/null
+++ b/third_party/licenses/npm/scheduler@0.27.0/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Meta Platforms, Inc. and affiliates.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE b/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE
new file mode 100644
index 00000000..46f7017b
--- /dev/null
+++ b/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Nathan Friedly (http://nfriedly.com/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE b/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE
new file mode 100644
index 00000000..28f2a368
--- /dev/null
+++ b/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018-Present Lea Anthony
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/third_party/manifest.json b/third_party/manifest.json
new file mode 100644
index 00000000..6564b58d
--- /dev/null
+++ b/third_party/manifest.json
@@ -0,0 +1,185 @@
+{
+ "dependencies": [
+ {
+ "ecosystem": "go",
+ "license": "MIT",
+ "license_files": [
+ "licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE"
+ ],
+ "name": "github.com/adrg/xdg",
+ "platforms": [
+ "macos-arm64",
+ "macos-x64",
+ "windows-arm64",
+ "windows-x64"
+ ],
+ "version": "v0.5.3"
+ },
+ {
+ "ecosystem": "go",
+ "license": "MIT",
+ "license_files": [
+ "licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE"
+ ],
+ "name": "github.com/go-ole/go-ole",
+ "platforms": [
+ "windows-arm64",
+ "windows-x64"
+ ],
+ "version": "v1.3.0"
+ },
+ {
+ "ecosystem": "go",
+ "license": "MIT",
+ "license_files": [
+ "licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE"
+ ],
+ "name": "github.com/pelletier/go-toml/v2",
+ "platforms": [
+ "macos-arm64",
+ "macos-x64",
+ "windows-arm64",
+ "windows-x64"
+ ],
+ "version": "v2.4.3"
+ },
+ {
+ "ecosystem": "go",
+ "license": "MIT",
+ "license_files": [
+ "licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE"
+ ],
+ "name": "github.com/wailsapp/wails/v3",
+ "platforms": [
+ "macos-arm64",
+ "macos-x64",
+ "windows-arm64",
+ "windows-x64"
+ ],
+ "version": "v3.0.0-beta.3"
+ },
+ {
+ "ecosystem": "go",
+ "license": "BSD-3-Clause",
+ "license_files": [
+ "licenses/go/golang.org_x_sys@v0.47.0/LICENSE"
+ ],
+ "name": "golang.org/x/sys",
+ "platforms": [
+ "windows-arm64",
+ "windows-x64"
+ ],
+ "version": "v0.47.0"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE"
+ ],
+ "name": "@wailsio/runtime",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "3.0.0-alpha2.117"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/cookie@1.0.1/LICENSE"
+ ],
+ "name": "cookie",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "1.0.1"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "ISC",
+ "license_files": [
+ "licenses/npm/lucide-react@1.25.0/LICENSE"
+ ],
+ "name": "lucide-react",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "1.25.0"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/react@19.2.8/LICENSE"
+ ],
+ "name": "react",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "19.2.8"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/react-dom@19.2.8/LICENSE"
+ ],
+ "name": "react-dom",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "19.2.8"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/react-router@7.18.1/LICENSE.md"
+ ],
+ "name": "react-router",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "7.18.1"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/react-router-dom@7.18.1/LICENSE.md"
+ ],
+ "name": "react-router-dom",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "7.18.1"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/scheduler@0.27.0/LICENSE"
+ ],
+ "name": "scheduler",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "0.27.0"
+ },
+ {
+ "ecosystem": "npm",
+ "license": "MIT",
+ "license_files": [
+ "licenses/npm/set-cookie-parser@2.6.0/LICENSE"
+ ],
+ "name": "set-cookie-parser",
+ "platforms": [
+ "frontend"
+ ],
+ "version": "2.6.0"
+ }
+ ],
+ "generated_by": "scripts/generate_third_party_licenses.py",
+ "schema_version": 1
+}