Commit graph

1918 commits

Author SHA1 Message Date
Alessandro
b5e110ad0d
Merge pull request #1470 from 3clyp50/ready
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
feat: add builtin skill selector; number of images in vision_tool; _memory hardening and improvements
2026-04-08 14:06:21 +02:00
Alessandro
c9eadf400a add built-in Skills selector plugin
Added a builtin plugin that you can open from the chat input plus button menu, which shows you a list of skills that you can directly activate in the current context/project.

Default configs allow users to start over with skills already active, instead of losing time and tokens asking Agent Zero to do it.

Update prompt for manual skill selector

add thumbnail for _skills builtin plugin
2026-04-08 14:02:09 +02:00
Alessandro
1cbecc241e memory: harden FAISS integrity and consolidation scoring
- Add FAISS index integrity checks using a SHA-256 sidecar (`index.faiss.sha256`) and write hash on save.
- Harden `memory_load` filter evaluation with input validation (allowlist + length cap) and `simple_eval(..., functions={})`.
- Add score-preserving similarity search and use real relevance scores in consolidation (including best-score dedupe by memory id).
- Prevent utility-model context overflows by truncating memorize input history for fragments and solutions.
2026-04-08 14:02:05 +02:00
Alessandro
5dc589486a plugins: hide agent profile selector when out of scope 2026-04-08 13:28:19 +02:00
Alessandro
33b88d5731 add number of imgs in vision tool 2026-04-08 13:06:03 +02:00
Alessandro
a1faa64f34
Merge pull request #1466 from gdeyoung/fix/empty-dict-tool-args-validation
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
fix: validate_tool_request rejects valid empty tool_args dict
2026-04-07 19:25:47 +02:00
Greg DeYoung
7cf8905af5 fix: validate_tool_request rejects empty tool_args dict (PATCH-015)
Bug: not tool_request.get("tool_args") evaluates True for empty dict {}
causing ValueError crash on any tool call with no arguments.
Scheduler list_tasks, health checks, etc all broken.

Fix: Changed to existence check ("tool_args" not in tool_request)

Co-authored-by: Agent Zero <agent@zero>
2026-04-07 01:09:00 +00:00
Jan Tomášek
2d95cd9fc0
Merge pull request #1433 from 3clyp50/ready
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
add thumbnail for _discovery plugin
2026-04-03 17:15:57 +02:00
Alessandro
92fcdbf8e6 add thumbnail for _discovery plugin 2026-04-03 17:14:34 +02:00
Jan Tomášek
2da44168da
Merge pull request #1428 from 3clyp50/dirtyjson
Dispatch tool calls at first completed JSON object
2026-04-03 17:05:48 +02:00
Alessandro
5a2223596a stop tool dispatch at first completed json object
Tool execution no longer waits for the full streamed assistant text. We now detect the first explicitly closed top-level JSON object, freeze that snapshot as the canonical tool request, and stop the model stream there for dispatch.

To make that safe, DirtyJson completion semantics are tightened so completed=true only means the root object was explicitly closed, not that parsing hit end of file. I also restricted the new extraction path to object roots only, since tool calls are always brace-delimited objects, and added tests for parser completion and early stream stop.
2026-04-03 16:56:21 +02:00
Alessandro
ec80702b80 add completion detection to DirtyJson parser
Track parsing depth via _pop_stack() helper. Exposes a 'completed' flag that signals when the root JSON structure is fully closed, allowing stream consumers to break early instead of waiting for irrelevant tokens.
2026-04-03 15:45:58 +02:00
Jan Tomášek
fbf6a8dc39
Merge pull request #1426 from 3clyp50/ready 2026-04-03 14:35:56 +02:00
Alessandro
db8bc111ca prompts: strict json guidance; concise responses
Trying to steer the model into treating the final curly brace of a JSON obj as EOS token. Also defaulting to concise responses, expanding only when needed.
2026-04-03 14:13:37 +02:00
Jan Tomášek
3507425380
Merge pull request #1423 from 3clyp50/prompts4
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
prompts: restore legacy, plugins, agent0 profile
2026-04-03 07:10:49 +02:00
Alessandro
86dca86f6f prompts: restore legacy, plugins, agent0 profile
Restore main.communication, main.solving, main.tips and tool.response, which made the model dumber. For some reasons the drawback was more visible with frontier LLMs.

restore builtin plugins and agent0 profile
2026-04-03 06:49:25 +02:00
Jan Tomášek
3a512b8c1b
Merge pull request #1419 from 3clyp50/prompts
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
prompts: restore tool examples for better model guidance
2026-04-02 21:42:49 +02:00
Alessandro
ef92a5e378 prompts: restore tool examples for better model guidance
Commit 54362bf8ee went too far stripping too many JSON examples to guide LLMs.
2026-04-02 18:50:13 +02:00
Jan Tomášek
756654b2ba
Merge pull request #1389 from 3clyp50/a0_small
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
prompts: adopt compact defaults and rebalance guidance
2026-04-02 16:21:29 +02:00
Jan Tomášek
01de1f7bca
Merge pull request #1402 from 3clyp50/discovery
feat: add plugin discovery to dashboard and onboarding wizard
2026-04-02 16:21:05 +02:00
Jan Tomášek
ace6c9e137
Merge pull request #1411 from 3clyp50/ready
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
fix: guard against missing plugin directory in config loads
2026-04-01 21:19:15 +02:00
Alessandro
1cccb68d0d fix: guard against missing plugin directory in config loads
`find_plugin_dir` can return `None` if a plugin cannot be found. Passing
this null value to `files.get_abs_path` caused crashes during config
retrieval. `get_plugin_config` and `get_default_plugin_config` now check
for a valid directory and return early if it is missing.
2026-04-01 20:42:24 +02:00
Alessandro
74efea68cd prompts: override role with specifics md file 2026-04-01 18:47:36 +02:00
Nicolas Leão
bc274e5d80
Merge pull request #1404 from 3clyp50/ready
Some checks failed
Build And Publish Docker Images / plan (push) Has been cancelled
Build And Publish Docker Images / build (push) Has been cancelled
quick update flow and migration guidance
2026-03-31 17:01:15 -03:00
Alessandro
bfe4119d72 quick update flow and migration guidance 2026-03-31 21:53:47 +02:00
Alessandro
5dd40db386 add banners agentic docs 2026-03-31 21:23:58 +02:00
Alessandro
0061b3a511 feat: add built-in plugin discovery cards to the welcome screen
Add the always-enabled `_discovery` plugin to turn the welcome screen into a discovery surface for the Plugin Hub and A0 integrations.

Includes a hero card plus Telegram, Email, and WhatsApp feature cards, with persistent dismiss/restore state, CTA routing to plugin config screens, and self-contained placeholder artwork. Implemented entirely through the existing WebUI extension mechanism with no core welcome-screen changes.

stores cleanup

layout polish and onboarding integration

Move feature card titles beside thumbnails for better space efficiency
and visibility. Restructure card markup and styles to support a fluid
grid layout and horizontal alignment.

Integrate discovery cards into the final onboarding step via a new
'onboarding-success-end' extension point, ensuring new users see
extension opportunities immediately after setup.

Hide discovery cards on the dashboard while the missing API key
onboarding banner is visible to reduce UI noise and user confusion during initial config.

update discovery card initialization and loading logic

Enhance the discovery store to fetch cards from the API, improving the dynamic loading of discovery cards based on user context. This change optimizes the user experience by ensuring relevant cards are displayed immediately after onboarding and when modals are closed.

And on top of that, there's a proper backend for these new cards.
2026-03-31 19:59:16 +02:00
Nicolas Leão
b531e5ee42 simplify preset editing screen 2026-03-31 14:08:04 -03:00
Jan Tomášek
797def4785
Merge pull request #1398 from 3clyp50/docsupdate 2026-03-31 18:09:49 +02:00
Alessandro
97591b6908 docs: align install and update flow 2026-03-31 16:36:27 +02:00
frdel
0bbc657dd3 fix: apply btn-field class to disabled update buttons in self-update modal
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
2026-03-31 15:29:51 +02:00
frdel
b94d4b79ae refactor: comprehensive UI server restructuring and self-update enhancements
- Extract UI server setup into UiServerRuntime class with modular initialization
- Move environment configuration, route registration, and transport handlers to helpers/ui_server.py
- Add released_at timestamp tracking for git tags and branch heads across update system
- Implement get_current_major_main_latest_info to find latest same-major version on main branch
- Add major_upgrade_versions and main_branch_latest fields to update info payload
- Remove
2026-03-31 15:20:57 +02:00
frdel
80518f22a6 Squashed commit of the following:
commit 5193ef7501
Author: frdel <38891707+frdel@users.noreply.github.com>
Date:   Tue Mar 31 09:47:02 2026 +0200

    refactor: change default mode from dedicated to self-chat and reorder UI settings

    - Change default mode to self-chat across all modules
    - Update README to reflect self-chat as primary mode with security warning
    - Move session/media storage from usr/whatsapp to tmp/whatsapp
    - Reorder config UI: move Mode above Allowed Numbers
    - Add warning banner when allowed_numbers is empty in self-chat mode
    - Move Bridge Port and Poll Interval to bottom of settings
    - Update mode descriptions to clarify self-chat handles both self

commit 9fece911b5
Author: frdel <38891707+frdel@users.noreply.github.com>
Date:   Tue Mar 31 09:20:35 2026 +0200

    refactor: centralize WhatsApp storage paths and improve bridge dependency handling

    - Add storage_paths.py helper for consistent session/media/runtime paths
    - Replace hardcoded usr/whatsapp paths across all modules
    - Fix bridge lock to be event-loop-aware (recreate per loop)
    - Add automatic dependency reinstall on startup failures
    - Track bridge startup output for better error diagnostics
    - Add dependency state tracking with package.json hash validation
    - Implement force reinstall when node_modules appears

commit bc511d221d
Author: linuztx <linuztx@gmail.com>
Date:   Tue Mar 31 09:07:46 2026 +0800

    fix: stop poll loop immediately when Node.js is not installed

commit a9554e132f
Author: linuztx <linuztx@gmail.com>
Date:   Tue Mar 31 08:49:15 2026 +0800

    fix: auto-reinstall corrupt node_modules and stop poll loop after repeated bridge failures

    _ensure_npm_install now verifies key package exists, not just
    node_modules dir. Wipes and reinstalls if corrupt.

    Poll loop stops after 5 consecutive bridge start failures instead
    of spamming errors and making A0 unusable.

commit 61fa1bf487
Author: linuztx <linuztx@gmail.com>
Date:   Tue Mar 31 08:38:51 2026 +0800

    fix: move allowed_numbers filtering from JS bridge to Python handler

    The JS bridge used LIDs (internal WhatsApp identifiers) for sender
    matching which never matched actual phone numbers. Moved filtering
    to Python handler.py where config is read fresh each poll cycle.

    - Add senderNumber (resolved phone) to bridge message payload
    - Filter in poll_messages() with normalized number comparison
    - Remove --allowed-numbers CLI arg and JS-side filtering
    - Fix ensure_bridge_http_up not recording _bridge_config
    - Fix falsy empty-dict check in bridge restart detection

commit 64ee177897
Author: linuztx <linuztx@gmail.com>
Date:   Sat Mar 28 23:34:23 2026 +0800

    refactor: move email agent instructions to system prompt and update prompt labels

commit 0f53b41d80
Author: linuztx <linuztx@gmail.com>
Date:   Sat Mar 28 10:59:44 2026 +0800

    Add node_modules to gitignore

commit eb6a4d3ad2
Author: linuztx <linuztx@gmail.com>
Date:   Sat Mar 28 10:53:59 2026 +0800

    Add WhatsApp plugin thumbnail

commit 39bed4f538
Author: linuztx <linuztx@gmail.com>
Date:   Sat Mar 28 10:51:47 2026 +0800

    refactor: rename allowed_users to allowed_numbers across plugin

commit e4991b6e6e
Author: linuztx <linuztx@gmail.com>
Date:   Fri Mar 27 21:58:29 2026 +0800

    improve: move agent instructions from per-message to system prompt

commit 4f1be15fa7
Author: linuztx <linuztx@gmail.com>
Date:   Fri Mar 27 21:00:25 2026 +0800

    improve: add macOS port kill support and bridge process destructor cleanup

commit f5349753d7
Author: linuztx <linuztx@gmail.com>
Date:   Fri Mar 27 17:09:56 2026 +0800

    improve: remove redundant bridge_manager from execute, rely on poll loop finally

commit 9d9dd4bd7f
Author: linuztx <linuztx@gmail.com>
Date:   Fri Mar 27 14:41:14 2026 +0800

    fix: stop bridge and poll loop when plugin is disabled or toggled off

commit 66b0a7d3e0
Author: linuztx <linuztx@gmail.com>
Date:   Fri Mar 27 11:05:58 2026 +0800

    improve: fix allowed users input, auto-strip + prefix, log ignored messages

commit 938e7b9312
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 23:26:42 2026 +0800

    improve: add line break to allowed users description

commit 4ef64b9121
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 22:44:55 2026 +0800

    feat: convert markdown to WhatsApp formatting before sending replies

commit f549b49f44
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 22:34:56 2026 +0800

    improve: add progress update instructions to system context prompt

commit 66e5d51dcf
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 22:23:32 2026 +0800

    fix: stop typing indicator on agent error or generation failure

commit 3dd01cd04c
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 18:31:38 2026 +0800

    improve: persistent typing indicator with poll-based refresh

commit 8d0ec86f15
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 17:11:25 2026 +0800

    Update README.md

commit e664673c1c
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 16:05:44 2026 +0800

    feat: add agent prefix to self-chat replies for visual distinction

commit 18c5716d10
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 15:43:01 2026 +0800

    fix: clear typing indicator after sending reply in self-chat mode

commit 7c653c9d56
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 14:43:06 2026 +0800

    improve: merge WhatsApp Link and Disconnect into single Account field

commit 57c95e6f13
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 14:11:05 2026 +0800

    feat: add disconnect account option to switch WhatsApp accounts

commit c62695356e
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 14:00:00 2026 +0800

    improve: move mode description inline and reorder Allow Group after Allowed Users

commit 18a56ea446
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 13:44:17 2026 +0800

    fix: remove duplicate typing indicator before sending reply

commit 44c90a118f
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 13:30:06 2026 +0800

    improve: remove sender number from DM prompt

commit 64fe7d0302
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 13:17:29 2026 +0800

    fix: handle documentWithCaptionMessage wrapper for captioned documents

commit 00b6657185
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 13:06:40 2026 +0800

    feat: add attachment reader/writer with RFC and download all media types

commit 8041c085d2
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 11:45:17 2026 +0800

    improve: update group prompt and reply instructions

commit 71a6eb7557
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 11:26:36 2026 +0800

    feat: reply to specific messages in group chats with quote

commit 6bf63eb9c6
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 09:57:34 2026 +0800

    feat: detect replies to bot messages in group chats

commit b4492e0759
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 09:20:27 2026 +0800

    improve: resolve group names and sender LIDs in bridge messages

commit 14e673f165
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 04:44:50 2026 +0800

    feat: add allow_group toggle to respond only when mentioned in group chats

commit 40f4884319
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 03:20:02 2026 +0800

    refactor: rename mode value from bot to dedicated

commit 50af7c2bde
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 02:34:51 2026 +0800

    fix: kill orphaned bridge process on port before starting new one

commit 45b21c093a
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 02:07:45 2026 +0800

    improve: auto-restart bridge when config changes

commit a12183ba6e
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 01:39:55 2026 +0800

    feat: add bot and self-chat mode selection for WhatsApp bridge

commit bb8961ab73
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 00:56:56 2026 +0800

    improve: send typing indicator immediately on message receive

commit 84c12b0c23
Author: linuztx <linuztx@gmail.com>
Date:   Thu Mar 26 00:29:04 2026 +0800

    feat: add WhatsApp integration plugin with Baileys bridge and QR pairing
2026-03-31 09:47:25 +02:00
Alessandro
f4fd91260d restore agent.system.tool.call_sub.py dynamic loader 2026-03-30 22:10:11 +02:00
Alessandro
54362bf8ee prompts: adopt compact defaults and rebalance guidance
Promote the a0_small prompt work into the shipped default stack.

Token count for default prompt, accounting for tools, plugins, secrets placeholders, inactive project, etc: 2996 tokens.

- migrate compact prompt fragments into core prompts, plugin-owned prompts, and the agent0 overlay
- remove the obsolete a0_small profile and rename the tool-call knowledge reference to a generic framework file
- keep a small set of high-value JSON examples while preserving key guardrails for tool names, tool args, and method-style calls
- bake balanced conciseness into default response behavior without changing the initial greeting
- drop the call_sub prompt-side loader and keep call_sub guidance self-contained
- restore essential secrets/security guidance, preserve inactive-project messaging, and rebalance the A2A prompt
- add a regression test that verifies the assembled default agent0 prompt stays under the token budget and retains critical guardrails
2026-03-30 21:44:20 +02:00
frdel
3df7065685 Squashed commit of the following:
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
commit e48ee68bf6
Author: keyboardstaff <keyboardstaff@gmail.com>
Date:   Sun Mar 29 06:27:50 2026 -0700

    fix(_model_config): restore utility preset provider fallback and empty option

commit c16134e624
Author: keyboardstaff <keyboardstaff@gmail.com>
Date:   Sun Mar 29 00:28:49 2026 -0700

    fix(_model_config): prevent Settings Save from clobbering API keys saved via Configure Models

commit 9ff4133d7d
Author: keyboardstaff <keyboardstaff@gmail.com>
Date:   Sat Mar 28 10:11:57 2026 -0700

    refactor(_model_config): extract reusable model-field component, split store into mixins, unify API key lifecycle

commit 14de2ab442
Merge: 69e17748 eef6d6d0
Author: Wabifocus <keyboardstaff@gmail.com>
Date:   Sat Mar 28 19:41:43 2026 -0700

    Merge pull request #48 from agent0ai/development

    Development
2026-03-30 17:19:33 +02:00
frdel
fb02b5f4cc enable api caching
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
enable websocket and api caching params
2026-03-30 17:15:50 +02:00
Jan Tomášek
9390ba9624
Merge pull request #1344 from keyboardstaff/ws-rework
refactor: Comprehensive WebSocket System Rework
2026-03-30 16:45:49 +02:00
frdel
44e008745d Sanitize print logs; refactor popular plugin logic
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Ensure printed output and HTML logs are safe by importing and applying sanitize_string, opening log files with utf-8 and errors='replace', and sanitizing text before writing. Add tests to verify lone surrogate characters are replaced and that logging won't crash on invalid Unicode. In the plugin installer UI, introduce POPULAR_PLUGIN_MIN_STARS and centralize popularity checking in _isPopularPlugin, using it for filtering and counts.
2026-03-30 11:50:59 +02:00
Jan Tomášek
430f8479a9
Merge pull request #1385 from 3clyp50/small_prompts
prompts: a0_small prompt set
2026-03-30 11:45:24 +02:00
frdel
2a21500a88 onboarding thumbnail
generated thumbnail for onboarding plugin
2026-03-30 09:43:05 +02:00
Alessandro
a2bd044a9d a0_small prompt set prototype
Created a new prompt set for small models.

A0 now starts with 2.5k tokens usage, not 10k.

improve small model tool policy

prompts: knowledge with tool call examples

- Adds knowledge examples for tool-call shapes and memory usage (workaround to not have examples in tool prompts)
- Adds a small prompt hint to consult memory examples when tool args are unclear

stricter small-model guardrails

Canonical JSON example, exact tool-name matching, method suffix enforcement, British spelling for behaviour_adjustment, boolean guidance for call_subordinate.reset, and the “don’t improvise tools after an error” rule are the new additions here.

Trying to make
2026-03-30 07:11:34 +02:00
Nicolas Leão
4b9f0ecc23
Merge pull request #1381 from nicolasleao/development
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
fix: let agents fix their own tool call format instead of erroring
2026-03-29 16:12:23 -03:00
Nicolas Leão
bd5eb7c61c fix: let agents fix their own tool call format instead of erroring 2026-03-29 11:06:39 -03:00
Nicolas Leão
6c4167755a Merge remote-tracking branch 'origin/development' into ready
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
2026-03-29 08:24:45 -03:00
Nicolas Leão
1623088699
Merge pull request #1375 from keyboardstaff/chat-nav-buttons
feat(ui): reposition chat nav buttons as floating overlay in bottom-right of chat area
2026-03-29 08:17:11 -03:00
keyboardstaff
1539424d64 feat(ui): reposition chat nav buttons as floating overlay in bottom-right of chat area 2026-03-29 02:13:30 -07:00
Nicolas Leão
63988108b7
Merge pull request #1369 from 3clyp50/ready
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
progress-bar-right css hotfix
2026-03-28 20:08:47 -03:00
Alessandro
39bb30646a progress-bar-right css hotfix 2026-03-28 23:53:13 +01:00
Nicolas Leão
eef6d6d007
Merge pull request #1362 from TerminallyLazy/update-model-config-ui
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Add model config presets and ignore agent artifacts
2026-03-28 16:20:08 -03:00