From b3327daf38096a4c86f24cb0b82539b5e51e3cca Mon Sep 17 00:00:00 2001 From: Benjamin McCormick Date: Wed, 10 Dec 2025 16:39:45 -0500 Subject: [PATCH 1/9] fix: force redirect on docs homepage --- docs/docs.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/docs.json b/docs/docs.json index c57b1f3e..a6e66375 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -2,6 +2,12 @@ "$schema": "https://mintlify.com/docs.json", "theme": "mint", "name": "Honcho", + "redirects": [ + { + "source": "/", + "destination": "/v2/documentation/introduction/overview" + } + ], "colors": { "primary": "#66AAFF", "dark": "#151E27", From 69f823aed1926d7623385a0708e44302136bf28b Mon Sep 17 00:00:00 2001 From: vintro Date: Wed, 10 Dec 2025 17:18:32 -0500 Subject: [PATCH 2/9] fix: links --- .../api-reference/endpoint/keys/create-key.mdx | 2 +- .../messages/create-messages-for-session.mdx | 2 +- .../endpoint/messages/create-messages-with-file.mdx | 2 +- .../api-reference/endpoint/messages/get-message.mdx | 2 +- .../api-reference/endpoint/messages/get-messages.mdx | 2 +- .../endpoint/messages/update-message.mdx | 2 +- .../endpoint/observations/create-observations.mdx | 2 +- .../endpoint/observations/delete-observation.mdx | 2 +- .../endpoint/observations/list-observations.mdx | 2 +- .../endpoint/observations/query-observations.mdx | 2 +- .../api-reference/endpoint/peers/chat.mdx | 2 +- .../endpoint/peers/get-or-create-peer.mdx | 2 +- .../api-reference/endpoint/peers/get-peer-card.mdx | 2 +- .../endpoint/peers/get-peer-context.mdx | 2 +- .../api-reference/endpoint/peers/get-peers.mdx | 2 +- .../endpoint/peers/get-sessions-for-peer.mdx | 2 +- .../endpoint/peers/get-working-representation.mdx | 2 +- .../api-reference/endpoint/peers/search-peer.mdx | 2 +- .../api-reference/endpoint/peers/set-peer-card.mdx | 2 +- .../api-reference/endpoint/peers/update-peer.mdx | 2 +- .../endpoint/sessions/add-peers-to-session.mdx | 2 +- .../endpoint/sessions/clone-session.mdx | 2 +- .../endpoint/sessions/delete-session.mdx | 2 +- .../endpoint/sessions/get-or-create-session.mdx | 2 +- .../endpoint/sessions/get-peer-config.mdx | 2 +- .../endpoint/sessions/get-session-context.mdx | 2 +- .../endpoint/sessions/get-session-peers.mdx | 2 +- .../endpoint/sessions/get-session-summaries.mdx | 2 +- .../api-reference/endpoint/sessions/get-sessions.mdx | 2 +- .../endpoint/sessions/remove-peers-from-session.mdx | 2 +- .../endpoint/sessions/search-session.mdx | 2 +- .../endpoint/sessions/set-peer-config.mdx | 2 +- .../endpoint/sessions/set-session-peers.mdx | 2 +- .../endpoint/sessions/update-session.mdx | 2 +- .../endpoint/webhooks/delete-webhook-endpoint.mdx | 2 +- .../webhooks/get-or-create-webhook-endpoint.mdx | 2 +- .../endpoint/webhooks/list-webhook-endpoints.mdx | 2 +- .../api-reference/endpoint/webhooks/test-emit.mdx | 2 +- .../endpoint/workspaces/delete-workspace.mdx | 2 +- .../endpoint/workspaces/get-all-workspaces.mdx | 2 +- .../endpoint/workspaces/get-deriver-status.mdx | 2 +- .../endpoint/workspaces/get-or-create-workspace.mdx | 2 +- .../endpoint/workspaces/search-workspace.mdx | 2 +- .../endpoint/workspaces/trigger-dream.mdx | 2 +- .../endpoint/workspaces/update-workspace.mdx | 2 +- docs/v2.6.0-alpha/api-reference/introduction.mdx | 2 +- docs/v2.6.0-alpha/contributing/self-hosting.mdx | 4 ++-- .../documentation/core-concepts/architecture.mdx | 10 +++++----- .../documentation/core-concepts/reasoning.mdx | 6 +++--- .../documentation/core-concepts/representation.mdx | 10 +++++----- .../documentation/features/advanced/overview.mdx | 12 ++++++------ .../documentation/features/advanced/queue-status.mdx | 2 +- .../features/advanced/toggle-reasoning.mdx | 2 +- docs/v2.6.0-alpha/documentation/features/chat.mdx | 4 ++-- .../documentation/features/get-context.mdx | 2 +- .../documentation/introduction/overview.mdx | 10 +++++----- .../documentation/introduction/quickstart.mdx | 10 +++++----- .../documentation/introduction/vibecoding.mdx | 6 +++--- .../documentation/reference/platform.mdx | 12 ++++++------ docs/v2.6.0-alpha/documentation/reference/sdk.mdx | 4 ++-- .../honcho-memory/advanced-retrieval/get-context.mdx | 6 +++--- .../scratch/honcho-memory/quickstart.mdx | 6 +++--- .../documentation/scratch/local-vs-global.mdx | 2 +- docs/v2.6.0-alpha/guides/integrations/crewai.mdx | 12 ++++++------ docs/v2.6.0-alpha/guides/integrations/langgraph.mdx | 10 +++++----- docs/v2.6.0-alpha/guides/overview.mdx | 10 +++++----- docs/v2.6.0-alpha/guides/storing-data.mdx | 2 +- 67 files changed, 117 insertions(+), 117 deletions(-) diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/keys/create-key.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/keys/create-key.mdx index 41b759f7..eb133652 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/keys/create-key.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/keys/create-key.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/keys +openapi: post /v2.6.0-alpha/keys --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-for-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-for-session.mdx index 19e9c9cb..59f2a1ad 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-for-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-for-session.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/messages/ +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages/ --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-with-file.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-with-file.mdx index 55ca55a8..f87b8243 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-with-file.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/messages/create-messages-with-file.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/messages/upload +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages/upload --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-message.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-message.mdx index 53765daa..db9c62ef 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-message.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-message.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/messages/{message_id} +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages/{message_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-messages.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-messages.mdx index 612c7aab..eb5b5097 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-messages.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/messages/get-messages.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/messages/list +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages/list --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/messages/update-message.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/messages/update-message.mdx index 77a296b2..3cb2db81 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/messages/update-message.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/messages/update-message.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id}/sessions/{session_id}/messages/{message_id} +openapi: put /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages/{message_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/observations/create-observations.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/observations/create-observations.mdx index 1aafec44..569e7190 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/observations/create-observations.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/observations/create-observations.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/observations +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/observations --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/observations/delete-observation.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/observations/delete-observation.mdx index 172ef679..69c9ddd3 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/observations/delete-observation.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/observations/delete-observation.mdx @@ -1,3 +1,3 @@ --- -openapi: delete /v2/workspaces/{workspace_id}/observations/{observation_id} +openapi: delete /v2.6.0-alpha/workspaces/{workspace_id}/observations/{observation_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/observations/list-observations.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/observations/list-observations.mdx index 3063a96e..1c4bef72 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/observations/list-observations.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/observations/list-observations.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/observations/list +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/observations/list --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/observations/query-observations.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/observations/query-observations.mdx index d5d15a14..00c5c6f8 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/observations/query-observations.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/observations/query-observations.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/observations/query +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/observations/query --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/chat.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/chat.mdx index 8fe3cd18..b7f8047e 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/chat.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/chat.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers/{peer_id}/chat +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/chat --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-or-create-peer.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-or-create-peer.mdx index 724d8100..9964c2aa 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-or-create-peer.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-or-create-peer.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-card.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-card.mdx index ef12d719..5ced4d68 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-card.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-card.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/peers/{peer_id}/card +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/card --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-context.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-context.mdx index ed6563c2..3e2c9508 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-context.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peer-context.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/peers/{peer_id}/context +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/context --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peers.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peers.mdx index 954e89b2..7b885554 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peers.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-peers.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers/list +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers/list --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-sessions-for-peer.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-sessions-for-peer.mdx index 8b33a832..93ff788d 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-sessions-for-peer.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-sessions-for-peer.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers/{peer_id}/sessions +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/sessions --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-working-representation.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-working-representation.mdx index b712a032..b77e17de 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-working-representation.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/get-working-representation.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers/{peer_id}/representation +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/representation --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/search-peer.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/search-peer.mdx index c8c25451..0053845c 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/search-peer.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/search-peer.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/peers/{peer_id}/search +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/search --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/set-peer-card.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/set-peer-card.mdx index c209ca8c..ab484cf3 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/set-peer-card.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/set-peer-card.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id}/peers/{peer_id}/card +openapi: put /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id}/card --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/peers/update-peer.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/peers/update-peer.mdx index 91b6da61..7bc1b2a5 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/peers/update-peer.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/peers/update-peer.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id}/peers/{peer_id} +openapi: put /v2.6.0-alpha/workspaces/{workspace_id}/peers/{peer_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/add-peers-to-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/add-peers-to-session.mdx index e73ece96..e04fe792 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/add-peers-to-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/add-peers-to-session.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/peers +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/clone-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/clone-session.mdx index e06f19a1..016cb1de 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/clone-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/clone-session.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/clone +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/clone --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/delete-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/delete-session.mdx index 2d1252fb..c4348148 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/delete-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/delete-session.mdx @@ -1,3 +1,3 @@ --- -openapi: delete /v2/workspaces/{workspace_id}/sessions/{session_id} +openapi: delete /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-or-create-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-or-create-session.mdx index c013803e..b3aab9d8 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-or-create-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-or-create-session.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-peer-config.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-peer-config.mdx index e84f5cea..33438219 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-peer-config.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-peer-config.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/peers/{peer_id}/config +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers/{peer_id}/config --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-context.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-context.mdx index c8c1bdd1..4e0444f5 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-context.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-context.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/context +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/context --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-peers.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-peers.mdx index 18beb221..fa85d340 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-peers.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-peers.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/peers +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-summaries.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-summaries.mdx index 9ae150bc..77208467 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-summaries.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-session-summaries.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/sessions/{session_id}/summaries +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/summaries --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-sessions.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-sessions.mdx index 75dc7eba..671f02b3 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-sessions.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/get-sessions.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/list +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/list --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/remove-peers-from-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/remove-peers-from-session.mdx index 31acf6bf..c08aa744 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/remove-peers-from-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/remove-peers-from-session.mdx @@ -1,3 +1,3 @@ --- -openapi: delete /v2/workspaces/{workspace_id}/sessions/{session_id}/peers +openapi: delete /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/search-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/search-session.mdx index 308138d5..b246354d 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/search-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/search-session.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/search +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/search --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-peer-config.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-peer-config.mdx index 6e6ee462..39b6199b 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-peer-config.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-peer-config.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/sessions/{session_id}/peers/{peer_id}/config +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers/{peer_id}/config --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-session-peers.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-session-peers.mdx index 475db5b9..aa8b3f8d 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-session-peers.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/set-session-peers.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id}/sessions/{session_id}/peers +openapi: put /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/peers --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/update-session.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/update-session.mdx index 94d14d1b..d2f51dd3 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/sessions/update-session.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/sessions/update-session.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id}/sessions/{session_id} +openapi: put /v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/delete-webhook-endpoint.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/delete-webhook-endpoint.mdx index 03663d39..44a48097 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/delete-webhook-endpoint.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/delete-webhook-endpoint.mdx @@ -1,3 +1,3 @@ --- -openapi: delete /v2/workspaces/{workspace_id}/webhooks/{endpoint_id} +openapi: delete /v2.6.0-alpha/workspaces/{workspace_id}/webhooks/{endpoint_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/get-or-create-webhook-endpoint.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/get-or-create-webhook-endpoint.mdx index 3eca8afb..3303c4dd 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/get-or-create-webhook-endpoint.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/get-or-create-webhook-endpoint.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/webhooks +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/webhooks --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/list-webhook-endpoints.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/list-webhook-endpoints.mdx index a205df80..4f0288c2 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/list-webhook-endpoints.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/list-webhook-endpoints.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/webhooks +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/webhooks --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/test-emit.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/test-emit.mdx index 8c2cbddd..e12c94f3 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/test-emit.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/webhooks/test-emit.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/webhooks/test +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/webhooks/test --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/delete-workspace.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/delete-workspace.mdx index f8eb6168..01d7774f 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/delete-workspace.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/delete-workspace.mdx @@ -1,3 +1,3 @@ --- -openapi: delete /v2/workspaces/{workspace_id} +openapi: delete /v2.6.0-alpha/workspaces/{workspace_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-all-workspaces.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-all-workspaces.mdx index 12e3d931..dbfa1d98 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-all-workspaces.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-all-workspaces.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/list +openapi: post /v2.6.0-alpha/workspaces/list --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-deriver-status.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-deriver-status.mdx index 0b7a32b9..b5460068 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-deriver-status.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-deriver-status.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v2/workspaces/{workspace_id}/deriver/status +openapi: get /v2.6.0-alpha/workspaces/{workspace_id}/deriver/status --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-or-create-workspace.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-or-create-workspace.mdx index 513f4fbb..85246932 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-or-create-workspace.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/get-or-create-workspace.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces +openapi: post /v2.6.0-alpha/workspaces --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/search-workspace.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/search-workspace.mdx index f17e4e52..9fa73978 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/search-workspace.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/search-workspace.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/search +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/search --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/trigger-dream.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/trigger-dream.mdx index 138c58be..d238dc7f 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/trigger-dream.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/trigger-dream.mdx @@ -1,3 +1,3 @@ --- -openapi: post /v2/workspaces/{workspace_id}/trigger_dream +openapi: post /v2.6.0-alpha/workspaces/{workspace_id}/trigger_dream --- diff --git a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/update-workspace.mdx b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/update-workspace.mdx index 07d3b75e..0ab685e7 100644 --- a/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/update-workspace.mdx +++ b/docs/v2.6.0-alpha/api-reference/endpoint/workspaces/update-workspace.mdx @@ -1,3 +1,3 @@ --- -openapi: put /v2/workspaces/{workspace_id} +openapi: put /v2.6.0-alpha/workspaces/{workspace_id} --- diff --git a/docs/v2.6.0-alpha/api-reference/introduction.mdx b/docs/v2.6.0-alpha/api-reference/introduction.mdx index 6765e7a3..5234167e 100644 --- a/docs/v2.6.0-alpha/api-reference/introduction.mdx +++ b/docs/v2.6.0-alpha/api-reference/introduction.mdx @@ -5,7 +5,7 @@ title: 'Introduction' This section documents all available API endpoints in the Honcho Server. Each endpoint provides CRUD operations for our core primitives. For information about these primitives, see -[Architecture](/v2/documentation/core-concepts/architecture). +[Architecture](/v2.6.0-alpha/documentation/core-concepts/architecture). We strongly recommend using our official SDKs instead of calling these APIs directly. The SDKs provide better error handling, type safety, and developer experience. diff --git a/docs/v2.6.0-alpha/contributing/self-hosting.mdx b/docs/v2.6.0-alpha/contributing/self-hosting.mdx index 3e5e1e42..88fca48e 100644 --- a/docs/v2.6.0-alpha/contributing/self-hosting.mdx +++ b/docs/v2.6.0-alpha/contributing/self-hosting.mdx @@ -276,8 +276,8 @@ const client = new Honcho({ ### Next Steps -- **Explore the API**: Check out the [API Reference](/v2/api-reference/introduction) -- **Try the SDKs**: See our [guides](/v2/guides) for examples +- **Explore the API**: Check out the [API Reference](/v2.6.0-alpha/api-reference/introduction) +- **Try the SDKs**: See our [guides](/v2.6.0-alpha/guides) for examples - **Configure Honcho**: Visit the [Configuration Guide](./configuration) for detailed settings - **Join the community**: [Discord](https://discord.gg/plasticlabs) diff --git a/docs/v2.6.0-alpha/documentation/core-concepts/architecture.mdx b/docs/v2.6.0-alpha/documentation/core-concepts/architecture.mdx index b0eb7dc3..35ec932a 100644 --- a/docs/v2.6.0-alpha/documentation/core-concepts/architecture.mdx +++ b/docs/v2.6.0-alpha/documentation/core-concepts/architecture.mdx @@ -5,7 +5,7 @@ icon: "sitemap" sidebarTitle: "Architecture" --- -Honcho is memory infrastructure that continuously [*reasons*](/v2/documentation/core-concepts/reasoning) about data to build rich representations of peers (users, agents, or any entity) over time. This document explains the data model, system components, and how data flows through Honcho. +Honcho is memory infrastructure that continuously [*reasons*](/v2.6.0-alpha/documentation/core-concepts/reasoning) about data to build rich representations of peers (users, agents, or any entity) over time. This document explains the data model, system components, and how data flows through Honcho. ## Data Model @@ -40,7 +40,7 @@ Authentication is scoped to the workspace level, and configuration settings can ### Peers -Peers are the most important entity in Honcho--everything revolves around building and maintaining their [*representations*](/v2/documentation/core-concepts/representation). A peer represents any individual user, agent, or entity in a workspace. Treating humans and agents the same way lets you build arbitrary combinations for multi-agent or group chat scenarios. +Peers are the most important entity in Honcho--everything revolves around building and maintaining their [*representations*](/v2.6.0-alpha/documentation/core-concepts/representation). A peer represents any individual user, agent, or entity in a workspace. Treating humans and agents the same way lets you build arbitrary combinations for multi-agent or group chat scenarios. Each peer has a unique identifier within a workspace and is a container for reasoning across all their sessions. This cross-session context means conclusions drawn about a peer in one session can inform interactions in completely different sessions. Peers can be configured to control whether Honcho reasons about them. @@ -90,13 +90,13 @@ Honcho's architecture follows a few core principles. Everything revolves around Sign up for the Honcho platform and start building - + Get started with your first integration - + Learn how Honcho reasons about messages to build memory - + Understand what peer representations are and how they work diff --git a/docs/v2.6.0-alpha/documentation/core-concepts/reasoning.mdx b/docs/v2.6.0-alpha/documentation/core-concepts/reasoning.mdx index 143abfba..38aec7b5 100644 --- a/docs/v2.6.0-alpha/documentation/core-concepts/reasoning.mdx +++ b/docs/v2.6.0-alpha/documentation/core-concepts/reasoning.mdx @@ -84,13 +84,13 @@ Without exhaustive reasoning, you're stuck with surface-level retrieval or someo Sign up for the Honcho platform and start building - + Get started with your first integration - + See how reasoning fits into Honcho's overall architecture - + Learn how reasoning produces peer representations diff --git a/docs/v2.6.0-alpha/documentation/core-concepts/representation.mdx b/docs/v2.6.0-alpha/documentation/core-concepts/representation.mdx index a9bd2325..5d9efb83 100644 --- a/docs/v2.6.0-alpha/documentation/core-concepts/representation.mdx +++ b/docs/v2.6.0-alpha/documentation/core-concepts/representation.mdx @@ -10,7 +10,7 @@ When you write messages to Honcho, the reasoning models extract premises, draw c ## What's in a Representation? -A peer representation is made up of several types of artifacts that Honcho generates through [*reasoning*](/v2/documentation/core-concepts/reasoning): +A peer representation is made up of several types of artifacts that Honcho generates through [*reasoning*](/v2.6.0-alpha/documentation/core-concepts/reasoning): **Conclusions** are insights derived through formal logic. Deductive conclusions are things Honcho can be certain about based on extracted premises. Inductive conclusions identify patterns across multiple messages. Abductive conclusions infer the simplest explanations for observed behavior. For example, if a user frequently mentions work deadlines and rarely mentions hobbies, Honcho might inductively conclude they're time-constrained or career-focused. @@ -25,7 +25,7 @@ These enable continuous improvement. Each new message refines conclusions, updat Honcho can build different representations based on what each peer observes. This enables sophisticated multi-peer scenarios where understanding is relative to what was actually witnessed. -There are two observation modes controlled by [configuration](/v2/documentation/features/advanced/configuration): +There are two observation modes controlled by [configuration](/v2.6.0-alpha/documentation/features/advanced/configuration): **Honcho observing peers** (`observe_me`): When enabled (default), Honcho forms a representation of the peer based on all messages they've sent across all sessions. This is Honcho's understanding of that peer, built from everything they've said and done in your system. Set `observe_me: false` if you don't want Honcho to reason about that peer at all. @@ -54,13 +54,13 @@ Humans reconstruct the past from imperfect recollections, then act on those reco Sign up for the Honcho platform and start building - + See representations in action with a working example - + Understand how representations fit into Honcho's architecture - + Learn how to query representations with natural language diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/overview.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/overview.mdx index 9891a34f..916334a6 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/overview.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/overview.mdx @@ -9,12 +9,12 @@ Advanced features give you fine-grained control over Honcho's behavior and imple ## Configuration & Monitoring -- [Queue Status](/v2/documentation/features/advanced/queue-status) - Monitor background processing and reasoning tasks -- [Configuration](/v2/documentation/features/advanced/toggle-reasoning) - Configure reasoning models and behavior -- [Summarizer](/v2/documentation/features/advanced/summarizer) - Automatic session summarization +- [Queue Status](/v2.6.0-alpha/documentation/features/advanced/queue-status) - Monitor background processing and reasoning tasks +- [Configuration](/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning) - Configure reasoning models and behavior +- [Summarizer](/v2.6.0-alpha/documentation/features/advanced/summarizer) - Automatic session summarization ## Querying & Filtering -- [Search](/v2/documentation/features/advanced/search) - Search across peers, sessions, and messages -- [Filters](/v2/documentation/features/advanced/using-filters) - Filter queries with advanced parameters -- [Streaming Responses](/v2/documentation/features/advanced/streaming-response) - Stream dialectic responses in real-time +- [Search](/v2.6.0-alpha/documentation/features/advanced/search) - Search across peers, sessions, and messages +- [Filters](/v2.6.0-alpha/documentation/features/advanced/using-filters) - Filter queries with advanced parameters +- [Streaming Responses](/v2.6.0-alpha/documentation/features/advanced/streaming-response) - Stream dialectic responses in real-time diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/queue-status.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/queue-status.mdx index 9b00eb01..5b3d8dfa 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/queue-status.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/queue-status.mdx @@ -4,7 +4,7 @@ description: Learn how to check the status of Honcho's reasoning icon: "lines-leaning" --- -Whenever messages are stored in Honcho, a background process kicks off to [reason](/v2/documentation/core-concepts/reasoning) about the conversation and generate insights. +Whenever messages are stored in Honcho, a background process kicks off to [reason](/v2.6.0-alpha/documentation/core-concepts/reasoning) about the conversation and generate insights. Reasoning is an asynchronous process and, depending on load, may not immediately generate insights for the latest message you've sent. To help with this, Honcho diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx index 2966c321..c37e1661 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx @@ -157,7 +157,7 @@ You may therefore disable observation of a peer by setting the `observe_me` flag If the peer has a session-level configuration, it will override this configuration. If the flag is not set, or is set to `true`, the peer will be observed. -For session-level observation controls and local representations (where peers build separate models of each other), see [Representation Scopes](/v2/documentation/features/advanced/representation-scopes). +For session-level observation controls and local representations (where peers build separate models of each other), see [Representation Scopes](/v2.6.0-alpha/documentation/features/advanced/representation-scopes). diff --git a/docs/v2.6.0-alpha/documentation/features/chat.mdx b/docs/v2.6.0-alpha/documentation/features/chat.mdx index 97296f83..b983846d 100644 --- a/docs/v2.6.0-alpha/documentation/features/chat.mdx +++ b/docs/v2.6.0-alpha/documentation/features/chat.mdx @@ -172,7 +172,7 @@ When you call `peer.chat(query)`: 3. Combines them with segments of source messages, if needed, to gather more context 4. Synthesizes them into a coherent natural language response to your query -Honcho [reasoning](/v2/documentation/core-concepts/reasoning) runs continuously in the background, processing new messages and updating representations. The chat endpoint always has access to Honcho's latest conclusions about the peer. +Honcho [reasoning](/v2.6.0-alpha/documentation/core-concepts/reasoning) runs continuously in the background, processing new messages and updating representations. The chat endpoint always has access to Honcho's latest conclusions about the peer. ## Best Practices @@ -188,4 +188,4 @@ Don't just use chat for LLM prompts - use it to drive application logic, routing ### Combine with get_context() Use `get_context()` for conversation context and `peer.chat()` for specific insights. They complement each other. -For more ideas on using the chat endpoint, see our [guides](/v2/guides/overview). +For more ideas on using the chat endpoint, see our [guides](/v2.6.0-alpha/guides/overview). diff --git a/docs/v2.6.0-alpha/documentation/features/get-context.mdx b/docs/v2.6.0-alpha/documentation/features/get-context.mdx index a564e9d9..ce6546c1 100644 --- a/docs/v2.6.0-alpha/documentation/features/get-context.mdx +++ b/docs/v2.6.0-alpha/documentation/features/get-context.mdx @@ -96,7 +96,7 @@ context = session.get_context(summary=False, tokens=2000) ### Peer Representation in Context -You can include a peer's [representation](/v2/documentation/core-concepts/representation) and peer card in the context by specifying `peer_target`. This is useful for providing the LLM with knowledge about a specific peer. +You can include a peer's [representation](/v2.6.0-alpha/documentation/core-concepts/representation) and peer card in the context by specifying `peer_target`. This is useful for providing the LLM with knowledge about a specific peer. ```python Python diff --git a/docs/v2.6.0-alpha/documentation/introduction/overview.mdx b/docs/v2.6.0-alpha/documentation/introduction/overview.mdx index 3d9624f9..871c0c4e 100644 --- a/docs/v2.6.0-alpha/documentation/introduction/overview.mdx +++ b/docs/v2.6.0-alpha/documentation/introduction/overview.mdx @@ -10,7 +10,7 @@ Honcho is an open source memory library with a managed service for building stat Sign up and start building with Honcho - + Build your first stateful agent in minutes @@ -63,7 +63,7 @@ Honcho has four storage primitives that work together: - **Sessions** - Interaction threads between peers with temporal boundaries - **Messages** - Units of data that trigger reasoning (conversations, events, activity, documents, and more) -When you write messages to Honcho, they're stored and processed in the background. Custom reasoning models perform formal logical [*reasoning*](/v2/documentation/core-concepts/reasoning) to generate conclusions about each peer. These conclusions are stored as [*representations*](/v2/documentation/core-concepts/representation) that you can query to provide rich context for your agents. +When you write messages to Honcho, they're stored and processed in the background. Custom reasoning models perform formal logical [*reasoning*](/v2.6.0-alpha/documentation/core-concepts/reasoning) to generate conclusions about each peer. These conclusions are stored as [*representations*](/v2.6.0-alpha/documentation/core-concepts/representation) that you can query to provide rich context for your agents. ![Honcho Architecture](/images/architecture.png) @@ -87,13 +87,13 @@ Welcome to Honcho. We're excited to have you at the frontier of AI with us 🫡. Sign up for the Honcho platform and get your API key - + Build your first stateful agent in minutes - + Deep dive into how Honcho's primitives fit together - + Learn how Honcho reasons about data to build memory diff --git a/docs/v2.6.0-alpha/documentation/introduction/quickstart.mdx b/docs/v2.6.0-alpha/documentation/introduction/quickstart.mdx index 927e0ba1..21feff6a 100644 --- a/docs/v2.6.0-alpha/documentation/introduction/quickstart.mdx +++ b/docs/v2.6.0-alpha/documentation/introduction/quickstart.mdx @@ -230,7 +230,7 @@ user.chat("What should I know about this user? 3 sentences max").then((response) -Honcho needs a short amount of time to process messages you write to it. There are several utilities to [check the status](/v2/documentation/features/advanced/queue-status) of the queue. Honcho also offers numerous ways to query reasoning to fit latency needs: see the [Get Context](/v2/documentation/features/get-context) page. +Honcho needs a short amount of time to process messages you write to it. There are several utilities to [check the status](/v2.6.0-alpha/documentation/features/advanced/queue-status) of the queue. Honcho also offers numerous ways to query reasoning to fit latency needs: see the [Get Context](/v2.6.0-alpha/documentation/features/get-context) page. The response will look something like this: @@ -389,16 +389,16 @@ console.log(response); From here, you can explore how to use Honcho's features in your own applications: - + Learn how to fetch the right context for your agent's next response - + Deep dive into how Honcho's primitives fit together - + Query representations with natural language - + Integration patterns and advanced use cases diff --git a/docs/v2.6.0-alpha/documentation/introduction/vibecoding.mdx b/docs/v2.6.0-alpha/documentation/introduction/vibecoding.mdx index 1c0ae6ec..0e44dc04 100644 --- a/docs/v2.6.0-alpha/documentation/introduction/vibecoding.mdx +++ b/docs/v2.6.0-alpha/documentation/introduction/vibecoding.mdx @@ -23,9 +23,9 @@ I want to start building with Honcho - an open source memory library for buildin **Documentation:** - Main docs: https://docs.honcho.dev -- API Reference: https://docs.honcho.dev/v2/api-reference/introduction -- Quickstart: https://docs.honcho.dev/v2/documentation/introduction/quickstart -- Architecture: https://docs.honcho.dev/v2/documentation/core-concepts/architecture +- API Reference: https://docs.honcho.dev/v2.6.0-alpha/api-reference/introduction +- Quickstart: https://docs.honcho.dev/v2.6.0-alpha/documentation/introduction/quickstart +- Architecture: https://docs.honcho.dev/v2.6.0-alpha/documentation/core-concepts/architecture **Code & Examples:** - Core repo: https://github.com/plastic-labs/honcho diff --git a/docs/v2.6.0-alpha/documentation/reference/platform.mdx b/docs/v2.6.0-alpha/documentation/reference/platform.mdx index 426af86f..479ffcb2 100644 --- a/docs/v2.6.0-alpha/documentation/reference/platform.mdx +++ b/docs/v2.6.0-alpha/documentation/reference/platform.mdx @@ -93,7 +93,7 @@ Expand the `Peers` list from the `Workspace` dashboard to see a detailed view of Peer Dashboard -Click into any peer to navigate to their respective utilities page. Next to the `Peer` name you can edit the [Global Peer Configuration](/v2/documentation/core-concepts/configuration), and in the tabs below, explore all utilities for the `Peer`. +Click into any peer to navigate to their respective utilities page. Next to the `Peer` name you can edit the [Global Peer Configuration](/v2.6.0-alpha/documentation/core-concepts/configuration), and in the tabs below, explore all utilities for the `Peer`. Peer Management Dashboard @@ -108,7 +108,7 @@ Utilities include: - **Session logs** view which `Sessions` the `Peer` is active -- **Peer configuration and metadata management** including [Session-Peer Configuration](/v2/documentation/core-concepts/configuration#session-peer-configuration) +- **Peer configuration and metadata management** including [Session-Peer Configuration](/v2.6.0-alpha/documentation/core-concepts/configuration#session-peer-configuration) Peer Management Dashboard @@ -153,9 +153,9 @@ The [Members](https://app.honcho.dev/members) page provides organization adminis ## Go Further -View the [Architecture](/v2/documentation/core-concepts/architecture) to see how Honcho works under the hood. +View the [Architecture](/v2.6.0-alpha/documentation/core-concepts/architecture) to see how Honcho works under the hood. -Dive into our [API Reference](/v2/api-reference) to explore all available endpoints. +Dive into our [API Reference](/v2.6.0-alpha/api-reference) to explore all available endpoints. ## Next Steps @@ -166,10 +166,10 @@ Dive into our [API Reference](/v2/api-reference) to explore all available endpoi Connect with 1000+ developers building with Honcho - + View our guidelines and explore the codebase - + See Honcho in action with real examples diff --git a/docs/v2.6.0-alpha/documentation/reference/sdk.mdx b/docs/v2.6.0-alpha/documentation/reference/sdk.mdx index 038e3cbc..7e4f7f80 100644 --- a/docs/v2.6.0-alpha/documentation/reference/sdk.mdx +++ b/docs/v2.6.0-alpha/documentation/reference/sdk.mdx @@ -944,7 +944,7 @@ const response = await openai.chat.completions.create({ When creating messages, you can optionally specify a custom `created_at` timestamp instead of using the server's current time: ```bash -curl -X POST "https://api.honcho.dev/v2/workspaces/{workspace_id}/sessions/{session_id}/messages" \ +curl -X POST "https://api.honcho.dev/v2.6.0-alpha/workspaces/{workspace_id}/sessions/{session_id}/messages" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ @@ -968,7 +968,7 @@ If `created_at` is not provided, messages will use the server's current timestam ### Metadata and Filtering -See [Using Filters](/v2/guides/using-filters) for more examples on how to use filters. +See [Using Filters](/v2.6.0-alpha/guides/using-filters) for more examples on how to use filters. ```python Python diff --git a/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/advanced-retrieval/get-context.mdx b/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/advanced-retrieval/get-context.mdx index 520fb362..c30dcf51 100644 --- a/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/advanced-retrieval/get-context.mdx +++ b/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/advanced-retrieval/get-context.mdx @@ -150,13 +150,13 @@ for query in user_queries: ## Related Features - + Learn about basic context retrieval - + Understand session summarization - + Chat with Honcho for insights diff --git a/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/quickstart.mdx b/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/quickstart.mdx index 812bfb95..228d0861 100644 --- a/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/quickstart.mdx +++ b/docs/v2.6.0-alpha/documentation/scratch/honcho-memory/quickstart.mdx @@ -237,19 +237,19 @@ and Bob. We: As soon as you save a message in Honcho, it will start to reason about it to pull out insights and develop a profile of the user. This is the default -behavior and can be toggled off via [the configuration](/v2/documentation/core-concepts/configuration). +behavior and can be toggled off via [the configuration](/v2.6.0-alpha/documentation/core-concepts/configuration). ## Next Steps + href="/v2.6.0-alpha/documentation/core-concepts/architecture"> Learn about the data primitives in Honcho and how they work together Sign up for Managed Honcho and get started building agents now. - + Check out spellbooks to see different examples apps built with Honcho diff --git a/docs/v2.6.0-alpha/documentation/scratch/local-vs-global.mdx b/docs/v2.6.0-alpha/documentation/scratch/local-vs-global.mdx index e5670229..c9036cdd 100644 --- a/docs/v2.6.0-alpha/documentation/scratch/local-vs-global.mdx +++ b/docs/v2.6.0-alpha/documentation/scratch/local-vs-global.mdx @@ -53,7 +53,7 @@ This feature is illustrated in the graphic below: We can enable local representation for a `Peer` by setting `observe_others=True`. This is shown in the [Configure -Reasoning](/v2/documentation/core-concepts/configuration) page. +Reasoning](/v2.6.0-alpha/documentation/core-concepts/configuration) page. Now if we used Bob's local representation of Alice then Bob would only get insights on what they've seen Alice say to them. diff --git a/docs/v2.6.0-alpha/guides/integrations/crewai.mdx b/docs/v2.6.0-alpha/guides/integrations/crewai.mdx index 6d39d983..d6cb34a2 100644 --- a/docs/v2.6.0-alpha/guides/integrations/crewai.mdx +++ b/docs/v2.6.0-alpha/guides/integrations/crewai.mdx @@ -53,7 +53,7 @@ This tutorial uses the Honcho demo server at https://demo.honcho.dev which runs The `honcho_crewai` package provides `HonchoStorage`, a storage provider that implements CrewAI's `Storage` interface using Honcho's session-based memory. -Before proceeding, it's important to understand Honcho's core concepts (`Peers` and `Sessions`). Review the [Honcho Architecture](/v2/documentation/core-concepts/architecture) to familiarize yourself with these primitives. +Before proceeding, it's important to understand Honcho's core concepts (`Peers` and `Sessions`). Review the [Honcho Architecture](/v2.6.0-alpha/documentation/core-concepts/architecture) to familiarize yourself with these primitives. `HonchoStorage` implements CrewAI's `Storage` interface using Honcho's `peer` and `session` primitives. @@ -97,7 +97,7 @@ results = storage.search("query", filters={ }) ``` -For the full filter syntax including logical operators (AND, OR, NOT), comparison operators, and metadata filtering, see the [Using Filters](https://docs.honcho.dev/v2/documentation/core-concepts/features/using-filters) documentation. +For the full filter syntax including logical operators (AND, OR, NOT), comparison operators, and metadata filtering, see the [Using Filters](https://docs.honcho.dev/v2.6.0-alpha/documentation/core-concepts/features/using-filters) documentation. For comprehensive details about CrewAI's memory system, see the [official CrewAI Memory documentation](https://docs.crewai.com/en/concepts/memory). @@ -279,16 +279,16 @@ Now that you have a working CrewAI integration with Honcho, you can: ## Related Resources - + Understand Honcho's peer-based model and core primitives - + Learn about retrieving and formatting conversation context - + Query `peer` representations for deeper understanding - + Build stateful agents with LangGraph and Honcho diff --git a/docs/v2.6.0-alpha/guides/integrations/langgraph.mdx b/docs/v2.6.0-alpha/guides/integrations/langgraph.mdx index 26af8c17..3eba2565 100644 --- a/docs/v2.6.0-alpha/guides/integrations/langgraph.mdx +++ b/docs/v2.6.0-alpha/guides/integrations/langgraph.mdx @@ -109,7 +109,7 @@ const llm = new OpenAI({ Define your state schema to pass data through the graph. The state stores Honcho objects directly along with the current user message and assistant response. -Before proceeding, it's important to understand Honcho's core concepts (`Peers` and `Sessions`). Review the [Honcho Architecture](/v2/documentation/core-concepts/architecture) to familiarize yourself with these primitives. +Before proceeding, it's important to understand Honcho's core concepts (`Peers` and `Sessions`). Review the [Honcho Architecture](/v2.6.0-alpha/documentation/core-concepts/architecture) to familiarize yourself with these primitives. @@ -227,7 +227,7 @@ const graph = new StateGraph(StateAnnotation) ### Understanding get_context() -The [`get_context()`](/v2/documentation/core-concepts/features/get-context) method retrieves comprehensive conversation context and formats it for your LLM. It automatically: +The [`get_context()`](/v2.6.0-alpha/documentation/core-concepts/features/get-context) method retrieves comprehensive conversation context and formats it for your LLM. It automatically: - **Manages conversation history** - Tracks all messages and determines what's relevant - **Respects token limits** - Stays within context window constraints without manual counting @@ -248,7 +248,7 @@ That's it. Call `session.get_context().to_openai(assistant)` and you get properl -For more details on all available parameters, see [`get_context() documentation`](/v2/documentation/core-concepts/features/get-context) +For more details on all available parameters, see [`get_context() documentation`](/v2.6.0-alpha/documentation/core-concepts/features/get-context) ## Chat Loop @@ -354,10 +354,10 @@ Now that you have a working LangGraph integration with Honcho, you can: ## Related Resources - + Learn more about retrieving and formatting conversation context - + Use Honcho in Claude Desktop with MCP diff --git a/docs/v2.6.0-alpha/guides/overview.mdx b/docs/v2.6.0-alpha/guides/overview.mdx index bfd96981..1944c7d6 100644 --- a/docs/v2.6.0-alpha/guides/overview.mdx +++ b/docs/v2.6.0-alpha/guides/overview.mdx @@ -5,7 +5,7 @@ description: 'Helpful guides and design patterns for building with Honcho' icon: 'hat-wizard' --- - Before you start a guide, follow [Quickstart](/v2/documentation/introduction/quickstart) to get up and running with Honcho in your language of choice. + Before you start a guide, follow [Quickstart](/v2.6.0-alpha/documentation/introduction/quickstart) to get up and running with Honcho in your language of choice. These guides provide concrete examples and implementation patterns for building with Honcho. Whether you're integrating Honcho into existing platforms, exploring advanced features, or getting up and running quickly, you'll find working code you can adapt to your needs. @@ -16,10 +16,10 @@ Each guide focuses on a specific use case with practical examples. The goal is t Quick integration guides to get up and running: - + Get Honcho running with a single prompt in Claude Code - + Add persistent memory and theory of mind to your LangGraph agents @@ -28,10 +28,10 @@ Quick integration guides to get up and running: Ready-to-use integration patterns for popular platforms: - + Build a Discord bot that remembers users across conversations - + Create a Telegram bot with persistent user understanding diff --git a/docs/v2.6.0-alpha/guides/storing-data.mdx b/docs/v2.6.0-alpha/guides/storing-data.mdx index 7f280473..4d49e744 100644 --- a/docs/v2.6.0-alpha/guides/storing-data.mdx +++ b/docs/v2.6.0-alpha/guides/storing-data.mdx @@ -42,7 +42,7 @@ Once a `Message` is saved in Honcho, it will kick off a background task that looks at the new data to generate insights about the `Peer` that sent the `Message` This is the default behavior of Honcho and can be turned off by [configuring the -Peer or Session](/v2/documentation/core-concepts/configuration) +Peer or Session](/v2.6.0-alpha/documentation/core-concepts/configuration) This pattern of having a Peer, Session, and Messages is highly flexible and works for many different use cases and agent setups. Some use cases may only From adee668f37de5fb118178a59934f419f0bd170c6 Mon Sep 17 00:00:00 2001 From: Paul Nodet <5941125+pnodet@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:12:37 +0100 Subject: [PATCH 3/9] docs: fix blog link in Dialectic endpoint documentation (#297) Updated the blog link for the Dialectic endpoint documentation to the archived version. --- .../documentation/core-concepts/features/dialectic-endpoint.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx b/docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx index add5921f..86f04a92 100644 --- a/docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx +++ b/docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx @@ -84,4 +84,4 @@ for await (const line of responseStream.iter_text()) { ``` -We've designed the Dialectic endpoint to be infinitely flexible. We wrote an incomplete list of ideas on how to use it on our blog [here](https://blog.plasticlabs.ai/blog/Introducing-Honcho's-Dialectic-API#how-it-works). +We've designed the Dialectic endpoint to be infinitely flexible. We wrote an incomplete list of ideas on how to use it on our blog [here](https://blog.plasticlabs.ai/archive/ARCHIVED;-Introducing-Honcho's-Dialectic-API#how-it-works). From 9c9c37f19613b5dfb29ca50afdff8a940bee2699 Mon Sep 17 00:00:00 2001 From: Eri Barrett Date: Fri, 12 Dec 2025 16:19:14 -0500 Subject: [PATCH 4/9] dashboard overview docs updates (#298) * fix: update dialectic to chat * fix: reasoning configuration * fix: backlink get_context in summarizer * fix: error handling * chore: update dashboard overview * fix: links due to other branches * fix: proof * fix: proof --------- Co-authored-by: vintro --- docs/docs.json | 2 +- .../images/app-screenshots/api-playground.png | Bin 137873 -> 271740 bytes ...soning.mdx => reasoning-configuration.mdx} | 2 +- .../features/advanced/streaming-response.mdx | 6 +- .../features/advanced/summarizer.mdx | 2 +- .../documentation/features/get-context.mdx | 27 +- .../documentation/reference/platform.mdx | 15 +- .../documentation/scratch/working-rep.mdx | 347 ------------------ docs/v2/documentation/reference/platform.mdx | 75 +++- 9 files changed, 77 insertions(+), 399 deletions(-) rename docs/v2.6.0-alpha/documentation/features/advanced/{toggle-reasoning.mdx => reasoning-configuration.mdx} (99%) delete mode 100644 docs/v2.6.0-alpha/documentation/scratch/working-rep.mdx diff --git a/docs/docs.json b/docs/docs.json index a6e66375..840ca468 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -260,7 +260,7 @@ "pages": [ "v2.6.0-alpha/documentation/features/advanced/overview", "v2.6.0-alpha/documentation/features/advanced/queue-status", - "v2.6.0-alpha/documentation/features/advanced/toggle-reasoning", + "v2.6.0-alpha/documentation/features/advanced/reasoning-configuration", "v2.6.0-alpha/documentation/features/advanced/representation-scopes", "v2.6.0-alpha/documentation/features/advanced/summarizer", "v2.6.0-alpha/documentation/features/advanced/search", diff --git a/docs/images/app-screenshots/api-playground.png b/docs/images/app-screenshots/api-playground.png index 3a3c4c5f6fb52e47359d410252f5efbcbbd8f74a..d8d7381181f7f78d52617e9b05fce630692e5f97 100644 GIT binary patch literal 271740 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%0DLs04 zTp__2FV~4W^h{~zO|HwID*!{bEsLel4t}Zw4Cm=sZf?Zg{Yl?gcO{lM9y|8_T~TJu zJeR$)wtlT%jsrSzXnqEQe*|ENp?x-Jh|i+H(okunKqD$5I~XmJ!`{@=@@A8gr+I2T zYEhy=69!3>9)(TL7ujC>70UOg9~!p>bB72Bi&3F=+wjK93=oC8-m}gd zrUr+Qw|U_UdJu)zv zv=^6JjZ(`HEW;}dP?VFR=nddZZ5t^*g%3&K?`DV+I@9gE+{oHG6f0P4b=@>q~|4wW%TH8=plt|A` z5w=&6`7Sq~E(iW|w^dqY*{fuq4|CGFL1FA+6+LW#5HN`w%kYCPzOMIh;li4zR^K)0 zJ90G(rDG+YWv%;@=4Biu#^*-dQF~={AZ7Rsh1e;ZGF|r-RRs=OhupF5Iu0|Hke&xN zTfp&2vROWCM268?aKXgtD|WQcBRyIo^GPm|ZIto_gL3UwGohv}_h6!6lZ=vi!T=uY zvWw4RC5tWL3aE&qA;HG}8i}kEP#^$|_LnOUSqqTY97EL(2gkj0@np*;aczxh< zm1;Xb@@!e{_*N$Y)|s7i|5Skg8_a!>k8FiNm$d z$S!4t#j)O7M05QSgtH|Uqq4gjLfQhwb|!VX6?u*G@+OV%ml|6&i)QyGvQ?Asxbx>3 z+TFAW>Rl=unP4ibRT2*~Hy}3+xX0kNn+AzOAg2fjvrDsh6k>R~Z6ulf{AfN(h(`mS zQYn!rGNIOg-)Y(NZe+feMJqhYq?M$4aCMw&Gun8w+!)DWg4P3GBry>5CV7rh8mZ9^ zoOcovTcREy0Peo+qC-h-R-OR#(J*#*Jy2fg+%rQMyC!G4lYXZ2vwB+KTAL zaH#r#K_VCOm0i>Zk%1lm3lOl)$3`ij3lGm&_0IH zjeUv`5o9SY8s>lanf{VMKlQi?5GJ$nDvI98CmliY@jU4UUsl>gW4~=AFkfY7Yb7{# z1C%3$6WK2Q2?9shJ^GUT2B}Nle+(6wMDwZm`SHeap$A)vHOu=ai3m$qhKBQRfPL{O zfxoN&-ZTs2d|rMA@w_=meSgf!^?EHl-mJREM%%ho4DwTR>(??hqj|ktbJC4!S`AoW zAdr_>Ts-6a+gnt?2M%Q}wQ+jOm8sdE7bfgATgn;0`@&MPp8Uq!pVvA6?o0*uUky)z z!6_Q33}Uj#?LNZVIrHUdgk{zo9fjKgF5Un7E&Q<$=A)G^7r1rhYAPYEh`{WZ?q|4W z$fvnImkVN=;;-RLlXpw-&}@4 z^<=NpH}&NWKb#p)483MO4iDZLcmR1-mK5dv#O`(|4bjYjGvs zTOL?cRaj=-ad$67!!{ikA|!+su~6p};&JAztSlOgz?Et3?1!=JR^!SGUp$i#-d4xN z#dA*PPlF55q?OmfASz;z!}NO7c9}ezzJTkijY88lZTV|E^Ttr&-)e){>p>+UK;C`l ze(`#r$lTW*iMtIQDTLXeZ2Ys9mF6+PX7LX2V$sXPY&D9Mxx}X*$t!jGz&|uL!#HaW z7T3E9pt|c{3hG-K=UG0_Ee%0EVOK3B@09FqWzBsBZe(_labkV%^P#Nbwd!;-yE$S| zE~|Op!p5A>P-++1tf?yzqu&85=<2`0m`SgN!1}(&Q*K3;K!M~7azqsdY07(`uLnDfNNOxKZp4DvCdEG%ZeR#sEhvqlDny&9w}ier+(f46rfk zC$0NZU*~F7$S!+6dV;J3p&X$?Ze_(bqq4wj&a^0^B$p&EZU{x2$DgSZ)u%rF?Gs|9 z?k0V=Y;!}C>Wt4y^@@XYYAu|#;+tN@#7KRZ&qijv)8r+Zesz4XG+3uWA}F$)FKYHg z;4-Vul!K7CIPnF-3s@|})Yu;Y!{@<;aqTv{&PpJBglqWMdqA=8IdpdUJ3oP}0L~aA zi=iF9qKFRtyJ``t;q5ms~>bLw9)f2XhybaGj$^rAiWFj+H4j!t&GvJkyn}L@=2#Fa^TS2 zdnqpRt%!oXpM*5G41awcmZ?4K<17vSsA9>U)*4vom|&!O3TPP~CjwP*P6S#OHbH^_?-59lkhWn#p3*F1A8cUIjgTI2t+{taeNwOnXbwI7 zr=6*rwVpcqNLuDPA3~w>BIwU28im8sb7Z&R3HO9uHZoVe1wWSC<+d=VjEA42GKjLKZ}*wMn$=%eJLatW)2*)c?6XZq z!53RG&jpCPp=Uuw%}##s+T^#@5De<+Dk-Q+s9K*6+~^+NHltOC+J&wwB4r%NfW)+R zopeLsE{9NT9Y}d}&v}e(sRkoRGb$G|5!+8W>E;Di>)8A(%DBTHio(VWs=pFfczn+D z;6x#f8f81+b2;o!gCihh_b~2+$RfzBG!!+S(;pogPGlA-03|A6&BkadmyOwCp z#E5q4VZmkZ65_ukzpqnsL3#$Gk?G)kYjLxdZ+ z^Hr8M$Tqr8Eg}XNZGKIC}Y06Bxs^IwR#zx19b za)9fXU*``6f0JJN{bZg0nW^-zU;N|KT`YXH;nBsd20Z+WuBZk6?=$%SB>2DW0ss}# zs?@OnU@gL^%X2sH(uuMea+H~qsk}VOGanDw-b+=O)$dI%?CRWOBiRzKFJ7|<)45SH zZ+da#1%IH^bx%VVKXjt)kDrrJg4Rq-;va$9E&o{1fBs9t`W@^eEg#0AE*seLa-H<5 zy_=>oeuc!{0 zcLv@1KfJ~d6v3`S1yiv6_xA3bmwuL%beu{1Pk9yDb%H4+TQWn$EEY*-K*Nt}c?SJ4 z!MiWPnRrBTdI*Pl`}Mp@gT+4J;a_6lJR>=q{@_Oa=W<7lAH%we%?+zk82`UOge&+y z0ZI4%WPBZaJWG?<|((> z=-Md}Uxu)0t@sy*(WiNRYThMt$a5+zG+jwdfZHryQkwX%|8^N~+5g+vDbp^_RBMk) zyS(qaK=@R*VH^YKr-u*?L)d zv7GqDoXCXvzTeiL$d2M{yvuq3Ew+4Yb6naR`mHMYxVbk2$=LX5dqW4qo5y@s{I#}6 zm9o0h=t0)J!a@$9d}SCt-eEgVunox3X~)ELgacUxAq3wB_-MF4_)4v}r6y_5FZs)q zaE8_4sm;wrEzABXlCZx|e|8ge=1tMc=HHv}9!fHXp(FEdl6&>q=*pHweVza66{QU{ zlt(;s>hv9U8hk^$5uXvCMTK|cr}nH3zHQd8h;3h!hA`OElI}y_uLKZ|`EMtPx%n`> zhkk;l;qBEBKUgwfzZMf1EV?0xmU@Su(&lqs?0pol84LwbM}Y7tEQYu~$xJQtVXHyd z63-iOXEfX3=fJn@1kA<&aT@FOGOG zu+@;y`#bUDE?1Ju!NGg6y8Y?wP4&v4uQRh0MW;~V)z#HgG-UA5-?IOSKru_p*l=b; z1&MADz{%Z#@C+wCn)%V1~!q!B_?(5!w*4& zcqVAF^hsQA|3;d}a$=@Iq7#Joa4(AqVYAQOrl;?v8bjsg zy3v^J9_6_Ir%=IaLk%^6BbU=Y5FnQXEgCm`RXb|w76CSoon!Bn+1pD4mHcD@FL{m@ z0{0S*h~Jxb!^V){2Ry)|0{W0Zk`fMxO3;9H4uEh5FQ0B++?m1A;xB$mB2DE>cqu13 zVYJT2b;>z5@hV9w7#!Us-&vdv{Y?D_c{az=a3c9%Rl3J-!~mpBmEDwp&Ikgzjm=8y}zww7*f&=^VfuZnSH4cTa$`ebNr`8aL(dz;KY2=?yPy@NWfUHP-QZ zT!Q^LwnzurS%V|uJ*UI%;@c~uMV#jY;zW+V!}aoa!a6X&(kM(FEE^e#FJHPwEkUOT zrtp!z$sI>KU-I+P8%ajq2HrtIq-{7k_V1MbMz2&N$>OvH_Apf4g!VWAIcTin+)-0_ zAnpm2^QpIWul$$n`A1vmC>ZV@Hn!%j7XMLA5)y3L3E+5G8I@_lwTfH6|8W)$v4)}D zJ$XQAN8+P~PlEz$;`QO-YEBJBMTHlvzb>%;PCFvOMx{+#2`$J!1kFkIMHL;XX3F20 zMYFn9v`L`}ayFBa@~;&5N8SCM-V*>?{$%SS^7>=s+N?EX95#O2>ClUO{V zTBg<~)ZoE>)pT*7^BLc70IPErMsI$^Js*IQBy=E#qFmYH`tRm6k%8U4Fz&1Xu_<7L z+#e~(nEN@-SJ=vRVE4}FDVF_i_bLElG%mdF%6kVIILpkya3mAo8h#(de4U)dQI(O$ z?+=SyY3)_Qw`dVQ{gZqlV{wcFlyqHpkBQ?^mL{=(xqE1dx?puy693bMdnpf|Kd-rb z-7m?R1TQ>0$!}w<;&^|HPa;3e6jWZYLyksv%w95^i!o1hPu${keTmpg#04e%ZAb25 zZQr^}+!r;mtgv19+D|8!FWx2WR(5eQahi1^LdkauJ~lpD(Z4Si?%c2b`6}_XF;Qx6 zE|wDyv<~cyz`so9Z)b(18q8~AiH~y?%N@t! zIUoF7QfX}1A{ghM+~djLESFe30he`850#9;*a08K`Hy0Bj$lmJ%;k>CP=7bO0e6ky zy^(NqaQ=;r_>oF0$PlgFSCIJ0s`WTkaQo{$aKT6`y<+=q047}`m_uW?HAkd0IH*D4 zx0a4hw=xJh0&5gL7VG@mz{H=yQ}N+O*fp~LKyk#XuyjSC8fWESIT^9>p7_mH0iK4l zXHv}{M%S=0GY3y9cS7(iL4`%5Ha@3IxcSgoVl_T3WrOqFPU2GkMvcFo`CWe0S6JeX zP0a6a_k{DjG#24?n&ZpaqnN`^FxbOAdK?|Kgx6m{q2pW&8`T*aq&50cp*ZwcP)ks z-bkl?9?56m(?AYY!5*6OhWl6W7dqElBLqmVJ{EJsk1eshhDhidwRVnKg+$qT?XRvW zPHd|xMy1!~%^QnOBUa{Ge4(DGPwZ9WH7jCSx@>Z5M5s42FKbt=sPsLrjCWJ=giGvH z6h1t-RoA|%AtU@C&;0Pu*~xQtx#297{T?~86_^}Z=%Gm-{lIhG)u$CpBcbV7s+a@-FJ?>U*Sz?a0!A|5fI z`K;bOR$*yVmwJEwOY67*j4`KmB9 zB(k#oms{vHifS% zzQ&T4l-WmW4IS)U8&%Qk(3Z=LFm?S8C!A>?Cz!Dp=;Xh=ko zQHQt0-8?#XqZQU2hbF&gapy^c_}DN1R6TreV+G>18}grO#O~nXYsw=7Qk+GBsL#~IzJH=+3)&gnxsgUMXVzVLnmy*r?azKSPgS&a z&Y#myCjKctCO}nLI)I%nJNfD76Qwi9LE`Dzb2)8Ndp0^{k}uAj(W}W?{_;^qMy6|L z`^~+eynS^wEylS1ywb~oHgy&+`?|`toyyRC`3Cf+X=z;x9x^IV-^R7nwBHQ zPq}OcWrONHp!dzHt_jGD=HB8Dhp`Rw&U+jPq!0)lf6 z{%oiYFs?w)(Wbrqfa#ctpOxLR!=#^cye+D^Qdt@t%k{=AZ>SvIO9}OH5!!W=kyCV~ zX1>LDUANB@ZbpXETVO|?`8r2+n?}1zCfCU{WU!?fvRJLuIP!iw@Wy_qyr+u|=d7@y z>!*@)ThS5~qL7SOF1wqHhalaeZjgKXX1sYurEmCxcbVYSBap)>vanEPuyk-8sZnBa zSlQKo+7#|gX-PT1Zz0V4YAZQtkcPCCL&L~=^njqO<05iR63X<1dYGorqzECb#D9cA=l8Y`}-nAgyJgIf4fuN8Tuxg|N?>2sf*Xdn+iE zgs$|Bi*C-@(ZMKehFrrv2G0S0bS+guGGaA-vwiD{?RY^7U=Tlzgc77llfbNnq1QYBVm$AOhQKyT2+t5Vfe5pia=^q(mqL3!&AQBV zJ+(DH>sgM-TeB0agkqu-7Eh|A506%P2Hw);lk$k?)+(gra`$ok(9@nJLsN4;LiF`AEIib^4IdhR9sA~tYH;~ik-cB!$vEL!e*ndy7hWN@3g4l zA@ZVSe-OPjQ{P%7!aI-$g?p7;Z1)bFKG^8hG(_B?DBAaYP6&aZysC$1j_<_wFxcvB z74?5Bfv1$#d&}z#6QH5Dx6EJiEX{nit!a}xD4z1<6cU-JZV7fsEw7yHFi$YpSB9x6 zE3*cJ*b;x(Ni3= zT9mJ*`Rv0OXUT^V;+JzW6$Oh!2f~xOldM(7*G#xGDjhdY>jzzmU98ea_roGvlKtHs z7Z=Q9XV7%MkXB!i!kxN^NO7JhihQyZrs2gPMgAvsjYqtQ88O$ww72^qs> zq1t5>D2=k56x_R;)dwC(MGQ*ZQ_^}D893rPnn&8-ASRB zw{o--optOi1}kfHbt%2~WgLl7khXjg^81h4`}eaDxx<PZXZ;&?3 zWPAvr7q?~3Xi^%=+zG|#?Fft?KrYGFeRS~IUChZhNevUNF&<5 z{9TvUbI7Nyap~!FmbCrX>da(AD;-L+*$QUDS$4Ut{e?ECrZJCBNfr6|`4^hasN7^_ z3KufzRol0;&9(P@@x?Gh6WD-8BAgr1z}?Gs2CRM!6pgdxe8sTd1}4eMs~?U`n<35 zh%RJG@v`okWh2!fED(8Q3(fU+A%nWG>O4mB#b~6NSxo3K%3+rO?H$ftb!F{8&zM!@ zcd9)UlI`DRG!&j4I!m~CknLGtNf_Z_?U-Q_j8LRx^X$9_OQE?KADNi!I$8=n8E?Kk zJjcY%BHtA(rC4g~np!Y5=wLgSiTESmu&7I2!}dvHkBMA@0R&009NBvcLT$K}LG&Q& zQkl2TLBcA;A)P|D*J;M8)dP;&%BY18o#dD`^wzqCp`xMJH^$@Wy{5Ryd}X=As4*8q zi|RXos6Tv?80jV0UBJJo1-Ycxmv7$@VaxjpqYAtDnTN`x)WGhbl`XHTcMMipxZ65E zR0ONY5#`)q$ME!Ey2lLYFv+b&CF8rXi?7S-a`oQ2wslb3!63Vy&vz-_XPds%o1=n$ z$m+^{ib?5R8W)As=`&E+?IkcH%@cOLH0$qTkQ=op=vi1KP{}5n`zp}!;#!YQ!Tz%X zCqWY7xl?N~$utY`54=PY2TC%y9t||0$`%K)^^ER2nwkOe?#1pe%>9rT?AHilFqT1%QzjMgync2oiAZqZw`#521CqU zm7zhl2k9kT5Zr#7os_in1>X1Vi8oaWR4*gmJAlh>ua+|V(I!s_i#!4GA4TTDnj{$TMvW+(i@YXa0Ot6G+$aGeB)eso)yt5MzR_B^zb z&sulX&XcjJAAdt{Py*5Cv{5tBp@;9`qmzHJ6{FOctD&*CIX9zXA#~M1SfzhA+qSjR z7BIt&ptH&_%Ei?xDO#Uw+YdH5cZ_p1S-3S`UmUEQ)GRYeM$NmUGtOazbVZRaO9R;S zrjaB2o})Cql)&c5@jhYElUu=MJ<X=kiZvw z0VK+KORLt(aZo&AlfSn1MoW;?vyRxk82FXaJfe}E?xcOpD{e;e`;21;H4S5@46!W7 zzd}@EC%0%zdFd30lt7rD1Y2h?3FkY1D-U*PaT~$@b2IGJg#_7$ctM#q0SD*r*?H)U zzh5fF#+tQ5WE>nmwDO<$nP|v&{?fNg*ZG#eE{DY?nh6P%gF2d|;^OR@9|bCO?VRqc zI}%IR|4GX{L?QQJzx<)^^w(1tm-*jz7pT-3n<$5BD)4ADMff5jZ)wndTiM1zc=9aK zPs94H&U;NICD#!c$as8OaUShIxY#KrpI`V@(Wn8oig$7O%hJ%ti%cZ_d9FU|_Nf}y zXXrQ11J#rL)WwE1bNF$0y+^m133n?+HwUV1u5p{$^%q43I{N4g7u5A{y)F~Wtnp65 z)NfRkE_a9_X7jvlg0;68qCvb%zXcL$)sLjq4AByZ)>|7nCKYe3u*UfNerFdXEDgzp^h1T zFA53WXCkBGiSYF_y2a~x4>=V;o`j`A#c9zowrUj9O-9BIA+mt5;$p6twYt!T?W~gO z^)acnzAD;)Wc9U~?6I`Q490ubapYD+iy z-1qWX-V=ViBSs+0`tfU(`gW5v(2@R9K=Vq&r;=LsW5v%scr!s{qf;8&1T$9#a-ghs zxq}nru!nFKjVNR-fEWb((B<%acBx$}Y?$G2e=1GrkOr@r)u_=}zeXLjP5t&X!B;9f z6QUc{RyFWCr%M2L-rt{ETPg||?xCg6mb&hG8YL|1 zgV0KHaf_6}pG%7K69erdTjot$7wepa(g~}G7H;h4)6BbhVHWe&>OZcyQwgRc3LFm- zE(6>kv)gPlLk%^^K#=|;1HrELvZz)MHI4o9?WU%t-YVnKzARO#+63WG)=q1h-KJkZ zhCVHU8V1)0*ycK~^nEI5t~2l|k(78DlJLxEGLLs3rsvtFK6?pXz3ZV}V`hVwFWC)L z88I*52?K6=m@7}p4>vs>4?f6slbzImQ+PM_1l!G9w>5ZMR>dAY?2%Dm_ulEW=y&@w!dy~z5+v~>dcK^Sy5bd?XX>%+aa!Qh zGYf$UZudb>cIOvE<<$i_W7`oKw^~)hs~j_yTyIQWzJUIy4CVyFgJP zo+~WeC2K;F%n?`gERVRn)6wb0o-<+%`W{7|za(X7|Mm_`WqXFAP_a8)ZZpr2$JK1c0qnmFoZvnt&CT)CnD zmhWmBd>bnd6i904R?jX3w4C+T;ioVq7{>uzDZOvG`@Gp9M${H|0ZV}x&7$P^sedxl z+ullNtd~z#MfO(L{(8Z}NM4`3{+HOckjrGMVu2hI-e}@1vtZS+R5ad5k#=lm)TaC1 zU8G1~eBf^M4eBicOaop%f(xO~~}B~ONPNTz0$ zjHjoUZVSG)?xKA=g_3;~fuNA_X^iCxxHZ>SSeu1T!v$Fdm6?9k&97*mNRDRoElG}j zO+uZQnZ${2LeKMPnpBRf=f9GMw_gr+S$x*0g%bcl2CYrB!va8ZKS{u zDgk%yDAOqFB^-L03^eEV%}sV-Z-H|g13Tx4Z`leT~ zY2&)8NX?R-^M75QArA=MUrT_irEpS>mZ%2E$$3*wlH0*Y`wkLL$O%;^W9x@IMOXdc zDKV~fB1iF?exoEoeLtnQ9}&y@0bJr!RJBAFD)-6s(o#@D$@>{zuvts5RBoY-0G za}asU`k?JV9DFBtWUtZZnEf)Yx$v$lO;72kwGQvpNop(jO;C56*})L);XHz>boUUA z_U4}8+wgyO8iT2?XQWU!`JuF#*tWu@mqx?=^Me_&cMKFZy@+@F-3Bxpg|u(dlac4; z(4@i(7Wl=jX5# z`j)k3n(SRlaYpm}Y~%hD)#%#ov-1q|gNPj|JqvgQ|XPm_(lw6q~ynocHsb(^C@2q~BPOw#wk?dL}{ zO%W+723y@r`e8lJDwW^NG2}GI#9t!yqaAXSNa>kjp#o##ASBBkUR3GZr60{d1DKjs zOKEma77A2sGLm&ce~yK>Bcz;sH}fS!)4*wB~%IG`ZPGV><#+!{HK=M{L#ZZrm<9FppH?v{zgEq6rZ8}uz*F-<5;eSuOCfg zH7s@w+Wb~fdtOYssJ9a2vv-U;A7t-*H3J@vz%h017T!v`^~*bYmB_Vy*ejJSbP18h z>T|08lfZ&9)*5NTOLtAQGJ?Bn)%+XTU{PQ*W964zZ1IpRJVNG;Em?ZabP@DN5)lK4yu^zBVRU=svRL-T zh|DFzmN3;jrng**^I#Op{CgXgmeVx?`};PX<;rq>)7DFa49ia2X+~r763p7xh8~cP zOc`|mnqXE?m^rpAQsUX2Fck{@rdgtwt%W1i{Zjgq-otP5kh)xZ`O{epd{y_3|5!-q zfrUi=%u|4*=ok{Ue=8USp`k3VCvbs~2fP-;_XGqR4bwg5+Q|-_vvEIw&>=r+kGSur zcjm%f@t7;?pF~QE+_L$Q4m<>AB?3a#uqzc7+sPK~?^MY$7&KQC)f^@leH)&{TM-I7 z+}zxrdE`K*BZN3{%Gl;Z)Rcs>syH@0Fd{;|OC> zo!#l6j`3f`ztvb{`cceYB?5lk|4KgmWH|&@xqjmS0Pxy`A>yYpcjEN$=?Mm!FyN<2 z`uMS|-nLezK@`3vUo{Lw!nzt#Xw43@8$V&i`^m)KSpwE&&R>0=DHHe&aX&C@ z)NY6%GVM23UZ+G;;9F`Tod>G4t2C*u(J0lu9L^OHXPdlOX)|K(_1UPezQbf@!F0+? zRBo!T0Iu86rk>5MPYS~QdS#_o;O}D}v1tpJUDBSea6oT;$dKygq<2=EE^gAuP+&-2 zmm$-gD{-HSa%~&0Tja5Bl56K>0(tYyv4805^#*s9#u!2Y(i;@L%_XCu!NJWV2!ZFk zXVM;AcB-nC&mP@aFpnVlgq)pByur|F$$n3MmLf6cLwPyxj>#%3EghY#@Qk>h^0I0X zFiqVj$p_5-o}1;YlTo&Gnu2_H&Lbb?qV~%`oqZQ{a2fiS7Ck=(Y=6S4RR!4@9%gE* z6+ZVZDRXIOOk<9@eK9SxaQMIrq-53lNZrf&Kvqsay@5alOk59N-#o2!WCuNQI^hYh zX9P)}AMq4BP=3UXF)+H|AH@~E-sVa}H(Cs0@LhE%bJ|qc`7w^T>NkLmiKXyJONhIEUGF`^e<`>eZ$1@svzyiDg*+& zjNTOpc{L0c*~!h#eJB;EU^B73&AuSJ{_nT zaYMi*ze#@fW2mYBW2yzkC`}rs(UtOy;oXNtRVJ%BtmEOUz4vF3+4oCD(HUok3?xadYdH9}99tah6(1GxsS~FD+Oy6|#jRy{e+0nt)nB>I1vPqm7yp zq5il6A8~~p;c)*(rt*!5oo_nGu&nr!C8sl25MKJSX0Xs$(aDE6b&AqvErIP#+h~b3 z;z>3s-;n&>EskaobX29jT`|1hhvaLM&$#NlD8CU7+JBU$SXG(P1rt35SIl|2D6-Zn(-3om zmbTGcn?#g;5V9KA+>EPQCL-s)p~{hsqnQ60D#dWPDR_|O?&+E2l41z7J-Y#;jLm_q z3q;V@y{TJ+BaEhg?7L^DkDtTRV{Z#+8;Mr@07o?J2Sf$XVQ`(Do{p?9$%b#-y6EOc zwOrL)FcHO3>@r0Y&Rtw71j7ZDoJaFL(y`3MI+>yv3}si#e}220nUc!AtM2)k&!lim!1Be?1l# z4=h_QuiK8d_MF_A)Y!?nddK+(YqRat`VyZ589cRS@ElfK7`x(SCUwSU#l5+$M|zq< z)n>i}^k>dOgiU#15IDcqJAUU#D*OdbPLMMFG;4ld>plS?dE5L0`LpxqPs#xH{k^?$ zg_>r&)2ChhsYbkr7g!eiJBGByJHe{SChqpKVGfTpcALFIsA5bH!s5^JEYzg;kQKag z3NBRwW;t^%<4rN^tykJKAm<$!oX)fKu_-pTSCSO^nth)+kN)n1^^SVUvuC4t9$Q#g zL|-Tg?s+J^^7Bq9*}T69GT^|P#)>WVuS}}E8INHx6|NYPHJ@^w3=VW8O z*j_oF;8D7@L~feY8e3K8(Fx#H58vwymDNzuV_+S_C)l9G6nDK)+p4(|JPX{l#ASlp>@!AN!*DWSrn%`{6VLd$r|0A_b?jV(s*4;8koQIrVlBHxkJ?vZBwG zaNogCJDP`#HcPcAz;n%F2kwO1R3q%g2b*(K!p3^5-D1D+0&s6vGhiVETqfJ$z4d=s z_y7Lp`W(Xk;N%NZBmhKwTr69XyBn!uW@vlNc5Qop`cX_fH=aJ&nKNyqtdAZFY`iLg zg9|w@lKRvc%_J$z=cLU-)j(o6dq=^A4w+vXQ)KPf8jOkp;~7NeAWo6w^LzZi+zF7< z`03@j`=3D~;SI~ThQNww{LR1u7RLxdp>oDHDH=xC=AI%5G1vogC_|h#K7rM2Sgv54 zH%MCxU;Q>5CtwDVOk?mn*gO1lOBs%FdvGAcO7i-0ok zU__J#x8S^yu#l;c(5CG~qE8RXSvg-}iGr)CXV1KWoWalUiouc}2l>}Boq4Q27F0bb zp_gc*8R)%nKK!m-`W~XyW|KBME2qRles>W9Bz@)5D?5RN%r&WyIM>o<^5W9W)qYaC zo3qD)+TV%qm>|0o1oadO?KTr?+za}#8GR1o=r$~4z!KPwM-z$8k~c(DI091>nS;1A zGb=EDxbpB}0xhBPp5^YIR^k5Xs}-B7Z~i)a;cjzzW>MS^z)+LTCm-e=U5rFMb}+|H z`|fjCzMM6ITcMzOG(SfEZX${sq&_@98@7060UBXE78HVzP=5W%y|&*+!M{7{s>h%j zSO0RVV!f!7eb*MqXm&_bQ`obH#dkJKAyeH117*5? zRllO85 zH=8@ficcQa-N>Ah0oYIWn)KM~&gF|mV>d!IE#h@_biTDHTh^^hUYd7!$kb)jHIrpA z-P2cA>ac5|K3$SR!G^F|9;G+x&9)@#GIjLf3MwgGl5+W=?Yor3L}h68l_N_PT(+UN zL!*Y(`f_tpT7yXH`#0!=SUj%yp4V+DMIRhx2qg=Sa+!IV z=z9VG-sN&X2>fQGuzT}aAl@C=o7D^Ho>tPlbkT)1l!HZ^tiLO==G9cv9TPK8n%_%kLB1bTBK12Q*rljjpL z?&+nkhE3d2G=KWkAF`_$ZWnRJZy=k-L!0=hObR#+mYDvjHMrD6jvsk~#XifyA^{WS zK1{uq_%j%r1@3@VgdVVp!)P2TE7Oi+Wbg4AITn;aB91^nYeuq>Ms=l-sHDHLguBG9 zpd}uF)7;y*ox;Dlej8yJD!{BZ82j?I!?>wK{#ZDz_$`-Z+sA}4+{Io|s1(bqex^GH zfsVX`Rf4L#XE5}okoWT7eKwy#-ROIb&Fwb8^sDJSZZO|b5jnZ4A45vL>@+u~29mKE zzNuzAbKdF&=hZi0!jM*oT(10@OKSM0lGKD`9CYz9C8fEhM3aXcq2E&70)S7Bw_77Q zEz3Vvd{>ob4r4(Gz|Y&wGmSR*-gMGHsGN1PIG2yCIY!+t^@0&sl`l{tdL@i87;+v=RBAX)q8 ztp4{m*SnB0-`8D+`Sj`Qz=*({SBW{mEmZwF%KFSf0)4#u;PaSR_1_o86puUrzxtZ1 zAviP&;-GZU>o`hIp?>h!+vuP(hfU699H>%HE8?FYd3FDHDB!E9x?s=+yeHK7Z$S|E z+BL|%lS~}5ByS;XO1xHr}7^V{cesYPN(BT7xX?pT2t%6LKGpo4T%? z0`S@@T85vVLdips$xfi-^6x|@X;tX-iO0a}696eFMHSF2vk6tx#8Q?X#Q1$!IavBz zdqgMx`pq=)h`?);&#sU>z`+D4%17O+N+1 zUwG=j≺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

jb_ipQ?MDO36wy@q`ORkT|95c)+H2cgBKvGpS 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 =a$f5YlTHKRwhi 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 V{PpxsG<0MD0#8>zmvv4FO#q}?-H8AI literal 137873 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

~a&|_PK+D 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 diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/reasoning-configuration.mdx similarity index 99% rename from docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx rename to docs/v2.6.0-alpha/documentation/features/advanced/reasoning-configuration.mdx index c37e1661..50d20f2c 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/toggle-reasoning.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/reasoning-configuration.mdx @@ -1,5 +1,5 @@ --- -title: 'Toggle Reasoning' +title: 'Reasoning Configuration' description: 'Customize how Honcho reasons over peers, sessions, and messages' icon: 'wrench' --- diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/streaming-response.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/streaming-response.mdx index 4e53cf9a..44c88b5b 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/streaming-response.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/streaming-response.mdx @@ -16,9 +16,9 @@ Streaming is particularly useful for: - Interactive agent experiences - Reducing time-to-first-word in user interactions -## Streaming with the Dialectic Endpoint +## Streaming with the Chat Endpoint -One of the primary use cases for streaming in Honcho is with the Dialectic endpoint. This allows you to stream the AI's reasoning about a user in real-time. +One of the primary use cases for streaming in Honcho is with the [chat endpoint](/v2.6.0-alpha/documentation/features/chat). This allows you to stream the AI's reasoning about a user in real-time. ### Prerequisites @@ -70,7 +70,7 @@ import { Honcho } from '@honcho-ai/sdk'; ``` -## Streaming from the Dialectic Endpoint +## Streaming from the Chat Endpoint ```python Python diff --git a/docs/v2.6.0-alpha/documentation/features/advanced/summarizer.mdx b/docs/v2.6.0-alpha/documentation/features/advanced/summarizer.mdx index 6e3d2ff2..b23492ee 100644 --- a/docs/v2.6.0-alpha/documentation/features/advanced/summarizer.mdx +++ b/docs/v2.6.0-alpha/documentation/features/advanced/summarizer.mdx @@ -27,7 +27,7 @@ It's important to keep in mind that summary tasks run in the background and are ### Retrieving Summaries -Summaries are retrieved from the session by the `get_context` method. This method has two parameters: +Summaries are retrieved from the session by the [`get_context`](/v2.6.0-alpha/documentation/features/get-context) method. This method has two parameters: * `summary`: A boolean indicating whether to include the summary in the return type. The default is true. * `tokens`: An integer indicating the maximum number of tokens to use for the context. **If not provided, `get_context` will retrieve as many tokens as are required to create exhaustive conversation coverage.** diff --git a/docs/v2.6.0-alpha/documentation/features/get-context.mdx b/docs/v2.6.0-alpha/documentation/features/get-context.mdx index ce6546c1..6b4ba186 100644 --- a/docs/v2.6.0-alpha/documentation/features/get-context.mdx +++ b/docs/v2.6.0-alpha/documentation/features/get-context.mdx @@ -6,8 +6,11 @@ icon: 'messages' The `get_context()` method is a powerful feature that retrieves formatted conversation context from sessions, making it easy to integrate with LLMs like OpenAI, Anthropic, and others. This guide covers everything you need to know about working with session context. + +By default, the context includes a blend of summary and messages ***which covers the entire session history of a peer***. + -By default, the context includes a blend of summary and messages which covers the entire history of the session. Summaries are automatically generated at intervals and recent messages are included depending on how many tokens the context is intended to be. You can specify any token limit you want, and can disable summaries to fill that limit entirely with recent messages. To get representation data, you need to specify a target peer. +Summaries are automatically generated at intervals and recent messages are included depending on how many tokens the context is intended to be. You can specify any token limit you want, and can disable summaries to fill that limit entirely with recent messages. To get representation data, you need to specify a target peer. ## Basic Usage @@ -601,40 +604,24 @@ anthropic_messages = context.to_anthropic(assistant=assistant) ### 3. Error Handling -Always handle potential errors when working with context: +Always handle potential errors when retrieving context: ```python Python try: context = session.get_context(tokens=2000) - messages = context.to_openai(assistant=assistant) - - # Use messages with LLM API - response = openai_client.chat.completions.create( - model="gpt-4", - messages=messages - ) - except Exception as e: print(f"Error getting context: {e}") - # Handle error appropriately + # Handle error appropriately (fallback to basic context, retry, etc.) ``` ```typescript TypeScript (async () => { try { const context = await session.getContext({ tokens: 2000 }); - const messages = context.toOpenAI(assistant); - - // Use messages with LLM API - const response = await openai.chat.completions.create({ - model: "gpt-4", - messages: messages - }); - } catch (error) { console.error(`Error getting context: ${error}`); - // Handle error appropriately + // Handle error appropriately (fallback to basic context, retry, etc.) } })(); ``` diff --git a/docs/v2.6.0-alpha/documentation/reference/platform.mdx b/docs/v2.6.0-alpha/documentation/reference/platform.mdx index 479ffcb2..34e9e237 100644 --- a/docs/v2.6.0-alpha/documentation/reference/platform.mdx +++ b/docs/v2.6.0-alpha/documentation/reference/platform.mdx @@ -1,7 +1,7 @@ --- title: "The Honcho Dashboard" icon: "rocket" -description: "Build socially intelligent agents without worrying about infrastructure" +description: "Build stateful agents without worrying about infrastructure" sidebarTitle: "Dashboard Overview" --- @@ -10,7 +10,7 @@ sidebarTitle: "Dashboard Overview" The quickest way to begin using Honcho in production is with the -[Honcho Cloud Platform](https://app.honcho.dev). Sign up, generate an API key, +[Honcho Cloud Service](https://app.honcho.dev). Sign up, generate an API key, and start building with Honcho. ## 1. Go to [app.honcho.dev](https://app.honcho.dev) @@ -93,7 +93,7 @@ Expand the `Peers` list from the `Workspace` dashboard to see a detailed view of Peer Dashboard -Click into any peer to navigate to their respective utilities page. Next to the `Peer` name you can edit the [Global Peer Configuration](/v2.6.0-alpha/documentation/core-concepts/configuration), and in the tabs below, explore all utilities for the `Peer`. +Click into any peer to navigate to their respective utilities page. Next to the `Peer` name you can edit the [Peer Configuration](/v2.6.0-alpha/documentation/features/advanced/reasoning-configuration), and in the tabs below, explore all utilities for the `Peer`. Peer Management Dashboard @@ -101,14 +101,14 @@ Click into any peer to navigate to their respective utilities page. Next to the Utilities include: - **Message search** across all sessions for a `Peer` -- **Dialectic Chat** to query `Peer` representations globally or session-scoped (results vary dependant on the `Peer`'s configuration) +- **Chat** to query `Peer` representations with an optional session scope (results vary based on the `Peer`'s configuration) Chat Endpoint - **Session logs** view which `Sessions` the `Peer` is active -- **Peer configuration and metadata management** including [Session-Peer Configuration](/v2.6.0-alpha/documentation/core-concepts/configuration#session-peer-configuration) +- **Peer configuration and metadata management** including [Session-Peer Configuration](/v2.6.0-alpha/documentation/features/advanced/reasoning-configuration#session-configuration) Peer Management Dashboard @@ -174,8 +174,3 @@ Dive into our [API Reference](/v2.6.0-alpha/api-reference) to explore all availa -We're excited to see what you'll build with Honcho Platform. Let's create smarter, more personalized AI experiences together! - ---- - -*Ready to build personally aligned AI? [Get started with Honcho →](https://app.honcho.dev)* diff --git a/docs/v2.6.0-alpha/documentation/scratch/working-rep.mdx b/docs/v2.6.0-alpha/documentation/scratch/working-rep.mdx deleted file mode 100644 index f3ea09b6..00000000 --- a/docs/v2.6.0-alpha/documentation/scratch/working-rep.mdx +++ /dev/null @@ -1,347 +0,0 @@ ---- -title: 'Working Representations' -description: "Learn how to retrieve cached peer knowledge and understanding using Honcho's working representation system" -icon: 'brain' ---- - -Working representations are Honcho's system for accessing cached psychological models that capture what peers know, think, and remember. Unlike the `chat()` method which generates fresh representations on-demand, the `working_rep()` method retrieves pre-computed representations that have been automatically built and stored as conversations progress. - -## How Working Representations Are Created - -Working representations are automatically generated and cached through Honcho's background processing system: - -1. **Automatic Generation**: When messages are added to sessions, they trigger background jobs that analyze conversations using theory of mind inference and long-term memory integration - -2. **Cached Storage**: The generated representations are stored in the database as metadata on `Peer` objects (for global representations) or `SessionPeer` objects (for session-scoped representations) - -3. **Retrieval**: The `working_rep()` method provides fast access to these cached representations without requiring LLM processing - - -**Cached vs On-Demand**: `working_rep()` retrieves cached representations for fast access, while `peer.chat()` generates fresh representations using the dialectic system. Use `working_rep()` when you need fast access to stored knowledge, and `chat()` when you need current analysis with custom queries. - - -## Basic Usage - -Working representations are accessed through the `working_rep()` method on Session or Peer objects: - - -```python Python -from honcho import Honcho - -# Initialize client -honcho = Honcho() - -# Create peers and session -user = honcho.peer("user-123") -assistant = honcho.peer("ai-assistant") -session = honcho.session("support-conversation") - -# Add conversation to trigger representation generation -session.add_messages([ - user.message("I'm having trouble with my billing account"), - assistant.message("I can help with that. What specific issue are you seeing?"), - user.message("My credit card was charged twice last month"), - assistant.message("I see duplicate charges on your account. Let me refund one of them.") -]) - -# Chat to generate a working representation -response = user.chat("What is this user's main concern right now?", session_id=session.id) - -# Retrieve the cached working representation for the user -user_representation = session.working_rep("user-123") -print("Cached user representation:", user_representation) - -# Or access from the peer directly -peer_representation = user.working_rep() -``` - -```typescript TypeScript -import { Honcho } from "@honcho-ai/sdk"; - -// Initialize client -const honcho = new Honcho({}); - -// Create peers and session -const user = await honcho.peer("user-123"); -const assistant = await honcho.peer("ai-assistant"); -const session = await honcho.session("support-conversation"); - -// Add conversation to trigger representation generation -await session.addMessages([ - user.message("I'm having trouble with my billing account"), - assistant.message("I can help with that. What specific issue are you seeing?"), - user.message("My credit card was charged twice last month"), - assistant.message("I see duplicate charges on your account. Let me refund one of them.") -]); - -// Chat to generate a working representation -const response = await user.chat("What is this user's main concern right now?", { sessionId: session.id }); - -// Retrieve the cached working representation for the user -const userRepresentation = await session.workingRep("user-123"); -console.log("Cached user representation:", userRepresentation); - -// Or access from the peer directly -const peerRepresentation = await user.workingRep(); -``` - - -## Semantic Search in Representations - -Working representations support semantic search to retrieve the most relevant observations for a given query. This is useful when you want to focus the representation on specific topics. - -### Parameters - -| Parameter | Type | Description | -|-----------|------|-------------| -| `search_query` | `str` | Semantic search query to filter relevant observations | -| `search_top_k` | `int` | Number of semantic search results to include (1-100) | -| `search_max_distance` | `float` | Maximum semantic distance threshold (0.0-1.0) | -| `include_most_derived` | `bool` | Whether to include the most recently derived observations | -| `max_observations` | `int` | Maximum number of observations to include (1-100) | - - -```python Python -# Get representation focused on a specific topic -billing_rep = session.working_rep( - "user-123", - search_query="billing and payment issues", - search_top_k=10, - search_max_distance=0.8, - include_most_derived=True, - max_observations=25 -) - -# Get representation from peer with target -# What user-123 knows about the assistant -local_rep = session.working_rep( - "user-123", - target="ai-assistant", - search_query="support interactions" -) - -# Access from peer object with semantic search -user_rep = user.working_rep( - session=session, - search_query="preferences", - search_top_k=5 -) -``` - -```typescript TypeScript -// Get representation focused on a specific topic -const billingRep = await session.workingRep("user-123", { - searchQuery: "billing and payment issues", - searchTopK: 10, - searchMaxDistance: 0.8, - includeMostDerived: true, - maxObservations: 25 -}); - -// Get representation from peer with target -// What user-123 knows about the assistant -const localRep = await session.workingRep("user-123", { - target: "ai-assistant", - searchQuery: "support interactions" -}); - -// Access from peer object with semantic search -const userRep = await user.workingRep(session, undefined, { - searchQuery: "preferences", - searchTopK: 5 -}); -``` - - -## Understanding Representation Content - -Cached working representations contain structured psychological analysis based on conversation history. The format typically includes: - -### Current Mental State Predictions -Information about what the peer is currently thinking, feeling, or focused on based on recent messages. - -### Relevant Long-term Facts -Facts about the peer that have been extracted and stored over time from various conversations. - -### Example Representation Structure - - -```python Python -# Example of what a cached representation might contain -representation = session.working_rep("user-123") - -# Typical content structure: -""" -PREDICTION ABOUT THE USER'S CURRENT MENTAL STATE: -The user appears frustrated with a billing issue, specifically concerning duplicate charges. -They seem to have some confidence in the support process as they provided specific details. - -RELEVANT LONG-TERM FACTS ABOUT THE USER: -- User has had previous billing inquiries -- User prefers direct, specific communication -- User is detail-oriented when reporting issues -""" - -print("Full representation:", representation) -``` - -```typescript TypeScript -// Example of what a cached representation might contain -const representation = await session.workingRep("user-123"); - -// Typical content structure: -/* -PREDICTION ABOUT THE USER'S CURRENT MENTAL STATE: -The user appears frustrated with a billing issue, specifically concerning duplicate charges. -They seem to have some confidence in the support process as they provided specific details. - -RELEVANT LONG-TERM FACTS ABOUT THE USER: -- User has had previous billing inquiries -- User prefers direct, specific communication -- User is detail-oriented when reporting issues -*/ - -console.log("Full representation:", representation); -``` - - -## When Representations Are Updated - -Working representations are automatically updated through Honcho's background processing system: - -### Message Processing Pipeline - -1. **Message Creation**: When messages are added via `session.add_messages()` or similar methods -2. **Background Queuing**: Messages are queued for processing in the background -3. **Theory of Mind Analysis**: The system analyzes conversation patterns and psychological states -4. **Fact Extraction**: Long-term facts are extracted and stored in vector embeddings -5. **Representation Generation**: New representations are created combining current analysis with historical facts -6. **Cache Update**: The new representation is stored in the database metadata - -### Processing Triggers - -Representations are updated when: -- New messages are added to sessions -- Sufficient new content has accumulated -- The background processing system determines an update is needed - -## Comparison with Chat Method - -Understanding when to use `working_rep()` vs `peer.chat()`: - -### Use `working_rep()` when: -- You need fast access to stored psychological models -- You want to see what the system has already learned about a peer -- You're building dashboards or analytics that display peer understanding -- You need consistent representations that don't change between calls - -### Use `peer.chat()` when: -- You need to ask specific questions about a peer -- You want fresh analysis based on current conversation state -- You need customized insights for specific use cases -- You want to query about relationships between peers - - -```python Python -# Fast cached access -cached_rep = session.working_rep("user-123") -print("Cached:", cached_rep[:100] + "...") - -# Custom query with fresh analysis -custom_analysis = user.chat("What is this user's main concern right now?", session_id=session.id) -print("Fresh analysis:", custom_analysis) -``` - -```typescript TypeScript -// Fast cached access -const cachedRep = await session.workingRep("user-123"); -console.log("Cached:", cachedRep.substring(0, 100) + "..."); - -// Custom query with fresh analysis -const customAnalysis = await user.chat("What is this user's main concern right now?", { sessionId: session.id }); -console.log("Fresh analysis:", customAnalysis); -``` - - -## Best Practices - -### 1. Ensure Availability Before Using - -Make sure that a representation exists before processing it by using the chat endpoint first. - -### 2. Use for Fast Analytics - -Cached representations are ideal for analytics dashboards: - - -```python Python -# Good: Fast dashboard updates using cached data -def update_analytics_dashboard(sessions): - analytics = {} - for session in sessions: - for peer_id in session.get_peer_ids(): - rep = session.working_rep(peer_id) - analytics[peer_id] = analyze_representation(rep) - return analytics -``` - -```typescript TypeScript -// Good: Fast dashboard updates using cached data -async function updateAnalyticsDashboard(sessions) { - const analytics: Record = {}; - for (const session of sessions) { - const peerIds = await session.getPeerIds(); - for (const peerId of peerIds) { - const rep = await session.workingRep(peerId); - analytics[peerId] = analyzeRepresentation(rep); - } - } - return analytics; -} -``` - - -### 3. Combine with Fresh Analysis When Needed - -Use cached representations for baseline understanding, and fresh analysis for current insights: - - -```python Python -# Get baseline understanding from cache -baseline = session.working_rep("user-123") - -# Get current specific insights -current_state = user.chat("How is this user feeling right now?", session_id=session.id) - -# Combine for comprehensive view -comprehensive_view = { - "baseline_knowledge": baseline, - "current_analysis": current_state -} -``` - -```typescript TypeScript -// Get baseline understanding from cache -const baseline = await session.workingRep("user-123"); - -// Get current specific insights -const currentState = await user.chat("How is this user feeling right now?", { sessionId: session.id }); - -// Combine for comprehensive view -const comprehensiveView = { - baselineKnowledge: baseline, - currentAnalysis: currentState -}; -``` - - -## Conclusion - -Working representations provide fast access to cached psychological models that Honcho automatically builds and maintains. By understanding how to: - -- Retrieve cached representations using `session.working_rep()` -- Parse and interpret representation content -- Handle cases where representations aren't available -- Combine cached and fresh analysis appropriately - -You can build efficient applications that leverage Honcho's continuous learning about peer knowledge and mental states without the latency of real-time generation. diff --git a/docs/v2/documentation/reference/platform.mdx b/docs/v2/documentation/reference/platform.mdx index 426af86f..0c666a5b 100644 --- a/docs/v2/documentation/reference/platform.mdx +++ b/docs/v2/documentation/reference/platform.mdx @@ -26,38 +26,32 @@ prompting you to create a new one. -Once you've created an organization, you'll be taken to the dashboard and see -the Welcome page with integration guidance and links to documentation. +Once you've created an organization, you'll be taken to the welcome dashboard. Honcho Dashboard Getting Started -Each organization has dedicated infrastructure running to isolate your -workloads. Once you add a valid payment method under the +Each organization has dedicated infrastructure running to isolate your workloads. +Once you add a valid payment method under the [Billing](https://app.honcho.dev/billing) page, your instance will turn on. ## 2. Activate your Honcho instance -Navigate to the [Billing](https://app.honcho.dev/billing) page to add a payment method. Your Honcho instance provisions automatically, and you can monitor the deployment on the [Instance Status](https://app.honcho.dev/status) page until all systems show a green check mark. +With credits and a payment method on file (managed via the [Billing](https://app.honcho.dev/billing) page), your Honcho instance will be provisioned and ready to use. Monitor your machine status, and check for version upgrades on the [Instance Status](https://app.honcho.dev/status) page. Instance Status Page -You can also upgrade Honcho when new versions are made available directly from the status page. +If there is an upgrade available you will see an indicator like this:
Upgrade Honcho
- -The **Performance** page provides comprehensive monitoring with usage metrics, health analytics, API response times, and endpoint usage across Honcho. - - - Performance Analytics Dashboard - +Upgrading your machines may take a few minutes and you can monitor progress. If for any reason your machine goes offline, you will see a red status indicator. Navigate to the [Instance Status](https://app.honcho.dev/status) page and try to trigger a refresh of your machines. ## 3. Manage API Keys The [API Keys](https://app.honcho.dev/api-keys) page allows you to create and manage authentication tokens for different environments. You can create admin-level keys with full instance access or scope keys to specific `Workspaces`, `Peers`, or `Sessions`. @@ -67,12 +61,48 @@ The [API Keys](https://app.honcho.dev/api-keys) page allows you to create and ma ## 4. Test with API Playground -The [API Playground](https://app.honcho.dev/playground) provides a Postman-like interface to test queries, explore endpoints, and validate your integration. Authenticate with an API key and send requests directly to your Honcho instance with real-time responses and full request/response logging. +The [API Playground](https://app.honcho.dev/playground) provides a developer-friendly interface to quickly iterate and test queries, explore endpoints, and validate your integration directly from your browser—no code required. API Playground Interface + +The playground automatically loads all available API endpoints to match your Honcho instance version. Endpoints can be filtered by category at the top of the list. + +If you prefer, you can set up your queries in the UI and copy to cURL for help with building scripts or general terminal use. + +### Step-by-Step: + +**1. Select an Endpoint**: Choose your desired endpoint from the available list. + +**2. Choose Path Parameters**: For fields like Workspace, Session, or Peer, select options from dropdown menus—no need to manually enter IDs. + +**3. Add Request Body Data**: Complete any required fields for POST/PUT requests. + +**4. Execute or Copy Request**: Run it directly or copy as cURL to use elsewhere (just add your API key). + + +### Example Usage + +Build a complete conversation flow without ever leaving the playground: + +1. **Create a Workspace**: + select `POST Get or Create Workspace` and type workspace name into the request body + → Returns workspace ID + +2. **Create new Peer(s)**: + select `POST Get or Create Peer,` choose your workspace from the dropdown, and type peer name into the request body. (repeat for each peer) + → Returns peer ID + +3. **POST Get or Create Session** + `POST /sessions` selecting your workspace from the dropdown then type session name into the request body + → Returns session ID and adds to dropdown + +4. **POST Create Messages for Session** + `POST /messages` selecting your workspace & session from the dropdown then type peer id(s) and message content into the request body + → Adds message(s) to the session + ## 5. Workspaces The [Explore](https://app.honcho.dev/explore) page provides comprehensive `Workspace` management where you can create workspaces and begin exploring the platform. Each `Workspace` serves as a container for organizing your Honcho data. @@ -137,14 +167,27 @@ Here you can: Get Context -## 8. Webhooks Integration -The [Webhooks](https://app.honcho.dev/webhooks) page enables Webhook creation and management. +## 8. Performance Monitoring & Analytics + +The **Performance** page offers comprehensive monitoring tools, including usage metrics, health analytics, API response times, and endpoint usage across Honcho. + + + Performance Analytics Dashboard + + +## 9. Webhooks Integration + +The [Webhooks](https://app.honcho.dev/webhooks) page allows managing and creation of webhooks for Honcho. React to events in real-time—such as message delivery, session updates, peer state changes, and more—by sending event payloads via HTTP POST requests to your provided endpoints. Webhooks Dashboard + + Create New Webhook + + +## 10. Organization Member Access -## 9. Organization Member Access The [Members](https://app.honcho.dev/members) page provides organization administration to manage your team's access to Honcho with the ability to grant admin permissions. From a42252867fff80695abedca347eee397fefc7d44 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Tue, 16 Dec 2025 11:13:01 -0500 Subject: [PATCH 5/9] fix message id range validation error (#300) * fix: documents message_ids validation error * feat: version bump to 2.5.1 * chore: bump core dependencies to 1.8.0 --- CHANGELOG.md | 6 + README.md | 2 +- docs/changelog/compatibility-guide.mdx | 5 +- docs/changelog/introduction.mdx | 8 +- docs/docs.json | 2 +- docs/v2/openapi.json | 2318 +++++++++++++++++++----- pyproject.toml | 2 +- sdks/python/pyproject.toml | 2 +- sdks/typescript/bun.lock | 4 +- sdks/typescript/package.json | 2 +- src/dreamer/consolidate.py | 3 +- src/main.py | 2 +- src/utils/representation.py | 42 +- uv.lock | 12 +- 14 files changed, 1921 insertions(+), 489 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bed65f2a..8c012374 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [2.5.1] - 2025-12-15 + +### Fixed + +- Backwards compatibility for `message_ids` field in documents to handle legacy tuple format + ## [2.5.0] - 2025-12-03 ### Added diff --git a/README.md b/README.md index 7ed3cae8..18417149 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ --- -![Static Badge](https://img.shields.io/badge/Version-2.5.0-blue) +![Static Badge](https://img.shields.io/badge/Version-2.5.1-blue) [![PyPI version](https://img.shields.io/pypi/v/honcho-ai.svg)](https://pypi.org/project/honcho-ai/) [![NPM version](https://img.shields.io/npm/v/@honcho-ai/sdk.svg)](https://npmjs.org/package/@honcho-ai/sdk) [![Discord](https://img.shields.io/discord/1016845111637839922?style=flat&logo=discord&logoColor=23ffffff&label=Plastic%20Labs&labelColor=235865F2)](https://discord.gg/plasticlabs) diff --git a/docs/changelog/compatibility-guide.mdx b/docs/changelog/compatibility-guide.mdx index 61b6a4c4..98490721 100644 --- a/docs/changelog/compatibility-guide.mdx +++ b/docs/changelog/compatibility-guide.mdx @@ -8,7 +8,7 @@ This guide helps you understand which versions of Honcho's API are compatible wi ## Version Compatibility -### Honcho API v2.5.0 (Current) +### Honcho API v2.5.1 (Current) @@ -34,7 +34,8 @@ This guide helps you understand which versions of Honcho's API are compatible wi | Honcho API Version | TypeScript SDK | Python SDK | |-------------------|---------------|------------| -| v2.5.0 (Current) | v1.6.0 | v1.6.0 | +| v2.5.1 (Current) | v1.6.0 | v1.6.0 | +| v2.5.0 | v1.6.0 | v1.6.0 | | v2.4.3 | v1.5.0 | v1.5.0 | | v2.4.2 | v1.5.0 | v1.5.0 | | v2.4.1 | v1.5.0 | v1.5.0 | diff --git a/docs/changelog/introduction.mdx b/docs/changelog/introduction.mdx index b3eab09d..09c15174 100644 --- a/docs/changelog/introduction.mdx +++ b/docs/changelog/introduction.mdx @@ -27,7 +27,13 @@ Welcome to the Honcho changelog! This section documents all notable changes to t ### Honcho API and SDK Changelogs - + + ### Fixed + + - Backwards compatibility for `message_ids` field in documents to handle legacy tuple format + + + ### Added - Message level configurations diff --git a/docs/docs.json b/docs/docs.json index 840ca468..0999a428 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -25,7 +25,7 @@ "navigation": { "versions": [ { - "version": "v2.5.0", + "version": "v2.5.1", "api": { "openapi": [ "openapi.json" diff --git a/docs/v2/openapi.json b/docs/v2/openapi.json index bca1b8e9..971277cc 100644 --- a/docs/v2/openapi.json +++ b/docs/v2/openapi.json @@ -9,14 +9,17 @@ "url": "https://honcho.dev/", "email": "hello@plasticlabs.ai" }, - "version": "2.5.0" + "version": "2.5.1" }, "servers": [ { "url": "http://localhost:8000", "description": "Local Development Server" }, - { "url": "https://demo.honcho.dev", "description": "Demo Server" }, + { + "url": "https://demo.honcho.dev", + "description": "Demo Server" + }, { "url": "https://api.honcho.dev", "description": "Production SaaS Platform" @@ -25,7 +28,9 @@ "paths": { "/v2/workspaces": { "post": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Get Or Create Workspace", "description": "Get a Workspace by ID.\n\nIf workspace_id is provided as a query parameter, it uses that (must match JWT workspace_id).\nOtherwise, it uses the workspace_id from the JWT.", "operationId": "get_or_create_workspace_v2_workspaces_post", @@ -45,7 +50,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Workspace" } + "schema": { + "$ref": "#/components/schemas/Workspace" + } } } }, @@ -53,21 +60,33 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } }, - "security": [{ "HTTPBearer": [] }] + "security": [ + { + "HTTPBearer": [] + } + ] } }, "/v2/workspaces/list": { "post": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Get All Workspaces", "description": "Get all Workspaces", "operationId": "get_all_workspaces_v2_workspaces_list_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "page", @@ -102,8 +121,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/WorkspaceGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/WorkspaceGet" + }, + { + "type": "null" + } ], "description": "Filtering and pagination options for the workspaces list", "title": "Options" @@ -116,7 +139,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Workspace_" } + "schema": { + "$ref": "#/components/schemas/Page_Workspace_" + } } } }, @@ -124,7 +149,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -133,11 +160,17 @@ }, "/v2/workspaces/{workspace_id}": { "put": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Update Workspace", "description": "Update a Workspace", "operationId": "update_workspace_v2_workspaces__workspace_id__put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -167,7 +200,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Workspace" } + "schema": { + "$ref": "#/components/schemas/Workspace" + } } } }, @@ -175,18 +210,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "delete": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Delete Workspace", "description": "Delete a Workspace", "operationId": "delete_workspace_v2_workspaces__workspace_id__delete", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -205,7 +248,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Workspace" } + "schema": { + "$ref": "#/components/schemas/Workspace" + } } } }, @@ -213,7 +258,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -222,11 +269,17 @@ }, "/v2/workspaces/{workspace_id}/search": { "post": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Search Workspace", "description": "Search a Workspace", "operationId": "search_workspace_v2_workspaces__workspace_id__search_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -258,7 +311,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "title": "Response Search Workspace V2 Workspaces Workspace Id Search Post" } } @@ -268,7 +323,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -277,11 +334,17 @@ }, "/v2/workspaces/{workspace_id}/deriver/status": { "get": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Get Deriver Status", "description": "Get the deriver processing status, optionally scoped to an observer, sender, and/or session", "operationId": "get_deriver_status_v2_workspaces__workspace_id__deriver_status_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -299,7 +362,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "Optional observer ID to filter by", "title": "Observer Id" }, @@ -310,7 +380,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "Optional sender ID to filter by", "title": "Sender Id" }, @@ -321,7 +398,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "Optional session ID to filter by", "title": "Session Id" }, @@ -333,7 +417,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/DeriverStatus" } + "schema": { + "$ref": "#/components/schemas/DeriverStatus" + } } } }, @@ -341,7 +427,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -350,11 +438,17 @@ }, "/v2/workspaces/{workspace_id}/trigger_dream": { "post": { - "tags": ["workspaces"], + "tags": [ + "workspaces" + ], "summary": "Trigger Dream", "description": "Manually trigger a dream task immediately for a specific collection.\n\nThis endpoint bypasses all automatic dream conditions (document threshold,\nminimum hours between dreams) and executes the dream task immediately without delay.", "operationId": "trigger_dream_v2_workspaces__workspace_id__trigger_dream_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -380,12 +474,16 @@ } }, "responses": { - "204": { "description": "Successful Response" }, + "204": { + "description": "Successful Response" + }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -394,11 +492,17 @@ }, "/v2/workspaces/{workspace_id}/peers/list": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Peers", "description": "Get All Peers for a Workspace", "operationId": "get_peers_v2_workspaces__workspace_id__peers_list_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -444,8 +548,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/PeerGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/PeerGet" + }, + { + "type": "null" + } ], "description": "Filtering options for the peers list", "title": "Options" @@ -458,7 +566,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Peer_" } + "schema": { + "$ref": "#/components/schemas/Page_Peer_" + } } } }, @@ -466,7 +576,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -475,11 +587,17 @@ }, "/v2/workspaces/{workspace_id}/peers": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Or Create Peer", "description": "Get a Peer by ID\n\nIf peer_id is provided as a query parameter, it uses that (must match JWT workspace_id).\nOtherwise, it uses the peer_id from the JWT.", "operationId": "get_or_create_peer_v2_workspaces__workspace_id__peers_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -509,7 +627,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Peer" } + "schema": { + "$ref": "#/components/schemas/Peer" + } } } }, @@ -517,7 +637,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -526,11 +648,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}": { "put": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Update Peer", "description": "Update a Peer's name and/or metadata", "operationId": "update_peer_v2_workspaces__workspace_id__peers__peer_id__put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -571,7 +699,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Peer" } + "schema": { + "$ref": "#/components/schemas/Peer" + } } } }, @@ -579,7 +709,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -588,11 +720,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/sessions": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Sessions For Peer", "description": "Get All Sessions for a Peer", "operationId": "get_sessions_for_peer_v2_workspaces__workspace_id__peers__peer_id__sessions_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -649,8 +787,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/SessionGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SessionGet" + }, + { + "type": "null" + } ], "description": "Filtering options for the sessions list", "title": "Options" @@ -663,7 +805,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Session_" } + "schema": { + "$ref": "#/components/schemas/Page_Session_" + } } } }, @@ -671,7 +815,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -680,10 +826,16 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/chat": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Chat", "operationId": "chat_v2_workspaces__workspace_id__peers__peer_id__chat_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -726,9 +878,14 @@ "application/json": { "schema": { "properties": { - "content": { "title": "Content", "type": "string" } + "content": { + "title": "Content", + "type": "string" + } }, - "required": ["content"], + "required": [ + "content" + ], "title": "DialecticResponse", "type": "object" } @@ -740,7 +897,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -749,11 +908,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/representation": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Working Representation", "description": "Get a peer's working representation for a session.\n\nIf a session_id is provided in the body, we get the working representation of the peer in that session.\nIf a target is provided, we get the representation of the target from the perspective of the peer.\nIf no target is provided, we get the omniscient Honcho representation of the peer.", "operationId": "get_working_representation_v2_workspaces__workspace_id__peers__peer_id__representation_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -806,7 +971,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -815,11 +982,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/card": { "get": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Peer Card", "description": "Get a peer card for a specific peer relationship.\n\nReturns the peer card that the observer peer has for the target peer if it exists.\nIf no target is specified, returns the observer's own peer card.", "operationId": "get_peer_card_v2_workspaces__workspace_id__peers__peer_id__card_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -848,7 +1021,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "The peer whose card to retrieve. If not provided, returns the observer's own card", "title": "Target" }, @@ -860,7 +1040,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/PeerCardResponse" } + "schema": { + "$ref": "#/components/schemas/PeerCardResponse" + } } } }, @@ -868,18 +1050,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "put": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Set Peer Card", "description": "Set a peer card for a specific peer relationship.\n\nSets the peer card that the observer peer has for the target peer.\nIf no target is specified, sets the observer's own peer card.", "operationId": "set_peer_card_v2_workspaces__workspace_id__peers__peer_id__card_put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -908,7 +1098,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "The peer whose card to set. If not provided, sets the observer's own card", "title": "Target" }, @@ -931,7 +1128,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/PeerCardResponse" } + "schema": { + "$ref": "#/components/schemas/PeerCardResponse" + } } } }, @@ -939,7 +1138,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -948,11 +1149,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/context": { "get": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Get Peer Context", "description": "Get context for a peer, including their representation and peer card.\n\nThis endpoint returns the working representation and peer card for a peer.\nIf a target is specified, returns the context for the target from the\nobserver peer's perspective. If no target is specified, returns the\npeer's own context (self-observation).\n\nThis is useful for getting all the context needed about a peer without\nmaking multiple API calls.", "operationId": "get_peer_context_v2_workspaces__workspace_id__peers__peer_id__context_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -981,7 +1188,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "The target peer to get context for. If not provided, returns the peer's own context (self-observation)", "title": "Target" }, @@ -992,7 +1206,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "Optional query to curate the representation around semantic search results", "title": "Search Query" }, @@ -1004,8 +1225,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "integer", "maximum": 100, "minimum": 1 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100, + "minimum": 1 + }, + { + "type": "null" + } ], "description": "Only used if `search_query` is provided. Number of semantic-search-retrieved observations to include", "title": "Search Top K" @@ -1018,8 +1245,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "number", "maximum": 1.0, "minimum": 0.0 }, - { "type": "null" } + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } ], "description": "Only used if `search_query` is provided. Maximum distance for semantically relevant observations", "title": "Search Max Distance" @@ -1044,8 +1277,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "integer", "maximum": 100, "minimum": 1 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100, + "minimum": 1 + }, + { + "type": "null" + } ], "description": "Maximum number of observations to include in the representation", "title": "Max Observations" @@ -1058,7 +1297,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/PeerContext" } + "schema": { + "$ref": "#/components/schemas/PeerContext" + } } } }, @@ -1066,7 +1307,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1075,11 +1318,17 @@ }, "/v2/workspaces/{workspace_id}/peers/{peer_id}/search": { "post": { - "tags": ["peers"], + "tags": [ + "peers" + ], "summary": "Search Peer", "description": "Search a Peer", "operationId": "search_peer_v2_workspaces__workspace_id__peers__peer_id__search_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1122,7 +1371,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "title": "Response Search Peer V2 Workspaces Workspace Id Peers Peer Id Search Post" } } @@ -1132,7 +1383,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1141,11 +1394,17 @@ }, "/v2/workspaces/{workspace_id}/sessions": { "post": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Or Create Session", "description": "Get a specific session in a workspace.\n\nIf session_id is provided as a query parameter, it verifies the session is in the workspace.\nOtherwise, it uses the session_id from the JWT for verification.", "operationId": "get_or_create_session_v2_workspaces__workspace_id__sessions_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1175,7 +1434,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1183,7 +1444,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1192,11 +1455,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/list": { "post": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Sessions", "description": "Get All Sessions in a Workspace", "operationId": "get_sessions_v2_workspaces__workspace_id__sessions_list_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1242,8 +1511,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/SessionGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SessionGet" + }, + { + "type": "null" + } ], "description": "Filtering and pagination options for the sessions list", "title": "Options" @@ -1256,7 +1529,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Session_" } + "schema": { + "$ref": "#/components/schemas/Page_Session_" + } } } }, @@ -1264,7 +1539,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1273,11 +1550,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}": { "put": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Update Session", "description": "Update the metadata of a Session", "operationId": "update_session_v2_workspaces__workspace_id__sessions__session_id__put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1318,7 +1601,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1326,18 +1611,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "delete": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Delete Session", "description": "Delete a session and all associated data.\n\nThe session is marked as inactive immediately and returns 202 Accepted. The actual\ndeletion of all related data (messages, embeddings, documents, etc.) happens\nasynchronously via the queue with retry support.\n\nThis action cannot be undone.", "operationId": "delete_session_v2_workspaces__workspace_id__sessions__session_id__delete", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1365,13 +1658,19 @@ "responses": { "202": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1380,11 +1679,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/clone": { "get": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Clone Session", "description": "Clone a session, optionally up to a specific message", "operationId": "clone_session_v2_workspaces__workspace_id__sessions__session_id__clone_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1413,7 +1718,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "Message ID to cut off the clone at", "title": "Message Id" }, @@ -1425,7 +1737,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1433,7 +1747,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1442,11 +1758,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/peers": { "post": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Add Peers To Session", "description": "Add peers to a session", "operationId": "add_peers_to_session_v2_workspaces__workspace_id__sessions__session_id__peers_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1491,7 +1813,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1499,18 +1823,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "put": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Set Session Peers", "description": "Set the peers in a session", "operationId": "set_session_peers_v2_workspaces__workspace_id__sessions__session_id__peers_put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1555,7 +1887,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1563,18 +1897,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "delete": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Remove Peers From Session", "description": "Remove peers from a session", "operationId": "remove_peers_from_session_v2_workspaces__workspace_id__sessions__session_id__peers_delete", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1605,7 +1947,9 @@ "application/json": { "schema": { "type": "array", - "items": { "type": "string" }, + "items": { + "type": "string" + }, "description": "List of peer IDs to remove from the session", "title": "Peers" } @@ -1617,7 +1961,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Session" } + "schema": { + "$ref": "#/components/schemas/Session" + } } } }, @@ -1625,18 +1971,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "get": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Session Peers", "description": "Get peers from a session", "operationId": "get_session_peers_v2_workspaces__workspace_id__sessions__session_id__peers_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1693,7 +2047,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Peer_" } + "schema": { + "$ref": "#/components/schemas/Page_Peer_" + } } } }, @@ -1701,7 +2057,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1710,11 +2068,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/peers/{peer_id}/config": { "get": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Peer Config", "description": "Get the configuration for a peer in a session", "operationId": "get_peer_config_v2_workspaces__workspace_id__sessions__session_id__peers__peer_id__config_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1755,7 +2119,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/SessionPeerConfig" } + "schema": { + "$ref": "#/components/schemas/SessionPeerConfig" + } } } }, @@ -1763,18 +2129,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "post": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Set Peer Config", "description": "Set the configuration for a peer in a session", "operationId": "set_peer_config_v2_workspaces__workspace_id__sessions__session_id__peers__peer_id__config_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1824,13 +2198,19 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -1839,11 +2219,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/context": { "get": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Session Context", "description": "Produce a context object from the session. The caller provides an optional token limit which the entire context must fit into.\nIf not provided, the context will be exhaustive (within configured max tokens). To do this, we allocate 40% of the token limit\nto the summary, and 60% to recent messages -- as many as can fit. Note that the summary will usually take up less space than\nthis. If the caller does not want a summary, we allocate all the tokens to recent messages.", "operationId": "get_session_context_v2_workspaces__workspace_id__sessions__session_id__context_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -1873,8 +2259,13 @@ "required": false, "schema": { "anyOf": [ - { "type": "integer", "maximum": 100000 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100000 + }, + { + "type": "null" + } ], "description": "Number of tokens to use for the context. Includes summary if set to true. Includes representation and peer card if they are included in the response. If not provided, the context will be exhaustive (within 100000 tokens)", "title": "Tokens" @@ -1886,7 +2277,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "The most recent message, used to fetch semantically relevant observations", "title": "Last Message" }, @@ -1909,7 +2307,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "The target of the perspective. If given without `peer_perspective`, will get the Honcho-level representation and peer card for this peer. If given with `peer_perspective`, will get the representation and card for this peer *from the perspective of that peer*.", "title": "Peer Target" }, @@ -1920,7 +2325,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "A peer to get context for. If given, response will attempt to include representation and card from the perspective of that peer. Must be provided with `peer_target`.", "title": "Peer Perspective" }, @@ -1944,8 +2356,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "integer", "maximum": 100, "minimum": 1 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100, + "minimum": 1 + }, + { + "type": "null" + } ], "description": "Only used if `last_message` is provided. The number of semantic-search-retrieved observations to include in the representation", "title": "Search Top K" @@ -1958,8 +2376,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "number", "maximum": 1.0, "minimum": 0.0 }, - { "type": "null" } + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } ], "description": "Only used if `last_message` is provided. The maximum distance to search for semantically relevant observations", "title": "Search Max Distance" @@ -1984,8 +2408,14 @@ "required": false, "schema": { "anyOf": [ - { "type": "integer", "maximum": 100, "minimum": 1 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100, + "minimum": 1 + }, + { + "type": "null" + } ], "description": "Only used if `last_message` is provided. The maximum number of observations to include in the representation", "title": "Max Observations" @@ -1998,7 +2428,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/SessionContext" } + "schema": { + "$ref": "#/components/schemas/SessionContext" + } } } }, @@ -2006,7 +2438,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2015,11 +2449,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/summaries": { "get": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Get Session Summaries", "description": "Get available summaries for a session.\n\nReturns both short and long summaries if available, including metadata like\nthe message ID they cover up to, creation timestamp, and token count.", "operationId": "get_session_summaries_v2_workspaces__workspace_id__sessions__session_id__summaries_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2049,7 +2489,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/SessionSummaries" } + "schema": { + "$ref": "#/components/schemas/SessionSummaries" + } } } }, @@ -2057,7 +2499,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2066,11 +2510,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/search": { "post": { - "tags": ["sessions"], + "tags": [ + "sessions" + ], "summary": "Search Session", "description": "Search a Session", "operationId": "search_session_v2_workspaces__workspace_id__sessions__session_id__search_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2113,7 +2563,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "title": "Response Search Session V2 Workspaces Workspace Id Sessions Session Id Search Post" } } @@ -2123,7 +2575,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2132,30 +2586,44 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/messages/": { "post": { - "tags": ["messages"], + "tags": [ + "messages" + ], "summary": "Create Messages For Session", "description": "Add new message(s) to a session.", "operationId": "create_messages_for_session_v2_workspaces__workspace_id__sessions__session_id__messages__post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", "in": "path", "required": true, - "schema": { "type": "string", "title": "Workspace Id" } + "schema": { + "type": "string", + "title": "Workspace Id" + } }, { "name": "session_id", "in": "path", "required": true, - "schema": { "type": "string", "title": "Session Id" } + "schema": { + "type": "string", + "title": "Session Id" + } } ], "requestBody": { "required": true, "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/MessageBatchCreate" } + "schema": { + "$ref": "#/components/schemas/MessageBatchCreate" + } } } }, @@ -2166,7 +2634,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "title": "Response Create Messages For Session V2 Workspaces Workspace Id Sessions Session Id Messages Post" } } @@ -2176,7 +2646,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2185,23 +2657,35 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/messages/upload": { "post": { - "tags": ["messages"], + "tags": [ + "messages" + ], "summary": "Create Messages With File", "description": "Create messages from uploaded files. Files are converted to text and split into multiple messages.", "operationId": "create_messages_with_file_v2_workspaces__workspace_id__sessions__session_id__messages_upload_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", "in": "path", "required": true, - "schema": { "type": "string", "title": "Workspace Id" } + "schema": { + "type": "string", + "title": "Workspace Id" + } }, { "name": "session_id", "in": "path", "required": true, - "schema": { "type": "string", "title": "Session Id" } + "schema": { + "type": "string", + "title": "Session Id" + } } ], "requestBody": { @@ -2221,7 +2705,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "title": "Response Create Messages With File V2 Workspaces Workspace Id Sessions Session Id Messages Upload Post" } } @@ -2231,7 +2717,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2240,11 +2728,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/messages/list": { "post": { - "tags": ["messages"], + "tags": [ + "messages" + ], "summary": "Get Messages", "description": "Get all messages for a session", "operationId": "get_messages_v2_workspaces__workspace_id__sessions__session_id__messages_list_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2273,7 +2767,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "description": "Whether to reverse the order of results", "default": false, "title": "Reverse" @@ -2313,8 +2814,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/MessageGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/MessageGet" + }, + { + "type": "null" + } ], "description": "Filtering options for the messages list", "title": "Options" @@ -2327,7 +2832,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Message_" } + "schema": { + "$ref": "#/components/schemas/Page_Message_" + } } } }, @@ -2335,7 +2842,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2344,11 +2853,17 @@ }, "/v2/workspaces/{workspace_id}/sessions/{session_id}/messages/{message_id}": { "get": { - "tags": ["messages"], + "tags": [ + "messages" + ], "summary": "Get Message", "description": "Get a Message by ID", "operationId": "get_message_v2_workspaces__workspace_id__sessions__session_id__messages__message_id__get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2389,7 +2904,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Message" } + "schema": { + "$ref": "#/components/schemas/Message" + } } } }, @@ -2397,18 +2914,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "put": { - "tags": ["messages"], + "tags": [ + "messages" + ], "summary": "Update Message", "description": "Update the metadata of a Message", "operationId": "update_message_v2_workspaces__workspace_id__sessions__session_id__messages__message_id__put", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2460,7 +2985,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Message" } + "schema": { + "$ref": "#/components/schemas/Message" + } } } }, @@ -2468,7 +2995,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2477,11 +3006,17 @@ }, "/v2/workspaces/{workspace_id}/observations": { "post": { - "tags": ["observations"], + "tags": [ + "observations" + ], "summary": "Create Observations", "description": "Create one or more observations.\n\nCreates observations (theory-of-mind facts) for the specified observer/observed peer pairs.\nEach observation must reference existing peers and a session within the workspace.\nEmbeddings are automatically generated for semantic search.\n\nMaximum of 100 observations per request.", "operationId": "create_observations_v2_workspaces__workspace_id__observations_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2513,7 +3048,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Observation" }, + "items": { + "$ref": "#/components/schemas/Observation" + }, "title": "Response Create Observations V2 Workspaces Workspace Id Observations Post" } } @@ -2523,7 +3060,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2532,11 +3071,17 @@ }, "/v2/workspaces/{workspace_id}/observations/list": { "post": { - "tags": ["observations"], + "tags": [ + "observations" + ], "summary": "List Observations", "description": "List all observations using custom filters. Observations are listed by recency unless `reverse` is set to `true`.\n\nObservations can be filtered by session_id, observer_id and observed_id using the filters parameter.", "operationId": "list_observations_v2_workspaces__workspace_id__observations_list_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2554,7 +3099,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "description": "Whether to reverse the order of results", "default": false, "title": "Reverse" @@ -2594,8 +3146,12 @@ "application/json": { "schema": { "anyOf": [ - { "$ref": "#/components/schemas/ObservationGet" }, - { "type": "null" } + { + "$ref": "#/components/schemas/ObservationGet" + }, + { + "type": "null" + } ], "description": "Filtering options for the observations list", "title": "Options" @@ -2608,7 +3164,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/Page_Observation_" } + "schema": { + "$ref": "#/components/schemas/Page_Observation_" + } } } }, @@ -2616,7 +3174,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2625,11 +3185,17 @@ }, "/v2/workspaces/{workspace_id}/observations/query": { "post": { - "tags": ["observations"], + "tags": [ + "observations" + ], "summary": "Query Observations", "description": "Query observations using semantic search.\n\nPerforms vector similarity search on observations to find semantically relevant results.\nObserver and observed are required for semantic search and must be provided in filters.", "operationId": "query_observations_v2_workspaces__workspace_id__observations_query_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2661,7 +3227,9 @@ "application/json": { "schema": { "type": "array", - "items": { "$ref": "#/components/schemas/Observation" }, + "items": { + "$ref": "#/components/schemas/Observation" + }, "title": "Response Query Observations V2 Workspaces Workspace Id Observations Query Post" } } @@ -2671,7 +3239,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2680,11 +3250,17 @@ }, "/v2/workspaces/{workspace_id}/observations/{observation_id}": { "delete": { - "tags": ["observations"], + "tags": [ + "observations" + ], "summary": "Delete Observation", "description": "Delete a specific observation.\n\nThis permanently deletes the observation (document) from the theory-of-mind system.\nThis action cannot be undone.", "operationId": "delete_observation_v2_workspaces__workspace_id__observations__observation_id__delete", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2712,13 +3288,19 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2727,18 +3309,31 @@ }, "/v2/keys": { "post": { - "tags": ["keys"], + "tags": [ + "keys" + ], "summary": "Create Key", "description": "Create a new Key", "operationId": "create_key_v2_keys_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "ID of the workspace to scope the key to", "title": "Workspace Id" }, @@ -2749,7 +3344,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "ID of the peer to scope the key to", "title": "Peer Id" }, @@ -2760,7 +3362,14 @@ "in": "query", "required": false, "schema": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "description": "ID of the session to scope the key to", "title": "Session Id" }, @@ -2772,8 +3381,13 @@ "required": false, "schema": { "anyOf": [ - { "type": "string", "format": "date-time" }, - { "type": "null" } + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } ], "title": "Expires At" } @@ -2782,13 +3396,19 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2797,11 +3417,17 @@ }, "/v2/workspaces/{workspace_id}/webhooks": { "post": { - "tags": ["webhooks"], + "tags": [ + "webhooks" + ], "summary": "Get Or Create Webhook Endpoint", "description": "Get or create a webhook endpoint URL.", "operationId": "get_or_create_webhook_endpoint_v2_workspaces__workspace_id__webhooks_post", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2831,7 +3457,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/WebhookEndpoint" } + "schema": { + "$ref": "#/components/schemas/WebhookEndpoint" + } } } }, @@ -2839,18 +3467,26 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } }, "get": { - "tags": ["webhooks"], + "tags": [ + "webhooks" + ], "summary": "List Webhook Endpoints", "description": "List all webhook endpoints, optionally filtered by workspace.", "operationId": "list_webhook_endpoints_v2_workspaces__workspace_id__webhooks_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2906,7 +3542,9 @@ "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2915,11 +3553,17 @@ }, "/v2/workspaces/{workspace_id}/webhooks/{endpoint_id}": { "delete": { - "tags": ["webhooks"], + "tags": [ + "webhooks" + ], "summary": "Delete Webhook Endpoint", "description": "Delete a specific webhook endpoint.", "operationId": "delete_webhook_endpoint_v2_workspaces__workspace_id__webhooks__endpoint_id__delete", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2947,13 +3591,19 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -2962,11 +3612,17 @@ }, "/v2/workspaces/{workspace_id}/webhooks/test": { "get": { - "tags": ["webhooks"], + "tags": [ + "webhooks" + ], "summary": "Test Emit", "description": "Test publishing a webhook event.", "operationId": "test_emit_v2_workspaces__workspace_id__webhooks_test_get", - "security": [{ "HTTPBearer": [] }], + "security": [ + { + "HTTPBearer": [] + } + ], "parameters": [ { "name": "workspace_id", @@ -2983,13 +3639,19 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } }, "422": { "description": "Validation Error", "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } @@ -3004,7 +3666,11 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { + "application/json": { + "schema": {} + } + } } } } @@ -3014,23 +3680,54 @@ "schemas": { "Body_create_messages_with_file_v2_workspaces__workspace_id__sessions__session_id__messages_upload_post": { "properties": { - "file": { "type": "string", "format": "binary", "title": "File" }, - "peer_id": { "type": "string", "title": "Peer Id" }, + "file": { + "type": "string", + "format": "binary", + "title": "File" + }, + "peer_id": { + "type": "string", + "title": "Peer Id" + }, "metadata": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Metadata" }, "configuration": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Configuration" }, "created_at": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Created At" } }, "type": "object", - "required": ["file", "peer_id"], + "required": [ + "file", + "peer_id" + ], "title": "Body_create_messages_with_file_v2_workspaces__workspace_id__sessions__session_id__messages_upload_post" }, "DeductiveObservation": { @@ -3041,13 +3738,20 @@ "title": "Created At" }, "message_ids": { - "items": { "type": "integer" }, + "items": { + "type": "integer" + }, "type": "array", "title": "Message Ids" }, - "session_name": { "type": "string", "title": "Session Name" }, + "session_name": { + "type": "string", + "title": "Session Name" + }, "premises": { - "items": { "type": "string" }, + "items": { + "type": "string" + }, "type": "array", "title": "Premises", "description": "Supporting premises or evidence for this conclusion" @@ -3059,19 +3763,38 @@ } }, "type": "object", - "required": ["created_at", "message_ids", "session_name", "conclusion"], + "required": [ + "created_at", + "message_ids", + "session_name", + "conclusion" + ], "title": "DeductiveObservation", "description": "Deductive observation with multiple premises and one conclusion, plus metadata." }, "DeriverConfiguration": { "properties": { "enabled": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Enabled", "description": "Whether to enable deriver functionality." }, "custom_instructions": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Custom Instructions", "description": "TODO: currently unused. Custom instructions to use for the deriver on this workspace/session/message." } @@ -3109,7 +3832,9 @@ }, "type": "object" }, - { "type": "null" } + { + "type": "null" + } ], "title": "Sessions", "description": "Per-session status when not filtered by session" @@ -3127,12 +3852,26 @@ "DialecticOptions": { "properties": { "session_id": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Session Id", "description": "ID of the session to scope the representation to" }, "target": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Target", "description": "Optional peer to get the representation for, from the perspective of this peer" }, @@ -3143,16 +3882,29 @@ "title": "Query", "description": "Dialectic API Prompt" }, - "stream": { "type": "boolean", "title": "Stream", "default": false } + "stream": { + "type": "boolean", + "title": "Stream", + "default": false + } }, "type": "object", - "required": ["query"], + "required": [ + "query" + ], "title": "DialecticOptions" }, "DreamConfiguration": { "properties": { "enabled": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Enabled", "description": "Whether to enable dream functionality. If deriver is disabled, dreams will also be disabled and this setting will be ignored." } @@ -3162,7 +3914,10 @@ }, "DreamType": { "type": "string", - "enum": ["consolidate", "agent"], + "enum": [ + "consolidate", + "agent" + ], "title": "DreamType", "description": "Types of dreams that can be triggered." }, @@ -3174,11 +3929,16 @@ "title": "Created At" }, "message_ids": { - "items": { "type": "integer" }, + "items": { + "type": "integer" + }, "type": "array", "title": "Message Ids" }, - "session_name": { "type": "string", "title": "Session Name" }, + "session_name": { + "type": "string", + "title": "Session Name" + }, "content": { "type": "string", "title": "Content", @@ -3186,14 +3946,21 @@ } }, "type": "object", - "required": ["created_at", "message_ids", "session_name", "content"], + "required": [ + "created_at", + "message_ids", + "session_name", + "content" + ], "title": "ExplicitObservation", "description": "Explicit observation with content and metadata." }, "HTTPValidationError": { "properties": { "detail": { - "items": { "$ref": "#/components/schemas/ValidationError" }, + "items": { + "$ref": "#/components/schemas/ValidationError" + }, "type": "array", "title": "Detail" } @@ -3203,10 +3970,22 @@ }, "Message": { "properties": { - "id": { "type": "string", "title": "Id" }, - "content": { "type": "string", "title": "Content" }, - "peer_id": { "type": "string", "title": "Peer Id" }, - "session_id": { "type": "string", "title": "Session Id" }, + "id": { + "type": "string", + "title": "Id" + }, + "content": { + "type": "string", + "title": "Content" + }, + "peer_id": { + "type": "string", + "title": "Peer Id" + }, + "session_id": { + "type": "string", + "title": "Session Id" + }, "metadata": { "additionalProperties": true, "type": "object", @@ -3217,8 +3996,14 @@ "format": "date-time", "title": "Created At" }, - "workspace_id": { "type": "string", "title": "Workspace Id" }, - "token_count": { "type": "integer", "title": "Token Count" } + "workspace_id": { + "type": "string", + "title": "Workspace Id" + }, + "token_count": { + "type": "integer", + "title": "Token Count" + } }, "type": "object", "required": [ @@ -3235,7 +4020,9 @@ "MessageBatchCreate": { "properties": { "messages": { - "items": { "$ref": "#/components/schemas/MessageCreate" }, + "items": { + "$ref": "#/components/schemas/MessageCreate" + }, "type": "array", "maxItems": 100, "minItems": 1, @@ -3243,7 +4030,9 @@ } }, "type": "object", - "required": ["messages"], + "required": [ + "messages" + ], "title": "MessageBatchCreate", "description": "Schema for batch message creation with a max of 100 messages" }, @@ -3251,15 +4040,23 @@ "properties": { "deriver": { "anyOf": [ - { "$ref": "#/components/schemas/DeriverConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/DeriverConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for deriver functionality." }, "peer_card": { "anyOf": [ - { "$ref": "#/components/schemas/PeerCardConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/PeerCardConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for peer card functionality. If deriver is disabled, peer cards will also be disabled and these settings will be ignored." } @@ -3276,38 +4073,63 @@ "minLength": 0, "title": "Content" }, - "peer_id": { "type": "string", "title": "Peer Id" }, + "peer_id": { + "type": "string", + "title": "Peer Id" + }, "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, "configuration": { "anyOf": [ - { "$ref": "#/components/schemas/MessageConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/MessageConfiguration" + }, + { + "type": "null" + } ] }, "created_at": { "anyOf": [ - { "type": "string", "format": "date-time" }, - { "type": "null" } + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } ], "title": "Created At" } }, "type": "object", - "required": ["content", "peer_id"], + "required": [ + "content", + "peer_id" + ], "title": "MessageCreate" }, "MessageGet": { "properties": { "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters" } @@ -3324,8 +4146,13 @@ }, "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters", "description": "Filters to scope the search" @@ -3340,15 +4167,22 @@ } }, "type": "object", - "required": ["query"], + "required": [ + "query" + ], "title": "MessageSearchOptions" }, "MessageUpdate": { "properties": { "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" } @@ -3358,8 +4192,14 @@ }, "Observation": { "properties": { - "id": { "type": "string", "title": "Id" }, - "content": { "type": "string", "title": "Content" }, + "id": { + "type": "string", + "title": "Id" + }, + "content": { + "type": "string", + "title": "Content" + }, "observer_id": { "type": "string", "title": "Observer Id", @@ -3370,7 +4210,10 @@ "title": "Observed Id", "description": "The peer being observed" }, - "session_id": { "type": "string", "title": "Session Id" }, + "session_id": { + "type": "string", + "title": "Session Id" + }, "created_at": { "type": "string", "format": "date-time", @@ -3392,7 +4235,9 @@ "ObservationBatchCreate": { "properties": { "observations": { - "items": { "$ref": "#/components/schemas/ObservationCreate" }, + "items": { + "$ref": "#/components/schemas/ObservationCreate" + }, "type": "array", "maxItems": 100, "minItems": 1, @@ -3400,7 +4245,9 @@ } }, "type": "object", - "required": ["observations"], + "required": [ + "observations" + ], "title": "ObservationBatchCreate", "description": "Schema for batch observation creation with a max of 100 observations" }, @@ -3429,7 +4276,12 @@ } }, "type": "object", - "required": ["content", "observer_id", "observed_id", "session_id"], + "required": [ + "content", + "observer_id", + "observed_id", + "session_id" + ], "title": "ObservationCreate", "description": "Schema for creating a single observation" }, @@ -3437,8 +4289,13 @@ "properties": { "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters" } @@ -3464,270 +4321,445 @@ }, "distance": { "anyOf": [ - { "type": "number", "maximum": 1.0, "minimum": 0.0 }, - { "type": "null" } + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Distance", "description": "Maximum cosine distance threshold for results" }, "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters", "description": "Additional filters to apply" } }, "type": "object", - "required": ["query"], + "required": [ + "query" + ], "title": "ObservationQuery", "description": "Query parameters for semantic search of observations" }, "Page_Message_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[Message]" }, "Page_Observation_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Observation" }, + "items": { + "$ref": "#/components/schemas/Observation" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[Observation]" }, "Page_Peer_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Peer" }, + "items": { + "$ref": "#/components/schemas/Peer" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[Peer]" }, "Page_Session_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Session" }, + "items": { + "$ref": "#/components/schemas/Session" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[Session]" }, "Page_WebhookEndpoint_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/WebhookEndpoint" }, + "items": { + "$ref": "#/components/schemas/WebhookEndpoint" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[WebhookEndpoint]" }, "Page_Workspace_": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Workspace" }, + "items": { + "$ref": "#/components/schemas/Workspace" + }, "type": "array", "title": "Items" }, "total": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Total" }, "page": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Page" }, "size": { "anyOf": [ - { "type": "integer", "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Size" }, "pages": { "anyOf": [ - { "type": "integer", "minimum": 0.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Pages" } }, "type": "object", - "required": ["items", "page", "size"], + "required": [ + "items", + "page", + "size" + ], "title": "Page[Workspace]" }, "Peer": { "properties": { - "id": { "type": "string", "title": "Id" }, - "workspace_id": { "type": "string", "title": "Workspace Id" }, + "id": { + "type": "string", + "title": "Id" + }, + "workspace_id": { + "type": "string", + "title": "Workspace Id" + }, "created_at": { "type": "string", "format": "date-time", @@ -3745,18 +4777,36 @@ } }, "type": "object", - "required": ["id", "workspace_id", "created_at"], + "required": [ + "id", + "workspace_id", + "created_at" + ], "title": "Peer" }, "PeerCardConfiguration": { "properties": { "use": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Use", "description": "Whether to use peer card related to this peer during deriver process." }, "create": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Create", "description": "Whether to generate peer card based on content." } @@ -3768,8 +4818,15 @@ "properties": { "peer_card": { "anyOf": [ - { "items": { "type": "string" }, "type": "array" }, - { "type": "null" } + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } ], "title": "Peer Card", "description": "The peer card content, or None if not found" @@ -3781,14 +4838,18 @@ "PeerCardSet": { "properties": { "peer_card": { - "items": { "type": "string" }, + "items": { + "type": "string" + }, "type": "array", "title": "Peer Card", "description": "The peer card content to set" } }, "type": "object", - "required": ["peer_card"], + "required": [ + "peer_card" + ], "title": "PeerCardSet" }, "PeerContext": { @@ -3805,22 +4866,36 @@ }, "representation": { "anyOf": [ - { "$ref": "#/components/schemas/Representation" }, - { "type": "null" } + { + "$ref": "#/components/schemas/Representation" + }, + { + "type": "null" + } ], "description": "The working representation of the target peer from the observer's perspective" }, "peer_card": { "anyOf": [ - { "items": { "type": "string" }, "type": "array" }, - { "type": "null" } + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } ], "title": "Peer Card", "description": "The peer card for the target peer from the observer's perspective" } }, "type": "object", - "required": ["peer_id", "target_id"], + "required": [ + "peer_id", + "target_id" + ], "title": "PeerContext", "description": "Context for a peer, including representation and peer card." }, @@ -3835,29 +4910,46 @@ }, "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, "configuration": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Configuration" } }, "type": "object", - "required": ["id"], + "required": [ + "id" + ], "title": "PeerCreate" }, "PeerGet": { "properties": { "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters" } @@ -3868,45 +4960,91 @@ "PeerRepresentationGet": { "properties": { "session_id": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Session Id", "description": "Get the working representation within this session" }, "target": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Target", "description": "Optional peer ID to get the representation for, from the perspective of this peer" }, "search_query": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Search Query", "description": "Optional input to curate the representation around semantic search results" }, "search_top_k": { "anyOf": [ - { "type": "integer", "maximum": 100.0, "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100.0, + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Search Top K", "description": "Only used if `search_query` is provided. Number of semantic-search-retrieved observations to include in the representation" }, "search_max_distance": { "anyOf": [ - { "type": "number", "maximum": 1.0, "minimum": 0.0 }, - { "type": "null" } + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } ], "title": "Search Max Distance", "description": "Only used if `search_query` is provided. Maximum distance to search for semantically relevant observations" }, "include_most_derived": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Include Most Derived", "description": "Only used if `search_query` is provided. Whether to include the most derived observations in the representation" }, "max_observations": { "anyOf": [ - { "type": "integer", "maximum": 100.0, "minimum": 1.0 }, - { "type": "null" } + { + "type": "integer", + "maximum": 100.0, + "minimum": 1.0 + }, + { + "type": "null" + } ], "title": "Max Observations", "description": "Only used if `search_query` is provided. Maximum number of observations to include in the representation", @@ -3920,15 +5058,25 @@ "properties": { "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, "configuration": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Configuration" } @@ -3939,13 +5087,17 @@ "Representation": { "properties": { "explicit": { - "items": { "$ref": "#/components/schemas/ExplicitObservation" }, + "items": { + "$ref": "#/components/schemas/ExplicitObservation" + }, "type": "array", "title": "Explicit", "description": "Facts LITERALLY stated by the user - direct quotes or clear paraphrases only, no interpretation or inference. Example: ['The user is 25 years old', 'The user has a dog']" }, "deductive": { - "items": { "$ref": "#/components/schemas/DeductiveObservation" }, + "items": { + "$ref": "#/components/schemas/DeductiveObservation" + }, "type": "array", "title": "Deductive", "description": "Conclusions that MUST be true given explicit facts and premises - strict logical necessities. Each deduction should have premises and a single conclusion." @@ -3957,9 +5109,18 @@ }, "Session": { "properties": { - "id": { "type": "string", "title": "Id" }, - "is_active": { "type": "boolean", "title": "Is Active" }, - "workspace_id": { "type": "string", "title": "Workspace Id" }, + "id": { + "type": "string", + "title": "Id" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + }, + "workspace_id": { + "type": "string", + "title": "Workspace Id" + }, "metadata": { "additionalProperties": true, "type": "object", @@ -3977,36 +5138,57 @@ } }, "type": "object", - "required": ["id", "is_active", "workspace_id", "created_at"], + "required": [ + "id", + "is_active", + "workspace_id", + "created_at" + ], "title": "Session" }, "SessionConfiguration": { "properties": { "deriver": { "anyOf": [ - { "$ref": "#/components/schemas/DeriverConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/DeriverConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for deriver functionality." }, "peer_card": { "anyOf": [ - { "$ref": "#/components/schemas/PeerCardConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/PeerCardConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for peer card functionality. If deriver is disabled, peer cards will also be disabled and these settings will be ignored." }, "summary": { "anyOf": [ - { "$ref": "#/components/schemas/SummaryConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SummaryConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for summary functionality." }, "dream": { "anyOf": [ - { "$ref": "#/components/schemas/DreamConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/DreamConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for dream functionality. If deriver is disabled, dreams will also be disabled and these settings will be ignored." } @@ -4018,37 +5200,60 @@ }, "SessionContext": { "properties": { - "id": { "type": "string", "title": "Id" }, + "id": { + "type": "string", + "title": "Id" + }, "messages": { - "items": { "$ref": "#/components/schemas/Message" }, + "items": { + "$ref": "#/components/schemas/Message" + }, "type": "array", "title": "Messages" }, "summary": { "anyOf": [ - { "$ref": "#/components/schemas/Summary" }, - { "type": "null" } + { + "$ref": "#/components/schemas/Summary" + }, + { + "type": "null" + } ], "description": "The summary if available" }, "peer_representation": { "anyOf": [ - { "$ref": "#/components/schemas/Representation" }, - { "type": "null" } + { + "$ref": "#/components/schemas/Representation" + }, + { + "type": "null" + } ], "description": "The peer representation, if context is requested from a specific perspective" }, "peer_card": { "anyOf": [ - { "items": { "type": "string" }, "type": "array" }, - { "type": "null" } + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } ], "title": "Peer Card", "description": "The peer card, if context is requested from a specific perspective" } }, "type": "object", - "required": ["id", "messages"], + "required": [ + "id", + "messages" + ], "title": "SessionContext" }, "SessionCreate": { @@ -4062,8 +5267,13 @@ }, "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, @@ -4075,25 +5285,40 @@ }, "type": "object" }, - { "type": "null" } + { + "type": "null" + } ], "title": "Peers" }, "configuration": { "anyOf": [ - { "$ref": "#/components/schemas/SessionConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SessionConfiguration" + }, + { + "type": "null" + } ] } }, "type": "object", - "required": ["id"], + "required": [ + "id" + ], "title": "SessionCreate" }, "SessionDeriverStatus": { "properties": { "session_id": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Session Id", "description": "Session ID if filtered by session" }, @@ -4131,8 +5356,13 @@ "properties": { "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters" } @@ -4143,12 +5373,26 @@ "SessionPeerConfig": { "properties": { "observe_me": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Observe Me", "description": "Whether honcho should form a global theory-of-mind representation of this peer" }, "observe_others": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Observe Others", "description": "Whether this peer should form a session-level theory-of-mind representation of other peers in the session" } @@ -4158,39 +5402,61 @@ }, "SessionSummaries": { "properties": { - "id": { "type": "string", "title": "Id" }, + "id": { + "type": "string", + "title": "Id" + }, "short_summary": { "anyOf": [ - { "$ref": "#/components/schemas/Summary" }, - { "type": "null" } + { + "$ref": "#/components/schemas/Summary" + }, + { + "type": "null" + } ], "description": "The short summary if available" }, "long_summary": { "anyOf": [ - { "$ref": "#/components/schemas/Summary" }, - { "type": "null" } + { + "$ref": "#/components/schemas/Summary" + }, + { + "type": "null" + } ], "description": "The long summary if available" } }, "type": "object", - "required": ["id"], + "required": [ + "id" + ], "title": "SessionSummaries" }, "SessionUpdate": { "properties": { "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, "configuration": { "anyOf": [ - { "$ref": "#/components/schemas/SessionConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SessionConfiguration" + }, + { + "type": "null" + } ] } }, @@ -4238,22 +5504,39 @@ "SummaryConfiguration": { "properties": { "enabled": { - "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], "title": "Enabled", "description": "Whether to enable summary functionality." }, "messages_per_short_summary": { "anyOf": [ - { "type": "integer", "minimum": 10.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 10.0 + }, + { + "type": "null" + } ], "title": "Messages Per Short Summary", "description": "Number of messages per short summary. Must be positive, greater than or equal to 10, and less than messages_per_long_summary." }, "messages_per_long_summary": { "anyOf": [ - { "type": "integer", "minimum": 20.0 }, - { "type": "null" } + { + "type": "integer", + "minimum": 20.0 + }, + { + "type": "null" + } ], "title": "Messages Per Long Summary", "description": "Number of messages per long summary. Must be positive, greater than or equal to 20, and greater than messages_per_short_summary." @@ -4270,7 +5553,14 @@ "description": "Observer peer name" }, "observed": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Observed", "description": "Observed peer name (defaults to observer if not specified)" }, @@ -4280,31 +5570,66 @@ } }, "type": "object", - "required": ["observer", "dream_type"], + "required": [ + "observer", + "dream_type" + ], "title": "TriggerDreamRequest" }, "ValidationError": { "properties": { "loc": { - "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] }, + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, "type": "array", "title": "Location" }, - "msg": { "type": "string", "title": "Message" }, - "type": { "type": "string", "title": "Error Type" } + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } }, "type": "object", - "required": ["loc", "msg", "type"], + "required": [ + "loc", + "msg", + "type" + ], "title": "ValidationError" }, "WebhookEndpoint": { "properties": { - "id": { "type": "string", "title": "Id" }, + "id": { + "type": "string", + "title": "Id" + }, "workspace_id": { - "anyOf": [{ "type": "string" }, { "type": "null" }], + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Workspace Id" }, - "url": { "type": "string", "title": "Url" }, + "url": { + "type": "string", + "title": "Url" + }, "created_at": { "type": "string", "format": "date-time", @@ -4312,18 +5637,33 @@ } }, "type": "object", - "required": ["id", "workspace_id", "url", "created_at"], + "required": [ + "id", + "workspace_id", + "url", + "created_at" + ], "title": "WebhookEndpoint" }, "WebhookEndpointCreate": { - "properties": { "url": { "type": "string", "title": "Url" } }, + "properties": { + "url": { + "type": "string", + "title": "Url" + } + }, "type": "object", - "required": ["url"], + "required": [ + "url" + ], "title": "WebhookEndpointCreate" }, "Workspace": { "properties": { - "id": { "type": "string", "title": "Id" }, + "id": { + "type": "string", + "title": "Id" + }, "metadata": { "additionalProperties": true, "type": "object", @@ -4341,36 +5681,55 @@ } }, "type": "object", - "required": ["id", "created_at"], + "required": [ + "id", + "created_at" + ], "title": "Workspace" }, "WorkspaceConfiguration": { "properties": { "deriver": { "anyOf": [ - { "$ref": "#/components/schemas/DeriverConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/DeriverConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for deriver functionality." }, "peer_card": { "anyOf": [ - { "$ref": "#/components/schemas/PeerCardConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/PeerCardConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for peer card functionality. If deriver is disabled, peer cards will also be disabled and these settings will be ignored." }, "summary": { "anyOf": [ - { "$ref": "#/components/schemas/SummaryConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/SummaryConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for summary functionality." }, "dream": { "anyOf": [ - { "$ref": "#/components/schemas/DreamConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/DreamConfiguration" + }, + { + "type": "null" + } ], "description": "Configuration for dream functionality. If deriver is disabled, dreams will also be disabled and these settings will be ignored." } @@ -4400,15 +5759,22 @@ } }, "type": "object", - "required": ["id"], + "required": [ + "id" + ], "title": "WorkspaceCreate" }, "WorkspaceGet": { "properties": { "filters": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Filters" } @@ -4420,15 +5786,24 @@ "properties": { "metadata": { "anyOf": [ - { "additionalProperties": true, "type": "object" }, - { "type": "null" } + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } ], "title": "Metadata" }, "configuration": { "anyOf": [ - { "$ref": "#/components/schemas/WorkspaceConfiguration" }, - { "type": "null" } + { + "$ref": "#/components/schemas/WorkspaceConfiguration" + }, + { + "type": "null" + } ] } }, @@ -4436,6 +5811,11 @@ "title": "WorkspaceUpdate" } }, - "securitySchemes": { "HTTPBearer": { "type": "http", "scheme": "bearer" } } + "securitySchemes": { + "HTTPBearer": { + "type": "http", + "scheme": "bearer" + } + } } } diff --git a/pyproject.toml b/pyproject.toml index 3cce118f..facc24a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "honcho" -version = "2.5.0" +version = "2.5.1" description = "Honcho Server" authors = [ {name = "Plastic Labs", email = "hello@plasticlabs.ai"}, diff --git a/sdks/python/pyproject.toml b/sdks/python/pyproject.toml index 5e3b4b67..513c269a 100644 --- a/sdks/python/pyproject.toml +++ b/sdks/python/pyproject.toml @@ -8,7 +8,7 @@ authors = [ { name = "Plastic Labs", email = "hello@plasticlabs.ai" }, ] dependencies = [ - "honcho-core>=1.7.0", + "honcho-core>=1.8.0", "httpx>=0.28.0, <1", "pydantic>=2.0.0, <3", "typing-extensions>=4.12.0; python_version < \"3.12\"", diff --git a/sdks/typescript/bun.lock b/sdks/typescript/bun.lock index a2449f90..78a4a5dd 100644 --- a/sdks/typescript/bun.lock +++ b/sdks/typescript/bun.lock @@ -4,7 +4,7 @@ "": { "name": "@honcho-ai/sdk", "dependencies": { - "@honcho-ai/core": "^1.7.0", + "@honcho-ai/core": "^1.8.0", "@types/node": "^24.0.1", "zod": "4.0.0", }, @@ -106,7 +106,7 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.8", "", { "os": "win32", "cpu": "x64" }, "sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w=="], - "@honcho-ai/core": ["@honcho-ai/core@1.7.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-ZZsRlz0DgXaWj5z81KKcw4dLlwSxHqsxuG/Gb9vaozqJa8SSj09IGMm3kJjRTxNOD/AhHxOxAX3l6WEq4VZL5g=="], + "@honcho-ai/core": ["@honcho-ai/core@1.8.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-qxBNoXLezH8yx4iBoz4Bsxkm9zp4Gm1fNwuP8gHRdSelxhR0dXpvLffx8B5V0XFWsx+SfPaJFyaKw0X2sYMwLA=="], "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], diff --git a/sdks/typescript/package.json b/sdks/typescript/package.json index 21671ccf..a780bc86 100644 --- a/sdks/typescript/package.json +++ b/sdks/typescript/package.json @@ -20,7 +20,7 @@ "test:coverage": "jest --coverage" }, "dependencies": { - "@honcho-ai/core": "^1.7.0", + "@honcho-ai/core": "^1.8.0", "@types/node": "^24.0.1", "zod": "4.0.0" }, diff --git a/src/dreamer/consolidate.py b/src/dreamer/consolidate.py index d834df4b..bb3c047c 100644 --- a/src/dreamer/consolidate.py +++ b/src/dreamer/consolidate.py @@ -15,6 +15,7 @@ from src.utils.queue_payload import DreamPayload from src.utils.representation import ( ExplicitObservation, Representation, + flatten_message_ids, ) logger = logging.getLogger(__name__) @@ -202,7 +203,7 @@ async def _consolidate_cluster( # NOTE: other kinds of observations here in the future metadata = schemas.DocumentMetadata( - message_ids=obs.message_ids, + message_ids=flatten_message_ids(obs.message_ids), message_created_at=format_datetime_utc(obs.created_at), premises=premises, ) diff --git a/src/main.py b/src/main.py index b2480e63..48b7afdb 100644 --- a/src/main.py +++ b/src/main.py @@ -139,7 +139,7 @@ app = FastAPI( title="Honcho API", summary="The Identity Layer for the Agentic World", description="""Honcho is a platform for giving agents user-centric memory and social cognition""", - version="2.5.0", + version="2.5.1", contact={ "name": "Plastic Labs", "url": "https://honcho.dev", diff --git a/src/utils/representation.py b/src/utils/representation.py index 7a0644d0..74557496 100644 --- a/src/utils/representation.py +++ b/src/utils/representation.py @@ -8,6 +8,40 @@ from src import models from src.utils.formatting import parse_datetime_iso +def flatten_message_ids( + message_ids: list[int] | list[list[int]] | list[tuple[int, int]], +) -> list[int]: + """ + Flatten message_ids that may be in old tuple format or nested list format. + + This handles backwards compatibility with the old schema where message_ids + was list[tuple[int, int]] representing ranges, and the new schema where + it's list[int] representing individual message IDs. + + Args: + message_ids: Either a flat list of ints, nested list, or list of tuples + + Returns: + A flat list of unique message IDs, sorted + + Examples: + [1, 2, 3] -> [1, 2, 3] + [[1, 2], [3, 4]] -> [1, 2, 3, 4] + [(105, 105)] -> [105] + [[105, 105]] -> [105] + """ + result: list[int] = [] + for item in message_ids: + if isinstance(item, (list | tuple)): + # Nested list or tuple - flatten it + result.extend(item) + else: + # Already flat + result.append(item) + # Remove duplicates and sort + return sorted(set(result)) + + class ObservationMetadata(BaseModel): created_at: datetime message_ids: list[int] @@ -267,7 +301,9 @@ class Representation(BaseModel): doc.internal_metadata, doc.created_at ), content=doc.content, - message_ids=doc.internal_metadata.get("message_ids", []), + message_ids=flatten_message_ids( + doc.internal_metadata.get("message_ids", []) + ), session_name=doc.session_name, ) for doc in documents @@ -279,7 +315,9 @@ class Representation(BaseModel): doc.internal_metadata, doc.created_at ), conclusion=doc.content, - message_ids=doc.internal_metadata.get("message_ids", []), + message_ids=flatten_message_ids( + doc.internal_metadata.get("message_ids", []) + ), session_name=doc.session_name, premises=doc.internal_metadata.get("premises", []), ) diff --git a/uv.lock b/uv.lock index 8e644b73..56d98ce9 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.13'", @@ -710,7 +710,7 @@ wheels = [ [[package]] name = "honcho" -version = "2.5.0" +version = "2.5.1" source = { virtual = "." } dependencies = [ { name = "alembic" }, @@ -826,7 +826,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "honcho-core", specifier = ">=1.7.0" }, + { name = "honcho-core", specifier = ">=1.8.0" }, { name = "httpx", specifier = ">=0.28.0,<1" }, { name = "pydantic", specifier = ">=2.0.0,<3" }, { name = "typing-extensions", marker = "python_full_version < '3.12'", specifier = ">=4.12.0" }, @@ -837,7 +837,7 @@ dev = [{ name = "ruff", specifier = ">=0.11.13" }] [[package]] name = "honcho-core" -version = "1.7.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -847,9 +847,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/75/0185a8b1c85d6947b3c7fe1a3ee5793fdedb944aec4798a370fcc27ec34f/honcho_core-1.7.0.tar.gz", hash = "sha256:b2eac28bc8b47ef8a1da404a1fce12180f12a8ea014f2bd68ad95d6e37bf90c4", size = 145919, upload-time = "2025-12-10T16:05:09.387Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/ea/c0949bbac5a9f20625bdb152b7da2350e89ffc15b5862cd6094b464cde14/honcho_core-1.8.0.tar.gz", hash = "sha256:ffe0840639651640722ad0ed38d193cc9402b077dac3e6726ac7be551398d952", size = 142469, upload-time = "2025-12-15T19:27:59.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/4d/74611a5055116ae683b5b256349f23913b2e35cc2ea2d96c28a5ddf23e76/honcho_core-1.7.0-py3-none-any.whl", hash = "sha256:2d9b31b0439513518e3156a798f5096fd92ab71fe46bc40b4b5507e23dd1116f", size = 148271, upload-time = "2025-12-10T16:05:07.964Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9a/5aba73353c7e70d331a21e01a931c951c5bd8688fb25e5fc318517f2adf9/honcho_core-1.8.0-py3-none-any.whl", hash = "sha256:30a44b7d421328dfac015e8a6ecbe09c89b6cac9f3a913262244e7d15698a8a8", size = 140580, upload-time = "2025-12-15T19:27:58.562Z" }, ] [[package]] From 75d1180ae1b0f1867f10de101b8039fda376b478 Mon Sep 17 00:00:00 2001 From: ajspig <46900795+ajspig@users.noreply.github.com> Date: Thu, 18 Dec 2025 17:34:10 -0500 Subject: [PATCH 6/9] fix: adding additional clarity when updating peercards (#304) --- src/deriver/deriver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deriver/deriver.py b/src/deriver/deriver.py index 589b30b3..e16e03da 100644 --- a/src/deriver/deriver.py +++ b/src/deriver/deriver.py @@ -472,9 +472,9 @@ class CertaintyReasoner: ] accumulate_metric( f"deriver_{self.ctx[-1].id}_{self.observer}", - "new_peer_card" + "updated_peer_card" if self.observer == self.observed - else f"new_{self.observed}_peer_card", + else f"updated_{self.observed}_peer_card", "\n".join(new_peer_card), "blob", ) From b31e9ac4b98e80b5241a280f6130390783bca358 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Tue, 30 Dec 2025 15:45:00 -0600 Subject: [PATCH 7/9] chore: bump redis (#302) --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index facc24a3..c63d5742 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "typing-extensions>=4.11.0", "prometheus-client>=0.20.0", "json-repair>=0.49.0", - "redis>=6.0.0", + "redis>=7.0.0,<8.0.0", "cashews[redis]==7.4.1", ] [tool.uv] diff --git a/uv.lock b/uv.lock index 56d98ce9..d11770e9 100644 --- a/uv.lock +++ b/uv.lock @@ -782,7 +782,7 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.10.1" }, { name = "pyjwt", specifier = ">=2.10.0" }, { name = "python-dotenv", specifier = ">=1.0.0" }, - { name = "redis", specifier = ">=6.0.0" }, + { name = "redis", specifier = ">=7.0.0,<8.0.0" }, { name = "rich", specifier = ">=13.7.1" }, { name = "sentry-sdk", extras = ["anthropic", "fastapi", "sqlalchemy"], specifier = ">=2.3.1" }, { name = "sqlalchemy", specifier = ">=2.0.30" }, @@ -2015,14 +2015,14 @@ wheels = [ [[package]] name = "redis" -version = "6.4.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/d6/e8b92798a5bd67d659d51a18170e91c16ac3b59738d91894651ee255ed49/redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010", size = 4647399, upload-time = "2025-08-07T08:10:11.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/c8/983d5c6579a411d8a99bc5823cc5712768859b5ce2c8afe1a65b37832c81/redis-7.1.0.tar.gz", hash = "sha256:b1cc3cfa5a2cb9c2ab3ba700864fb0ad75617b41f01352ce5779dabf6d5f9c3c", size = 4796669, upload-time = "2025-11-19T15:54:39.961Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/02/89e2ed7e85db6c93dfa9e8f691c5087df4e3551ab39081a4d7c6d1f90e05/redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f", size = 279847, upload-time = "2025-08-07T08:10:09.84Z" }, + { url = "https://files.pythonhosted.org/packages/89/f0/8956f8a86b20d7bb9d6ac0187cf4cd54d8065bc9a1a09eb8011d4d326596/redis-7.1.0-py3-none-any.whl", hash = "sha256:23c52b208f92b56103e17c5d06bdc1a6c2c0b3106583985a76a18f83b265de2b", size = 354159, upload-time = "2025-11-19T15:54:38.064Z" }, ] [[package]] From c821eb7fce5ba391eae1f4f9e30be83eb1f4c521 Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Fri, 2 Jan 2026 13:52:58 -0500 Subject: [PATCH 8/9] Update MCP Worker (#311) * fix: Update MCP Server to latest SDK version * fix: Force primitive creation to avoid race conditions --- mcp/bun.lock | 15 +- mcp/package.json | 4 +- mcp/worker.ts | 2633 +++++++++++++++++++++++++--------------------- 3 files changed, 1466 insertions(+), 1186 deletions(-) diff --git a/mcp/bun.lock b/mcp/bun.lock index 61644df3..26363de9 100644 --- a/mcp/bun.lock +++ b/mcp/bun.lock @@ -4,11 +4,10 @@ "": { "name": "honcho-mcp-proxy", "dependencies": { - "@honcho-ai/sdk": "^1.2.1", + "@honcho-ai/sdk": "^1.6.0", }, "devDependencies": { "@cloudflare/workers-types": "^4.20241002.0", - "only-allow": "^1.2.1", "typescript": "^5.3.3", "wrangler": "^4.24.3", }, @@ -85,9 +84,9 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], - "@honcho-ai/core": ["@honcho-ai/core@1.2.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-VPHCFIGfC00GeE4P83DDIT7hkuMnMVkWlMTmMd2tw4HSEUciqLBh09AX/6aMKfJAzprg1diub6pJJ6LJP6eJ+g=="], + "@honcho-ai/core": ["@honcho-ai/core@1.8.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-qxBNoXLezH8yx4iBoz4Bsxkm9zp4Gm1fNwuP8gHRdSelxhR0dXpvLffx8B5V0XFWsx+SfPaJFyaKw0X2sYMwLA=="], - "@honcho-ai/sdk": ["@honcho-ai/sdk@1.2.1", "", { "dependencies": { "@honcho-ai/core": "1.2.0", "@types/node": "^24.0.1" } }, "sha512-/RFHq9R9XsD1uj3KPZkZ4aGMuyan6gmIXu3HFND7Aipe3PGFeMEmteFmcMVGi3FO3F5S+NJsfqppV9Z3dNfeyQ=="], + "@honcho-ai/sdk": ["@honcho-ai/sdk@1.6.0", "", { "dependencies": { "@honcho-ai/core": "^1.6.1", "@types/node": "^24.0.1", "zod": "4.0.0" } }, "sha512-6HSjTidVwchEWw18p5Gqp4e2/I1Um0EppTZYZ22+hG1UemKRcJX+VDRvlu5ja8inD/WWYTEOJ/HBSdT8OC9biw=="], "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], @@ -247,8 +246,6 @@ "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "only-allow": ["only-allow@1.2.1", "", { "dependencies": { "which-pm-runs": "^1.1.0" }, "bin": { "only-allow": "bin.js" } }, "sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA=="], - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -283,8 +280,6 @@ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], - "workerd": ["workerd@1.20250712.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250712.0", "@cloudflare/workerd-darwin-arm64": "1.20250712.0", "@cloudflare/workerd-linux-64": "1.20250712.0", "@cloudflare/workerd-linux-arm64": "1.20250712.0", "@cloudflare/workerd-windows-64": "1.20250712.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-7h+k1OxREpiZW0849g0uQNexRWMcs5i5gUGhJzCY8nIx6Tv4D/ndlXJ47lEFj7/LQdp165IL9dM2D5uDiedZrg=="], "wrangler": ["wrangler@4.26.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.4.1", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250712.2", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.17", "workerd": "1.20250712.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250712.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-EXuwyWlgYQZv6GJlyE0lVGk9hHqASssuECECT1XC5aIijTwNLQhsj/TOZ0hKSFlMbVr1E+OAdevAxd0kaF4ovA=="], @@ -295,10 +290,12 @@ "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], - "zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "zod": ["zod@4.0.0", "", {}, "sha512-9diLdTPc/L7w/5jI4C3gHYNiGHDV9IZYxo1e5LSD8cabi65WVTWWb+g2BGPEpUUCOxR4D+6O5B0AzyMdUAXwrw=="], "@honcho-ai/core/@types/node": ["@types/node@18.19.120", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA=="], + "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "@honcho-ai/core/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], } } diff --git a/mcp/package.json b/mcp/package.json index c77cd31e..c13b93ba 100644 --- a/mcp/package.json +++ b/mcp/package.json @@ -9,13 +9,13 @@ "bun": ">=1.2.0" }, "scripts": { - "preinstall": "node -e \"if(process.env.npm_config_user_agent?.includes('npm')){console.error('❌ Please use bun instead of npm!\\n📦 Run: bun install\\n🌐 Install bun: https://bun.sh/');process.exit(1)}\"", + "preinstall": "node -e \"const ua=process.env.npm_config_user_agent||'';if(ua.includes('npm')&&!ua.includes('bun')){console.error('❌ Please use bun instead of npm!\\n📦 Run: bun install\\n🌐 Install bun: https://bun.sh/');process.exit(1)}\"", "dev": "wrangler dev", "deploy": "wrangler deploy", "deploy:staging": "wrangler deploy --env staging" }, "dependencies": { - "@honcho-ai/sdk": "^1.2.1" + "@honcho-ai/sdk": "^1.6.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20241002.0", diff --git a/mcp/worker.ts b/mcp/worker.ts index 74dcc5bd..2b558852 100644 --- a/mcp/worker.ts +++ b/mcp/worker.ts @@ -1,515 +1,598 @@ -import { Honcho } from '@honcho-ai/sdk'; +import { Honcho } from "@honcho-ai/sdk"; interface HonchoConfig { - apiKey: string; - userName: string; - baseUrl?: string; - workspaceId?: string; - assistantName?: string; + apiKey: string; + userName: string; + baseUrl?: string; + workspaceId?: string; + assistantName?: string; } interface Message { - role: 'user' | 'assistant'; - content: string; - metadata?: Record; + role: "user" | "assistant"; + content: string; + metadata?: Record; } /** * JSON-RPC 2.0 request interface */ interface JsonRpcRequest { - jsonrpc: '2.0'; - method: string; - params?: any; - id?: string | number; + jsonrpc: "2.0"; + method: string; + params?: any; + id?: string | number; } /** * JSON-RPC 2.0 response interface */ interface JsonRpcResponse { - jsonrpc: '2.0'; - id?: string | number | null; - result?: any; - error?: { - code: number; - message: string; - data?: any; - }; + jsonrpc: "2.0"; + id?: string | number | null; + result?: any; + error?: { + code: number; + message: string; + data?: any; + }; } // MCP Tool definitions interface Tool { - name: string; - description: string; - inputSchema: { - type: 'object'; - properties: Record; - required?: string[]; - }; + name: string; + description: string; + inputSchema: { + type: "object"; + properties: Record; + required?: string[]; + }; } /** * Helper function to validate required arguments and create error responses */ -function validateArguments(args: Record, required: string[], requestId: string | number | null): Response | null { - for (const param of required) { - if (!args[param]) { - return createErrorResponse(requestId, -32602, `${param} is required`); - } +function validateArguments( + args: Record, + required: string[], + requestId: string | number | null, +): Response | null { + for (const param of required) { + if (!args[param]) { + return createErrorResponse(requestId, -32602, `${param} is required`); } + } - // Special validation for arrays - if (args.messages && !Array.isArray(args.messages)) { - return createErrorResponse(requestId, -32602, 'messages must be an array'); - } - if (args.peer_ids && !Array.isArray(args.peer_ids)) { - return createErrorResponse(requestId, -32602, 'peer_ids must be an array'); - } + // Special validation for arrays + if (args.messages && !Array.isArray(args.messages)) { + return createErrorResponse(requestId, -32602, "messages must be an array"); + } + if (args.peer_ids && !Array.isArray(args.peer_ids)) { + return createErrorResponse(requestId, -32602, "peer_ids must be an array"); + } - return null; + return null; } /** * Helper function to create error responses */ -function createErrorResponse(id: string | number | null, code: number, message: string): Response { - return new Response(JSON.stringify(createJsonRpcResponse(id, undefined, createJsonRpcError(code, message))), { - status: code === -32602 ? 400 : (code === -32601 ? 404 : 500), - headers: { 'Content-Type': 'application/json' }, - }); +function createErrorResponse( + id: string | number | null, + code: number, + message: string, +): Response { + return new Response( + JSON.stringify( + createJsonRpcResponse(id, undefined, createJsonRpcError(code, message)), + ), + { + status: code === -32602 ? 400 : code === -32601 ? 404 : 500, + headers: { "Content-Type": "application/json" }, + }, + ); } /** * Helper function to format messages for async iteration */ async function formatMessages(messagesPage: any): Promise { - const messages = []; - for await (const message of messagesPage) { - messages.push({ - id: message.id, - content: message.content, - peer_id: message.peer_id, - session_id: message.session_id, - metadata: message.metadata, - created_at: message.created_at, - }); - } - return messages; + const messages = []; + for await (const message of messagesPage) { + messages.push({ + id: message.id, + content: message.content, + peer_id: message.peer_id, + session_id: message.session_id, + metadata: message.metadata, + created_at: message.created_at, + }); + } + return messages; } class HonchoWorker { - private honcho: Honcho; - private config: HonchoConfig; + private honcho: Honcho; + private config: HonchoConfig; - constructor(config: HonchoConfig) { - this.config = { - baseUrl: 'https://api.honcho.dev', - workspaceId: 'default', - assistantName: 'Assistant', - ...config, - }; + constructor(config: HonchoConfig) { + this.config = { + baseUrl: "https://api.honcho.dev", + workspaceId: "default", + assistantName: "Assistant", + ...config, + }; - this.honcho = new Honcho({ - apiKey: this.config.apiKey, - baseURL: this.config.baseUrl, - workspaceId: this.config.workspaceId, - }); - } + this.honcho = new Honcho({ + apiKey: this.config.apiKey, + baseURL: this.config.baseUrl, + workspaceId: this.config.workspaceId, + }); + } - //////////////////////////////////////////////////////////////////////////////// - /// /// - /// "Bespoke" tools: easy to use for user-assistant conversation paradigms /// - /// /// - //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /// /// + /// "Bespoke" tools: easy to use for user-assistant conversation paradigms /// + /// /// + //////////////////////////////////////////////////////////////////////////////// - /** - * Start a new conversation with a user. Call this when a user starts a new conversation. - * @returns A session ID for the conversation - */ - async startConversation(): Promise { - // Get/create the assistant peer with observe_me=false - const assistant = this.honcho.peer(this.config.assistantName!, { config: { observe_me: false } }); + /** + * Start a new conversation with a user. Call this when a user starts a new conversation. + * @returns A session ID for the conversation + */ + async startConversation(): Promise { + // Get/create the peers first, before session creation + // This avoids a race condition where peer creation during session.addPeers + // could rollback the session if there's an IntegrityError + const userPeer = await this.honcho.peer(this.config.userName); + const assistantPeer = await this.honcho.peer(this.config.assistantName!, { + config: { observe_me: false }, + }); - // Create a new session - const sessionId = crypto.randomUUID(); - const session = this.honcho.session(sessionId); + // Create a new session - pass empty config to force API call + const sessionId = crypto.randomUUID(); + const session = await this.honcho.session(sessionId, { config: {} }); - // Add the user and assistant peers to the session - // @ts-expect-error - API accepts null for observe_me despite type definition - await session.addPeers([this.config.userName, [assistant, { observe_me: null, observe_others: false }]]); + // Add the user and assistant peers to the session + await session.addPeers([ + userPeer, + [assistantPeer, { observe_me: null, observe_others: false }], + ]); - return sessionId; - } + return sessionId; + } - /** - * Add a turn to a conversation. Call this after a user has sent a message and the assistant has responded. - * @param sessionId - The ID of the session to add the turn to - * @param messages - A list of messages to add to the session - */ - async addTurn(sessionId: string, messages: Message[]): Promise { - const session = this.honcho.session(sessionId); - const userPeer = this.honcho.peer(this.config.userName); - const assistantPeer = this.honcho.peer(this.config.assistantName!); + /** + * Add a turn to a conversation. Call this after a user has sent a message and the assistant has responded. + * @param sessionId - The ID of the session to add the turn to + * @param messages - A list of messages to add to the session + */ + async addTurn(sessionId: string, messages: Message[]): Promise { + const session = await this.honcho.session(sessionId); + const userPeer = await this.honcho.peer(this.config.userName); + const assistantPeer = await this.honcho.peer(this.config.assistantName!); - const sessionMessages = []; + const sessionMessages = []; - for (let i = 0; i < messages.length; i++) { - const message = messages[i]; + for (let i = 0; i < messages.length; i++) { + const message = messages[i]; - // Validate required fields - if (!message || typeof message !== 'object') { - throw new Error(`Message at index ${i} must be a dictionary`); - } + // Validate required fields + if (!message || typeof message !== "object") { + throw new Error(`Message at index ${i} must be a dictionary`); + } - if (!message.role) { - throw new Error(`Message at index ${i} is missing required field 'role'`); - } + if (!message.role) { + throw new Error( + `Message at index ${i} is missing required field 'role'`, + ); + } - if (!message.content) { - throw new Error(`Message at index ${i} is missing required field 'content'`); - } + if (!message.content) { + throw new Error( + `Message at index ${i} is missing required field 'content'`, + ); + } - const { role, content, metadata } = message; + const { role, content, metadata } = message; - // Create message with appropriate peer - if (role === 'user') { - if (metadata) { - sessionMessages.push(userPeer.message(content, { metadata })); - } else { - sessionMessages.push(userPeer.message(content)); - } - } else if (role === 'assistant') { - if (metadata) { - sessionMessages.push(assistantPeer.message(content, { metadata })); - } else { - sessionMessages.push(assistantPeer.message(content)); - } - } else { - throw new Error(`Invalid role '${role}' at message index ${i}. Role must be one of: 'user' or 'assistant'`); - } - } - - await session.addMessages(sessionMessages); - } - - /** - * Get personalization insights about the user, based on the query and the accumulated knowledge of the user across all conversations. - * @param sessionId - The ID of the session for context - * @param query - The question about the user's preferences, habits, etc. - * @returns A string with the personalization insights - */ - async getPersonalizationInsights(sessionId: string, query: string): Promise { - const userPeer = this.honcho.peer(this.config.userName); - - // Get the personalization insights - const personalizationInsights = await userPeer.chat(query, { sessionId }); - - if (!personalizationInsights) { - return "No personalization insights found."; - } - - return personalizationInsights; - } - - //////////////////////////////////////////////////////////////////////////////// - /// /// - /// General tools for using Honcho /// - /// /// - //////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////// - /// /// - /// Workspace operations /// - /// /// - ////////////////////////////////////////////////////// - - /** - * Search for messages across the entire workspace. - * @param query - The search query to use - * @returns A list of message dictionaries matching the search query - */ - async searchWorkspace(query: string): Promise { - const messagesPage = await this.honcho.search(query); - return await formatMessages(messagesPage); - } - - /** - * Get metadata for the current workspace. - * @returns A dictionary containing the workspace's metadata - */ - async getWorkspaceMetadata(): Promise> { - return await this.honcho.getMetadata(); - } - - /** - * Set metadata for the current workspace. - * @param metadata - A dictionary of metadata to associate with the workspace - */ - async setWorkspaceMetadata(metadata: Record): Promise { - await this.honcho.setMetadata(metadata); - } - - ////////////////////////////////////////////////////// - /// /// - /// Peer operations /// - /// /// - ////////////////////////////////////////////////////// - - /** - * Create or get a peer with the specified ID and optional configuration. - * @param peerId - Unique identifier for the peer - * @param config - Optional configuration dictionary for the peer - * @returns A dictionary with the peer ID and confirmation of creation - */ - async createPeer(peerId: string, config?: Record): Promise<{ peer_id: string; config?: Record }> { - const peer = this.honcho.peer(peerId, { config }); - return { - peer_id: peer.id, - config, - }; - } - - /** - * Get metadata for a specific peer. - * @param peerId - The ID of the peer to get metadata for - * @returns A dictionary containing the peer's metadata - */ - async getPeerMetadata(peerId: string): Promise> { - const peer = this.honcho.peer(peerId); - return await peer.getMetadata(); - } - - /** - * Set metadata for a specific peer. - * @param peerId - The ID of the peer to set metadata for - * @param metadata - A dictionary of metadata to associate with the peer - */ - async setPeerMetadata(peerId: string, metadata: Record): Promise { - const peer = this.honcho.peer(peerId); - await peer.setMetadata(metadata); - } - - /** - * Search for messages sent by a peer. - * @param peerId - The ID of the peer to search messages for - * @param query - The search query to use - * @returns A list of message dictionaries matching the search query - */ - async searchPeerMessages(peerId: string, query: string): Promise { - const peer = this.honcho.peer(peerId); - const messagesPage = await peer.search(query); - return await formatMessages(messagesPage); - } - - /** - * Query a peer's representation with natural language questions. - * @param peerId - The ID of the peer to query - * @param query - The natural language question to ask - * @param targetPeerId - Optional target peer ID for local representation queries - * @param sessionId - Optional session ID to scope the query to a specific session - * @returns Response string containing the answer to the query, or "None" if no relevant information - */ - async chat(peerId: string, query: string, targetPeerId?: string, sessionId?: string): Promise { - const peer = this.honcho.peer(peerId); - let targetPeer; - if (targetPeerId) { - targetPeer = this.honcho.peer(targetPeerId); - } - - const result = await peer.chat(query, { target: targetPeer, sessionId }); - return result || "None"; - } - - /** - * Get all peers in the current workspace. - * @returns A list of peer dictionaries with their IDs - */ - async listPeers(): Promise<{ id: string }[]> { - const peersPage = await this.honcho.getPeers(); - const peers = []; - - for await (const peer of peersPage) { - peers.push({ - id: peer.id, - }); - } - - return peers; - } - - ////////////////////////////////////////////////////// - /// /// - /// Session operations /// - /// /// - ////////////////////////////////////////////////////// - - /** - * Create or get a session with the specified ID and optional configuration. - * @param sessionId - Unique identifier for the session - * @param config - Optional configuration dictionary for the session - * @returns A dictionary with the session ID and confirmation of creation - */ - async createSession(sessionId: string, config?: Record): Promise<{ session_id: string; config?: Record }> { - const session = this.honcho.session(sessionId, { config }); - return { - session_id: session.id, - config, - }; - } - - /** - * Get metadata for a specific session. - * @param sessionId - The ID of the session to get metadata for - * @returns A dictionary containing the session's metadata - */ - async getSessionMetadata(sessionId: string): Promise> { - const session = this.honcho.session(sessionId); - return await session.getMetadata(); - } - - /** - * Set metadata for a specific session. - * @param sessionId - The ID of the session to set metadata for - * @param metadata - A dictionary of metadata to associate with the session - */ - async setSessionMetadata(sessionId: string, metadata: Record): Promise { - const session = this.honcho.session(sessionId); - await session.setMetadata(metadata); - } - - /** - * Add peers to a session. - * @param sessionId - The ID of the session to add peers to - * @param peerIds - List of peer IDs to add to the session - */ - async addPeersToSession(sessionId: string, peerIds: string[]): Promise { - const session = this.honcho.session(sessionId); - await session.addPeers(peerIds); - } - - /** - * Remove peers from a session. - * @param sessionId - The ID of the session to remove peers from - * @param peerIds - List of peer IDs to remove from the session - */ - async removePeersFromSession(sessionId: string, peerIds: string[]): Promise { - const session = this.honcho.session(sessionId); - await session.removePeers(peerIds); - } - - /** - * Get all peer IDs in a session. - * @param sessionId - The ID of the session to get peers from - * @returns A list of peer IDs that are members of the session - */ - async getSessionPeers(sessionId: string): Promise { - const session = this.honcho.session(sessionId); - const peers = await session.getPeers(); - return peers.map(peer => peer.id); - } - - /** - * Add messages to a session. - * @param sessionId - The ID of the session to add messages to - * @param messages - List of message dictionaries - */ - async addMessagesToSession(sessionId: string, messages: { peer_id: string; content: string; metadata?: Record }[]): Promise { - const session = this.honcho.session(sessionId); - - const sessionMessages = []; - for (const message of messages) { - const peer = this.honcho.peer(message.peer_id); - if (message.metadata) { - sessionMessages.push(peer.message(message.content, { metadata: message.metadata })); - } else { - sessionMessages.push(peer.message(message.content)); - } - } - - await session.addMessages(sessionMessages); - } - - /** - * Get messages from a session with optional filtering. - * @param sessionId - The ID of the session to get messages from - * @param filters - Optional dictionary of filter criteria - * @returns A list of message dictionaries - */ - async getSessionMessages(sessionId: string, filters?: Record): Promise { - const session = this.honcho.session(sessionId); - const messagesPage = await session.getMessages({ filter: filters }); - return await formatMessages(messagesPage); - } - - /** - * Get optimized context for a session within a token limit. - * @param sessionId - The ID of the session to get context for - * @param summary - Whether to include summary information - * @param tokens - Maximum number of tokens to include in the context - * @returns A dictionary containing the session context with messages and optional summary - */ - async getSessionContext(sessionId: string, summary: boolean = true, tokens?: number): Promise { - const session = this.honcho.session(sessionId); - const context = await session.getContext({ summary, tokens }); - - return { - session_id: context.sessionId, - summary: context.summary, - messages: context.messages.map(msg => ({ - id: msg.id, - content: msg.content, - peer_id: msg.peer_id, - metadata: msg.metadata, - created_at: msg.created_at, - })), - }; - } - - /** - * Search for messages in a specific session. - * @param sessionId - The ID of the session to search messages in - * @param query - The search query to use - * @returns A list of message dictionaries matching the search query - */ - async searchSessionMessages(sessionId: string, query: string): Promise { - const session = this.honcho.session(sessionId); - const messagesPage = await session.search(query); - return await formatMessages(messagesPage); - } - - /** - * Get the current working representation of a peer in a session. - * @param sessionId - The ID of the session - * @param peerId - The ID of the peer to get the working representation of - * @param targetPeerId - Optional target peer ID to get the representation of what peer_id knows about target_peer_id - * @returns A dictionary containing information about the peer - */ - async getWorkingRepresentation(sessionId: string, peerId: string, targetPeerId?: string): Promise> { - const session = this.honcho.session(sessionId); - if (targetPeerId) { - return await session.workingRep(peerId, targetPeerId); + // Create message with appropriate peer + if (role === "user") { + if (metadata) { + sessionMessages.push(userPeer.message(content, { metadata })); } else { - return await session.workingRep(peerId); + sessionMessages.push(userPeer.message(content)); } + } else if (role === "assistant") { + if (metadata) { + sessionMessages.push(assistantPeer.message(content, { metadata })); + } else { + sessionMessages.push(assistantPeer.message(content)); + } + } else { + throw new Error( + `Invalid role '${role}' at message index ${i}. Role must be one of: 'user' or 'assistant'`, + ); + } } - /** - * Get all sessions in the current workspace. - * @returns A list of session dictionaries with their IDs - */ - async listSessions(): Promise<{ id: string }[]> { - const sessionsPage = await this.honcho.getSessions(); - const sessions = []; + await session.addMessages(sessionMessages); + } - for await (const session of sessionsPage) { - sessions.push({ - id: session.id, - }); - } + /** + * Get personalization insights about the user, based on the query and the accumulated knowledge of the user across all conversations. + * @param sessionId - The ID of the session for context + * @param query - The question about the user's preferences, habits, etc. + * @returns A string with the personalization insights + */ + async getPersonalizationInsights( + sessionId: string, + query: string, + ): Promise { + const userPeer = await this.honcho.peer(this.config.userName); - return sessions; + // Get the personalization insights (non-streaming returns string | null) + const personalizationInsights = await userPeer.chat(query, { + session: sessionId, + }); + + if (!personalizationInsights || typeof personalizationInsights !== 'string') { + return "No personalization insights found."; } + + return personalizationInsights; + } + + //////////////////////////////////////////////////////////////////////////////// + /// /// + /// General tools for using Honcho /// + /// /// + //////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////// + /// /// + /// Workspace operations /// + /// /// + ////////////////////////////////////////////////////// + + /** + * Search for messages across the entire workspace. + * @param query - The search query to use + * @returns A list of message dictionaries matching the search query + */ + async searchWorkspace(query: string): Promise { + const messagesPage = await this.honcho.search(query); + return await formatMessages(messagesPage); + } + + /** + * Get metadata for the current workspace. + * @returns A dictionary containing the workspace's metadata + */ + async getWorkspaceMetadata(): Promise> { + return await this.honcho.getMetadata(); + } + + /** + * Set metadata for the current workspace. + * @param metadata - A dictionary of metadata to associate with the workspace + */ + async setWorkspaceMetadata(metadata: Record): Promise { + await this.honcho.setMetadata(metadata); + } + + ////////////////////////////////////////////////////// + /// /// + /// Peer operations /// + /// /// + ////////////////////////////////////////////////////// + + /** + * Create or get a peer with the specified ID and optional configuration. + * @param peerId - Unique identifier for the peer + * @param config - Optional configuration dictionary for the peer + * @returns A dictionary with the peer ID and confirmation of creation + */ + async createPeer( + peerId: string, + config?: Record, + ): Promise<{ peer_id: string; config?: Record }> { + const peer = await this.honcho.peer(peerId, { config }); + return { + peer_id: peer.id, + config, + }; + } + + /** + * Get metadata for a specific peer. + * @param peerId - The ID of the peer to get metadata for + * @returns A dictionary containing the peer's metadata + */ + async getPeerMetadata(peerId: string): Promise> { + const peer = await this.honcho.peer(peerId); + return await peer.getMetadata(); + } + + /** + * Set metadata for a specific peer. + * @param peerId - The ID of the peer to set metadata for + * @param metadata - A dictionary of metadata to associate with the peer + */ + async setPeerMetadata( + peerId: string, + metadata: Record, + ): Promise { + const peer = await this.honcho.peer(peerId); + await peer.setMetadata(metadata); + } + + /** + * Search for messages sent by a peer. + * @param peerId - The ID of the peer to search messages for + * @param query - The search query to use + * @returns A list of message dictionaries matching the search query + */ + async searchPeerMessages(peerId: string, query: string): Promise { + const peer = await this.honcho.peer(peerId); + const messagesPage = await peer.search(query); + return await formatMessages(messagesPage); + } + + /** + * Query a peer's representation with natural language questions. + * @param peerId - The ID of the peer to query + * @param query - The natural language question to ask + * @param targetPeerId - Optional target peer ID for local representation queries + * @param sessionId - Optional session ID to scope the query to a specific session + * @returns Response string containing the answer to the query, or "None" if no relevant information + */ + async chat( + peerId: string, + query: string, + targetPeerId?: string, + sessionId?: string, + ): Promise { + const peer = await this.honcho.peer(peerId); + let targetPeer; + if (targetPeerId) { + targetPeer = await this.honcho.peer(targetPeerId); + } + + const result = await peer.chat(query, { + target: targetPeer, + session: sessionId, + }); + + if (!result || typeof result !== 'string') { + return "None"; + } + return result; + } + + /** + * Get all peers in the current workspace. + * @returns A list of peer dictionaries with their IDs + */ + async listPeers(): Promise<{ id: string }[]> { + const peersPage = await this.honcho.getPeers(); + const peers = []; + + for await (const peer of peersPage) { + peers.push({ + id: peer.id, + }); + } + + return peers; + } + + ////////////////////////////////////////////////////// + /// /// + /// Session operations /// + /// /// + ////////////////////////////////////////////////////// + + /** + * Create or get a session with the specified ID and optional configuration. + * @param sessionId - Unique identifier for the session + * @param config - Optional configuration dictionary for the session + * @returns A dictionary with the session ID and confirmation of creation + */ + async createSession( + sessionId: string, + config?: Record, + ): Promise<{ session_id: string; config?: Record }> { + // Always pass config (even if empty) to force the API call to create the session + // Without this, the SDK just creates a local Session object without making an API call + const session = await this.honcho.session(sessionId, { config: config ?? {} }); + return { + session_id: session.id, + config, + }; + } + + /** + * Get metadata for a specific session. + * @param sessionId - The ID of the session to get metadata for + * @returns A dictionary containing the session's metadata + */ + async getSessionMetadata(sessionId: string): Promise> { + const session = await this.honcho.session(sessionId); + return await session.getMetadata(); + } + + /** + * Set metadata for a specific session. + * @param sessionId - The ID of the session to set metadata for + * @param metadata - A dictionary of metadata to associate with the session + */ + async setSessionMetadata( + sessionId: string, + metadata: Record, + ): Promise { + const session = await this.honcho.session(sessionId); + await session.setMetadata(metadata); + } + + /** + * Add peers to a session. + * @param sessionId - The ID of the session to add peers to + * @param peerIds - List of peer IDs to add to the session + */ + async addPeersToSession(sessionId: string, peerIds: string[]): Promise { + const session = await this.honcho.session(sessionId); + await session.addPeers(peerIds); + } + + /** + * Remove peers from a session. + * @param sessionId - The ID of the session to remove peers from + * @param peerIds - List of peer IDs to remove from the session + */ + async removePeersFromSession( + sessionId: string, + peerIds: string[], + ): Promise { + const session = await this.honcho.session(sessionId); + await session.removePeers(peerIds); + } + + /** + * Get all peer IDs in a session. + * @param sessionId - The ID of the session to get peers from + * @returns A list of peer IDs that are members of the session + */ + async getSessionPeers(sessionId: string): Promise { + const session = await this.honcho.session(sessionId); + const peers = await session.getPeers(); + return peers.map((peer) => peer.id); + } + + /** + * Add messages to a session. + * @param sessionId - The ID of the session to add messages to + * @param messages - List of message dictionaries + */ + async addMessagesToSession( + sessionId: string, + messages: { + peer_id: string; + content: string; + metadata?: Record; + }[], + ): Promise { + const session = await this.honcho.session(sessionId); + + const sessionMessages = []; + for (const message of messages) { + const peer = await this.honcho.peer(message.peer_id); + if (message.metadata) { + sessionMessages.push( + peer.message(message.content, { metadata: message.metadata }), + ); + } else { + sessionMessages.push(peer.message(message.content)); + } + } + + await session.addMessages(sessionMessages); + } + + /** + * Get messages from a session with optional filtering. + * @param sessionId - The ID of the session to get messages from + * @param filters - Optional dictionary of filter criteria + * @returns A list of message dictionaries + */ + async getSessionMessages( + sessionId: string, + filters?: Record, + ): Promise { + const session = await this.honcho.session(sessionId); + const messagesPage = await session.getMessages({ filter: filters }); + return await formatMessages(messagesPage); + } + + /** + * Get optimized context for a session within a token limit. + * @param sessionId - The ID of the session to get context for + * @param summary - Whether to include summary information + * @param tokens - Maximum number of tokens to include in the context + * @returns A dictionary containing the session context with messages and optional summary + */ + async getSessionContext( + sessionId: string, + summary: boolean = true, + tokens?: number, + ): Promise { + const session = await this.honcho.session(sessionId); + const context = await session.getContext({ summary, tokens }); + + return { + session_id: context.sessionId, + summary: context.summary, + messages: context.messages.map((msg) => ({ + id: msg.id, + content: msg.content, + peer_id: msg.peer_id, + metadata: msg.metadata, + created_at: msg.created_at, + })), + }; + } + + /** + * Search for messages in a specific session. + * @param sessionId - The ID of the session to search messages in + * @param query - The search query to use + * @returns A list of message dictionaries matching the search query + */ + async searchSessionMessages( + sessionId: string, + query: string, + ): Promise { + const session = await this.honcho.session(sessionId); + const messagesPage = await session.search(query); + return await formatMessages(messagesPage); + } + + /** + * Get the current working representation of a peer in a session. + * @param sessionId - The ID of the session + * @param peerId - The ID of the peer to get the working representation of + * @param targetPeerId - Optional target peer ID to get the representation of what peer_id knows about target_peer_id + * @returns A dictionary containing information about the peer + */ + async getWorkingRepresentation( + sessionId: string, + peerId: string, + targetPeerId?: string, + ): Promise> { + const session = await this.honcho.session(sessionId); + if (targetPeerId) { + return await session.workingRep(peerId, targetPeerId); + } else { + return await session.workingRep(peerId); + } + } + + /** + * Get all sessions in the current workspace. + * @returns A list of session dictionaries with their IDs + */ + async listSessions(): Promise<{ id: string }[]> { + const sessionsPage = await this.honcho.getSessions(); + const sessions = []; + + for await (const session of sessionsPage) { + sessions.push({ + id: session.id, + }); + } + + return sessions; + } } /** @@ -518,32 +601,34 @@ class HonchoWorker { * @returns Configuration object or null if invalid */ function parseConfig(request: Request): HonchoConfig | null { - // Get API key from Authorization header - const authHeader = request.headers.get('Authorization'); - if (!authHeader || !authHeader.startsWith('Bearer ')) { - return null; - } - const apiKey = authHeader.substring(7); + // Get API key from Authorization header + const authHeader = request.headers.get("Authorization"); + if (!authHeader || !authHeader.startsWith("Bearer ")) { + return null; + } + const apiKey = authHeader.substring(7); - if (!apiKey) { - return null; - } + if (!apiKey) { + return null; + } - const userName = request.headers.get('X-Honcho-User-Name'); - if (!userName) { - return null; - } + const userName = request.headers.get("X-Honcho-User-Name"); + if (!userName) { + return null; + } - // Get configuration from headers with proper defaults - const config: HonchoConfig = { - apiKey, - userName, - baseUrl: request.headers.get('X-Honcho-Base-URL') || 'https://api.honcho.dev', - workspaceId: request.headers.get('X-Honcho-Workspace-ID') || 'default', - assistantName: request.headers.get('X-Honcho-Assistant-Name') || 'Assistant', - }; + // Get configuration from headers with proper defaults + const config: HonchoConfig = { + apiKey, + userName, + baseUrl: + request.headers.get("X-Honcho-Base-URL") || "https://api.honcho.dev", + workspaceId: request.headers.get("X-Honcho-Workspace-ID") || "default", + assistantName: + request.headers.get("X-Honcho-Assistant-Name") || "Assistant", + }; - return config; + return config; } /** @@ -553,19 +638,23 @@ function parseConfig(request: Request): HonchoConfig | null { * @param error - Error object if any * @returns JSON-RPC response object */ -function createJsonRpcResponse(id: string | number | null, result?: any, error?: { code: number; message: string; data?: any }): JsonRpcResponse { - const response: JsonRpcResponse = { - jsonrpc: '2.0', - id, - }; +function createJsonRpcResponse( + id: string | number | null, + result?: any, + error?: { code: number; message: string; data?: any }, +): JsonRpcResponse { + const response: JsonRpcResponse = { + jsonrpc: "2.0", + id, + }; - if (error) { - response.error = error; - } else { - response.result = result; - } + if (error) { + response.error = error; + } else { + response.result = result; + } - return response; + return response; } /** @@ -575,770 +664,964 @@ function createJsonRpcResponse(id: string | number | null, result?: any, error?: * @param data - Optional error data * @returns Error object */ -function createJsonRpcError(code: number, message: string, data?: any): { code: number; message: string; data?: any } { - return { code, message, data }; +function createJsonRpcError( + code: number, + message: string, + data?: any, +): { code: number; message: string; data?: any } { + return { code, message, data }; } // Define all MCP tools based on the Python server.py functions const tools: Tool[] = [ - // Bespoke tools - { - name: 'start_conversation', - description: 'Start a new conversation with a user. Call this when a user starts a new conversation.', - inputSchema: { - type: 'object', - properties: {}, - required: [], - }, + // Bespoke tools + { + name: "start_conversation", + description: + "Start a new conversation with a user. Call this when a user starts a new conversation.", + inputSchema: { + type: "object", + properties: {}, + required: [], }, - { - name: 'add_turn', - description: 'Add a turn to a conversation. Call this after a user has sent a message and the assistant has responded.', - inputSchema: { - type: 'object', + }, + { + name: "add_turn", + description: + "Add a turn to a conversation. Call this after a user has sent a message and the assistant has responded.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to add the turn to.", + }, + messages: { + type: "array", + description: "A list of messages to add to the session.", + items: { + type: "object", properties: { - session_id: { - type: 'string', - description: 'The ID of the session to add the turn to.', - }, - messages: { - type: 'array', - description: 'A list of messages to add to the session.', - items: { - type: 'object', - properties: { - role: { - type: 'string', - enum: ['user', 'assistant'], - description: 'The role of the message author.', - }, - content: { - type: 'string', - description: 'The content of the message.', - }, - metadata: { - type: 'object', - description: 'Optional metadata about the message.', - }, - }, - required: ['role', 'content'], - }, - }, + role: { + type: "string", + enum: ["user", "assistant"], + description: "The role of the message author.", + }, + content: { + type: "string", + description: "The content of the message.", + }, + metadata: { + type: "object", + description: "Optional metadata about the message.", + }, }, - required: ['session_id', 'messages'], + required: ["role", "content"], + }, }, + }, + required: ["session_id", "messages"], }, - { - name: 'get_personalization_insights', - description: 'Get personalization insights about the user, based on the query and the accumulated knowledge of the user across all conversations.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session for context.', - }, - query: { - type: 'string', - description: 'The question about the user\'s preferences, habits, etc.', - }, - }, - required: ['session_id', 'query'], + }, + { + name: "get_personalization_insights", + description: + "Get personalization insights about the user, based on the query and the accumulated knowledge of the user across all conversations.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session for context.", }, + query: { + type: "string", + description: + "The question about the user's preferences, habits, etc.", + }, + }, + required: ["session_id", "query"], }, + }, - // Workspace operations - { - name: 'search_workspace', - description: 'Search for messages across the entire workspace.', - inputSchema: { - type: 'object', - properties: { - query: { - type: 'string', - description: 'The search query to use.', - }, - }, - required: ['query'], + // Workspace operations + { + name: "search_workspace", + description: "Search for messages across the entire workspace.", + inputSchema: { + type: "object", + properties: { + query: { + type: "string", + description: "The search query to use.", }, + }, + required: ["query"], }, - { - name: 'get_workspace_metadata', - description: 'Get metadata for the current workspace.', - inputSchema: { - type: 'object', - properties: {}, - required: [], - }, - }, - { - name: 'set_workspace_metadata', - description: 'Set metadata for the current workspace.', - inputSchema: { - type: 'object', - properties: { - metadata: { - type: 'object', - description: 'A dictionary of metadata to associate with the workspace.', - }, - }, - required: ['metadata'], + }, + { + name: "get_workspace_metadata", + description: "Get metadata for the current workspace.", + inputSchema: { + type: "object", + properties: {}, + required: [], + }, + }, + { + name: "set_workspace_metadata", + description: "Set metadata for the current workspace.", + inputSchema: { + type: "object", + properties: { + metadata: { + type: "object", + description: + "A dictionary of metadata to associate with the workspace.", }, + }, + required: ["metadata"], }, + }, - // Peer operations - { - name: 'create_peer', - description: 'Create or get a peer with the specified ID and optional configuration.', - inputSchema: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'Unique identifier for the peer.', - }, - config: { - type: 'object', - description: 'Optional configuration dictionary for the peer.', - }, - }, - required: ['peer_id'], + // Peer operations + { + name: "create_peer", + description: + "Create or get a peer with the specified ID and optional configuration.", + inputSchema: { + type: "object", + properties: { + peer_id: { + type: "string", + description: "Unique identifier for the peer.", }, - }, - { - name: 'get_peer_metadata', - description: 'Get metadata for a specific peer.', - inputSchema: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'The ID of the peer to get metadata for.', - }, - }, - required: ['peer_id'], + config: { + type: "object", + description: "Optional configuration dictionary for the peer.", }, + }, + required: ["peer_id"], }, - { - name: 'set_peer_metadata', - description: 'Set metadata for a specific peer.', - inputSchema: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'The ID of the peer to set metadata for.', - }, - metadata: { - type: 'object', - description: 'A dictionary of metadata to associate with the peer.', - }, - }, - required: ['peer_id', 'metadata'], + }, + { + name: "get_peer_metadata", + description: "Get metadata for a specific peer.", + inputSchema: { + type: "object", + properties: { + peer_id: { + type: "string", + description: "The ID of the peer to get metadata for.", }, + }, + required: ["peer_id"], }, - { - name: 'search_peer_messages', - description: 'Search for messages sent by a peer.', - inputSchema: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'The ID of the peer to search messages for.', - }, - query: { - type: 'string', - description: 'The search query to use.', - }, - }, - required: ['peer_id', 'query'], + }, + { + name: "set_peer_metadata", + description: "Set metadata for a specific peer.", + inputSchema: { + type: "object", + properties: { + peer_id: { + type: "string", + description: "The ID of the peer to set metadata for.", }, - }, - { - name: 'chat', - description: 'Query a peer\'s representation with natural language questions.', - inputSchema: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'The ID of the peer to query.', - }, - query: { - type: 'string', - description: 'The natural language question to ask.', - }, - target_peer_id: { - type: 'string', - description: 'Optional target peer ID for local representation queries.', - }, - session_id: { - type: 'string', - description: 'Optional session ID to scope the query to a specific session.', - }, - }, - required: ['peer_id', 'query'], + metadata: { + type: "object", + description: "A dictionary of metadata to associate with the peer.", }, + }, + required: ["peer_id", "metadata"], }, - { - name: 'list_peers', - description: 'Get all peers in the current workspace.', - inputSchema: { - type: 'object', - properties: {}, - required: [], + }, + { + name: "search_peer_messages", + description: "Search for messages sent by a peer.", + inputSchema: { + type: "object", + properties: { + peer_id: { + type: "string", + description: "The ID of the peer to search messages for.", }, + query: { + type: "string", + description: "The search query to use.", + }, + }, + required: ["peer_id", "query"], }, + }, + { + name: "chat", + description: + "Query a peer's representation with natural language questions.", + inputSchema: { + type: "object", + properties: { + peer_id: { + type: "string", + description: "The ID of the peer to query.", + }, + query: { + type: "string", + description: "The natural language question to ask.", + }, + target_peer_id: { + type: "string", + description: + "Optional target peer ID for local representation queries.", + }, + session_id: { + type: "string", + description: + "Optional session ID to scope the query to a specific session.", + }, + }, + required: ["peer_id", "query"], + }, + }, + { + name: "list_peers", + description: "Get all peers in the current workspace.", + inputSchema: { + type: "object", + properties: {}, + required: [], + }, + }, - // Session operations - { - name: 'create_session', - description: 'Create or get a session with the specified ID and optional configuration.', - inputSchema: { - type: 'object', + // Session operations + { + name: "create_session", + description: + "Create or get a session with the specified ID and optional configuration.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "Unique identifier for the session.", + }, + config: { + type: "object", + description: "Optional configuration dictionary for the session.", + }, + }, + required: ["session_id"], + }, + }, + { + name: "get_session_metadata", + description: "Get metadata for a specific session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to get metadata for.", + }, + }, + required: ["session_id"], + }, + }, + { + name: "set_session_metadata", + description: "Set metadata for a specific session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to set metadata for.", + }, + metadata: { + type: "object", + description: + "A dictionary of metadata to associate with the session.", + }, + }, + required: ["session_id", "metadata"], + }, + }, + { + name: "add_peers_to_session", + description: "Add peers to a session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to add peers to.", + }, + peer_ids: { + type: "array", + items: { type: "string" }, + description: "List of peer IDs to add to the session.", + }, + }, + required: ["session_id", "peer_ids"], + }, + }, + { + name: "remove_peers_from_session", + description: "Remove peers from a session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to remove peers from.", + }, + peer_ids: { + type: "array", + items: { type: "string" }, + description: "List of peer IDs to remove from the session.", + }, + }, + required: ["session_id", "peer_ids"], + }, + }, + { + name: "get_session_peers", + description: "Get all peer IDs in a session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to get peers from.", + }, + }, + required: ["session_id"], + }, + }, + { + name: "add_messages_to_session", + description: "Add messages to a session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to add messages to.", + }, + messages: { + type: "array", + items: { + type: "object", properties: { - session_id: { - type: 'string', - description: 'Unique identifier for the session.', - }, - config: { - type: 'object', - description: 'Optional configuration dictionary for the session.', - }, + peer_id: { + type: "string", + description: "ID of the peer sending the message", + }, + content: { + type: "string", + description: "Message content", + }, + metadata: { + type: "object", + description: "Optional metadata dictionary", + }, }, - required: ['session_id'], + required: ["peer_id", "content"], + }, + description: "List of message dictionaries.", }, + }, + required: ["session_id", "messages"], }, - { - name: 'get_session_metadata', - description: 'Get metadata for a specific session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to get metadata for.', - }, - }, - required: ['session_id'], + }, + { + name: "get_session_messages", + description: "Get messages from a session with optional filtering.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to get messages from.", }, - }, - { - name: 'set_session_metadata', - description: 'Set metadata for a specific session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to set metadata for.', - }, - metadata: { - type: 'object', - description: 'A dictionary of metadata to associate with the session.', - }, - }, - required: ['session_id', 'metadata'], + filters: { + type: "object", + description: "Optional dictionary of filter criteria.", }, + }, + required: ["session_id"], }, - { - name: 'add_peers_to_session', - description: 'Add peers to a session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to add peers to.', - }, - peer_ids: { - type: 'array', - items: { type: 'string' }, - description: 'List of peer IDs to add to the session.', - }, - }, - required: ['session_id', 'peer_ids'], + }, + { + name: "get_session_context", + description: "Get optimized context for a session within a token limit.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to get context for.", }, - }, - { - name: 'remove_peers_from_session', - description: 'Remove peers from a session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to remove peers from.', - }, - peer_ids: { - type: 'array', - items: { type: 'string' }, - description: 'List of peer IDs to remove from the session.', - }, - }, - required: ['session_id', 'peer_ids'], + summary: { + type: "boolean", + description: "Whether to include summary information.", + default: true, }, - }, - { - name: 'get_session_peers', - description: 'Get all peer IDs in a session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to get peers from.', - }, - }, - required: ['session_id'], + tokens: { + type: "integer", + description: "Maximum number of tokens to include in the context.", }, + }, + required: ["session_id"], }, - { - name: 'add_messages_to_session', - description: 'Add messages to a session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to add messages to.', - }, - messages: { - type: 'array', - items: { - type: 'object', - properties: { - peer_id: { - type: 'string', - description: 'ID of the peer sending the message', - }, - content: { - type: 'string', - description: 'Message content', - }, - metadata: { - type: 'object', - description: 'Optional metadata dictionary', - }, - }, - required: ['peer_id', 'content'], - }, - description: 'List of message dictionaries.', - }, - }, - required: ['session_id', 'messages'], + }, + { + name: "search_session_messages", + description: "Search for messages in a specific session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session to search messages in.", }, - }, - { - name: 'get_session_messages', - description: 'Get messages from a session with optional filtering.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to get messages from.', - }, - filters: { - type: 'object', - description: 'Optional dictionary of filter criteria.', - }, - }, - required: ['session_id'], + query: { + type: "string", + description: "The search query to use.", }, + }, + required: ["session_id", "query"], }, - { - name: 'get_session_context', - description: 'Get optimized context for a session within a token limit.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to get context for.', - }, - summary: { - type: 'boolean', - description: 'Whether to include summary information.', - default: true, - }, - tokens: { - type: 'integer', - description: 'Maximum number of tokens to include in the context.', - }, - }, - required: ['session_id'], + }, + { + name: "get_working_representation", + description: + "Get the current working representation of a peer in a session.", + inputSchema: { + type: "object", + properties: { + session_id: { + type: "string", + description: "The ID of the session.", }, - }, - { - name: 'search_session_messages', - description: 'Search for messages in a specific session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session to search messages in.', - }, - query: { - type: 'string', - description: 'The search query to use.', - }, - }, - required: ['session_id', 'query'], + peer_id: { + type: "string", + description: + "The ID of the peer to get the working representation of.", }, - }, - { - name: 'get_working_representation', - description: 'Get the current working representation of a peer in a session.', - inputSchema: { - type: 'object', - properties: { - session_id: { - type: 'string', - description: 'The ID of the session.', - }, - peer_id: { - type: 'string', - description: 'The ID of the peer to get the working representation of.', - }, - target_peer_id: { - type: 'string', - description: 'Optional target peer ID to get the representation of what peer_id knows about target_peer_id.', - }, - }, - required: ['session_id', 'peer_id'], + target_peer_id: { + type: "string", + description: + "Optional target peer ID to get the representation of what peer_id knows about target_peer_id.", }, + }, + required: ["session_id", "peer_id"], }, - { - name: 'list_sessions', - description: 'Get all sessions in the current workspace.', - inputSchema: { - type: 'object', - properties: {}, - required: [], - }, + }, + { + name: "list_sessions", + description: "Get all sessions in the current workspace.", + inputSchema: { + type: "object", + properties: {}, + required: [], }, + }, ]; /** * Execute a tool with validation and consistent response handling */ -async function executeToolCall(honcho: HonchoWorker, toolName: string, toolArguments: any, requestId: string | number | null): Promise { - let result: any; +async function executeToolCall( + honcho: HonchoWorker, + toolName: string, + toolArguments: any, + requestId: string | number | null, +): Promise { + let result: any; - switch (toolName) { - // Bespoke tools - case 'start_conversation': - result = await honcho.startConversation(); - break; + switch (toolName) { + // Bespoke tools + case "start_conversation": + result = await honcho.startConversation(); + break; - case 'add_turn': { - const validation = validateArguments(toolArguments, ['session_id', 'messages'], requestId); - if (validation) return validation; + case "add_turn": { + const validation = validateArguments( + toolArguments, + ["session_id", "messages"], + requestId, + ); + if (validation) return validation; - await honcho.addTurn(toolArguments.session_id, toolArguments.messages); - result = 'Turn added successfully'; - break; - } - - case 'get_personalization_insights': { - const validation = validateArguments(toolArguments, ['session_id', 'query'], requestId); - if (validation) return validation; - - result = await honcho.getPersonalizationInsights(toolArguments.session_id, toolArguments.query); - break; - } - - // Workspace operations - case 'search_workspace': { - const validation = validateArguments(toolArguments, ['query'], requestId); - if (validation) return validation; - - result = await honcho.searchWorkspace(toolArguments.query); - break; - } - - case 'get_workspace_metadata': - result = await honcho.getWorkspaceMetadata(); - break; - - case 'set_workspace_metadata': { - const validation = validateArguments(toolArguments, ['metadata'], requestId); - if (validation) return validation; - - await honcho.setWorkspaceMetadata(toolArguments.metadata); - result = 'Workspace metadata set successfully'; - break; - } - - // Peer operations - case 'create_peer': { - const validation = validateArguments(toolArguments, ['peer_id'], requestId); - if (validation) return validation; - - result = await honcho.createPeer(toolArguments.peer_id, toolArguments.config); - break; - } - - case 'get_peer_metadata': { - const validation = validateArguments(toolArguments, ['peer_id'], requestId); - if (validation) return validation; - - result = await honcho.getPeerMetadata(toolArguments.peer_id); - break; - } - - case 'set_peer_metadata': { - const validation = validateArguments(toolArguments, ['peer_id', 'metadata'], requestId); - if (validation) return validation; - - await honcho.setPeerMetadata(toolArguments.peer_id, toolArguments.metadata); - result = 'Peer metadata set successfully'; - break; - } - - case 'search_peer_messages': { - const validation = validateArguments(toolArguments, ['peer_id', 'query'], requestId); - if (validation) return validation; - - result = await honcho.searchPeerMessages(toolArguments.peer_id, toolArguments.query); - break; - } - - case 'chat': { - const validation = validateArguments(toolArguments, ['peer_id', 'query'], requestId); - if (validation) return validation; - - result = await honcho.chat(toolArguments.peer_id, toolArguments.query, toolArguments.target_peer_id, toolArguments.session_id); - break; - } - - case 'list_peers': - result = await honcho.listPeers(); - break; - - // Session operations - case 'create_session': { - const validation = validateArguments(toolArguments, ['session_id'], requestId); - if (validation) return validation; - - result = await honcho.createSession(toolArguments.session_id, toolArguments.config); - break; - } - - case 'get_session_metadata': { - const validation = validateArguments(toolArguments, ['session_id'], requestId); - if (validation) return validation; - - result = await honcho.getSessionMetadata(toolArguments.session_id); - break; - } - - case 'set_session_metadata': { - const validation = validateArguments(toolArguments, ['session_id', 'metadata'], requestId); - if (validation) return validation; - - await honcho.setSessionMetadata(toolArguments.session_id, toolArguments.metadata); - result = 'Session metadata set successfully'; - break; - } - - case 'add_peers_to_session': { - const validation = validateArguments(toolArguments, ['session_id', 'peer_ids'], requestId); - if (validation) return validation; - - await honcho.addPeersToSession(toolArguments.session_id, toolArguments.peer_ids); - result = 'Peers added to session successfully'; - break; - } - - case 'remove_peers_from_session': { - const validation = validateArguments(toolArguments, ['session_id', 'peer_ids'], requestId); - if (validation) return validation; - - await honcho.removePeersFromSession(toolArguments.session_id, toolArguments.peer_ids); - result = 'Peers removed from session successfully'; - break; - } - - case 'get_session_peers': { - const validation = validateArguments(toolArguments, ['session_id'], requestId); - if (validation) return validation; - - result = await honcho.getSessionPeers(toolArguments.session_id); - break; - } - - case 'add_messages_to_session': { - const validation = validateArguments(toolArguments, ['session_id', 'messages'], requestId); - if (validation) return validation; - - await honcho.addMessagesToSession(toolArguments.session_id, toolArguments.messages); - result = 'Messages added to session successfully'; - break; - } - - case 'get_session_messages': { - const validation = validateArguments(toolArguments, ['session_id'], requestId); - if (validation) return validation; - - result = await honcho.getSessionMessages(toolArguments.session_id, toolArguments.filters); - break; - } - - case 'get_session_context': { - const validation = validateArguments(toolArguments, ['session_id'], requestId); - if (validation) return validation; - - result = await honcho.getSessionContext(toolArguments.session_id, toolArguments.summary, toolArguments.tokens); - break; - } - - case 'search_session_messages': { - const validation = validateArguments(toolArguments, ['session_id', 'query'], requestId); - if (validation) return validation; - - result = await honcho.searchSessionMessages(toolArguments.session_id, toolArguments.query); - break; - } - - case 'get_working_representation': { - const validation = validateArguments(toolArguments, ['session_id', 'peer_id'], requestId); - if (validation) return validation; - - result = await honcho.getWorkingRepresentation(toolArguments.session_id, toolArguments.peer_id, toolArguments.target_peer_id); - break; - } - - case 'list_sessions': - result = await honcho.listSessions(); - break; - - default: - return createErrorResponse(requestId, -32601, `Method not found: ${toolName}`); + await honcho.addTurn(toolArguments.session_id, toolArguments.messages); + result = "Turn added successfully"; + break; } - const responseData = typeof result === 'string' ? result : JSON.stringify(result); - return new Response(JSON.stringify(createJsonRpcResponse(requestId, { - content: [{ - type: 'text', + case "get_personalization_insights": { + const validation = validateArguments( + toolArguments, + ["session_id", "query"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getPersonalizationInsights( + toolArguments.session_id, + toolArguments.query, + ); + break; + } + + // Workspace operations + case "search_workspace": { + const validation = validateArguments(toolArguments, ["query"], requestId); + if (validation) return validation; + + result = await honcho.searchWorkspace(toolArguments.query); + break; + } + + case "get_workspace_metadata": + result = await honcho.getWorkspaceMetadata(); + break; + + case "set_workspace_metadata": { + const validation = validateArguments( + toolArguments, + ["metadata"], + requestId, + ); + if (validation) return validation; + + await honcho.setWorkspaceMetadata(toolArguments.metadata); + result = "Workspace metadata set successfully"; + break; + } + + // Peer operations + case "create_peer": { + const validation = validateArguments( + toolArguments, + ["peer_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.createPeer( + toolArguments.peer_id, + toolArguments.config, + ); + break; + } + + case "get_peer_metadata": { + const validation = validateArguments( + toolArguments, + ["peer_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getPeerMetadata(toolArguments.peer_id); + break; + } + + case "set_peer_metadata": { + const validation = validateArguments( + toolArguments, + ["peer_id", "metadata"], + requestId, + ); + if (validation) return validation; + + await honcho.setPeerMetadata( + toolArguments.peer_id, + toolArguments.metadata, + ); + result = "Peer metadata set successfully"; + break; + } + + case "search_peer_messages": { + const validation = validateArguments( + toolArguments, + ["peer_id", "query"], + requestId, + ); + if (validation) return validation; + + result = await honcho.searchPeerMessages( + toolArguments.peer_id, + toolArguments.query, + ); + break; + } + + case "chat": { + const validation = validateArguments( + toolArguments, + ["peer_id", "query"], + requestId, + ); + if (validation) return validation; + + result = await honcho.chat( + toolArguments.peer_id, + toolArguments.query, + toolArguments.target_peer_id, + toolArguments.session_id, + ); + break; + } + + case "list_peers": + result = await honcho.listPeers(); + break; + + // Session operations + case "create_session": { + const validation = validateArguments( + toolArguments, + ["session_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.createSession( + toolArguments.session_id, + toolArguments.config, + ); + break; + } + + case "get_session_metadata": { + const validation = validateArguments( + toolArguments, + ["session_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getSessionMetadata(toolArguments.session_id); + break; + } + + case "set_session_metadata": { + const validation = validateArguments( + toolArguments, + ["session_id", "metadata"], + requestId, + ); + if (validation) return validation; + + await honcho.setSessionMetadata( + toolArguments.session_id, + toolArguments.metadata, + ); + result = "Session metadata set successfully"; + break; + } + + case "add_peers_to_session": { + const validation = validateArguments( + toolArguments, + ["session_id", "peer_ids"], + requestId, + ); + if (validation) return validation; + + await honcho.addPeersToSession( + toolArguments.session_id, + toolArguments.peer_ids, + ); + result = "Peers added to session successfully"; + break; + } + + case "remove_peers_from_session": { + const validation = validateArguments( + toolArguments, + ["session_id", "peer_ids"], + requestId, + ); + if (validation) return validation; + + await honcho.removePeersFromSession( + toolArguments.session_id, + toolArguments.peer_ids, + ); + result = "Peers removed from session successfully"; + break; + } + + case "get_session_peers": { + const validation = validateArguments( + toolArguments, + ["session_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getSessionPeers(toolArguments.session_id); + break; + } + + case "add_messages_to_session": { + const validation = validateArguments( + toolArguments, + ["session_id", "messages"], + requestId, + ); + if (validation) return validation; + + await honcho.addMessagesToSession( + toolArguments.session_id, + toolArguments.messages, + ); + result = "Messages added to session successfully"; + break; + } + + case "get_session_messages": { + const validation = validateArguments( + toolArguments, + ["session_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getSessionMessages( + toolArguments.session_id, + toolArguments.filters, + ); + break; + } + + case "get_session_context": { + const validation = validateArguments( + toolArguments, + ["session_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getSessionContext( + toolArguments.session_id, + toolArguments.summary, + toolArguments.tokens, + ); + break; + } + + case "search_session_messages": { + const validation = validateArguments( + toolArguments, + ["session_id", "query"], + requestId, + ); + if (validation) return validation; + + result = await honcho.searchSessionMessages( + toolArguments.session_id, + toolArguments.query, + ); + break; + } + + case "get_working_representation": { + const validation = validateArguments( + toolArguments, + ["session_id", "peer_id"], + requestId, + ); + if (validation) return validation; + + result = await honcho.getWorkingRepresentation( + toolArguments.session_id, + toolArguments.peer_id, + toolArguments.target_peer_id, + ); + break; + } + + case "list_sessions": + result = await honcho.listSessions(); + break; + + default: + return createErrorResponse( + requestId, + -32601, + `Method not found: ${toolName}`, + ); + } + + const responseData = + typeof result === "string" ? result : JSON.stringify(result); + return new Response( + JSON.stringify( + createJsonRpcResponse(requestId, { + content: [ + { + type: "text", text: responseData, - }], - })), { - status: 200, - headers: { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin': '*', - }, - }); + }, + ], + }), + ), + { + status: 200, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, + }, + ); } /** * Main Cloudflare Worker export */ export default { - async fetch(request: Request): Promise { - // Handle CORS preflight requests - if (request.method === 'OPTIONS') { - return new Response(null, { - status: 200, - headers: { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', - 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Honcho-User-Name, X-Honcho-Base-URL, X-Honcho-Workspace-ID, X-Honcho-Assistant-Name', + async fetch(request: Request): Promise { + // Handle CORS preflight requests + if (request.method === "OPTIONS") { + return new Response(null, { + status: 200, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, OPTIONS", + "Access-Control-Allow-Headers": + "Content-Type, Authorization, X-Honcho-User-Name, X-Honcho-Base-URL, X-Honcho-Workspace-ID, X-Honcho-Assistant-Name", + }, + }); + } + + // Only accept POST requests for JSON-RPC + if (request.method !== "POST") { + return createErrorResponse(null, -32600, "Invalid Request"); + } + + let requestData: JsonRpcRequest; + + try { + requestData = (await request.json()) as JsonRpcRequest; + } catch (error) { + return createErrorResponse(null, -32700, "Parse error"); + } + + // Validate JSON-RPC format + if (requestData.jsonrpc !== "2.0") { + return createErrorResponse( + requestData.id ?? null, + -32600, + "Invalid Request", + ); + } + + if (!requestData.method) { + return createErrorResponse( + requestData.id ?? null, + -32600, + "Invalid Request", + ); + } + + // Parse configuration + const config = parseConfig(request); + if (!config && requestData.method !== "initialize") { + return createErrorResponse( + requestData.id ?? null, + -32602, + "Missing or invalid API key", + ); + } + + const honcho = config ? new HonchoWorker(config) : null; + + try { + switch (requestData.method) { + case "initialize": + return new Response( + JSON.stringify( + createJsonRpcResponse(requestData.id ?? null, { + protocolVersion: "2024-11-05", + capabilities: { + tools: {}, }, - }); - } + serverInfo: { + name: "Honcho MCP Server", + version: "1.0.0", + }, + }), + ), + { + status: 200, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, + }, + ); - // Only accept POST requests for JSON-RPC - if (request.method !== 'POST') { - return createErrorResponse(null, -32600, 'Invalid Request'); - } + case "notifications/initialized": + // MCP initialized notification - no response needed + return new Response(null, { + status: 204, + headers: { + "Access-Control-Allow-Origin": "*", + }, + }); - let requestData: JsonRpcRequest; + case "tools/list": + return new Response( + JSON.stringify( + createJsonRpcResponse(requestData.id ?? null, { + tools: tools, + }), + ), + { + status: 200, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, + }, + ); - try { - requestData = await request.json() as JsonRpcRequest; - } catch (error) { - return createErrorResponse(null, -32700, 'Parse error'); - } + case "tools/call": + if (!honcho) { + return createErrorResponse( + requestData.id ?? null, + -32602, + "Missing API key", + ); + } - // Validate JSON-RPC format - if (requestData.jsonrpc !== '2.0') { - return createErrorResponse(requestData.id ?? null, -32600, 'Invalid Request'); - } + const toolName = requestData.params?.name; + const toolArguments = requestData.params?.arguments || {}; - if (!requestData.method) { - return createErrorResponse(requestData.id ?? null, -32600, 'Invalid Request'); - } + return await executeToolCall( + honcho, + toolName, + toolArguments, + requestData.id ?? null, + ); - // Parse configuration - const config = parseConfig(request); - if (!config && requestData.method !== 'initialize') { - return createErrorResponse(requestData.id ?? null, -32602, 'Missing or invalid API key'); - } - - const honcho = config ? new HonchoWorker(config) : null; - - try { - switch (requestData.method) { - case 'initialize': - return new Response(JSON.stringify(createJsonRpcResponse(requestData.id ?? null, { - protocolVersion: '2024-11-05', - capabilities: { - tools: {} - }, - serverInfo: { - name: 'Honcho MCP Server', - version: '1.0.0', - }, - })), { - status: 200, - headers: { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin': '*', - }, - }); - - case 'notifications/initialized': - // MCP initialized notification - no response needed - return new Response(null, { - status: 204, - headers: { - 'Access-Control-Allow-Origin': '*', - }, - }); - - case 'tools/list': - return new Response(JSON.stringify(createJsonRpcResponse(requestData.id ?? null, { - tools: tools, - })), { - status: 200, - headers: { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin': '*', - }, - }); - - case 'tools/call': - if (!honcho) { - return createErrorResponse(requestData.id ?? null, -32602, 'Missing API key'); - } - - const toolName = requestData.params?.name; - const toolArguments = requestData.params?.arguments || {}; - - return await executeToolCall(honcho, toolName, toolArguments, requestData.id ?? null); - - default: - return createErrorResponse(requestData.id ?? null, -32601, `Method not found: ${requestData.method}`); - } - } catch (error) { - console.error('Worker error:', error); - const errorMessage = error instanceof Error ? error.message : 'Internal server error'; - return createErrorResponse(requestData.id ?? null, -32603, errorMessage); - } - }, + default: + return createErrorResponse( + requestData.id ?? null, + -32601, + `Method not found: ${requestData.method}`, + ); + } + } catch (error) { + console.error("Worker error:", error); + const errorMessage = + error instanceof Error ? error.message : "Internal server error"; + return createErrorResponse(requestData.id ?? null, -32603, errorMessage); + } + }, };