Alexandre Teixeira
576abb012d
feat(browser): deterministic private_browser lifecycle (Wave 5A)
...
Own each agent-browser session as a browser tree: the daemon's POSIX
session, its runtime files and its Chrome profile. Timeouts, launch
failures, bootstrap recovery, cancellation and shutdown clean that tree
and verify nothing survives, instead of killing only the daemon and
orphaning Chrome. Per-call cleanup no longer sweeps every Chrome under
the runtime TMPDIR.
Sessionless calls get an ephemeral browser closed before returning.
Actions on one session are serialized. Recovery is bounded by one
deadline with at most one retry for local HTML open, and the retry flag
is no longer model-visible. Observations after a failed navigation are
marked stale. read URL navigates and extracts in one batch because
agent-browser has no read command. Results carry a browser_lifecycle
receipt with stages, timings, ownership and cleanup evidence.
Playwright MCP tool calls are bounded by
ODYSSEUS_BROWSER_MCP_CALL_TIMEOUT_S and are not retried. research_navigator
now passes timeout_ms.
2026-10-01 20:59:27 +01:00
Alexandre Teixeira
cb5b81022b
Merge pull request #50 from pewdiepie-archdaemon/feature/runtime-request-authority
...
feat(runtime): enforce server request authority
2026-10-01 19:50:38 +01:00
Alexandre Teixeira
9d0257134f
feat(runtime): enforce server request authority
2026-10-01 18:35:41 +01:00
Alexandre Teixeira
05c6cfcfa1
Merge pull request #43 from pewdiepie-archdaemon/feature/agent-runtime-wave-1-1
...
feat(runtime): complete Agent Runtime Wave 1.1
2026-10-01 15:22:06 +01:00
Alexandre Teixeira
d49071bbec
fix: close Wave 1.1 completion-gate audit findings
...
- Headless consumers (task scheduler, background follow-up) now treat a
completion-gate final_response as the authoritative answer instead of
collecting deltas only. A gated replacement no longer leaves scheduled
output empty, which used to trigger an extra, ungated grace-summary
model call.
- The scheduler closes the agent stream with contextlib.aclosing, so the
approval-pause break unwinds the gate's journal and teacher-takeover
context in its own task. Chained runs no longer inherit a stale
parent_run_id, and later finalization no longer raises ContextVar
reset errors.
- On provider error, the completion gate applies the live answer's
statement filter to persisted round_texts. Diagnostics and the failure
note survive; claims rejected by the gate cannot reappear on reload.
2026-10-01 14:49:32 +01:00
Alexandre Teixeira
f4793696f4
merge: reconcile Wave 1.1 with post-PR40 lab
...
Merge canonical lab 9557b8d5909eb4a885c3bf49e19a65dd904f8c1d exactly once.
Retain invocation journal ownership and lineage, provider terminal ordering,
teacher handoff, framed DONE handling, and canonical authority/Ajax routing.
Combine dynamic dispatch receipts with lab policy forwarding. Adapt native
shell/patch evidence, explicit TUI verifiers, and artifact recovery presentation.
Refresh generated configuration source links and strengthen adapter regressions.
Validation: focused 2118 passed; Wave 1.1 script 2291 passed; broad runtime
5649 passed; full pytest 11581 passed, 53 skipped, 2 xfailed, 6 subtests passed.
Compileall 1689 Python files; syntax 279 JS and 82 MJS files; diff and
conflict-marker checks passed.
2026-10-01 09:09:55 +01:00
Alexandre Teixeira
e5e23e640d
Merge pull request #40 from pewdiepie-archdaemon/review/harness-latest-20260917
...
Review preview harness, editor, email and task improvements
2026-10-01 06:59:19 +01:00
Alexandre Teixeira
5dfe1c353c
test: stabilize final PR 40 validation gates
2026-10-01 06:39:22 +01:00
Alexandre Teixeira
f74a262f73
merge: reconcile PR 40 with current lab
...
Integrate lab fff55a78 into PR #40 (cc25d5ba). Lab's modular email
backend/frontend, modular settings, split stylesheets (static/style.css
stays deleted), procfs compatibility, and request-scoped TurnContract
authority win; PR #40 's routing classifiers, editor/email/task features,
and style.css changes are ported into lab's module and stylesheet homes.
Integration fixes:
- settings/api.js imports ui.js under its canonical versioned URL
- browser observations keep legacy CAPTCHA/access-block evidence
- artifact turns do not re-trigger broad-web research recovery
- env reference documents PR test-tool variables; page regenerated
PR #40 defects surfaced by lab gates and fixed here:
- web_fetch generic schema drops top-level anyOf (OpenAI contract);
the compact preview contract still requires url or urls
- get_weather registered as a brokered network read
- new lazy editor modules precached for offline use
- SearXNG pin mirrored into GPU standalone compose files
- image model picker again skips offline endpoints
Tests updated where PR #40 changed behaviour on purpose, and PR tests
moved onto lab's document_source helpers.
2026-10-01 05:03:58 +01:00
Alexandre Teixeira
f93767d5c7
Merge pull request #17 from o3LL/fix/procfs-pid-file-liveness
...
fix(browser): stop treating a missing cmdline as proof the daemon exited
2026-10-01 03:10:43 +01:00
Alexandre Teixeira
d63932f1ad
Merge lab into fix/procfs-pid-file-liveness
2026-10-01 03:10:10 +01:00
Alexandre Teixeira
a462e01483
Merge pull request #39 from o3LL/feat/admin-build-provenance
...
feat(settings): show the running build's version and commit in the admin panel
2026-10-01 02:55:54 +01:00
Alexandre Teixeira
6901c56192
Merge lab into feat/admin-build-provenance
2026-10-01 02:55:27 +01:00
Alexandre Teixeira
f817ab6e09
Merge pull request #35 from o3LL/docs/env-configuration-reference
...
docs: generate the ODYSSEUS_* configuration reference from the source
2026-10-01 02:53:07 +01:00
Alexandre Teixeira
c6f690a27b
Merge lab into docs/env-configuration-reference
2026-10-01 02:52:37 +01:00
Alexandre Teixeira
762fb891ce
Merge pull request #29 from o3LL/test/95-release-smoke-suite
...
test(smoke): add a release smoke suite over every advertised feature area
2026-10-01 02:46:16 +01:00
Alexandre Teixeira
bdccb1ddb1
Merge lab into test/95-release-smoke-suite
2026-10-01 02:45:49 +01:00
Alexandre Teixeira
95416cdbfb
Merge pull request #27 from o3LL/audit/ref-parity
...
chore(tools): add a read-only ref-to-ref parity audit
2026-10-01 02:45:38 +01:00
Alexandre Teixeira
ef0d96a3ae
Merge lab into audit/ref-parity
2026-10-01 02:45:10 +01:00
Alexandre Teixeira
fe7297547c
Merge pull request #38 from o3LL/test/runtime-behavior-regressions
...
test(runtime): pin negative capability wording, test-only
2026-10-01 02:42:50 +01:00
Alexandre Teixeira
8c7e3a9411
Merge lab into test/runtime-behavior-regressions
2026-10-01 02:42:22 +01:00
Alexandre Teixeira
1dca85cb07
Merge pull request #37 from o3LL/fix/token-cache-atomic-swap
...
fix(auth): swap the API token cache atomically instead of clearing it
2026-10-01 02:42:09 +01:00
Alexandre Teixeira
45e1e2e7d9
Merge lab into fix/token-cache-atomic-swap
2026-10-01 02:41:41 +01:00
Alexandre Teixeira
bf76c9c608
Merge pull request #36 from o3LL/fix/6174-singleflight-cancel
...
fix(tasks): clean up the singleflight cache on cancellation
2026-10-01 02:28:18 +01:00
Alexandre Teixeira
b0bc0b8c40
Merge lab into fix/6174-singleflight-cancel
2026-10-01 02:27:49 +01:00
Alexandre Teixeira
236baea232
Merge pull request #33 from o3LL/refactor/email-library-package
...
refactor(email): decompose emailLibrary.js into a package behind a re-export wrapper
2026-10-01 02:23:56 +01:00
Alexandre Teixeira
799adbbde6
Merge lab into refactor/email-library-package
2026-10-01 02:22:23 +01:00
Alexandre Teixeira
eef390b9ae
Merge pull request #22 from o3LL/refactor/routes-email-subpackage
...
refactor(routes): move the email modules into routes/email/
2026-10-01 02:17:29 +01:00
Alexandre Teixeira
9477616e05
Merge lab into refactor/routes-email-subpackage
2026-10-01 02:15:36 +01:00
Alexandre Teixeira
aedec7d005
fix(runtime): isolate nested invocation ownership
2026-10-01 02:11:53 +01:00
Alexandre Teixeira
b35010c3d1
Merge pull request #24 from o3LL/refactor/settings-shell-modules
...
refactor(settings): move the shell out of settings.js into settings/
2026-10-01 01:42:18 +01:00
Alexandre Teixeira
33387d4a4c
Merge lab into refactor/settings-shell-modules
2026-10-01 01:41:27 +01:00
Alexandre Teixeira
4c122de880
fix(runtime): scope completion claims to execution obligations
2026-10-01 01:36:18 +01:00
Alexandre Teixeira
290bb0d61d
Merge pull request #23 from o3LL/refactor/settings-panel-modules
...
refactor(settings): extract four panels into settings/ modules
2026-10-01 01:08:58 +01:00
Alexandre Teixeira
9ee9205bfc
merge: sync lab after stylesheet split
2026-10-01 01:08:15 +01:00
Alexandre Teixeira
86212bfe99
Merge lab into refactor/settings-panel-modules
2026-10-01 01:03:49 +01:00
Alexandre Teixeira
0f23439a31
Merge pull request #20 from o3LL/refactor/split-style-css
...
refactor(css): split style.css into ordered fragments
2026-10-01 00:55:35 +01:00
Alexandre Teixeira
23fdc26079
Merge lab into refactor/split-style-css
2026-10-01 00:48:58 +01:00
Alexandre Teixeira
466a6b323a
fix(runtime): preserve provider error terminal ordering
2026-10-01 00:33:46 +01:00
Alexandre Teixeira
fe80eb795e
merge: reconcile reviewed lab baseline for runtime wave 1.1
2026-10-01 00:25:42 +01:00
Alexandre Teixeira
0a88b3c322
Merge pull request #31 from o3LL/test/document-module-set-helper
...
test(document): read the editor through a module-set helper before it is split
2026-09-30 22:59:49 +01:00
Alexandre Teixeira
40dbe17a95
Merge lab into test/document-module-set-helper
...
Resolve the overlap with #19 by preserving the whole-cascade stylesheet
helpers alongside #31 's document-source/module-set helpers.
Maintainer validation:
- document/module contract and composition guards: 15 passed
- all 54 touched Python test modules: 366 passed
- py_compile: clean
- git diff --check: clean
2026-09-30 22:56:56 +01:00
Alexandre Teixeira
741f5dff2b
Merge pull request #19 from o3LL/refactor/tests-read-the-whole-cascade
...
refactor(tests): read the whole cascade instead of style.css alone
2026-09-30 19:27:58 +01:00
Alexandre Teixeira
6ee51fee72
Merge pull request #18 from o3LL/fix/duplicate-keyframes
...
fix(css): collapse duplicate @keyframes names to the definition that wins
2026-09-30 19:18:13 +01:00
Alexandre Teixeira
a969a68016
Merge pull request #34 from o3LL/test/macos-failures-and-stub-leak-guard
...
test: fix environment-dependent failures and guard module-stub leaks
2026-09-30 19:16:43 +01:00
Alexandre Teixeira
56484df737
test(media): detect ffmpeg encoders by codec alias
2026-09-30 19:16:29 +01:00
Alexandre Teixeira
eaddc03729
Merge pull request #26 from o3LL/fix/tmp-realpath-test-bugs
...
fix(tests): resolve temp paths consistently on macOS
2026-09-30 18:21:04 +01:00
Alexandre Teixeira
bfae249120
Merge pull request #28 from o3LL/fix/cookbook-stop-procfs-guard
...
fix(cookbook): skip the pid sweep when the host has no procfs
2026-09-30 18:07:07 +01:00
Alexandre Teixeira
054df080af
Merge pull request #32 from o3LL/fix/6215-mcp-args-validation
...
fix(mcp): reject malformed Args on Add MCP Server instead of defaulting to []
2026-09-30 17:18:51 +01:00
Alexandre Teixeira
11ecf46abb
Merge pull request #30 from o3LL/fix/6228-tailscale-empty-lookup-cache
...
fix(discovery): cache a successful but empty Tailscale lookup
2026-09-30 17:05:16 +01:00
Alexandre Teixeira
3748a621d1
Merge current lab into agent runtime decomposition
2026-09-29 19:15:54 +01:00
Alexandre Teixeira
6105702901
Merge pull request #16 from o3LL/lane/decomposition-and-test-isolation
...
refactor(lane): decompose style.css, pin it with a computed-style harness, and isolate worktree runs
2026-09-29 14:54:36 +01:00
Alexandre Teixeira
65c35c8211
Merge pull request #15 from o3LL/fix/test-static-port-isolation
...
test(harness): bind the static test server to an ephemeral port
2026-09-29 14:54:18 +01:00
Alexandre Teixeira
956671a731
Merge pull request #14 from o3LL/fix/proc-guard-private-browser
...
fix(browser): skip the Chrome sweep when the host has no procfs
2026-09-29 14:54:00 +01:00
Alexandre Teixeira
aafd8a98eb
Merge pull request #13 from o3LL/v1/css-split-3
...
refactor(css): move cookbook, research, memory and settings styles to their own file
2026-09-29 14:53:44 +01:00
Alexandre Teixeira
cea8ed297e
fix(runtime): reject unobserved verification and preserve safe reasoning
2026-09-26 14:24:29 +01:00
Alexandre Teixeira
b241bb3a7b
fix(runtime): close completion stream bypass and preserve explanations
2026-09-26 14:13:40 +01:00
Alexandre Teixeira
eaa5668baa
feat(runtime): record execution evidence and gate completion
2026-09-26 13:48:12 +01:00
Alexandre Teixeira
ea847e6c0b
test(runtime): establish isolated validation and comparison gates
2026-09-26 13:13:07 +01:00
Alexandre Teixeira
0e07d9a675
Merge pull request #10 from o3LL/fix/review-20260923-bound-outbound-and-draft-limits
...
fix(security): harden scholarly lookups and editor draft limits
2026-09-24 12:22:04 +01:00
Alexandre Teixeira
11ad4e2739
fix(url-safety): resolve NAT64 well-known prefix to IPv4 target
...
The R09 scholarly hardening routes every hop through check_outbound_url with
block_private=True. On a DNS64/NAT64 network, an IPv4-only host can resolve
through the RFC 6052 Well-Known Prefix. For example, export.arxiv.org resolved
to 64:ff9b::924b:5b2a in the reproduced environment.
CPython classifies that outer IPv6 prefix as reserved, so the URL guard rejected
the request before examining the effective IPv4 destination.
Decode addresses in exactly 64:ff9b::/96 to their embedded IPv4 destination and
evaluate that destination under the strict outbound policy.
The translated target is always checked with private-address blocking enabled.
This prevents the NAT64 prefix from becoming a path to loopback, private,
shared/CGNAT, link-local, multicast, unspecified, or other non-global IPv4
space.
Network-specific translation prefixes are not decoded. In particular,
64:ff9b:1::/48 remains subject to the existing IPv6 policy.
Coverage includes:
- public IPv4 destinations embedded through the RFC 6052 prefix
- loopback, link-local, private, CGNAT, multicast, unspecified, benchmark, and
TEST-NET rejection
- network-specific NAT64 prefixes remaining undecoded
- deterministic scholarly provider tests without live DNS dependence
- redirect query parameter isolation
- relative redirect resolution
- HTTP error fallback behavior
- editor draft GET and DELETE behavior remaining unaffected
R09, R11, and R01 were independently audited and otherwise left unchanged.
2026-09-23 15:32:04 +01:00
Alexandre Teixeira
0784cd2fed
fix(review): harden scholarly redirects, editor draft limits, and threat model
...
- Enforce outbound URL policy on all hops via bounded manual redirects in scholarly lookups
- Guard declared Content-Length in EditorDraftRoute before request body parsing
- Keep scholarly lookup timeouts and budgets as internal constants rather than surface env vars
- Narrow TUI threat-model description around demonstrable host shell bridge behavior
- Add behavioral regression tests for redirect security and pre-parsing body size guards
2026-09-23 12:53:06 +01:00
Alexandre Teixeira
c90a81dbdc
Merge commit '14afd3afb6274ff986733ddff992001e19c80e29' into fix/pr10-merge-ready
2026-09-23 12:29:27 +01:00
Alexandre Teixeira
f577934777
fix(ci): restore green lab baseline before runtime W1 ( #9 )
...
Validated locally and on GitHub Actions before integration into lab.
2026-09-23 10:16:54 +01:00
Alexandre Teixeira
771d48f147
ci: install FFmpeg for media integration tests
2026-09-23 01:08:20 +01:00
Alexandre Teixeira
3cabbb9bca
test(agent): restore exact turn-policy regressions
2026-09-23 00:14:30 +01:00
Alexandre Teixeira
c0b71a5cef
fix(tools): constrain Python environment namespace mount
2026-09-23 00:10:50 +01:00
Alexandre Teixeira
0012baa17c
ci(trivy): free build cache before image scan
2026-09-22 23:27:29 +01:00
Alexandre Teixeira
c0a1cecc00
test(baseline): align UI and model profile expectations
2026-09-22 23:27:17 +01:00
Alexandre Teixeira
9bc1cdcab0
test(harness): isolate imports and stabilize browser and DNS fixtures
2026-09-22 23:27:08 +01:00
Alexandre Teixeira
4520b4f6f0
fix(ui): restore rich text controls and accessible research map
2026-09-22 23:26:43 +01:00
Alexandre Teixeira
b9cccb93ac
fix(tools): expose active Python environment in workspace namespace
2026-09-22 23:26:28 +01:00
Alexandre Teixeira
79a55fac38
fix(agent): preserve focused turn contracts and verified completion
2026-09-22 23:26:16 +01:00
Alexandre Teixeira
128102ef26
test(runtime): isolate tool execution module state
2026-09-22 18:17:42 +01:00
Alexandre Teixeira
5568d7d631
fix(sw): complete editor panel precache
2026-09-22 18:09:04 +01:00
Alexandre Teixeira
83088f8811
ci: provision browser dependencies for pytest
2026-09-22 18:08:16 +01:00
Alexandre Teixeira
ebcc6c524f
test(database): restore model endpoint isolation
2026-09-22 18:07:09 +01:00
Alexandre Teixeira
dbba4978ee
test(harness): support cache-busted frontend module imports
2026-09-22 18:06:18 +01:00
Alexandre Teixeira
7e798fe925
Merge pull request #6 from pewdiepie-archdaemon/pr/alteixeira20/subscription-provider-ux
...
feat(provider): improve subscription UX and lazy discovery
2026-09-22 14:02:55 +01:00
Alexandre Teixeira
8bb48780a1
feat(provider): add lazy Featherless model discovery
2026-09-22 13:12:19 +01:00
Alexandre Teixeira
2b2bf0fb90
fix(ui): refine provider endpoint controls
2026-09-22 13:12:19 +01:00
Alexandre Teixeira
46c8451a29
fix(ui): bust cache for collapsible subscription usage
2026-09-22 13:12:19 +01:00
Alexandre Teixeira
411559913c
feat(ui): refine subscription model and usage controls
2026-09-22 13:12:19 +01:00
Alexandre Teixeira
ed7ccfd584
feat(provider): support multiple ChatGPT subscriptions with usage
2026-09-22 13:12:19 +01:00
Alexandre Teixeira
45330097b8
Merge pull request #7 from pewdiepie-archdaemon/fix/maintainer-harness-ci-reproducibility-v1
...
fix(ci): make maintainer harness and lab workflow portable
2026-09-22 12:44:20 +01:00
Alexandre Teixeira
dd13f53507
ci: support maintainer lab pull requests
2026-09-22 12:39:14 +01:00
Alexandre Teixeira
822ceaaac4
fix(ci): make maintainer harness contract self-contained and portable
2026-09-22 11:31:45 +01:00
Alexandre Teixeira
cee319050c
refactor(settings): add registry-backed navigation and finder ( #6040 )
...
* refactor(settings): add modular shell primitives
* refactor(settings): wire modular shell
* test(settings): exercise real coordinator ESM boundary
* refactor(settings): add registry-backed settings finder
* fix(settings): harden registry navigation behavior
2026-08-16 02:48:19 +01:00
Alexandre Teixeira and RaresKeY
9c71948376
fix(companion): honor configured pairing address ( #6060 )
...
* fix(companion): honor configured pairing origin
* fix(companion): keep configured pairing on v1 LAN contract
* fix(companion): reject numeric pairing hosts
---------
Co-authored-by: RaresKeY <158580472+RaresKeY@users.noreply.github.com >
2026-08-15 21:11:10 +02:00
c4369305f0
refactor(model-routing): centralize explicit foreground fallback policy ( #6020 )
...
* refactor(model-routing): centralize explicit foreground fallback policy
Make foreground fallback an explicit per-user, availability-only policy shared by streaming Chat, non-stream Chat, and Agent runs.
Preserve strict defaults, owner/model and credential boundaries, pinned Agent routes, and truthful per-round provenance/accounting. Carry provider-reported model identifiers through native streaming adapters, non-stream responses, and caches, and keep legacy default_model_fallbacks as tombstoned raw storage that generic settings APIs and agent tools cannot expose or mutate.
* fix(agent-loop): restore rebase-dropped qwen routing, workspace prompt, and temperature clamp
* fix(model-routing): thread selected endpoint identity, fix cost classification and fallback eligibility
* fix(chat): restore stream helpers and harden run stop lifecycle
* fix(model-routing): let numeric provider codes win over symbolic rate-limit statuses
* fix(agent-loop): apply qwen temperature and notes-tool clamps per fallback candidate
* fix(chat): honor queued stop across resend and reload canonical terminal on EOF
* fix(chat): track stop queue and cleanup ownership by per-send generation
* fix(agent-loop): preserve requested temperature for non-qwen fallback candidates
* fix(chat): reserve send ownership before any await and scope stop to the current send
* fix(chat): clear the previous run identity at send reservation
---------
Co-authored-by: RaresKeY <158580472+RaresKeY@users.noreply.github.com >
Co-authored-by: StressTestor <212606152+StressTestor@users.noreply.github.com >
2026-08-14 08:10:30 +01:00
Alexandre Teixeira
e466b02f1a
fix(security): make research path lookup CodeQL-friendly ( #5129 )
...
* fix(security): make research path lookup CodeQL-friendly
* fix(security): avoid duplicate research path scans
* fix(research): preserve active completed spinoff query
2026-07-04 20:17:45 +02:00
Alexandre Teixeira
5b4ed45e69
Merge pull request #5195 from ashvinctrl/fix/send-to-session-null-owner
...
fix(security): scope send_to_session to an exact session owner
2026-07-04 16:47:10 +01:00
Alexandre Teixeira
972c2d6c62
ci: add focused test guidance signal ( #4982 )
...
* ci: add focused test guidance signal
* ci: diff focused guidance from merge base
2026-07-03 21:17:28 +02:00
Alexandre Teixeira
667cc4e2fa
test: split service health tests ( #4972 )
...
* test: split service health tests
* test(service-health): preserve focus selector
2026-07-03 20:50:49 +02:00
Alexandre Teixeira
a24e749404
fix(security): confine research file paths ( #4986 )
2026-07-02 11:58:35 +01:00
Alexandre Teixeira
e86ccae0db
fix(docker): make host Docker socket opt-in ( #4902 )
...
* fix(docker): make host socket compose opt-in
* fix(cookbook): gate container Docker access
* fix(docker): gate socket group setup on opt-in
* fix(cookbook): gate generated docker exec serve commands
* fix(cookbook): narrow generated docker exec forms
2026-06-30 19:54:51 +02:00
Alexandre Teixeira
4c7db7c216
fix(security): harden gallery endpoint URL checks ( #4981 )
...
Replace substring OpenAI endpoint detection with exact parsed-host matching.
Route gallery image endpoint construction through a constant path allowlist.
Remove client-visible exception and upstream response body leaks from gallery image flows while preserving diagnostics in server logs.
Add focused regression tests for OpenAI host matching, checked endpoint joining, harmonize SSRF hardening, and sanitized client errors.
2026-06-30 19:16:34 +02:00
Alexandre Teixeira
c8e106c629
test: split provider endpoint tests ( #4961 )
2026-06-28 19:05:38 +02:00
Alexandre Teixeira
31705015a3
test: localize calendar recurrence helper import ( #4944 )
...
* test: localize calendar recurrence helper import
* test: share calendar route import helper
2026-06-28 19:04:15 +02:00
Alexandre Teixeira
b2881ea0d1
test: split endpoint resolver tests ( #4957 )
2026-06-28 00:49:43 +02:00