Skip to content
12 changes: 12 additions & 0 deletions docs/content/docs/(configuration)/config.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ context_window = 128000 # context window size in tokens
history_backfill_count = 50 # messages to fetch from platform on new channel
worker_log_mode = "errors_only" # "errors_only", "all_separate", or "all_combined"
cron_timezone = "UTC" # optional default timezone for cron active hours
user_timezone = "UTC" # optional default timezone for channel/worker time context

# Model routing per process type.
[defaults.routing]
Expand Down Expand Up @@ -116,6 +117,7 @@ id = "main"
default = true
workspace = "/custom/workspace/path" # optional, defaults to ~/.spacebot/agents/{id}/workspace
cron_timezone = "America/Los_Angeles" # optional per-agent cron timezone override
user_timezone = "America/Los_Angeles" # optional per-agent timezone override for channel/worker time context

# Per-agent routing overrides (merges with defaults).
[agents.routing]
Expand Down Expand Up @@ -417,6 +419,7 @@ At least one provider (legacy key or custom provider) must be configured.
| `history_backfill_count` | integer | 50 | Messages to fetch from platform on new channel |
| `worker_log_mode` | string | `"errors_only"` | Worker log persistence: `"errors_only"`, `"all_separate"`, or `"all_combined"` |
| `cron_timezone` | string | None | Default timezone for cron active-hours evaluation (IANA name like `UTC` or `America/New_York`) |
| `user_timezone` | string | inherits `cron_timezone` | Default timezone for channel/worker temporal context (IANA name) |

### `[defaults.routing]`

Expand Down Expand Up @@ -522,6 +525,7 @@ When branch/worker/cron dispatch happens before readiness is satisfied, Spacebot
| `default` | bool | false | Whether this is the default agent |
| `workspace` | string | `~/.spacebot/agents/{id}/workspace` | Custom workspace path |
| `cron_timezone` | string | inherits | Per-agent timezone override for cron active-hours evaluation |
| `user_timezone` | string | inherits | Per-agent timezone override for channel/worker temporal context |
| `max_concurrent_branches` | integer | inherits | Override instance default |
| `max_turns` | integer | inherits | Override instance default |
| `context_window` | integer | inherits | Override instance default |
Expand Down Expand Up @@ -577,6 +581,14 @@ Cron timezone precedence is:

If a configured timezone is invalid, Spacebot logs a warning and falls back to server local time.

Channel/worker temporal context timezone precedence is:

1. `agents.user_timezone`
2. `defaults.user_timezone`
3. `SPACEBOT_USER_TIMEZONE`
4. resolved cron timezone (from `agents.cron_timezone` / `defaults.cron_timezone` / `SPACEBOT_CRON_TIMEZONE`)
5. server local timezone

### `[messaging.discord]`

| Key | Type | Default | Description |
Expand Down
1 change: 1 addition & 0 deletions prompts/en/branch.md.j2
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,4 @@ Refine a task. Update the description as the user clarifies scope — append sec
- **observation** — a pattern noticed over time ("the user usually asks for code-first answers")
- **goal** — something the user or agent wants to achieve ("migrate to the new API by Q3"). Goals are aspirational and may span multiple conversations.
- **todo** — a concrete actionable task or reminder ("update the auth tests", "remind me to check the deploy tomorrow"). Todos are specific and completable.
7. For time-sensitive conclusions, anchor on explicit timestamps/context and include concrete dates when ambiguity is possible.
2 changes: 2 additions & 0 deletions prompts/en/channel.md.j2
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ You have a soul, an identity, and a personality. These are loaded separately and
## How You Work

Every turn, you receive the user's message along with a live status block showing active workers, branches, and recently completed work. Use this to stay aware of what's happening without asking.
The status block includes a current date/time line with timezone and UTC. Treat that as the source of truth for words like "today", "tomorrow", "yesterday", "now", and "later today".

When a background process (branch or worker) completes, you will receive a system message containing the full result text, tagged with the process type and ID. The user has NOT seen any of it — you must relay the substance to them using the reply tool. Include actual content and details, not just a summary teaser. Do not mention internal processes (branch, worker, process IDs). If a result is background work the user didn't ask about, incorporate it silently.

Expand Down Expand Up @@ -105,6 +106,7 @@ When in doubt, skip. Being a lurker who speaks when it matters is better than be
9. Save important information to memory. Be selective. When the user asks to forget something, branch to find and delete the relevant memories.
10. One worker per task. Never spawn multiple workers for the same request. If a worker is already handling something, wait for it to finish or route follow-ups to it. Check your status block before spawning.
11. On Discord and Slack, prefer rich responses when output is structured or multi-part (task outcomes, summaries, comparisons, checklists, incident/debug updates, plans). Use `reply` with `cards`/interactive elements (Discord) or `blocks` (Slack) instead of plain text walls when it improves clarity.
12. For time-sensitive responses, prefer concrete dates (for example, "March 5, 2026") in addition to relative phrases.

{%- if adapter_prompt %}
## Adapter Guidance
Expand Down
4 changes: 4 additions & 0 deletions prompts/en/fragments/system/worker_time_context.md.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## Time Context
- Current local date/time: {{ current_local_datetime }}
- Current UTC date/time: {{ current_utc_datetime }}
- Use this context for relative dates (today/tomorrow/yesterday/now) and include absolute dates when timing matters.
Loading