Commit Graph

1554 Commits

Author SHA1 Message Date
Peter Steinberger
3ac191d95d feat(sessions): label lookup tightening (#570) (thanks @azade-c) 2026-01-09 16:42:09 +01:00
Peter Steinberger
6160f7faa5 fix: harden node bridge keepalive 2026-01-09 15:46:45 +01:00
Peter Steinberger
1dba0b66c2 chore: regen protocol models (#570) (thanks @azade-c) 2026-01-09 15:32:49 +01:00
Peter Steinberger
68d4777eef fix: land mac node bridge ping loop (#572) (thanks @ngutman) 2026-01-09 14:01:20 +01:00
Nimrod Gutman
7821867e71 fix(macos): add node bridge ping loop 2026-01-09 13:50:38 +01:00
Peter Steinberger
947844117c feat: wire multi-agent config and routing
Co-authored-by: Mark Pors <1078320+pors@users.noreply.github.com>
2026-01-09 12:48:42 +00:00
Peter Steinberger
d4fcbc26b2 chore: bump versions to 2026.1.9 2026-01-09 10:02:15 +01:00
Peter Steinberger
276f0b0407 feat: add usage cost reporting 2026-01-09 02:29:54 +00:00
Erik von Essen Fisher
778a87441c Rebrand app icons from Clawdis to Clawdbot
Replace app icons with new Clawdbot branding (lobster-in-phone-booth design) across iOS, Android, and macOS.

Changes:
- iOS: Updated all 14 icon sizes in AppIcon.appiconset (20px to 1024px)
- Android: Updated launcher icons for all density buckets (mdpi to xxxhdpi)
- macOS: Updated Icon.icon bundle and regenerated Clawdbot.icns

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 23:31:24 +01:00
Peter Steinberger
d4e62f5d80 fix: land macos resource bundle guard (#473) — thanks @gupsammy 2026-01-08 19:24:20 +00:00
gupsammy
135fe4a148 fix(macos): prevent crash from missing ClawdbotKit resources and Swift library
The macOS app was crashing in two scenarios:

1. Bundle.module crash (fixes #213): When the first tool event arrived,
   ToolDisplayRegistry tried to load config via ClawdbotKitResources.bundle,
   which used Bundle.module directly. In packaged apps, Bundle.module
   couldn't find the resource bundle at the expected path, causing a
   fatal assertion failure after ~40-80 minutes of runtime.

2. dyld crash (fixes #417): Swift 6.2 requires libswiftCompatibilitySpan.dylib
   but SwiftPM doesn't bundle it automatically, causing immediate crash on
   launch with "Library not loaded" error.

Changes:
- ClawdbotKitResources.swift: Replace direct Bundle.module access with a
  safe locator that checks multiple paths and falls back gracefully
- package-mac-app.sh: Copy ClawdbotKit_ClawdbotKit.bundle to Resources
- package-mac-app.sh: Copy libswiftCompatibilitySpan.dylib from Xcode
  toolchain to Frameworks

Tested on macOS 26.2 with Swift 6.2 - app launches and runs without crashes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 19:24:20 +00:00
Peter Steinberger
f003a1ecbc fix: remove swift/android build warnings 2026-01-08 05:57:27 +00:00
Peter Steinberger
fcfda99738 chore: sync app versions 2026-01-08 05:21:20 +00:00
Peter Steinberger
24cafda943 chore: bump version to 2026.1.8 2026-01-08 05:15:51 +00:00
Peter Steinberger
fcaf0966d9 fix(ci): sync logs tail protocol artifacts 2026-01-08 03:49:19 +00:00
Peter Steinberger
bb2ad2abb0 style: swiftformat sweep 2026-01-08 02:36:29 +00:00
SirCrumpet
cb92c53271 fix(macos): fix node bridge tunnel port override 2026-01-08 03:09:31 +01:00
Peter Steinberger
425253a7ca style: align voice wake text utils format 2026-01-08 01:49:29 +00:00
Peter Steinberger
870a8746ba refactor: share voice wake text utils 2026-01-08 01:46:25 +00:00
Peter Steinberger
95dca89c98 fix: voice wake logging privacy (PR #438 @xadenryan) 2026-01-08 01:37:42 +00:00
Xaden Ryan
403bbb6495 Mac: format voice wake files 2026-01-08 01:36:16 +00:00
Xaden Ryan
15e0d0476a Voice Wake: trigger on wake-word pause 2026-01-08 01:36:15 +00:00
Xaden Ryan
607a10921e Voice Wake: preserve mic selection across disconnects
- Keep the chosen mic label visible when it disconnects and show a disconnected hint while falling back to system default.
- Avoid clearing the preferred mic on device changes so it auto-restores when available.
- Add audio input change and default-input logs in voice wake runtime/tester/meter to debug routing.
2026-01-08 01:36:15 +00:00
Xaden Ryan
3056102068 Mac: keep voice wake tester local-only
Why: Start Test is a local verification tool, but it was forwarding transcripts to the gateway/chat, which confused users and made tests look like real commands.

What: stop forwarding from VoiceWakeTester and clarify in docs that the tester does not send to the gateway.
2026-01-08 01:36:15 +00:00
Xaden Ryan
0db7c07793 Mac: stabilize voice wake test flow
Why: voice wake tests often delivered partial/final transcripts without reliable word timings, so trigger matching failed, timeouts overwrote detections, and test runs/mic capture kept running after UI changes.

What: add text-only/prefix fallback and silence-based detection in the test flow, stop/clean up any prior test, cancel timeout on detection/stop, and tear down meter/test when the Voice Wake tab is inactive. Runtime detection now falls back on final text-only matches when timing is missing. UI state now reflects finalizing and prevents hanging tests.
2026-01-08 01:36:15 +00:00
Peter Steinberger
72183933c4 fix: resolve CI asset/protocol drift 2026-01-08 01:25:17 +00:00
Peter Steinberger
0314103c1b style(macos): swiftformat + swiftlint cleanup 2026-01-07 20:41:41 +00:00
Peter Steinberger
56af37c5a5 test(macos): make env/defaults helper Swift 6-safe 2026-01-07 20:32:15 +00:00
Peter Steinberger
a11a91997c refactor(macos): inject main-actor services into node runtime 2026-01-07 20:32:15 +00:00
Peter Steinberger
429000566c test(macos): isolate env + defaults 2026-01-07 20:32:15 +00:00
Peter Steinberger
9586f45e0c refactor(macos): move launchctl + plist snapshot 2026-01-07 20:32:15 +00:00
Peter Steinberger
94f4bdf34a fix(macos): stabilize node runtime + menu sessions 2026-01-07 19:42:49 +00:00
Peter Steinberger
a81b843793 refactor(macos): drop duplicate AnyCodable 2026-01-07 19:42:49 +00:00
Peter Steinberger
13ce4932ac fix(macos): make launchd enable idempotent 2026-01-07 19:42:49 +00:00
gupsammy
7ee4c81e7f fix(macos): prevent gateway launchd race condition on startup (#306) 2026-01-07 19:42:49 +00:00
Peter Steinberger
3e5a784d04 fix(ClawdbotKit): bundle tool-display.json 2026-01-07 18:30:45 +00:00
François Catuhe
48a96b4b0b fix(android): rotate camera photos by EXIF orientation 2026-01-07 19:19:07 +01:00
Manuel Jiménez Torres
23967e02a5 fix(android): fix build error 2026-01-07 18:09:31 +00:00
Peter Steinberger
09655917e3 fix(android): drop broken apk output renaming 2026-01-07 18:04:37 +00:00
Peter Steinberger
26aa6793aa fix(android): restore tool display config 2026-01-07 15:38:10 +00:00
Peter Steinberger
13c71edd36 Merge branch 'main' into pr-402 2026-01-07 15:36:34 +00:00
Peter Steinberger
492c8f728d build(android): bump 2026.1.7 + apk naming 2026-01-07 15:30:03 +00:00
François Catuhe
430c85320d android: set version 2026.1.5, add APK naming convention, remove duplicate asset 2026-01-07 16:05:26 +01:00
Peter Steinberger
8907e19b97 fix(macos): validate remote ports 2026-01-07 11:00:21 +00:00
Nima Karimi
b33331c3c8 fix(macos): honor discovered gateway ports 2026-01-07 10:51:06 +00:00
Peter Steinberger
82458c2e9f feat: add provider usage tracking 2026-01-07 11:42:46 +01:00
Peter Steinberger
3e1361e206 chore: sync swift protocol models 2026-01-07 06:14:15 +00:00
Peter Steinberger
c89835b2ae fix(macos): fix swiftformat lint in A2UI handler 2026-01-06 21:54:46 +01:00
Peter Steinberger
33ef15e66e Merge PR #310 2026-01-06 20:25:47 +01:00
Peter Steinberger
84d9d1fd66 build(protocol): regenerate protocol artifacts 2026-01-06 18:37:20 +00:00
Peter Steinberger
882bcaf414 feat: multi-agent routing + multi-account providers 2026-01-06 18:33:37 +00:00
Nimrod Gutman
d0260c1e49 fix(macOS): keep gateway config sync local 2026-01-06 18:05:28 +02:00
Peter Steinberger
f6fda75f02 chore(protocol): regenerate GatewayModels.swift 2026-01-06 09:55:58 +01:00
Shadow
aae366d41b chore: fixed CI 2026-01-05 23:36:48 -06:00
Marcus Neves
9572f92a0f Cron: normalize cron.add inputs + align channels (#256)
* fix: harden cron add and align channels

* fix: keep cron tool id params

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-06 02:09:48 +00:00
Peter Steinberger
fdb81c006c fix(ci): satisfy formatter checks 2026-01-05 13:55:53 +00:00
Peter Steinberger
02f259dd00 fix: sync gateway mode via gateway config 2026-01-05 06:39:37 +00:00
Peter Steinberger
93e4584fca fix: custom connections sidebar 2026-01-05 07:25:13 +01:00
Peter Steinberger
b61a2b0679 fix: prefer gateway config in local mode 2026-01-05 06:16:48 +00:00
Peter Steinberger
e5df2e782f fix: preserve JSON5 config parsing 2026-01-05 06:16:48 +00:00
Peter Steinberger
3fa0fcd399 fix: remove sidebar toggle toolbar item safely 2026-01-05 06:49:57 +01:00
Peter Steinberger
01c45cc13b fix: remove settings sidebar toggle 2026-01-05 06:48:49 +01:00
Peter Steinberger
23723430fb fix: hide settings toolbar row 2026-01-05 06:36:34 +01:00
Peter Steinberger
da8ed6928d refactor: align agent lifecycle 2026-01-05 05:55:02 +01:00
Peter Steinberger
e3df06bf02 fix: use sidebar settings layout 2026-01-05 05:54:21 +01:00
Peter Steinberger
654ba9a265 fix: avoid settings toolbar overflow 2026-01-05 05:32:14 +01:00
Peter Steinberger
e1e04fec39 fix: honor tailnet bind for macOS gateway endpoint 2026-01-05 05:30:40 +01:00
Peter Steinberger
25d43ca55c chore: sync generated protocol swift 2026-01-05 00:54:54 +00:00
Peter Steinberger
fb731a0756 chore: apply upstream autostash 2026-01-05 00:26:52 +00:00
Andranik Sahakyan
9ade229e09 fix(mac): add Sendable conformance to generated Swift protocol structs (#195)
* fix(mac): add Sendable conformance to generated Swift protocol structs

* fix(mac): make generated protocol types Sendable

* chore(mac): drop redundant Sendable extensions

* docs(changelog): thank @andranik-sahakyan for Sendable fix

* chore(swiftformat): exclude generated protocol models

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-04 22:39:21 +00:00
Nachx639
c3b444a553 fix(macos): remove authorizedWhenInUse references (iOS-only API) (#165)
CLAuthorizationStatus.authorizedWhenInUse only exists on iOS. On macOS,
location services only support .authorizedAlways. This was causing
compilation warnings and potentially incorrect behavior.

Fixes:
- GeneralSettings.swift: Remove authorizedWhenInUse check
- PermissionManager.swift: Update ensureLocation and status methods
- MacNodeRuntime.swift: Update location permission check

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 17:58:01 +00:00
Peter Steinberger
9d6ed9c10d test: cover macos location permission status 2026-01-04 18:49:36 +01:00
Peter Steinberger
46bd8e1fdd chore: update protocol swift models 2026-01-04 18:16:36 +01:00
Peter Steinberger
3e6d461b5d style: swiftformat gateway models 2026-01-04 18:12:33 +01:00
Peter Steinberger
3d897df2fc test(android): cover notification tap intent 2026-01-04 18:05:26 +01:00
Manuel Jiménez Torres
61698679c6 feat(android): open app when tapping foreground service notification
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 18:05:26 +01:00
Peter Steinberger
2c7e946612 fix: update ClawdBot Swift references 2026-01-04 17:57:53 +01:00
Peter Steinberger
d9222ca3b4 fix: macOS Swift cleanup 2026-01-04 17:57:53 +01:00
Peter Steinberger
3d0b703ae4 chore(protocol): regenerate GatewayModels 2026-01-04 16:05:47 +00:00
Peter Steinberger
5eef8eadde fix: avoid sendable issue in mac location timeout 2026-01-04 16:27:17 +01:00
Peter Steinberger
fa4d5cb362 chore: lint and format cleanup 2026-01-04 16:24:17 +01:00
Peter Steinberger
81349a30a5 refactor: streamline node invoke handling 2026-01-04 16:24:17 +01:00
Peter Steinberger
51fcb3bea3 refactor: split connections settings/store 2026-01-04 16:24:17 +01:00
Peter Steinberger
f7cb3846f1 chore: rename project to clawdbot 2026-01-04 14:38:51 +00:00
Peter Steinberger
a1806acb16 fix: keep node presence fresh 2026-01-04 14:41:52 +01:00
Peter Steinberger
1d85ac2e04 fix(android): refresh hello on sms permission grant 2026-01-04 13:59:05 +01:00
Peter Steinberger
4a9bd42c0c fix(android): add sms permission flow and tests 2026-01-04 13:59:05 +01:00
Vasanth Rao Naik Sabavat
c208f0c709 feat(android): add SMS sending capability to Android node
Add sms.send command to allow sending text messages via the paired Android device.

Changes:
- Add SmsManager class to handle SMS sending via Android SmsManager API
- Add ClawdisSmsCommand enum and Sms capability to protocol constants
- Wire sms.send command into NodeRuntime invoke handler
- Add SEND_SMS permission to AndroidManifest.xml
- Advertise sms capability when SEND_SMS permission is granted

The SMS capability is only advertised when the user has granted SEND_SMS
permission. Messages longer than 160 chars are automatically split into
multipart messages.
2026-01-04 13:58:05 +01:00
Peter Steinberger
79272d0efc chore: refresh protocol models 2026-01-04 07:07:21 +01:00
Peter Steinberger
2a8ce783ae fix(macos): bridge wizard option values 2026-01-04 06:17:07 +01:00
Tu Nombre Real
4463e3f39c feat(macos): add Swift 6 strict concurrency compatibility
Prepares the macOS app for Swift 6 strict concurrency mode by:

1. Adding Sendable conformance to WizardNextResult, WizardStartResult,
   and WizardStatusResult in GatewayModels.swift

2. Adding AnyCodable bridging helpers in OnboardingWizard.swift to
   handle type conflicts between ClawdisProtocol and local module

3. Making CLLocationManagerDelegate methods nonisolated in:
   - MacNodeLocationService.swift
   - PermissionManager.swift (LocationPermissionRequester)

   Using Task { @MainActor in } pattern to safely access MainActor
   state from nonisolated protocol requirements.

These changes are forward-compatible and don't affect behavior on
current Swift versions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 06:09:52 +01:00
Peter Steinberger
9f8a3bd1b9 feat(sessions): add agent-to-agent post step 2026-01-04 03:04:55 +01:00
Peter Steinberger
eda4540021 fix: render thinking text in italics 2026-01-04 02:44:11 +01:00
Cash Williams
90a7a7db20 fix(android): handle unreachable gateway gracefully
Previously, if the gateway was unreachable (wrong IP, offline, etc.),
the Android app would crash with an unhandled socket exception.

Changes:
- Wrap socket.connect() in try/catch to handle connection failures
- Return PairResult with error message instead of crashing
- Display actual error message in status text instead of generic 'pairing required'

This gives users useful feedback like 'Connection refused' or
'Network is unreachable' instead of a crash.
2026-01-04 01:44:43 +01:00
Peter Steinberger
b67a0d0d28 chore: regen Swift protocol models 2026-01-04 01:20:20 +01:00
Peter Steinberger
6b6a4c69f8 fix: lock main session deletion 2026-01-03 23:57:17 +00:00
Peter Steinberger
df609cdd27 feat: add node location support 2026-01-04 00:54:44 +01:00
Peter Steinberger
76c118657e feat(macos): sync gateway config 2026-01-03 22:17:04 +01:00
Peter Steinberger
965f9c4746 Discord: default reaction notifications to own 2026-01-03 18:48:36 +00:00
Shadow
1acd162502 Discord: add reaction notification allowlist 2026-01-03 18:48:36 +00:00
Peter Steinberger
40192f9f22 fix: avoid Swift compiler crash in onboarding wizard 2026-01-03 17:59:37 +00:00
Peter Steinberger
5052414f12 feat: unify onboarding + config schema 2026-01-03 16:48:08 +01:00
Peter Steinberger
d6509b9e55 fix: update protocol models and android parsing 2026-01-03 15:04:24 +00:00
Peter Steinberger
1eb491c30b fix: restructure macOS connections settings 2026-01-03 14:25:03 +01:00
Peter Steinberger
5f95aabe19 fix(macos): expand onboarding window height 2026-01-03 13:34:30 +01:00
Peter Steinberger
38b755935c feat: centralize tool display metadata 2026-01-03 13:18:27 +01:00
Peter Steinberger
79d21b58e4 refactor: rename bundle identifiers to com.clawdis 2026-01-03 12:26:22 +01:00
Peter Steinberger
a5340a920b feat: support configurable gateway port 2026-01-03 12:00:17 +01:00
Shadow
cdd30c4c3e Discord: update UIs to use the new config 2026-01-03 01:02:22 -06:00
Peter Steinberger
2dcd90ece8 chore: update protocol swift models 2026-01-03 06:44:21 +01:00
Peter Steinberger
e9e1b83418 fix: show rich session names in chat UIs 2026-01-03 05:07:13 +01:00
Shadow
250db134cb UI: add discord action toggles 2026-01-03 03:07:13 +01:00
Shadow
1aff389226 Discord: drop enableReactions config 2026-01-03 03:07:13 +01:00
Peter Steinberger
41fd695de6 fix: respect onboarding scroll indicator preference 2026-01-03 02:55:43 +01:00
Shadow
e10ee6fb27 macOS: add onboarding scroll gutter 2026-01-03 02:55:43 +01:00
Peter Steinberger
4fb2fbb523 fix(mac): resolve camera type deprecation 2026-01-03 01:49:27 +01:00
Peter Steinberger
015239367c fix(mac): harden remote tunnel recovery 2026-01-03 00:02:27 +01:00
Peter Steinberger
1756e6a891 fix: align discord config ui 2026-01-02 21:15:59 +01:00
Peter Steinberger
b01ee75b8d Merge pull request #108 from thewilloftheshadow/shadow/ui-connection-update
UI: Update connections UIs
2026-01-02 21:04:45 +01:00
Peter Steinberger
95c0b832d8 fix(macos): resolve gateway launch args 2026-01-02 19:58:38 +00:00
Peter Steinberger
5a65a0db96 test: cover camera list invoke 2026-01-02 20:24:41 +01:00
Peter Steinberger
5a1067fb58 fix(macos): improve session preview loading 2026-01-02 19:55:19 +01:00
Shadow
fb708b073b macOS: swiftformat connections settings 2026-01-02 12:30:59 -06:00
Shadow
2211996cea macOS: fix swiftlint param count 2026-01-02 12:25:47 -06:00
Shadow
e347bf8656 Update connections UIs 2026-01-02 12:06:05 -06:00
Peter Steinberger
12b2e98f59 fix: satisfy swiftformat for ios build 2026-01-02 18:48:05 +01:00
Peter Steinberger
e33c732880 fix(macos): decode session preview payload 2026-01-02 18:32:03 +01:00
Peter Steinberger
057ec6c811 feat(macos): add session previews in menu 2026-01-02 18:29:47 +01:00
Peter Steinberger
95a6c4bceb feat: add camera list and device selection 2026-01-02 18:23:26 +01:00
Peter Steinberger
6339269ff1 fix: resolve mac camera continuation isolation 2026-01-02 18:02:24 +01:00
Peter Steinberger
af9bea95e1 fix: wait for camera exposure to settle 2026-01-02 17:57:34 +01:00
Peter Steinberger
2271d1a664 test(macos): cover gateway password whitespace 2026-01-02 17:15:26 +01:00
Peter Steinberger
1e89e507d8 fix(macos): keep config writes on main actor 2026-01-02 17:15:26 +01:00
Peter Steinberger
3536400745 chore: fix lint and add gateway auth tests 2026-01-02 17:15:26 +01:00
Peter Steinberger
d471340937 chore: merge origin/main 2026-01-02 16:50:29 +01:00
Peter Steinberger
560ed9a12e fix: harden gateway password auth 2026-01-02 16:47:52 +01:00
Peter Steinberger
b6fdb743e3 feat(macos): add Camera permission to onboarding flow
- Add 'camera' case to Capability enum
- Add UI strings (title, subtitle, icon) in PermissionsSettings
- Add ensureCamera() and camera status check in PermissionManager
- Add CameraPermissionHelper for opening System Settings

🦞 Clawd's first code contribution!
2026-01-02 15:27:54 +00:00
Peter Steinberger
189c4889c8 fix(macos): return node name 2026-01-02 15:28:34 +01:00
Peter Steinberger
2d88ded666 fix(macos): show gateway in devices list 2026-01-02 15:27:21 +01:00
Peter Steinberger
8913c8a507 fix(macos): suppress cancelled node refresh 2026-01-02 15:12:57 +01:00
Peter Steinberger
1e0f9f9e74 fix(macos): clarify gateway error state 2026-01-02 13:48:19 +01:00
Peter Steinberger
c65ee8e1f9 fix: add top padding before first chat message 2026-01-02 10:23:40 +01:00
Peter Steinberger
ce319bef69 refactor: normalize group session keys 2026-01-02 10:14:58 +01:00
Jefferson Nunn
bdef1abb4b feat(macOS): add gateway password auth support and fix Swift 6.2 concurrency
- Add CLAWDIS_GATEWAY_PASSWORD to launchd plist environment
- Read password from gateway.remote.password config in client
- Fix Swift 6.2 sending parameter violations in config save functions
- Add password parameter to GatewayConnection.Config type
- GatewayChannel now sends password in connect auth params
- GatewayEndpointStore and GatewayLaunchAgentManager read password from config
- CLI gateway client reads password from remote config and env
2026-01-01 21:34:46 -06:00
jeffersonwarrior
67b2f08b55 fix(macos): support password auth mode for gateway connections
GatewayChannel now sends both 'token' and 'password' fields in the auth
payload to support both authentication modes. Gateway checks the field
matching its auth.mode configuration ('token' or 'password').

Also adds config file password fallback for remote mode, allowing
gateway password to be configured in ~/.clawdis/clawdis.json without
requiring environment variables.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-01 21:26:37 -06:00
Peter Steinberger
19eb761f57 fix: keep chat scrolled to bottom on session switch 2026-01-02 00:21:48 +01:00
Peter Steinberger
680cdee9e3 style: fix swiftlint warnings 2026-01-02 00:17:49 +01:00
Peter Steinberger
1775fd3de9 feat: add recent session switchers 2026-01-01 23:50:26 +01:00
Peter Steinberger
db9977e38e fix(macos): colorize provider status subtitles 2026-01-01 23:16:22 +01:00
Peter Steinberger
9137a1decc feat(macos): verify Claude OAuth in onboarding 2026-01-01 23:16:15 +01:00