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:
root
2026-03-27 08:44:45 -05:00
co-authored by Claude Opus 4.6
parent 6df904a03c
commit 0b9da45647
20 changed files with 695 additions and 108 deletions
@@ -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"
}