Agent workspaces: per-contract overlays with instant handoff
- WorkspaceManager: create/get/list workspaces with daily/weekly/monthly/pinned tiers
- Saved searches: agent stores SQL queries in workspace context
- Shortlist: tag candidates/records to a workspace with notes
- Activity log: track calls, emails, updates per workspace per agent
- Instant handoff: transfer workspace ownership with full history
Zero data copy — just a pointer swap, receiving agent sees everything
- Persistence: workspaces stored as JSON in object storage, rebuilt on startup
- Endpoints: /workspaces/create, /{id}, /{id}/handoff, /{id}/search,
/{id}/shortlist, /{id}/activity
- Tested: Sarah creates workspace, saves searches, shortlists 3 candidates,
logs activity, hands off to Mike who continues seamlessly
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "142c4090-fd14-4065-8c06-d9721c14ec87",
|
||||
"name": "candidates",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/candidates.parquet",
|
||||
"size_bytes": 10592165,
|
||||
"created_at": "2026-03-27T13:43:21.924470705Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:21.924477421Z",
|
||||
"updated_at": "2026-03-27T13:43:21.924477421Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "18d22cdd-24b3-4a65-bdcb-6624753e5ab7",
|
||||
"name": "job_orders",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/job_orders.parquet",
|
||||
"size_bytes": 905534,
|
||||
"created_at": "2026-03-27T13:36:42.130140103Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:42.130146127Z",
|
||||
"updated_at": "2026-03-27T13:36:42.130146127Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "1e7a1b8d-6211-46b5-b030-02ac76f92564",
|
||||
"name": "email_log",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/email_log.parquet",
|
||||
"size_bytes": 16768671,
|
||||
"created_at": "2026-03-27T13:43:32.341429856Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:32.341435388Z",
|
||||
"updated_at": "2026-03-27T13:43:32.341435388Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "29c177bd-3728-428a-ab0f-95169aae1106",
|
||||
"name": "timesheets",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/timesheets.parquet",
|
||||
"size_bytes": 17539932,
|
||||
"created_at": "2026-03-27T13:43:26.951181242Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:26.951188331Z",
|
||||
"updated_at": "2026-03-27T13:43:26.951188331Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "812e7d9a-0f50-49c0-b121-4cf758c304d9",
|
||||
"name": "placements",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/placements.parquet",
|
||||
"size_bytes": 1213820,
|
||||
"created_at": "2026-03-27T13:43:22.173146233Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:22.173152301Z",
|
||||
"updated_at": "2026-03-27T13:43:22.173152301Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "8fa7cb8b-ab6b-4e64-9384-d2480e79dd7c",
|
||||
"name": "clients",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/clients.parquet",
|
||||
"size_bytes": 21971,
|
||||
"created_at": "2026-03-27T13:36:42.025701092Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:42.025707574Z",
|
||||
"updated_at": "2026-03-27T13:36:42.025707574Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "91413428-b4b1-44b3-bb8d-5cb326019879",
|
||||
"name": "job_orders",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/job_orders.parquet",
|
||||
"size_bytes": 905534,
|
||||
"created_at": "2026-03-27T13:43:22.036039453Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:22.036045131Z",
|
||||
"updated_at": "2026-03-27T13:43:22.036045131Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "9bb57bf9-2c19-42ed-84f4-83fd3c52b94a",
|
||||
"name": "clients",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/clients.parquet",
|
||||
"size_bytes": 21971,
|
||||
"created_at": "2026-03-27T13:43:21.933347525Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:21.933351887Z",
|
||||
"updated_at": "2026-03-27T13:43:21.933351887Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "b5d49316-9c9b-4a57-8221-13b6dcda551a",
|
||||
"name": "placements",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/placements.parquet",
|
||||
"size_bytes": 1213820,
|
||||
"created_at": "2026-03-27T13:36:42.237756183Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:42.237762120Z",
|
||||
"updated_at": "2026-03-27T13:36:42.237762120Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "c00465bd-c562-419a-b40e-c557ba9054bf",
|
||||
"name": "candidates",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/candidates.parquet",
|
||||
"size_bytes": 10592165,
|
||||
"created_at": "2026-03-27T13:36:42.018896280Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:42.018904245Z",
|
||||
"updated_at": "2026-03-27T13:36:42.018904245Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "dce14141-f679-481b-9b48-13438cbfe057",
|
||||
"name": "email_log",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/email_log.parquet",
|
||||
"size_bytes": 16768671,
|
||||
"created_at": "2026-03-27T13:36:52.383853471Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:52.383859356Z",
|
||||
"updated_at": "2026-03-27T13:36:52.383859356Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "e0bcb8de-a2c1-4706-bf2d-73c1b989a70d",
|
||||
"name": "timesheets",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/timesheets.parquet",
|
||||
"size_bytes": 17539932,
|
||||
"created_at": "2026-03-27T13:36:46.998375016Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:46.998383728Z",
|
||||
"updated_at": "2026-03-27T13:36:46.998383728Z"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "e1607b56-a826-4826-845a-76918127c6bf",
|
||||
"name": "call_log",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/call_log.parquet",
|
||||
"size_bytes": 35951077,
|
||||
"created_at": "2026-03-27T13:43:30.485776088Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:43:30.485783579Z",
|
||||
"updated_at": "2026-03-27T13:43:30.485783579Z"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"id": "e47b637f-31c6-4209-ab3c-557f8c67c812",
|
||||
"name": "call_log",
|
||||
"schema_fingerprint": "auto",
|
||||
"objects": [
|
||||
{
|
||||
"bucket": "data",
|
||||
"key": "datasets/call_log.parquet",
|
||||
"size_bytes": 35951077,
|
||||
"created_at": "2026-03-27T13:36:50.546706609Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:36:50.546712358Z",
|
||||
"updated_at": "2026-03-27T13:36:50.546712358Z"
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"id": "ws-1774619041730",
|
||||
"name": "Apex Corp - .NET Developers Chicago",
|
||||
"description": "Fill 5 .NET developer positions for Apex Corp, downtown Chicago, $65-85/hr bill rate",
|
||||
"tier": "weekly",
|
||||
"owner": "Sarah",
|
||||
"previous_owners": [],
|
||||
"created_at": "2026-03-27T13:44:01.730143708Z",
|
||||
"updated_at": "2026-03-27T13:44:08.530268827Z",
|
||||
"saved_searches": [
|
||||
{
|
||||
"name": "Chicago .NET active candidates",
|
||||
"sql": "SELECT candidate_id, first_name, last_name, phone, email, years_experience FROM candidates WHERE city = 'Chicago' AND skills LIKE '%.NET%' AND status = 'active' ORDER BY years_experience DESC",
|
||||
"created_at": "2026-03-27T13:44:01.731891844Z"
|
||||
},
|
||||
{
|
||||
"name": "test",
|
||||
"sql": "SELECT 1",
|
||||
"created_at": "2026-03-27T13:44:08.530262069Z"
|
||||
}
|
||||
],
|
||||
"shortlist": [],
|
||||
"activity": [
|
||||
{
|
||||
"action": "search",
|
||||
"detail": "saved search: Chicago .NET active candidates",
|
||||
"timestamp": "2026-03-27T13:44:01.731898474Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "search",
|
||||
"detail": "saved search: test",
|
||||
"timestamp": "2026-03-27T13:44:08.530268200Z",
|
||||
"agent": "Sarah"
|
||||
}
|
||||
],
|
||||
"ingested_datasets": [],
|
||||
"delta_keys": [],
|
||||
"tags": []
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"id": "ws-1774619071313",
|
||||
"name": "Apex Corp - .NET Developers Chicago",
|
||||
"description": "Fill 5 .NET developer positions, downtown Chicago, $65-85/hr",
|
||||
"tier": "weekly",
|
||||
"owner": "Mike",
|
||||
"previous_owners": [
|
||||
{
|
||||
"from_agent": "Sarah",
|
||||
"to_agent": "Mike",
|
||||
"reason": "Sarah on PTO, Mike covering Apex account",
|
||||
"timestamp": "2026-03-27T13:44:31.531544562Z"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-03-27T13:44:31.313179900Z",
|
||||
"updated_at": "2026-03-27T13:44:31.534554639Z",
|
||||
"saved_searches": [
|
||||
{
|
||||
"name": "Chicago .NET active",
|
||||
"sql": "SELECT candidate_id, first_name, last_name, phone, years_experience FROM candidates WHERE city = 'Chicago' AND skills LIKE '%.NET%' AND status = 'active' ORDER BY years_experience DESC",
|
||||
"created_at": "2026-03-27T13:44:31.314740279Z"
|
||||
},
|
||||
{
|
||||
"name": "High-bill .NET history",
|
||||
"sql": "SELECT p.candidate_id, c.first_name, c.last_name, p.bill_rate FROM placements p JOIN candidates c ON p.candidate_id = c.candidate_id JOIN job_orders j ON p.job_order_id = j.job_order_id WHERE j.title LIKE '%.NET%' AND p.bill_rate > 60 ORDER BY p.bill_rate DESC LIMIT 20",
|
||||
"created_at": "2026-03-27T13:44:31.315923201Z"
|
||||
}
|
||||
],
|
||||
"shortlist": [
|
||||
{
|
||||
"dataset": "candidates",
|
||||
"record_id": "CAND-006645",
|
||||
"notes": "Joseph Hill — 30yr .NET exp",
|
||||
"added_at": "2026-03-27T13:44:31.524757463Z",
|
||||
"added_by": "Sarah"
|
||||
},
|
||||
{
|
||||
"dataset": "candidates",
|
||||
"record_id": "CAND-020078",
|
||||
"notes": "Jessica Jones — 30yr .NET exp",
|
||||
"added_at": "2026-03-27T13:44:31.525965891Z",
|
||||
"added_by": "Sarah"
|
||||
},
|
||||
{
|
||||
"dataset": "candidates",
|
||||
"record_id": "CAND-015656",
|
||||
"notes": "Barbara Wright — 30yr .NET exp",
|
||||
"added_at": "2026-03-27T13:44:31.527152483Z",
|
||||
"added_by": "Sarah"
|
||||
},
|
||||
{
|
||||
"dataset": "candidates",
|
||||
"record_id": "CAND-00099",
|
||||
"notes": "Mike found additional candidate via LinkedIn",
|
||||
"added_at": "2026-03-27T13:44:31.534551709Z",
|
||||
"added_by": "Mike"
|
||||
}
|
||||
],
|
||||
"activity": [
|
||||
{
|
||||
"action": "search",
|
||||
"detail": "saved search: Chicago .NET active",
|
||||
"timestamp": "2026-03-27T13:44:31.314743876Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "search",
|
||||
"detail": "saved search: High-bill .NET history",
|
||||
"timestamp": "2026-03-27T13:44:31.315925687Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "shortlist",
|
||||
"detail": "added CAND-006645 from candidates",
|
||||
"timestamp": "2026-03-27T13:44:31.524762385Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "shortlist",
|
||||
"detail": "added CAND-020078 from candidates",
|
||||
"timestamp": "2026-03-27T13:44:31.525968748Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "shortlist",
|
||||
"detail": "added CAND-015656 from candidates",
|
||||
"timestamp": "2026-03-27T13:44:31.527155126Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "call",
|
||||
"detail": "Called top 3 candidates, 2 interested",
|
||||
"timestamp": "2026-03-27T13:44:31.528254640Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "email",
|
||||
"detail": "Sent job descriptions to shortlist",
|
||||
"timestamp": "2026-03-27T13:44:31.529452236Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "update",
|
||||
"detail": "Candidate CAND-00025 confirmed for Thursday interview",
|
||||
"timestamp": "2026-03-27T13:44:31.530540919Z",
|
||||
"agent": "Sarah"
|
||||
},
|
||||
{
|
||||
"action": "handoff",
|
||||
"detail": "handed off to Mike — Sarah on PTO, Mike covering Apex account",
|
||||
"timestamp": "2026-03-27T13:44:31.531546876Z",
|
||||
"agent": "Mike"
|
||||
},
|
||||
{
|
||||
"action": "call",
|
||||
"detail": "Followed up with CAND-00025, interview confirmed",
|
||||
"timestamp": "2026-03-27T13:44:31.533529588Z",
|
||||
"agent": "Mike"
|
||||
},
|
||||
{
|
||||
"action": "shortlist",
|
||||
"detail": "added CAND-00099 from candidates",
|
||||
"timestamp": "2026-03-27T13:44:31.534554347Z",
|
||||
"agent": "Mike"
|
||||
}
|
||||
],
|
||||
"ingested_datasets": [],
|
||||
"delta_keys": [],
|
||||
"tags": []
|
||||
}
|
||||
Reference in New Issue
Block a user