3474eeb4eb
[kimi] refactor: extract presence state serializer from workshop heartbeat ( #668 ) ( #697 )
2026-03-21 13:41:42 +00:00
e3d425483d
[kimi] fix: add logging to silent except Exception handlers ( #646 ) ( #692 )
2026-03-21 03:50:26 +00:00
c9445e3056
[kimi] refactor: extract helpers from CSRFMiddleware.dispatch ( #628 ) ( #691 )
2026-03-21 03:41:09 +00:00
9d0f5c778e
[loop-cycle-2] fix: resolve endpoint before execution in CSRF middleware ( #626 ) ( #656 )
2026-03-20 23:05:09 +00:00
2bfc44ea1b
[loop-cycle-1] refactor: extract _try_prune helper and fix f-string logging ( #653 ) ( #657 )
2026-03-20 17:44:32 -04:00
faad0726a2
[loop-cycle-1666] fix: replace remaining deprecated utcnow() in calm.py ( #633 ) ( #644 )
2026-03-20 17:22:35 -04:00
6f66670396
[loop-cycle-1664] fix: replace deprecated datetime.utcnow() ( #633 ) ( #636 )
2026-03-20 17:01:19 -04:00
a3f61c67d3
refactor: break up post_morning_ritual into helpers ( #631 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-20 16:43:14 -04:00
2c217104db
feat: real-time Spark visualization in Mission Control ( #615 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-20 16:22:15 -04:00
9732c80892
feat: Real-time Spark Visualization in Tower Dashboard ( #612 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-20 16:10:42 -04:00
4ba8d25749
feat: Lightning Network integration for tool usage ( #610 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-20 13:07:02 -04:00
bc010ecfba
[loop-cycle-1233] refactor: add docstrings to calm.py route handlers ( #569 ) ( #585 )
2026-03-20 11:44:06 -04:00
50c8a5428e
refactor: break up api_chat() into helpers ( #544 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 20:49:04 -04:00
88e59f7c17
refactor: break up chat_agent() into helpers ( #542 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 20:38:46 -04:00
2d69f73d9d
fix: add timeout to thinking/loop-QA schedulers ( #530 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 20:18:31 -04:00
9f2728f529
refactor: break up lifespan() into testable helpers ( #515 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 19:30:32 -04:00
e4de539bf3
fix: extract ollama_url normalization into shared utility ( #508 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 19:18:22 -04:00
5f52dd54c0
[loop-cycle-932] fix: add logging to bare except Exception blocks ( #484 ) ( #501 )
2026-03-19 19:05:02 -04:00
7f20742fcf
fix: replace hardcoded secret placeholder in CSRF middleware docstring ( #488 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 15:52:29 -04:00
50aaf60db2
[loop-cycle-2] fix: strip CORS wildcards in production ( #462 ) ( #469 )
2026-03-19 15:05:27 -04:00
a751be3038
fix: default CORS origins to localhost instead of wildcard ( #467 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 14:57:36 -04:00
76b26ead55
rescue: WS heartbeat ping + commitment tracking from stale PRs ( #415 )
...
## What
Manually integrated unique code from two stale PRs that were **not** superseded by merged work.
### PR #399 (kimi/issue-362) — WebSocket heartbeat ping
- 15-second ping loop detects dead iPad/Safari connections
- `_heartbeat()` coroutine launched as background task per WS client
- `ping_task` properly cancelled on disconnect
### PR #408 (kimi/issue-322) — Conversation commitment tracking
- Regex extraction of commitments from Timmy replies (`I'll` / `I will` / `Let me`)
- `_record_commitments()` stores with dedup + cap at 10
- `_tick_commitments()` increments message counter per commitment
- `_build_commitment_context()` surfaces overdue commitments as grounding context
- Wired into `_bark_and_broadcast()` and `_generate_bark()`
- Public API: `get_commitments()`, `close_commitment()`, `reset_commitments()`
### Tests
22 new tests covering both features: extraction, recording, dedup, caps, tick/context, integration, heartbeat ping, dead connection handling.
---
This PR rescues unique code from stale PRs #399 and #408 . The other two stale PRs (#402 , #411 ) were already superseded by merged work and should be closed.
Co-authored-by: Perplexity Computer <perplexity@tower.dev >
Reviewed-on: http://localhost:3000/rockachopa/Timmy-time-dashboard/pulls/415
Co-authored-by: Perplexity Computer <perplexity@tower.local >
Co-committed-by: Perplexity Computer <perplexity@tower.local >
2026-03-19 03:22:44 -04:00
9b8ad3629a
fix: wire Pip familiar into Workshop state pipeline ( #412 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 03:09:22 -04:00
b67dbe922f
fix: conversation grounding to prevent topic drift in Workshop ( #406 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 02:39:15 -04:00
3571d528ad
feat: Workshop Phase 1 — State Schema v1 ( #404 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 02:24:13 -04:00
e89aef41bc
[loop-cycle-392] refactor: DRY broadcast + bark error logging ( #397 , #398 ) ( #400 )
2026-03-19 02:01:58 -04:00
86224d042d
feat: Workshop Phase 4 — visitor chat via WebSocket bark engine ( #394 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 01:54:06 -04:00
f9d8509c15
fix: send world state snapshot on WS client connect ( #390 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 01:28:57 -04:00
da43421d4e
feat: broadcast Timmy state changes via WS relay ( #380 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-19 00:25:11 -04:00
19e7e61c92
[loop-cycle] refactor: DRY PRESENCE_FILE — single source of truth in workshop_state ( #381 ) ( #382 )
2026-03-18 22:33:06 -04:00
b7573432cc
fix: watch presence.json and broadcast state via WS ( #379 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-18 22:22:02 -04:00
3108971bd5
[loop-cycle-155] feat: GET /api/world/state — Workshop bootstrap endpoint ( #373 ) ( #378 )
2026-03-18 22:13:49 -04:00
864be20dde
feat: Workshop state heartbeat for presence.json ( #377 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-18 22:07:32 -04:00
8ef0ad1778
fix: pause thought counter during idle periods ( #319 )
...
Co-authored-by: Kimi Agent <kimi@timmy.local >
Co-committed-by: Kimi Agent <kimi@timmy.local >
2026-03-18 19:12:14 -04:00
f4106452d2
feat: implement v1 API endpoints for iPad app ( #312 )
...
Co-authored-by: manus <manus@timmy.local >
Co-committed-by: manus <manus@timmy.local >
2026-03-18 18:20:14 -04:00
f5a570c56d
fix: add real-time data disclaimer to welcome message ( #304 )
2026-03-18 16:56:21 -04:00
a50af74ea2
[loop-cycle-56] fix: resolve 5 lint errors on main ( #203 ) ( #224 )
2026-03-15 13:40:40 -04:00
b4cb3e9975
[loop-cycle-54] refactor: consolidate three memory stores into single table ( #37 ) ( #223 )
2026-03-15 13:33:24 -04:00
4a68f6cb8b
[loop-cycle-53] refactor: break circular imports between packages ( #164 ) ( #193 )
2026-03-15 12:52:18 -04:00
bcd6d7e321
[loop-cycle-50] refactor: replace bare sqlite3.connect() with context managers batch 2 ( #157 ) ( #180 )
2026-03-15 11:58:43 -04:00
5aea8be223
[loop-cycle-47] refactor: replace bare sqlite3.connect() with context managers ( #148 ) ( #155 )
2026-03-15 11:05:39 -04:00
342b9a9d84
Merge pull request 'feat: JSON status endpoints for briefing, memory, swarm ( #49 , #50 )' ( #101 ) from fix/api-consistency into main
2026-03-14 19:24:15 -04:00
b3809f5246
feat: add JSON status endpoints for briefing, memory, swarm ( #49 , #50 )
2026-03-14 19:23:32 -04:00
fdc5b861ca
fix: replace 59 bare except clauses with proper logging ( #25 )
...
All `except Exception:` now catch as `except Exception as exc:` with
appropriate logging (warning for critical paths, debug for graceful degradation).
Added logger setup to 4 files that lacked it:
- src/timmy/memory/vector_store.py
- src/dashboard/middleware/csrf.py
- src/dashboard/middleware/security_headers.py
- src/spark/memory.py
31 files changed across timmy core, dashboard, infrastructure, integrations.
Zero bare excepts remain. 1340 tests passing.
2026-03-14 19:07:14 -04:00
f0b0e2f202
fix: WebSocket 403 spam and missing /swarm endpoints
...
- CSRF middleware now skips WebSocket upgrade requests (they don't carry tokens)
- Added /swarm/live WebSocket endpoint wired to ws_manager singleton
- Added /swarm/agents/sidebar HTMX partial (was 404 on every dashboard poll)
Stops hundreds of 403 Forbidden + 404 log lines per minute.
2026-03-14 16:29:59 -04:00
79edfd1106
feat: persist chat history in SQLite — survives server restarts
...
Replace in-memory MessageLog with SQLite-backed implementation.
Same API surface (append/all/clear/len) so zero caller changes needed.
- data/chat.db stores messages with role, content, timestamp, source
- Lazy DB connection (opened on first use, not at import time)
- Retention policy: oldest messages pruned when count > 500
- New .recent(limit) method for efficient last-N queries
- Thread-safe with explicit locking
- WAL mode for concurrent read performance
- Test isolation: conftest redirects DB to tmp_path per test
- 8 new tests: persistence, retention, concurrency, source field
Closes #46
2026-03-14 16:09:26 -04:00
591954891a
fix: sanitize dynamic innerHTML in templates ( #47 )
2026-03-14 15:07:00 -04:00
bb287b2c73
fix: sanitize WebSocket data in HTML templates (XSS #47 )
2026-03-14 15:01:48 -04:00
2f623826bd
cleanup: delete dead modules — ~7,900 lines removed
...
Closes #22 , Closes #23
Deleted: brain/, swarm/, openfang/, paperclip/, cascade_adapter,
memory_migrate, agents/timmy.py, dead routes + all corresponding tests.
Updated pyproject.toml, app.py, loop_qa.py for removed imports.
2026-03-14 09:49:24 -04:00
Trip T
78167675f2
feat: replace custom Gitea client with MCP servers
...
Replace the bespoke GiteaHand httpx client and tools_gitea.py wrappers
with official MCP tool servers (gitea-mcp + filesystem MCP), wired into
Agno via MCPTools. Switch all session functions to async (arun/acontinue_run)
so MCP tools auto-connect. Delete ~1070 lines of custom Gitea code.
- Create src/timmy/mcp_tools.py with MCP factories + standalone issue bridge
- Wire MCPTools into agent.py tool list (Gitea + filesystem)
- Switch session.py chat/chat_with_tools/continue_chat to async
- Update all callers (dashboard routes, Discord vendor, CLI, thinking engine)
- Add gitea_token fallback from ~/.config/gitea/token
- Add MCP session cleanup to app shutdown hook
- Update tool_safety.py for MCP tool names
- 11 new tests, all 1417 passing, coverage 74.2%
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-12 21:40:32 -04:00