diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-01-28 22:19:28 -1000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-01-28 22:19:28 -1000 |
| commit | 05b1930e04ac222d73ffb2f45c1b1febb69f893d (patch) | |
| tree | bc451d72b5265ff044c4655ed90685c601688b6d /web/templates/agent-context.html | |
| parent | 058ff7d699f088edb851336928dd3eea2934cc07 (diff) | |
Add Agent Context API for external agent integration
Phase 1: Authentication and read-only context
- POST /agent/auth/request - request access with name + agent_id
- GET /agent/auth/poll - poll for approval status
- POST /agent/auth/approve|deny - user approval (browser auth required)
- GET /agent/context - 7-day timeline context (agent session required)
Phase 1.5: Browser-only agent endpoints (HTML pages)
- GET /agent/web/request - request page with token
- GET /agent/web/status - status page with polling
- GET /agent/web/context - context page with timeline data
WebSocket notifications:
- GET /ws/notifications - push agent requests to browsers
- Approval modal with trust indicators and countdown timer
Database:
- agents table for registered agent tracking
- agent_sessions table for pending/active sessions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'web/templates/agent-context.html')
| -rw-r--r-- | web/templates/agent-context.html | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/web/templates/agent-context.html b/web/templates/agent-context.html new file mode 100644 index 0000000..3a4778a --- /dev/null +++ b/web/templates/agent-context.html @@ -0,0 +1,121 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Agent Context - {{.AgentName}}</title> + <style> + body { font-family: system-ui, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a2e; color: #eee; } + .card { background: #16213e; border-radius: 8px; padding: 24px; margin-bottom: 20px; } + h1 { color: #e94560; margin-top: 0; } + h2 { color: #0f3460; font-size: 1.2em; margin-top: 24px; } + .label { color: #888; font-size: 0.9em; margin-bottom: 4px; } + .value { font-family: monospace; background: #0f0f23; padding: 8px 12px; border-radius: 4px; word-break: break-all; margin-bottom: 16px; } + .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 20px; } + .summary-item { background: #0f3460; padding: 12px; border-radius: 6px; text-align: center; } + .summary-value { font-size: 1.5em; font-weight: bold; color: #e94560; } + .summary-label { font-size: 0.8em; color: #888; } + table { width: 100%; border-collapse: collapse; margin-top: 16px; } + th, td { padding: 10px; text-align: left; border-bottom: 1px solid #333; } + th { background: #0f3460; color: #fff; } + tr:hover { background: #1a1a2e; } + .source { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 0.8em; } + .source-todoist { background: #e44332; color: #fff; } + .source-trello { background: #0079bf; color: #fff; } + .source-plantoeat { background: #5cb85c; color: #fff; } + .due-overdue { color: #dc3545; } + .due-today { color: #ffc107; } + .due-future { color: #28a745; } + a { color: #4da6ff; } + </style> +</head> +<body> + <script type="application/json" id="agent-data"> +{ + "generated_at": "{{.GeneratedAt}}", + "range": { + "start": "{{.RangeStart}}", + "end": "{{.RangeEnd}}" + }, + "summary": { + "total_items": {{with .Summary}}{{.total_items}}{{else}}0{{end}}, + "overdue": {{with .Summary}}{{.overdue}}{{else}}0{{end}}, + "today": {{with .Summary}}{{.today}}{{else}}0{{end}} + }, + "timeline": [{{range $i, $item := .Timeline}}{{if $i}},{{end}} + { + "id": "{{$item.ID}}", + "source": "{{$item.Source}}", + "type": "{{$item.Type}}", + "title": "{{$item.Title}}", + "description": "{{$item.Description}}", + "due": {{if $item.Due}}"{{$item.Due.Format "2006-01-02T15:04:05Z07:00"}}"{{else}}null{{end}}, + "priority": {{$item.Priority}}, + "completable": {{$item.Completable}}, + "url": "{{$item.URL}}" + }{{end}} + ] +} + </script> + + <div class="card"> + <h1>Agent Context</h1> + <p>Timeline data for <strong>{{.AgentName}}</strong></p> + + <div class="label">Generated At</div> + <div class="value">{{.GeneratedAt}}</div> + + <div class="label">Date Range</div> + <div class="value">{{.RangeStart}} to {{.RangeEnd}}</div> + </div> + + <div class="card"> + <h2>Summary</h2> + <div class="summary"> + <div class="summary-item"> + <div class="summary-value">{{with .Summary}}{{.total_items}}{{else}}0{{end}}</div> + <div class="summary-label">Total Items</div> + </div> + <div class="summary-item"> + <div class="summary-value">{{with .Summary}}{{.overdue}}{{else}}0{{end}}</div> + <div class="summary-label">Overdue</div> + </div> + <div class="summary-item"> + <div class="summary-value">{{with .Summary}}{{.today}}{{else}}0{{end}}</div> + <div class="summary-label">Due Today</div> + </div> + </div> + </div> + + <div class="card"> + <h2>Timeline</h2> + {{if .Timeline}} + <table> + <thead> + <tr> + <th>Source</th> + <th>Title</th> + <th>Due</th> + <th>Type</th> + </tr> + </thead> + <tbody> + {{range .Timeline}} + <tr> + <td><span class="source source-{{.Source}}">{{.Source}}</span></td> + <td> + {{if .URL}}<a href="{{.URL}}" target="_blank">{{.Title}}</a>{{else}}{{.Title}}{{end}} + {{if .Description}}<br><small style="color: #888;">{{.Description}}</small>{{end}} + </td> + <td>{{if .Due}}{{.Due.Format "Jan 2, 3:04 PM"}}{{else}}-{{end}}</td> + <td>{{.Type}}</td> + </tr> + {{end}} + </tbody> + </table> + {{else}} + <p>No items in the timeline for this date range.</p> + {{end}} + </div> +</body> +</html> |
