From 05b1930e04ac222d73ffb2f45c1b1febb69f893d Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Wed, 28 Jan 2026 22:19:28 -1000 Subject: 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 --- web/templates/agent-context.html | 121 +++++++++++++++++++++++++++++++++++++++ web/templates/agent-error.html | 28 +++++++++ web/templates/agent-request.html | 61 ++++++++++++++++++++ web/templates/agent-status.html | 80 ++++++++++++++++++++++++++ 4 files changed, 290 insertions(+) create mode 100644 web/templates/agent-context.html create mode 100644 web/templates/agent-error.html create mode 100644 web/templates/agent-request.html create mode 100644 web/templates/agent-status.html (limited to 'web/templates') 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 @@ + + + + + + Agent Context - {{.AgentName}} + + + + + +
+

Agent Context

+

Timeline data for {{.AgentName}}

+ +
Generated At
+
{{.GeneratedAt}}
+ +
Date Range
+
{{.RangeStart}} to {{.RangeEnd}}
+
+ +
+

Summary

+
+
+
{{with .Summary}}{{.total_items}}{{else}}0{{end}}
+
Total Items
+
+
+
{{with .Summary}}{{.overdue}}{{else}}0{{end}}
+
Overdue
+
+
+
{{with .Summary}}{{.today}}{{else}}0{{end}}
+
Due Today
+
+
+
+ +
+

Timeline

+ {{if .Timeline}} + + + + + + + + + + + {{range .Timeline}} + + + + + + + {{end}} + +
SourceTitleDueType
{{.Source}} + {{if .URL}}{{.Title}}{{else}}{{.Title}}{{end}} + {{if .Description}}
{{.Description}}{{end}} +
{{if .Due}}{{.Due.Format "Jan 2, 3:04 PM"}}{{else}}-{{end}}{{.Type}}
+ {{else}} +

No items in the timeline for this date range.

+ {{end}} +
+ + diff --git a/web/templates/agent-error.html b/web/templates/agent-error.html new file mode 100644 index 0000000..afb3603 --- /dev/null +++ b/web/templates/agent-error.html @@ -0,0 +1,28 @@ + + + + + + Error - Agent API + + + + + +
+
{{.Status}}
+

Error

+

{{.Error}}

+
+ + diff --git a/web/templates/agent-request.html b/web/templates/agent-request.html new file mode 100644 index 0000000..fee5ca4 --- /dev/null +++ b/web/templates/agent-request.html @@ -0,0 +1,61 @@ + + + + + + Agent Auth Request - {{.AgentName}} + + + + + +
+

Agent Authentication Request

+

Agent {{.AgentName}} is requesting access to your dashboard.

+ +
Status
+
{{.Status}}
+
+ +
Request Token
+
{{.RequestToken}}
+ +
Poll URL
+
{{.PollURL}}
+ +
Expires At
+
{{.ExpiresAt}}
+
+ +
+ Next Steps: +
    +
  1. Wait for human approval on the dashboard
  2. +
  3. Poll the status URL: GET {{.PollURL}}
  4. +
  5. When status is "approved", extract the session token from the response
  6. +
  7. Use the context URL to fetch your timeline data
  8. +
+
+ + diff --git a/web/templates/agent-status.html b/web/templates/agent-status.html new file mode 100644 index 0000000..a77bb97 --- /dev/null +++ b/web/templates/agent-status.html @@ -0,0 +1,80 @@ + + + + + + Agent Status - {{.AgentName}} + + + + + +
+

Agent Status

+

Status for agent {{.AgentName}}

+ +
Status
+
{{.Status}}
+ + {{if eq .Status "approved"}} +
+ Access Granted! +

Your session has been approved. Use the credentials below to access the context.

+
+ +
+
Session Token
+
{{.SessionToken}}
+ +
Context URL
+
{{.ContextURL}}
+ + {{if .SessionExpiresAt}} +
Session Expires At
+
{{.SessionExpiresAt}}
+ {{end}} + +
+ Next Step: +

Fetch your timeline data by navigating to: GET {{.ContextURL}}

+
+ {{else if eq .Status "pending"}} +
+ Waiting for approval... +

Refresh this page to check the current status.

+
+ {{else if eq .Status "denied"}} +
+ Access Denied +

Your request was denied by the dashboard owner.

+
+ {{else if eq .Status "expired"}} +
+ Request Expired +

Your authentication request has expired. Please initiate a new request.

+
+ {{end}} +
+ + -- cgit v1.2.3