Commit Graph
172 Commits
Author SHA1 Message Date
Latte e139ae826f docs: regenerate tool inventory after annotation overrides
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Failing after 35s
ci / lint (push) Successful in 47s
ci / test-mcp (push) Failing after 48s
ci / test-integration (push) Successful in 52s
ci / security (push) Failing after 29s
ci / test-unit (push) Successful in 1m57s
ci / build-and-push (push) Successful in 18s
2026-10-14 16:13:57 +02:00
Latte 7c7cfc05ff docs: rewrite README and docs for the full-access design, generate tool inventory 2026-10-14 16:13:11 +02:00
Latte 68bd8700dc feat: add docs drift check 2026-10-14 16:13:11 +02:00
Latte c9e2c481e7 feat: add MCP server core, stdio and streamable HTTP transports and serve command
Low-level SDK server built from the catalog plus gitea_api_request, with TOOLSETS/READ_ONLY/DISABLED_TOOLS filters, schema validation without value echo, one audit event per call, static bearer verifier, identity resolver hook, /health, DNS-rebinding protection, rate limiting and fail-closed startup checks.
2026-10-14 16:13:11 +02:00
Latte 581ca67bf8 docs: correct the module lists in AGENTS.md and CLAUDE.md 2026-10-14 16:12:51 +02:00
Latte 10c8b21cf5 docs: document result redaction, credential-issuing operations and path encoding 2026-10-14 16:12:51 +02:00
Latte 72462105f5 fix: keep the harness admin password out of the docker exec argv 2026-10-14 16:11:46 +02:00
Latte 517c675048 fix: harden setup against plain http, untrusted output and unsafe values
Require consent before sending the token over plain http to a non-loopback
host, strip control characters from server-supplied text, restrict env values
and tokens to printable ASCII, validate the URLs like other env values and
fsync the directory after the atomic replace.
2026-10-14 16:11:01 +02:00
Latte 6c9b2b74ca test: satisfy lint in catalog override test 2026-10-14 16:10:04 +02:00
Latte 6b11d29919 fix: annotate POST render endpoints read-only and irreversible POSTs destructive 2026-10-14 16:09:59 +02:00
Latte 156e963e21 fix: key slash encoding on route, redact more request secrets, bound JSON depth and uploads
Slash safety is decided per (path template, parameter) so single-segment
routes such as releases/tags/{tag} and editorconfig/{filepath} keep %2F.
Adds authorization_header, remote_password, mirror_password, mirror_token and
the AWS key fields to the redacted request fields. Deeply nested JSON from
Gitea is treated as text instead of raising RecursionError, and base64
uploads are capped before decoding.
2026-10-14 16:08:42 +02:00
Latte 1a039e32ab ci: single Gitea Actions pipeline, uv-based image, scoped docker cleanup
Replace lint/test/docker workflows with ci.yml (gitleaks, lint, test-unit, test-integration, test-mcp, build-and-push, docs-check, security). Rebuild the Dockerfile as a digest-pinned multi-stage uv build running as uid 1000, add .dockerignore, a hardened compose file and a gitleaks config. The integration harness now falls back to /etc/hostname and /proc/self to find its own container.
2026-10-14 15:59:19 +02:00
Latte 9e50859133 feat: add Gitea request executor with result envelope, pagination and redaction 2026-10-14 15:55:56 +02:00
Latte 041b3ea7ff feat: generate the tool catalog from the pinned swagger
Adds scripts/generate_catalog.py (with --check), the naming rules, schema conversion, the committed tools.json for all 537 operations and the load_catalog() loader.
2026-10-14 15:51:01 +02:00
Latte a807a70556 test: fix integration harness lint findings 2026-10-14 15:50:43 +02:00
Latte 1d223e6799 feat: add the aegis-gitea-mcp setup command
Verifies the Gitea instance, token and scopes, registers or reuses the aegis-gitea-mcp OAuth app, generates missing secrets and writes a 0600 env file from the template. Prints client configs and deployment snippets without any secret value.
2026-10-14 15:50:02 +02:00
Latte 465a365d89 test: add live-Gitea integration harness (opt-in, Docker) 2026-10-14 15:49:11 +02:00
Latte c246f5c267 docs: rewrite contributor contract for the full-access model 2026-10-14 15:40:37 +02:00
Latte b82e2866cb feat: new settings, CLI skeleton and interface skeletons
Adds the pydantic-settings Settings with validated GITEA_URL, OAuth scopes
and toolsets, the argparse CLI skeleton, catalog.model, identity and
GiteaAPIError. Test fixtures now isolate env, cwd and state paths in tmp.
2026-10-14 15:40:37 +02:00
Latte 4ac9626eb5 refactor!: remove legacy adapters, policy engine and API-key auth
Removes the FastAPI server, hand-rolled MCP protocol, tool registry and
tools, YAML policy, resource-type authz, API-key and OAuth proxy modules,
automation, observability, cache, the old Gitea client and stdio adapter,
the key-management scripts and their tests (ADR 0006).
2026-10-14 15:40:37 +02:00
Latte c0b22c531e build: switch to uv, hatchling and ruff-only tooling 2026-10-14 15:40:30 +02:00
Latte 8b7bb7205c docs: phase 0 audit, chunk plan, ADRs and pinned Gitea 28.1.0 swagger
Inventory and gap analysis of the 0.2.0 codebase against the full Gitea API
and the official gitea-mcp toolset, the B1..B11 + security chunk plan, ADRs
0001-0006 for the full-access rebuild, SDK/OAuth research notes, and the
instance swagger pinned for tool generation. The audit-logging doc moves to
docs/audit-logging.md.
2026-10-14 15:34:48 +02:00
Latte 2b99644ec5 Merge pull request 'Merge pull request 'Main' (#67) from main into dev' (#68) from dev into main
publish / test (push) Successful in 37s
publish / lint (push) Successful in 43s
docker / docker (push) Successful in 51s
docker / lint (push) Successful in 41s
docker / test (push) Successful in 38s
lint / lint (push) Successful in 30s
test / test (push) Successful in 32s
test / package (push) Successful in 43s
publish / publish (push) Failing after 12s
Reviewed-on: #68
v0.2.0
2026-06-27 14:17:38 +00:00
Latte 5999e14e4b Merge pull request 'Main' (#67) from main into dev
docker / test (push) Successful in 37s
docker / lint (push) Successful in 42s
publish / test (push) Successful in 36s
publish / lint (push) Successful in 43s
lint / lint (push) Successful in 44s
test / test (push) Successful in 42s
docker / test (pull_request) Successful in 36s
docker / lint (pull_request) Successful in 43s
test / package (push) Successful in 1m10s
lint / lint (pull_request) Successful in 43s
test / test (pull_request) Successful in 45s
test / package (pull_request) Successful in 1m10s
publish / publish (push) Successful in 20s
docker / docker (pull_request) Successful in 30s
docker / docker (push) Failing after 1m0s
Reviewed-on: #67
2026-06-27 14:17:22 +00:00
Latte 524cc1773d Merge pull request 'Promote dev to main: publish stable aegis-gitea-mcp 0.2.0' (#66) from dev into main
docker / test (push) Successful in 35s
docker / lint (push) Successful in 42s
publish / lint (push) Successful in 42s
lint / lint (push) Successful in 44s
publish / test (push) Successful in 34s
test / test (push) Successful in 44s
docker / lint (pull_request) Successful in 44s
docker / test (pull_request) Successful in 36s
test / package (push) Successful in 1m7s
lint / lint (pull_request) Successful in 43s
test / test (pull_request) Successful in 45s
test / package (pull_request) Successful in 1m8s
docker / docker (push) Successful in 1m26s
publish / publish (push) Successful in 28s
docker / docker (pull_request) Successful in 59s
Reviewed-on: #66
2026-06-27 14:16:33 +00:00
Bartender 64611d9c53 Merge pull request 'ci: fix package publishing + add dev/main packages' (#65) from fix/package-publishing into dev
docker / lint (push) Successful in 31s
docker / test (push) Successful in 30s
lint / lint (push) Successful in 41s
publish / test (push) Successful in 37s
publish / lint (push) Successful in 43s
test / test (push) Successful in 44s
publish / publish (push) Successful in 42s
test / package (push) Successful in 53s
docker / docker (push) Successful in 1m3s
docker / test (pull_request) Successful in 33s
docker / lint (pull_request) Successful in 40s
lint / lint (pull_request) Successful in 43s
test / test (pull_request) Successful in 45s
test / package (pull_request) Successful in 42s
docker / docker (pull_request) Successful in 43s
2026-06-27 14:03:00 +00:00
Latte 45641f8e2c docs: document dev and stable package channels
docker / test (push) Successful in 36s
docker / lint (push) Successful in 41s
lint / lint (push) Successful in 44s
docker / test (pull_request) Successful in 37s
lint / lint (pull_request) Successful in 44s
test / test (push) Successful in 45s
docker / lint (pull_request) Successful in 42s
test / package (push) Successful in 1m6s
test / test (pull_request) Successful in 40s
test / package (pull_request) Successful in 57s
docker / docker (pull_request) Successful in 56s
docker / docker (push) Successful in 1m7s
Document the two publish channels (aegis-gitea-mcp from main,
aegis-gitea-mcp-dev from dev), install commands for each, that both share
the aegis_gitea_mcp module so only one installs per environment, and the
merge-driven stable release flow (bump version -> PR into dev -> promote
dev to main; re-pushing main at the same version is a --check-url no-op).
2026-06-27 15:59:37 +02:00
Latte e5dfba208e ci: publish package on merge to dev/main with separate dev and stable packages
Replace the tag-only publish trigger (no v* tags ever existed, so the
package was never built) with branch-push publishing:

- dev push  -> aegis-gitea-mcp-dev at X.Y.Z.dev<run_number> (always unique)
- main push -> aegis-gitea-mcp at X.Y.Z, a clean no-op via uv --check-url
  if that version is already in the registry

Name + version are patched into pyproject.toml at build time only; the
committed file keeps aegis-gitea-mcp / X.Y.Z. Lint + test gates still run
before publish, and the REGISTRY_TOKEN secret is required (fail-closed).
2026-06-27 15:59:30 +02:00
Latte 83e5a0df14 Merge pull request 'release: v0.2.0 — local stdio package, safe full-API coverage & resource-type authz' (#63) from dev into main
docker / test (push) Successful in 29s
docker / lint (push) Successful in 31s
lint / lint (push) Successful in 32s
test / test (push) Successful in 31s
docker / docker (push) Successful in 55s
test / package (push) Successful in 1m26s
Reviewed-on: #63
2026-06-27 13:43:55 +00:00
Latte 2bb74807bc Merge pull request 'feat: harden local stdio MCP, CI package smoke, CLAUDE.md conventions' (#64) from feat/local-mcp-hardening-and-ci into dev
docker / lint (push) Successful in 33s
docker / test (push) Successful in 31s
docker / test (pull_request) Successful in 36s
docker / lint (pull_request) Successful in 43s
lint / lint (push) Successful in 45s
test / test (push) Successful in 44s
lint / lint (pull_request) Successful in 43s
test / test (pull_request) Successful in 45s
test / package (pull_request) Successful in 1m0s
docker / docker (pull_request) Successful in 49s
test / package (push) Successful in 1m53s
docker / docker (push) Successful in 42s
Reviewed-on: #64
2026-06-27 13:29:09 +00:00
Latte 4db37d200e ci: stop artifact upload from failing the build on Gitea runners
docker / test (push) Successful in 34s
docker / lint (push) Successful in 40s
lint / lint (push) Successful in 43s
docker / lint (pull_request) Successful in 43s
docker / test (pull_request) Successful in 34s
test / test (push) Successful in 44s
lint / lint (pull_request) Successful in 44s
test / package (push) Successful in 1m8s
test / test (pull_request) Successful in 44s
test / package (pull_request) Successful in 53s
docker / docker (push) Successful in 1m5s
docker / docker (pull_request) Successful in 43s
Gitea's act_runner does not reliably support the actions/upload-artifact@v4
backend. Drop the artifact upload from the test workflow (the package job's
purpose is to build and smoke-test, not to store wheels) and make the publish
workflow's upload best-effort (continue-on-error) so a flaky artifact backend
cannot block a release — the package is still published to the registry.
2026-06-27 15:26:56 +02:00
Latte 3d527f8690 ci: build the package and smoke-test both install profiles
docker / test (pull_request) Successful in 34s
docker / test (push) Successful in 36s
docker / lint (pull_request) Successful in 39s
docker / lint (push) Successful in 40s
test / test (push) Successful in 42s
test / package (pull_request) Failing after 2m27s
lint / lint (pull_request) Successful in 43s
lint / lint (push) Successful in 43s
test / test (pull_request) Successful in 44s
docker / docker (pull_request) Successful in 1m10s
docker / docker (push) Successful in 34s
test / package (push) Failing after 2m5s
Add a package job to the test workflow: uv build, then verify a clean core
install excludes the web stack and the aegis-gitea-mcp stdio entry exits 2 with
an actionable message, and that the [server] extra pulls in fastapi/uvicorn and
imports the server entry. Catches packaging/console-script regressions in CI.
2026-06-27 15:19:43 +02:00
Latte d79ff2d476 docs: forbid AI attribution and document the stdio transport in CLAUDE.md
Record that no 'Generated with Claude Code' / Co-Authored-By / 'made by Claude'
attribution may appear in commits, PRs, releases, comments or docs. Add stdio
transport notes (stdout reserved for JSON-RPC, build_server vs _serve).
2026-06-27 15:19:42 +02:00
Latte 5d4a98d06e feat(stdio): harden local MCP transport and add end-to-end tests
Reserve stdout for the JSON-RPC stream: _configure_stderr_logging() pins all
logging to stderr (and rewrites any stray stdout handler) so a log line can
never corrupt the stdio protocol. Extract a pure, testable build_server() from
_serve(). Add end-to-end tests over the mcp in-memory transport (initialize +
tools/list + tools/call), covering a successful round trip and a policy denial
surfaced as an MCP error.
2026-06-27 15:19:42 +02:00
Latte f660fa32c1 Merge pull request 'ci: reuse existing REGISTRY_TOKEN secret for package publish' (#62) from feat/local-package-and-full-coverage into dev
docker / test (push) Successful in 31s
docker / lint (push) Successful in 37s
lint / lint (push) Successful in 39s
test / test (push) Successful in 38s
docker / docker (push) Successful in 43s
docker / test (pull_request) Successful in 33s
docker / lint (pull_request) Successful in 39s
lint / lint (pull_request) Successful in 39s
test / test (pull_request) Successful in 39s
docker / docker (pull_request) Successful in 38s
Reviewed-on: #62
2026-06-27 13:05:18 +00:00
Latte 83c7416677 Merge branch 'dev' into feat/local-package-and-full-coverage
docker / test (push) Successful in 34s
docker / lint (push) Successful in 42s
docker / lint (pull_request) Successful in 43s
docker / test (pull_request) Successful in 32s
lint / lint (push) Successful in 45s
test / test (push) Successful in 45s
lint / lint (pull_request) Successful in 44s
test / test (pull_request) Successful in 35s
docker / docker (push) Successful in 46s
docker / docker (pull_request) Successful in 41s
2026-06-27 13:02:10 +00:00
Latte da66200be7 Merge pull request 'ci: reuse existing REGISTRY_TOKEN secret for package publish' (#60) from feat/publish-reuse-registry-token into dev
docker / test (push) Successful in 33s
docker / lint (push) Successful in 38s
lint / lint (push) Successful in 40s
test / test (push) Successful in 39s
docker / docker (push) Successful in 43s
docker / test (pull_request) Successful in 33s
docker / lint (pull_request) Successful in 39s
lint / lint (pull_request) Successful in 39s
test / test (pull_request) Successful in 39s
docker / docker (pull_request) Successful in 58s
Reviewed-on: #60
2026-06-27 12:49:17 +00:00
LatteandClaude Opus 4.8 1ca5bcbc6b ci: reuse existing REGISTRY_TOKEN secret for package publish
docker / test (pull_request) Successful in 34s
test / test (pull_request) Successful in 43s
docker / docker (pull_request) Successful in 39s
docker / test (push) Successful in 34s
docker / lint (push) Successful in 40s
test / test (push) Successful in 42s
lint / lint (push) Successful in 44s
docker / lint (pull_request) Successful in 44s
lint / lint (pull_request) Successful in 42s
docker / docker (push) Successful in 46s
The repo already has a write:package REGISTRY_TOKEN secret (used by docker.yml).
Reuse it for uv publish instead of requiring new GITEA_PACKAGE_* secrets:
authenticate as GITHUB_ACTOR with the token as password. Update packaging docs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 14:46:44 +02:00
LatteandClaude Opus 4.8 c551b3cfc3 ci: reuse existing REGISTRY_TOKEN secret for package publish
docker / lint (push) Successful in 36s
lint / lint (push) Successful in 38s
docker / test (push) Successful in 30s
test / test (push) Successful in 37s
docker / docker (push) Successful in 39s
docker / test (pull_request) Successful in 36s
docker / lint (pull_request) Successful in 41s
lint / lint (pull_request) Successful in 43s
test / test (pull_request) Successful in 43s
docker / docker (pull_request) Successful in 47s
The repo already has a write:package REGISTRY_TOKEN secret (used by docker.yml).
Reuse it for uv publish instead of requiring new GITEA_PACKAGE_* secrets:
authenticate as GITHUB_ACTOR with the token as password. Update packaging docs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 14:39:10 +02:00
Latte cf19a320b0 Merge pull request 'feat: local stdio package + safe full-API coverage' (#59) from feat/local-package-and-full-coverage into dev
docker / test (push) Successful in 33s
lint / lint (push) Successful in 39s
docker / lint (push) Successful in 38s
test / test (push) Successful in 39s
docker / docker (push) Successful in 43s
Reviewed-on: #59
2026-06-27 12:23:31 +00:00
LatteandClaude Opus 4.8 499bf98d92 ci: build and publish package to Gitea registry on tag
docker / test (push) Successful in 38s
lint / lint (push) Successful in 45s
docker / lint (push) Successful in 44s
test / test (push) Successful in 44s
docker / docker (push) Successful in 40s
docker / lint (pull_request) Successful in 40s
docker / test (pull_request) Successful in 34s
lint / lint (pull_request) Successful in 41s
test / test (pull_request) Successful in 40s
docker / docker (pull_request) Successful in 37s
Add .gitea/workflows/publish.yml: on a v* tag, gate on the existing lint + test
jobs, then build sdist+wheel with uv and publish to the self-hosted Gitea PyPI
registry using least-privilege Actions secrets (GITEA_PACKAGE_USER /
GITEA_PACKAGE_TOKEN). The job fails loudly when the secrets are absent rather
than publishing anonymously, uploads the built artifacts, and leaves a disabled
public-PyPI stub. Public PyPI is intentionally not published in this pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:18:07 +02:00
LatteandClaude Opus 4.8 385b442b6f docs: local vs server quickstart, authz model, packaging
Reframe the README around two transports and add a local stdio quickstart with
uvx/pip and Claude Desktop / Claude Code wiring. New docs: local-quickstart.md
and packaging.md (uv build/publish). Document resource-type-aware authorization
and classified gitea_request in security.md; stdio env vars + audit-log
fallback in configuration.md; local install in deployment.md; core+adapters in
architecture.md. Add the missing root AGENTS.md contract, update CLAUDE.md with
the core/adapter layout, fail-closed invariants, and the branching flow
(HEAD -> feature -> dev -> main). Update roadmap/todo and .env.example.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:17:01 +02:00
LatteandClaude Opus 4.8 2859a7f917 style: apply ruff/black formatting to stdio_app
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:10:14 +02:00
LatteandClaude Opus 4.8 1636ae1501 test: stdio adapter dispatch, owner resolution and local env bootstrap
Cover the stdio adapter: local-mode env bootstrap (OAuth off, API-key gate off,
per-user audit path), missing-env failure, PAT owner resolution, and dispatch
(unknown tool, write-mode policy denial, and the happy path pinning request
context to the PAT owner via the shared registry). Tidy the boundary-test
assertion so ruff and black agree.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:10:05 +02:00
LatteandClaude Opus 4.8 3392d8f69b feat(security): resource-type-aware authorization with fail-closed defaults
Add aegis_gitea_mcp.authz: classify every dispatched call (typed tools and
gitea_request) by resource type (repository/org/user_self/user_owned/
misc_global/admin/unknown) and enforce a type-specific rule in service-PAT
mode, on top of policy + WRITE_MODE. Every decision fails closed:

- org: signed-in user must be a verified org member (Gitea-checked).
- user_owned: owner must be the caller or a member org of the caller.
- user_self: token-owner-scoped endpoints denied (token is the bot's).
- admin: default-deny; allowed only with RAW_API_ALLOW_SENSITIVE opt-in AND a
  verified site admin.
- misc_global: reads allowed, writes denied.
- unknown / unverifiable: denied and audited.

Wire it into the server's service-PAT dispatch: repository calls keep the
existing per-user collaborator check; non-repo calls (previously blanket-denied)
now go through the resource-type gate, opening the org/user/admin surface
safely. Verification results are cached briefly (fail-closed: positives only).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:09:50 +02:00
LatteandClaude Opus 4.8 2d7f12d0d0 feat: safe full-API coverage via classified gitea_request dispatch
Add a deterministic (method, path) read/write classifier with an explicit
render-only override table that can only downgrade provably side-effect-free
POSTs (markdown/markup) to reads, never the reverse — so a mutating call cannot
slip past the write-mode gate. Add a known-Gitea-prefix gate: gitea_request now
fails closed on any path whose top segment is not a recognized /api/v1 route
instead of passing unknown paths through. Expose raw_relative_segments for the
authorization layer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 11:09:30 +02:00
LatteandClaude Opus 4.8 8902c4f642 feat: add local stdio adapter and uv-installable package with extras
Add aegis_gitea_mcp.stdio_app: a single-user, local MCP server over stdio
(official mcp SDK) that serves the same tools from the shared registry,
resolves the PAT owner via GET /user and pins request context to it, and runs
policy + WRITE_MODE + secret sanitization + audit while skipping the per-user
repo probe (the operator is the trusted token owner). Audit log falls back to a
per-user state path when the container default is unwritable.

Packaging: split deps into core (httpx/pydantic/mcp/...) and a [server] extra
(fastapi/uvicorn/PyJWT/python-multipart); add console scripts aegis-gitea-mcp
(stdio) and aegis-gitea-mcp-server (guarded HTTP entry); bump to 0.2.0 and fix
repo URLs. mcp added to requirements for CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 10:56:16 +02:00
LatteandClaude Opus 4.8 7da0c46de8 refactor: extract transport-agnostic core and shared tool registry
Introduce aegis_gitea_mcp.registry as the single name->handler source of
truth consumed by every transport adapter, moving TOOL_HANDLERS out of the
FastAPI server module. Add aegis_gitea_mcp.errors.ToolError so core handlers
no longer import fastapi.HTTPException; raw_tools now raises ToolError and the
HTTP adapter maps it back to HTTPException, preserving status codes and audit
behavior. Add a subprocess boundary test asserting the core imports without
pulling in fastapi/uvicorn/starlette.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 10:49:46 +02:00
LatteandClaude Opus 4.8 dd253f87e5 chore: add PLAN.md and branch for local package + full coverage
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 10:44:06 +02:00
Latte aefb243a05 Merge pull request 'Feat/raw api dispatch' (#58) from feat/raw-api-dispatch into dev
docker / test (push) Successful in 27s
test / test (push) Successful in 35s
docker / lint (push) Successful in 33s
lint / lint (push) Successful in 35s
docker / docker (push) Successful in 42s
Reviewed-on: #58
2026-06-26 10:33:10 +00:00