summaryrefslogtreecommitdiffhomepage
path: root/packages/transport-contract/src
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-22 00:36:52 +0900
committerAdam Malczewski <[email protected]>2026-06-22 00:36:52 +0900
commitc1bfd62b0c734484efcff09d6cd521acdbab2640 (patch)
treef9194ea3214d5f15be6fed659a230997a1309ab9 /packages/transport-contract/src
parent7ff9f94c41a9870e124a50133cd74b42295ab9ac (diff)
downloaddispatch-c1bfd62b0c734484efcff09d6cd521acdbab2640.tar.gz
dispatch-c1bfd62b0c734484efcff09d6cd521acdbab2640.zip
feat: conversation compacting (manual + automatic)
Implement roadmap item 10: conversation compaction to reclaim context window without losing the thread. Wire (0.11.0): - Add CompactionResult type - Add ConversationCompactedMessage WS event Transport-contract (0.15.0): - Add CompactResponse, CompactThresholdResponse, SetCompactThresholdRequest - Add ConversationCompactedMessage to WsServerMessage union - Re-export CompactionResult Conversation-store: - replaceHistory: delete all chunks, reset seq, append new messages - getCompactThreshold / setCompactThreshold (per-conversation setting) - compactThresholdKey added to keys.ts Session-orchestrator: - CompactionService interface + compactionHandle - conversationCompacted hook descriptor - createCompactionService: load history, split old/recent, call provider to summarize, replaceHistory with [system: summary] + recent N - Auto-trigger: resolveCompaction lazy dep, fires after turn settles (checks threshold, non-blocking) - Hook declared in manifest contributes.hooks + services Transport-http: - POST /conversations/:id/compact (manual trigger) - GET /conversations/:id/compact-threshold (read setting) - PUT /conversations/:id/compact-threshold (set setting) Transport-ws: - Subscribe to conversationCompacted hook - Broadcast conversation.compacted WS message CLI: - dispatch compact <conversationId> command FE handoff: frontend-compaction-handoff.md
Diffstat (limited to 'packages/transport-contract/src')
-rw-r--r--packages/transport-contract/src/index.ts42
1 files changed, 41 insertions, 1 deletions
diff --git a/packages/transport-contract/src/index.ts b/packages/transport-contract/src/index.ts
index 237f4ab..86eb807 100644
--- a/packages/transport-contract/src/index.ts
+++ b/packages/transport-contract/src/index.ts
@@ -32,6 +32,7 @@ import type {
export type {
AgentEvent,
+ CompactionResult,
ConversationMeta,
ConversationStatus,
QueuedMessage,
@@ -486,7 +487,8 @@ export type WsServerMessage =
| ChatDeltaMessage
| ChatErrorMessage
| ConversationOpenMessage
- | ConversationStatusChangedMessage;
+ | ConversationStatusChangedMessage
+ | ConversationCompactedMessage;
// ─── Conversation list + metadata ────────────────────────────────────────────
@@ -512,6 +514,18 @@ export interface ConversationStatusChangedMessage {
}
/**
+ * Broadcast to all connected WS clients when a conversation's history has been
+ * compacted (summarized). The frontend should reload the conversation history
+ * via `GET /conversations/:id` to reflect the compacted state.
+ */
+export interface ConversationCompactedMessage {
+ readonly type: "conversation.compacted";
+ readonly conversationId: string;
+ readonly messagesSummarized: number;
+ readonly messagesKept: number;
+}
+
+/**
* Response for `GET /conversations` — the list of all known conversations,
* sorted by `lastActivityAt` descending (most recent first). Each entry carries
* enough metadata for a conversation picker UI (id, title, timestamps).
@@ -555,3 +569,29 @@ export interface TitleResponse {
readonly conversationId: string;
readonly title: string;
}
+
+/**
+ * Response for `POST /conversations/:id/compact` — confirms the conversation
+ * history was compacted (old messages summarized, recent messages retained).
+ */
+export interface CompactResponse {
+ readonly conversationId: string;
+ readonly messagesSummarized: number;
+ readonly messagesKept: number;
+}
+
+/**
+ * Response for `GET /conversations/:id/compact-threshold` — the token count
+ * at which automatic compaction triggers (0 = manual only).
+ */
+export interface CompactThresholdResponse {
+ readonly conversationId: string;
+ readonly threshold: number;
+}
+
+/**
+ * Request body for `PUT /conversations/:id/compact-threshold`.
+ */
+export interface SetCompactThresholdRequest {
+ readonly threshold: number;
+}