@geminixiang/mikan 1.0.0-beta.48 → 1.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +2 -6
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +2 -4
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/agent/presenter.d.ts +3 -10
- package/dist/agent/presenter.d.ts.map +1 -1
- package/dist/agent/presenter.js +35 -32
- package/dist/agent/presenter.js.map +1 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +16 -22
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/types.d.ts +4 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.js +2 -2
- package/dist/env-manifest.js.map +1 -1
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +1 -4
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +2 -5
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts.map +1 -1
- package/dist/harness/subagent-runner.js +1 -8
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/harness/types.d.ts +2 -6
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -1
- package/dist/mcp/catalog.d.ts.map +1 -1
- package/dist/mcp/catalog.js +0 -88
- package/dist/mcp/catalog.js.map +1 -1
- package/dist/mcp/open-connector.d.ts +1 -1
- package/dist/mcp/open-connector.d.ts.map +1 -1
- package/dist/mcp/open-connector.js +23 -22
- package/dist/mcp/open-connector.js.map +1 -1
- package/dist/runtime/conversation-runtime.js +1 -0
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +0 -1
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +1 -4
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +3 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,12 @@ any release.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [1.0.0-beta.49]
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Configure OpenConnector only at startup with `OPENCONNECTOR_ENDPOINT` and `OPENCONNECTOR_ADMIN_TOKEN`; ignore settings overrides of the reserved server, and reduce the Admin MCP Marketplace to the Metabase preset.
|
|
17
|
+
|
|
12
18
|
## [1.0.0-beta.48]
|
|
13
19
|
|
|
14
20
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAKvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAalE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,mBAAmB,GACvB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAKvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAalE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,mBAAmB,GACvB,mBAAmB,CAkFrB"}
|
|
@@ -74,9 +74,7 @@ export function createDiscordAdapters(event, bot) {
|
|
|
74
74
|
replyTargetId,
|
|
75
75
|
conversationKind: message.conversationKind,
|
|
76
76
|
}),
|
|
77
|
-
post:
|
|
78
|
-
return postFirst(text);
|
|
79
|
-
},
|
|
77
|
+
post: postFirst,
|
|
80
78
|
update: (id, text) => bot.updateMessageRaw(channelId, id, text),
|
|
81
79
|
// Returns the id so the renderer can edit this overflow message on the
|
|
82
80
|
// next redraw instead of posting another copy of the tail.
|
|
@@ -89,9 +87,7 @@ export function createDiscordAdapters(event, bot) {
|
|
|
89
87
|
return bot.postReply(channelId, responseId, text);
|
|
90
88
|
return bot.postMessage(channelId, text);
|
|
91
89
|
},
|
|
92
|
-
delete:
|
|
93
|
-
await bot.deleteMessageRaw(channelId, id);
|
|
94
|
-
},
|
|
90
|
+
delete: (id) => bot.deleteMessageRaw(channelId, id),
|
|
95
91
|
logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),
|
|
96
92
|
uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),
|
|
97
93
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage, type ConversationContext } from \"../../adapter.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer, formatMarkdownToolResult } from \"../progressive-renderer.js\";\nimport { DISCORD_V2_TEXT_LIMIT } from \"./components.js\";\nimport { formatDiscordMarkdown } from \"./format.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\n// Components V2 allows 4000 characters across a message's text, against 2000\n// for classic content — the reason for using it at all. The margin leaves room\n// for the working indicator and for the continuation marker on a split.\nconst MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): ConversationContext {\n const conversationId = event.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform = bot.getMessagingInfo();\n\n function postFirst(text: string): Promise<string> {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n return bot.postMessage(channelId, text);\n }\n\n const { responder } = createProgressiveRenderer({\n label: \"Discord\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatDiscordContinuation,\n errorPrefix: \"*Error:* \",\n workingIndicator: \" ...\",\n supportsDeltas: true,\n typing: {\n // Send immediately and repeat every 8s (Discord clears indicator after ~10s)\n send: () => bot.sendTyping(channelId),\n intervalMs: 8000,\n stopOnSend: true,\n },\n // The last step before sending: the model writes standard markdown, and\n // the parts Discord cannot render are converted here rather than by\n // constraining what the model may write.\n prepareSource: (text) => formatDiscordMarkdown(text),\n formatToolResult: formatMarkdownToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }),\n post: postFirst,\n update: (id, text) => bot.updateMessageRaw(channelId, id, text),\n // Returns the id so the renderer can edit this overflow message on the\n // next redraw instead of posting another copy of the tail.\n postExtra: async (text, responseId) => {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n if (responseId !== null) return bot.postReply(channelId, responseId, text);\n return bot.postMessage(channelId, text);\n },\n delete: (id) => bot.deleteMessageRaw(channelId, id),\n logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAcpE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,oBAAoB,GACxB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAcpE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,oBAAoB,GACxB,mBAAmB,CAgErB"}
|
|
@@ -65,10 +65,8 @@ export function createTelegramAdapters(event, bot) {
|
|
|
65
65
|
update: (id, text) => bot.updateMessage(conversationId, id, text),
|
|
66
66
|
// Returns the id so the renderer can edit this overflow message on the
|
|
67
67
|
// next redraw instead of posting another copy of the tail.
|
|
68
|
-
postExtra:
|
|
69
|
-
delete:
|
|
70
|
-
await bot.deleteMessageRaw(chatId, Number(id));
|
|
71
|
-
},
|
|
68
|
+
postExtra: (text) => bot.postMessageRaw(chatId, text),
|
|
69
|
+
delete: (id) => bot.deleteMessageRaw(chatId, Number(id)),
|
|
72
70
|
logBotResponse: (text, id) => bot.logBotResponse(conversationId, text, id),
|
|
73
71
|
uploadFile: (filePath, title) => bot.uploadFile(conversationId, filePath, title),
|
|
74
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,+EAA+E;AAC/E,4EAA4E;AAC5E,sDAAsD;AACtD,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC;IACjI,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,GAAyB;IAEzB,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,UAAU;QACpB,cAAc;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACnC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAExC,MAAM,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,UAAU;QACrB,kBAAkB,EAAE,CAAC,OAAe,EAAU,EAAE,CAAC,cAAc,OAAO,GAAG;QACzE,WAAW,EAAE,SAAS;QACtB,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE;YACN,6EAA6E;YAC7E,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAClC,UAAU,EAAE,IAAI;SACjB;QACD,gBAAgB;QAChB,oBAAoB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrC,QAAQ,EAAE,UAAU;YACpB,cAAc;YACd,MAAM;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,iBAAiB,EAAE,UAAU;YAC7B,SAAS;YACT,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;QACF,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;YACxC,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,EAAE,GACN,SAAS,KAAK,IAAI;gBAChB,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;gBAC9C,CAAC,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC;QACjE,uEAAuE;QACvE,2DAA2D;QAC3D,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage } from \"../../adapter.js\";\nimport type { ChatToolResult, ConversationContext } from \"../../adapter.js\";\nimport { deriveSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { formatToolArgs } from \"../shared.js\";\nimport type { TelegramMessagingBot, TelegramEvent } from \"./bot.js\";\n\n// A rich message allows far more than the 4096 a plain message did; this stays\n// well inside it, and the headroom is now for the continuation marker alone\n// rather than for HTML escapes that no longer happen.\nconst MAX_LENGTH = 30000;\n\nfunction formatToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n const title = `${result.isError ? \"Error\" : \"Done\"} ${result.toolName}${result.label ? `: ${result.label}` : \"\"} (${duration}s)`;\n return [title, argsFormatted, result.result].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function createTelegramAdapters(\n event: TelegramEvent,\n bot: TelegramMessagingBot,\n): ConversationContext {\n const conversationId = event.conversationId;\n const chatId = parseInt(conversationId);\n const replyToId = event.thread_ts ? parseInt(event.thread_ts) : null;\n\n const message = createConversationMessage({\n platform: \"telegram\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey: deriveSessionKey(event),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform = bot.getMessagingInfo();\n\n const { responder } = createProgressiveRenderer({\n label: \"Telegram\",\n maxLength: MAX_LENGTH,\n formatContinuation: (partNum: number): string => `(continued ${partNum})`,\n errorPrefix: \"Error: \",\n supportsDeltas: true,\n typing: {\n // Send immediately and repeat every 4s (Telegram clears indicator after ~5s)\n send: () => bot.sendTyping(chatId),\n intervalMs: 4000,\n },\n formatToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"telegram\",\n conversationId,\n chatId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n replyToId,\n conversationKind: message.conversationKind,\n }),\n notifySendFailure: async (errorMessage) => {\n await bot.postPlainMessage(chatId, `⚠️ 發送失敗:${errorMessage}`);\n },\n post: async (text) => {\n const id =\n replyToId !== null\n ? await bot.postReply(chatId, replyToId, text)\n : await bot.postMessageRaw(chatId, text);\n return String(id);\n },\n update: (id, text) => bot.updateMessage(conversationId, id, text),\n // Returns the id so the renderer can edit this overflow message on the\n // next redraw instead of posting another copy of the tail.\n postExtra: (text) => bot.postMessageRaw(chatId, text),\n delete: (id) => bot.deleteMessageRaw(chatId, Number(id)),\n logBotResponse: (text, id) => bot.logBotResponse(conversationId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(conversationId, filePath, title),\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
|
@@ -3,24 +3,17 @@ import type { MikanAgentSession } from "../harness/index.js";
|
|
|
3
3
|
import type { ConversationResponder } from "../adapter.js";
|
|
4
4
|
import type { AgentEventPayload } from "../types.js";
|
|
5
5
|
import type { resolveConversationSettings } from "../config.js";
|
|
6
|
-
import type { RunnerSessionState, UsageReportContext } from "./types.js";
|
|
6
|
+
import type { RunPresentation, RunnerSessionState, UsageReportContext } from "./types.js";
|
|
7
7
|
export declare function createRunState(): RunnerSessionState;
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function activateRunPresentation(runState: RunnerSessionState, context: {
|
|
9
9
|
responder: ConversationResponder;
|
|
10
10
|
sessionConversation: string;
|
|
11
11
|
userName: string | undefined;
|
|
12
12
|
sessionUuid: string;
|
|
13
13
|
triggerAttribution: string | undefined;
|
|
14
|
-
}):
|
|
15
|
-
export declare function createRunQueue(responder: ConversationResponder, runState: RunnerSessionState): {
|
|
16
|
-
queue: {
|
|
17
|
-
enqueue(fn: () => Promise<void>, errorContext: string): void;
|
|
18
|
-
};
|
|
19
|
-
wait: () => Promise<void>;
|
|
20
|
-
};
|
|
14
|
+
}): RunPresentation;
|
|
21
15
|
export declare function isEventTriggerAttribution(triggerAttribution: string | undefined): boolean;
|
|
22
16
|
export declare function finalizeRunResponse(responder: ConversationResponder, session: MikanAgentSession, runState: RunnerSessionState, options?: {
|
|
23
|
-
triggerAttribution?: string;
|
|
24
17
|
triggerSessionLink?: string;
|
|
25
18
|
createOverflowLink?: () => string;
|
|
26
19
|
platform?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/agent/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAO3E,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAUhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/agent/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAgB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAO3E,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAUhE,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAY1F,wBAAgB,cAAc,IAAI,kBAAkB,CAsBnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE;IACP,SAAS,EAAE,qBAAqB,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,GACA,eAAe,CAwDjB;AAOD,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAiKD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAwDf;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE/E;AA4BD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,IAAI,CAEP;AAwVD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;CAC7D,GAAG,IAAI,CAkBP"}
|
package/dist/agent/presenter.js
CHANGED
|
@@ -37,7 +37,7 @@ export function createRunState() {
|
|
|
37
37
|
triggerAttribution: undefined,
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
-
export function
|
|
40
|
+
export function activateRunPresentation(runState, context) {
|
|
41
41
|
runState.responder = context.responder;
|
|
42
42
|
runState.logCtx = {
|
|
43
43
|
conversationId: context.sessionConversation,
|
|
@@ -63,32 +63,39 @@ export function resetRunState(runState, context) {
|
|
|
63
63
|
runState.reportedLlmError = false;
|
|
64
64
|
runState.finalResponseHandledByTool = false;
|
|
65
65
|
runState.triggerAttribution = context.triggerAttribution;
|
|
66
|
-
}
|
|
67
|
-
export function createRunQueue(responder, runState) {
|
|
66
|
+
const { responder } = context;
|
|
68
67
|
let queueChain = Promise.resolve();
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
runState.queue = {
|
|
69
|
+
enqueue(fn, errorContext) {
|
|
70
|
+
queueChain = queueChain.then(async () => {
|
|
71
|
+
if (runState.finalResponseHandledByTool)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
await fn();
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
78
|
+
log.logWarning(`API error (${errorContext})`, errMsg);
|
|
75
79
|
try {
|
|
76
|
-
await
|
|
80
|
+
await responder.respondDiagnostic(`Error: ${errMsg}`, { style: "error" });
|
|
77
81
|
}
|
|
78
|
-
catch
|
|
79
|
-
|
|
80
|
-
log.logWarning(`API error (${errorContext})`, errMsg);
|
|
81
|
-
try {
|
|
82
|
-
await responder.respondDiagnostic(`Error: ${errMsg}`, { style: "error" });
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// Ignore
|
|
86
|
-
}
|
|
82
|
+
catch {
|
|
83
|
+
// Ignore
|
|
87
84
|
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
90
87
|
},
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
91
90
|
wait: () => queueChain,
|
|
91
|
+
dispose() {
|
|
92
|
+
if (runState.toolProgressTimer)
|
|
93
|
+
clearTimeout(runState.toolProgressTimer);
|
|
94
|
+
runState.toolProgressTimer = undefined;
|
|
95
|
+
runState.responder = null;
|
|
96
|
+
runState.logCtx = null;
|
|
97
|
+
runState.queue = null;
|
|
98
|
+
},
|
|
92
99
|
};
|
|
93
100
|
}
|
|
94
101
|
function getFinalAssistantText(session) {
|
|
@@ -249,7 +256,7 @@ export async function finalizeRunResponse(responder, session, runState, options)
|
|
|
249
256
|
if (!finalText.trim())
|
|
250
257
|
return;
|
|
251
258
|
try {
|
|
252
|
-
const finalResponse = appendTriggerAttribution(finalText,
|
|
259
|
+
const finalResponse = appendTriggerAttribution(finalText, runState.triggerAttribution, options?.triggerSessionLink);
|
|
253
260
|
const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);
|
|
254
261
|
if (finalDashboard) {
|
|
255
262
|
await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {
|
|
@@ -280,10 +287,7 @@ export async function finalizeRunResponse(responder, session, runState, options)
|
|
|
280
287
|
}
|
|
281
288
|
export async function reportUsageSummary(ctx) {
|
|
282
289
|
const { session, runState, responder, platform, model, agentConfig, sessionConversation, sessionUuid, waitForQueue, } = ctx;
|
|
283
|
-
const lastAssistantMessage = session.messages
|
|
284
|
-
.slice()
|
|
285
|
-
.toReversed()
|
|
286
|
-
.find((message) => message.role === "assistant" && message.stopReason !== "aborted");
|
|
290
|
+
const lastAssistantMessage = session.messages.findLast((message) => message.role === "assistant" && message.stopReason !== "aborted");
|
|
287
291
|
const contextTokens = lastAssistantMessage
|
|
288
292
|
? lastAssistantMessage.usage.input +
|
|
289
293
|
lastAssistantMessage.usage.output +
|
|
@@ -353,7 +357,7 @@ export function sendAgentEvent(payload) {
|
|
|
353
357
|
emitAgentEvent({ source: "mikan", ...payload });
|
|
354
358
|
}
|
|
355
359
|
function handleToolStart(event, context) {
|
|
356
|
-
const { runState, responder, logCtx, queue,
|
|
360
|
+
const { runState, responder, logCtx, queue, baseAttrs, agentEventSessionId } = context;
|
|
357
361
|
const args = (event.args ?? {});
|
|
358
362
|
const label = args.label || event.toolName;
|
|
359
363
|
sendAgentEvent({
|
|
@@ -366,7 +370,7 @@ function handleToolStart(event, context) {
|
|
|
366
370
|
input: { label },
|
|
367
371
|
},
|
|
368
372
|
});
|
|
369
|
-
pendingTools.set(event.toolCallId, {
|
|
373
|
+
runState.pendingTools.set(event.toolCallId, {
|
|
370
374
|
toolName: event.toolName,
|
|
371
375
|
args: event.args,
|
|
372
376
|
startTime: Date.now(),
|
|
@@ -413,9 +417,9 @@ function recordToolMetrics(event, durationMs, context) {
|
|
|
413
417
|
});
|
|
414
418
|
}
|
|
415
419
|
function handleToolEnd(event, context) {
|
|
416
|
-
const { runState, responder, logCtx,
|
|
420
|
+
const { runState, responder, logCtx, agentEventSessionId } = context;
|
|
417
421
|
const resultStr = extractToolResultText(event.result);
|
|
418
|
-
const pending = pendingTools.get(event.toolCallId);
|
|
422
|
+
const pending = runState.pendingTools.get(event.toolCallId);
|
|
419
423
|
sendAgentEvent({
|
|
420
424
|
sessionId: agentEventSessionId,
|
|
421
425
|
actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
|
|
@@ -433,7 +437,7 @@ function handleToolEnd(event, context) {
|
|
|
433
437
|
if (completedProgress)
|
|
434
438
|
runState.completedSubagentProgress.push(completedProgress);
|
|
435
439
|
runState.subagentProgress.delete(event.toolCallId);
|
|
436
|
-
pendingTools.delete(event.toolCallId);
|
|
440
|
+
runState.pendingTools.delete(event.toolCallId);
|
|
437
441
|
const durationMs = pending ? Date.now() - pending.startTime : 0;
|
|
438
442
|
recordToolMetrics(event, durationMs, context);
|
|
439
443
|
if (event.isError) {
|
|
@@ -657,7 +661,6 @@ export function attachSessionEventHandlers(params) {
|
|
|
657
661
|
responder: runState.responder,
|
|
658
662
|
logCtx: runState.logCtx,
|
|
659
663
|
queue: runState.queue,
|
|
660
|
-
pendingTools: runState.pendingTools,
|
|
661
664
|
baseAttrs: {
|
|
662
665
|
channel_id: runState.logCtx.conversationId,
|
|
663
666
|
session_id: runState.logCtx.sessionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../src/agent/presenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { contentText, type Api, type Model } from \"@earendil-works/pi-ai\";\nimport type { HarnessEvent, MikanAgentSession } from \"../harness/index.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"../subagent-progress.js\";\nimport type { ConversationResponder, SubagentProgressSnapshot } from \"../adapter.js\";\nimport type { AgentEventPayload } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../config.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n reportUserFacingError,\n} from \"../observability/sentry.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { emitAgentEvent } from \"../agent-events.js\";\nimport { appendTriggerAttribution } from \"./prompt.js\";\nimport type { RunnerSessionState, UsageReportContext } from \"./types.js\";\n\nfunction createEmptyUsageTotals() {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nexport function createRunState(): RunnerSessionState {\n return {\n responder: null,\n logCtx: null,\n queue: null,\n pendingTools: new Map<string, { toolName: string; args: unknown; startTime: number }>(),\n toolProgress: new Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>(),\n subagentProgress: new Map<string, SubagentProgressSnapshot>(),\n completedSubagentProgress: [],\n subagentToolCalls: new Set<string>(),\n subagentProgressShown: false,\n suppressResponseDeltas: false,\n lastSubagentProgressAt: 0,\n toolProgressTimer: undefined,\n totalUsage: createEmptyUsageTotals(),\n llmCallCount: 0,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nexport function resetRunState(\n runState: RunnerSessionState,\n context: {\n responder: ConversationResponder;\n sessionConversation: string;\n userName: string | undefined;\n sessionUuid: string;\n triggerAttribution: string | undefined;\n },\n): void {\n runState.responder = context.responder;\n runState.logCtx = {\n conversationId: context.sessionConversation,\n userName: context.userName,\n conversationName: undefined,\n sessionId: context.sessionUuid,\n };\n runState.pendingTools.clear();\n runState.toolProgress.clear();\n runState.subagentProgress.clear();\n runState.completedSubagentProgress = [];\n runState.subagentToolCalls.clear();\n runState.subagentProgressShown = false;\n runState.suppressResponseDeltas = false;\n runState.lastSubagentProgressAt = 0;\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n runState.totalUsage = createEmptyUsageTotals();\n runState.llmCallCount = 0;\n runState.stopReason = \"stop\";\n runState.errorMessage = undefined;\n runState.reportedLlmError = false;\n runState.finalResponseHandledByTool = false;\n runState.triggerAttribution = context.triggerAttribution;\n}\n\nexport function createRunQueue(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): {\n queue: { enqueue(fn: () => Promise<void>, errorContext: string): void };\n wait: () => Promise<void>;\n} {\n let queueChain = Promise.resolve();\n return {\n queue: {\n enqueue(fn: () => Promise<void>, errorContext: string): void {\n queueChain = queueChain.then(async () => {\n if (runState.finalResponseHandledByTool) return;\n try {\n await fn();\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {\n // Ignore\n }\n }\n });\n },\n },\n wait: () => queueChain,\n };\n}\n\nfunction getFinalAssistantText(session: MikanAgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return contentText(lastAssistant?.content ?? []);\n}\n\nexport function isEventTriggerAttribution(triggerAttribution: string | undefined): boolean {\n return triggerAttribution?.startsWith(\"[event:\") === true;\n}\n\nfunction extractToolLabel(toolName: string, args: unknown): string {\n const label = (args as { label?: unknown } | undefined)?.label;\n if (typeof label !== \"string\") return toolName;\n return label.trim() || toolName;\n}\n\n/** Non-subagent tool activity lines; subagent calls render as the dashboard. */\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.entries()).flatMap(([toolCallId, item]) => {\n if (runState.subagentToolCalls.has(toolCallId)) return [];\n const marker = item.status === \"running\" ? \"•\" : item.status === \"error\" ? \"✗\" : \"✓\";\n return [`${marker} ${item.label}`];\n });\n return lines.join(\"\\n\");\n}\n\nfunction formatResponseWithToolProgress(text: string, runState: RunnerSessionState): string {\n const progress = formatToolProgress(runState);\n return [progress, text].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * The one dashboard render path. A responder that overrides\n * `replaceSubagentProgress` converts the snapshot for a pipeline that is not\n * response-source Markdown (Telegram HTML); every other platform receives the\n * Markdown dashboard — \"dashboard, blank line, answer\" — through\n * `replaceResponse`, the same conversion as any response.\n */\nasync function replaceWithSubagentDashboard(\n responder: ConversationResponder,\n snapshot: SubagentProgressSnapshot,\n finalText?: string,\n options?: { createOverflowLink?: () => string },\n): Promise<void> {\n if (responder.replaceSubagentProgress) {\n await responder.replaceSubagentProgress(snapshot, finalText);\n return;\n }\n const dashboard = renderSubagentDashboard(snapshot);\n await responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard, options);\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]),\n): Promise<void> {\n if (subagentProgress) {\n await replaceWithSubagentDashboard(responder, subagentProgress);\n return;\n }\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nconst TOOL_PROGRESS_DEBOUNCE_MS = 500;\nconst SUBAGENT_PROGRESS_THROTTLE_MS = 2000;\n\nfunction subagentProgressDelay(runState: RunnerSessionState): number {\n if (!runState.subagentProgressShown) return 0;\n return Math.max(0, runState.lastSubagentProgressAt + SUBAGENT_PROGRESS_THROTTLE_MS - Date.now());\n}\n\nfunction scheduleToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) return;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n const delay = subagentProgress ? subagentProgressDelay(runState) : TOOL_PROGRESS_DEBOUNCE_MS;\n runState.toolProgressTimer = setTimeout(() => {\n runState.toolProgressTimer = undefined;\n const snapshot = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (snapshot) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, snapshot),\n \"tool progress update\",\n );\n }, delay);\n runState.toolProgressTimer.unref();\n}\n\nfunction flushToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (subagentProgress) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, subagentProgress),\n \"tool progress update\",\n );\n}\n\nfunction extractSubagentProgress(partialResult: unknown): SubagentProgressSnapshot | undefined {\n if (!partialResult || typeof partialResult !== \"object\") return undefined;\n const details = (partialResult as { details?: unknown }).details;\n if (!details || typeof details !== \"object\") return undefined;\n return parseSubagentProgressSnapshot((details as { progress?: unknown }).progress);\n}\n\nasync function finalizeErrorResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n options?: {\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (!runState.reportedLlmError) {\n runState.reportedLlmError = true;\n reportUserFacingError(new Error(\"LLM run completed with error stop reason\"), {\n domain: \"llm\",\n surface: \"assistant_response\",\n operation: \"llm_turn\",\n severity: \"error\",\n platform: options?.platform,\n provider: options?.model?.provider,\n model: options?.model?.name,\n stopReason: runState.stopReason,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n hasErrorMessage: true,\n llmCallCount: runState.llmCallCount,\n },\n });\n }\n try {\n await responder.replaceResponse(\"_Sorry, something went wrong_\");\n await responder.respondDiagnostic(`Error: ${runState.errorMessage}`, { style: \"error\" });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to post error message\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"finalize_error_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n stopReason: runState.stopReason,\n },\n });\n }\n}\n\nexport async function finalizeRunResponse(\n responder: ConversationResponder,\n session: MikanAgentSession,\n runState: RunnerSessionState,\n options?: {\n triggerAttribution?: string;\n triggerSessionLink?: string;\n createOverflowLink?: () => string;\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n await finalizeErrorResponse(responder, runState, options);\n return;\n }\n\n const finalText = getFinalAssistantText(session);\n if (runState.finalResponseHandledByTool) {\n log.logInfo(\"Final response already handled by tool - skipping final replacement\");\n return;\n }\n if (finalText.trim() === \"[SILENT]\" || finalText.trim().startsWith(\"[SILENT]\")) {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n return;\n }\n\n if (!finalText.trim()) return;\n\n try {\n const finalResponse = appendTriggerAttribution(\n finalText,\n options?.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\n createOverflowLink: options?.createOverflowLink,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to replace message with final text\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"replace_final_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n finalTextLength: finalText.length,\n },\n });\n }\n}\n\nexport async function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages\n .slice()\n .toReversed()\n .find(\n (message): message is Extract<typeof message, { role: \"assistant\" }> =>\n message.role === \"assistant\" && message.stopReason !== \"aborted\",\n );\n\n const contextTokens = lastAssistantMessage\n ? lastAssistantMessage.usage.input +\n lastAssistantMessage.usage.output +\n lastAssistantMessage.usage.cacheRead +\n lastAssistantMessage.usage.cacheWrite\n : 0;\n const contextWindow = model.contextWindow || 200000;\n\n const { totalUsage } = runState;\n const runMetricAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.gauge(\"agent.context.utilization\", contextTokens / contextWindow, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n if (platform.diagnostics?.showUsageSummary === true) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") {\n return result;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n \"content\" in result &&\n Array.isArray((result as { content: unknown }).content)\n ) {\n const content = (result as { content: Array<{ type: string; text?: string }> }).content;\n const textParts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\" && part.text) {\n textParts.push(part.text);\n }\n }\n if (textParts.length > 0) {\n return textParts.join(\"\\n\");\n }\n }\n\n return JSON.stringify(result);\n}\n\nexport function formatAgentActorName(userName: string | undefined, fallback: string): string {\n return userName ? `DM:${userName}` : fallback;\n}\n\nexport function sendAgentEvent(payload: {\n sessionId: string;\n actorName: string;\n event: AgentEventPayload;\n}): void {\n emitAgentEvent({ source: \"mikan\", ...payload });\n}\n\n// ponytail: additive SSE mirror only; keep responder rendering here until another frontend needs the same stream.\ntype PresenterEventContext = {\n runState: RunnerSessionState;\n responder: ConversationResponder;\n logCtx: NonNullable<RunnerSessionState[\"logCtx\"]>;\n queue: NonNullable<RunnerSessionState[\"queue\"]>;\n pendingTools: RunnerSessionState[\"pendingTools\"];\n baseAttrs: { channel_id: string; session_id: string | undefined };\n agentEventSessionId: string;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n};\n\ntype ToolStartEvent = Extract<HarnessEvent, { type: \"tool_execution_start\" }>;\ntype ToolUpdateEvent = Extract<HarnessEvent, { type: \"tool_execution_update\" }>;\ntype ToolEndEvent = Extract<HarnessEvent, { type: \"tool_execution_end\" }>;\ntype MessageStartEvent = Extract<HarnessEvent, { type: \"message_start\" }>;\ntype MessageUpdateEvent = Extract<HarnessEvent, { type: \"message_update\" }>;\ntype MessageEndEvent = Extract<HarnessEvent, { type: \"message_end\" }>;\ntype AssistantMessage = Extract<MessageEndEvent[\"message\"], { role: \"assistant\" }>;\ntype LifecycleEvent = Extract<\n HarnessEvent,\n { type: \"compaction_start\" | \"compaction_end\" | \"auto_retry_start\" | \"budget_exceeded\" }\n>;\n\nfunction handleToolStart(event: ToolStartEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, queue, pendingTools, baseAttrs, agentEventSessionId } =\n context;\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: {\n kind: \"toolStart\",\n toolId: event.toolCallId,\n toolName: event.toolName,\n input: { label },\n },\n });\n pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n }\n addLifecycleBreadcrumb(\"agent.tool.started\", { tool: event.toolName, ...baseAttrs });\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n}\n\nfunction handleToolUpdate(event: ToolUpdateEvent, context: PresenterEventContext): void {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (!subagentProgress) return;\n context.runState.subagentProgress.set(event.toolCallId, subagentProgress);\n context.runState.subagentToolCalls.add(event.toolCallId);\n context.runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(context.responder, context.runState);\n}\n\nfunction recordToolMetrics(\n event: ToolEndEvent,\n durationMs: number,\n context: PresenterEventContext,\n): void {\n Sentry.metrics.count(\"agent.tool.calls\", 1, {\n attributes: metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...context.baseAttrs,\n }),\n });\n Sentry.metrics.distribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({ tool: event.toolName, ...context.baseAttrs }),\n });\n addLifecycleBreadcrumb(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...context.baseAttrs,\n });\n}\n\nfunction handleToolEnd(event: ToolEndEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, pendingTools, agentEventSessionId } = context;\n const resultStr = extractToolResultText(event.result);\n const pending = pendingTools.get(event.toolCallId);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"toolEnd\", toolId: event.toolCallId },\n });\n const progress = runState.toolProgress.get(event.toolCallId);\n if (progress) progress.status = event.isError ? \"error\" : \"done\";\n const subagentProgress = runState.subagentProgress.get(event.toolCallId);\n if (subagentProgress) {\n runState.subagentProgress.set(\n event.toolCallId,\n settleSubagentProgress(subagentProgress, event.isError),\n );\n }\n flushToolProgressUpdate(responder, runState);\n const completedProgress = runState.subagentProgress.get(event.toolCallId);\n if (completedProgress) runState.completedSubagentProgress.push(completedProgress);\n runState.subagentProgress.delete(event.toolCallId);\n pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n recordToolMetrics(event, durationMs, context);\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n return;\n }\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n if (event.toolName === \"slack_blockkit\") runState.finalResponseHandledByTool = true;\n}\n\nfunction handleMessageStart(event: MessageStartEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n context.runState.llmCallCount += 1;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n addLifecycleBreadcrumb(\"agent.llm.call.started\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n });\n log.logResponseStart(context.logCtx);\n}\n\nfunction handleMessageUpdate(event: MessageUpdateEvent, context: PresenterEventContext): void {\n const update = event.assistantMessageEvent;\n if (update.type !== \"text_delta\" || !update.delta) return;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"responseDelta\", delta: update.delta },\n });\n if (context.responder.appendResponseDelta && !context.runState.suppressResponseDeltas) {\n context.queue.enqueue(async () => {\n await context.responder.appendResponseDelta?.(update.delta);\n }, \"response delta\");\n }\n}\n\nfunction recordAssistantUsage(message: AssistantMessage, context: PresenterEventContext): void {\n if (!message.usage) return;\n const { totalUsage } = context.runState;\n totalUsage.input += message.usage.input;\n totalUsage.output += message.usage.output;\n totalUsage.cacheRead += message.usage.cacheRead;\n totalUsage.cacheWrite += message.usage.cacheWrite;\n totalUsage.cost.input += message.usage.cost.input;\n totalUsage.cost.output += message.usage.cost.output;\n totalUsage.cost.cacheRead += message.usage.cost.cacheRead;\n totalUsage.cost.cacheWrite += message.usage.cost.cacheWrite;\n totalUsage.cost.total += message.usage.cost.total;\n\n const attributes = metricAttributes({\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n });\n Sentry.metrics.count(\"agent.llm.calls\", 1, { attributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_in\", message.usage.input, { attributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_out\", message.usage.output, { attributes });\n if (message.usage.cacheRead > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_read\", message.usage.cacheRead, { attributes });\n }\n if (message.usage.cacheWrite > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_write\", message.usage.cacheWrite, { attributes });\n }\n Sentry.metrics.distribution(\"agent.llm.cost_per_turn\", message.usage.cost.total, { attributes });\n addLifecycleBreadcrumb(\"agent.llm.call.completed\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n input_tokens: message.usage.input,\n output_tokens: message.usage.output,\n cost_total_usd: message.usage.cost.total,\n });\n}\n\nfunction presentAssistantMessage(message: AssistantMessage, context: PresenterEventContext): void {\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = message.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of message.content) {\n if (part.type === \"thinking\") thinkingParts.push(part.thinking);\n else if (part.type === \"text\") textParts.push(part.text);\n }\n for (const thinking of thinkingParts) {\n log.logThinking(context.logCtx, thinking);\n context.queue.enqueue(() => context.responder.respond(`_${thinking}_`), \"thinking main\");\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(`_${thinking}_`),\n \"thinking diagnostic\",\n );\n }\n\n const text = textParts.join(\"\\n\");\n if (!text.trim() || hasToolCall || context.runState.finalResponseHandledByTool) return;\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, context.runState),\n context.runState.triggerAttribution,\n );\n log.logResponse(context.logCtx, text);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"responseFinal\", text: finalText },\n });\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"turnEnd\" },\n });\n // Subagent dashboard finalization must preserve \"dashboard, blank line, answer\".\n if (context.runState.completedSubagentProgress.length > 0) return;\n if (context.responder.finishResponse) {\n context.queue.enqueue(async () => {\n await context.responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n context.queue.enqueue(() => context.responder.respond(finalText), \"response main\");\n }\n}\n\nfunction handleMessageEnd(event: MessageEndEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n const message = event.message;\n if (message.stopReason) {\n context.runState.stopReason = message.stopReason;\n // The settling message clears any stale error left by a recovered retry.\n context.runState.errorMessage = message.errorMessage;\n }\n recordAssistantUsage(message, context);\n presentAssistantMessage(message, context);\n}\n\nfunction handleLifecycleEvent(event: LifecycleEvent, context: PresenterEventContext): void {\n if (event.type === \"compaction_start\") {\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(() => context.responder.respond(text), \"compaction start\");\n return;\n }\n if (event.type === \"compaction_end\") {\n if (event.result) {\n log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);\n } else if (event.aborted) {\n log.logInfo(\"Auto-compaction aborted\");\n }\n return;\n }\n if (event.type === \"auto_retry_start\") {\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(() => context.responder.respond(text), \"retry\");\n return;\n }\n\n log.logWarning(\n \"Run stopped by budget circuit breaker\",\n `${event.reason} (tokens=${event.tokens}, cost=${event.costUsd.toFixed(2)}, calls=${event.llmCalls}, ${event.durationMs}ms)`,\n );\n const text = `_Stopped: run budget exceeded (${event.reason})_`;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(text, { style: \"error\" }),\n \"budget exceeded\",\n );\n}\n\nfunction handlePresenterEvent(event: HarnessEvent, context: PresenterEventContext): void {\n switch (event.type) {\n case \"tool_execution_start\":\n handleToolStart(event, context);\n return;\n case \"tool_execution_update\":\n handleToolUpdate(event, context);\n return;\n case \"tool_execution_end\":\n handleToolEnd(event, context);\n return;\n case \"message_start\":\n handleMessageStart(event, context);\n return;\n case \"message_update\":\n handleMessageUpdate(event, context);\n return;\n case \"message_end\":\n handleMessageEnd(event, context);\n return;\n case \"compaction_start\":\n case \"compaction_end\":\n case \"auto_retry_start\":\n case \"budget_exceeded\":\n handleLifecycleEvent(event, context);\n return;\n default:\n return;\n }\n}\n\nexport function attachSessionEventHandlers(params: {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n}): void {\n const { session, runState, model, agentConfig } = params;\n session.subscribe((event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n handlePresenterEvent(event, {\n runState,\n responder: runState.responder,\n logCtx: runState.logCtx,\n queue: runState.queue,\n pendingTools: runState.pendingTools,\n baseAttrs: {\n channel_id: runState.logCtx.conversationId,\n session_id: runState.logCtx.sessionId,\n },\n agentEventSessionId: runState.logCtx.sessionId ?? runState.logCtx.conversationId,\n model,\n agentConfig,\n });\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"presenter.js","sourceRoot":"","sources":["../../src/agent/presenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { contentText, type Api, type Model } from \"@earendil-works/pi-ai\";\nimport type { HarnessEvent, MikanAgentSession } from \"../harness/index.js\";\nimport {\n mergeSubagentProgress,\n parseSubagentProgressSnapshot,\n renderSubagentDashboard,\n settleSubagentProgress,\n} from \"../subagent-progress.js\";\nimport type { ConversationResponder, SubagentProgressSnapshot } from \"../adapter.js\";\nimport type { AgentEventPayload } from \"../types.js\";\nimport type { resolveConversationSettings } from \"../config.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleBreadcrumb,\n metricAttributes,\n reportUserFacingError,\n} from \"../observability/sentry.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { emitAgentEvent } from \"../agent-events.js\";\nimport { appendTriggerAttribution } from \"./prompt.js\";\nimport type { RunPresentation, RunnerSessionState, UsageReportContext } from \"./types.js\";\n\nfunction createEmptyUsageTotals() {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\nexport function createRunState(): RunnerSessionState {\n return {\n responder: null,\n logCtx: null,\n queue: null,\n pendingTools: new Map<string, { toolName: string; args: unknown; startTime: number }>(),\n toolProgress: new Map<string, { label: string; status: \"running\" | \"done\" | \"error\" }>(),\n subagentProgress: new Map<string, SubagentProgressSnapshot>(),\n completedSubagentProgress: [],\n subagentToolCalls: new Set<string>(),\n subagentProgressShown: false,\n suppressResponseDeltas: false,\n lastSubagentProgressAt: 0,\n toolProgressTimer: undefined,\n totalUsage: createEmptyUsageTotals(),\n llmCallCount: 0,\n stopReason: \"stop\",\n errorMessage: undefined,\n reportedLlmError: false,\n finalResponseHandledByTool: false,\n triggerAttribution: undefined,\n };\n}\n\nexport function activateRunPresentation(\n runState: RunnerSessionState,\n context: {\n responder: ConversationResponder;\n sessionConversation: string;\n userName: string | undefined;\n sessionUuid: string;\n triggerAttribution: string | undefined;\n },\n): RunPresentation {\n runState.responder = context.responder;\n runState.logCtx = {\n conversationId: context.sessionConversation,\n userName: context.userName,\n conversationName: undefined,\n sessionId: context.sessionUuid,\n };\n runState.pendingTools.clear();\n runState.toolProgress.clear();\n runState.subagentProgress.clear();\n runState.completedSubagentProgress = [];\n runState.subagentToolCalls.clear();\n runState.subagentProgressShown = false;\n runState.suppressResponseDeltas = false;\n runState.lastSubagentProgressAt = 0;\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n runState.totalUsage = createEmptyUsageTotals();\n runState.llmCallCount = 0;\n runState.stopReason = \"stop\";\n runState.errorMessage = undefined;\n runState.reportedLlmError = false;\n runState.finalResponseHandledByTool = false;\n runState.triggerAttribution = context.triggerAttribution;\n\n const { responder } = context;\n let queueChain = Promise.resolve();\n runState.queue = {\n enqueue(fn: () => Promise<void>, errorContext: string): void {\n queueChain = queueChain.then(async () => {\n if (runState.finalResponseHandledByTool) return;\n try {\n await fn();\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(`API error (${errorContext})`, errMsg);\n try {\n await responder.respondDiagnostic(`Error: ${errMsg}`, { style: \"error\" });\n } catch {\n // Ignore\n }\n }\n });\n },\n };\n return {\n wait: () => queueChain,\n dispose(): void {\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n runState.responder = null;\n runState.logCtx = null;\n runState.queue = null;\n },\n };\n}\n\nfunction getFinalAssistantText(session: MikanAgentSession): string {\n const lastAssistant = session.messages.findLast((message) => message.role === \"assistant\");\n return contentText(lastAssistant?.content ?? []);\n}\n\nexport function isEventTriggerAttribution(triggerAttribution: string | undefined): boolean {\n return triggerAttribution?.startsWith(\"[event:\") === true;\n}\n\nfunction extractToolLabel(toolName: string, args: unknown): string {\n const label = (args as { label?: unknown } | undefined)?.label;\n if (typeof label !== \"string\") return toolName;\n return label.trim() || toolName;\n}\n\n/** Non-subagent tool activity lines; subagent calls render as the dashboard. */\nfunction formatToolProgress(runState: RunnerSessionState): string {\n const lines = Array.from(runState.toolProgress.entries()).flatMap(([toolCallId, item]) => {\n if (runState.subagentToolCalls.has(toolCallId)) return [];\n const marker = item.status === \"running\" ? \"•\" : item.status === \"error\" ? \"✗\" : \"✓\";\n return [`${marker} ${item.label}`];\n });\n return lines.join(\"\\n\");\n}\n\nfunction formatResponseWithToolProgress(text: string, runState: RunnerSessionState): string {\n const progress = formatToolProgress(runState);\n return [progress, text].filter(Boolean).join(\"\\n\\n\");\n}\n\n/**\n * The one dashboard render path. A responder that overrides\n * `replaceSubagentProgress` converts the snapshot for a pipeline that is not\n * response-source Markdown (Telegram HTML); every other platform receives the\n * Markdown dashboard — \"dashboard, blank line, answer\" — through\n * `replaceResponse`, the same conversion as any response.\n */\nasync function replaceWithSubagentDashboard(\n responder: ConversationResponder,\n snapshot: SubagentProgressSnapshot,\n finalText?: string,\n options?: { createOverflowLink?: () => string },\n): Promise<void> {\n if (responder.replaceSubagentProgress) {\n await responder.replaceSubagentProgress(snapshot, finalText);\n return;\n }\n const dashboard = renderSubagentDashboard(snapshot);\n await responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard, options);\n}\n\nasync function replaceResponseWithToolProgress(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]),\n): Promise<void> {\n if (subagentProgress) {\n await replaceWithSubagentDashboard(responder, subagentProgress);\n return;\n }\n const progress = formatToolProgress(runState);\n if (progress) await responder.replaceResponse(progress);\n}\n\nconst TOOL_PROGRESS_DEBOUNCE_MS = 500;\nconst SUBAGENT_PROGRESS_THROTTLE_MS = 2000;\n\nfunction subagentProgressDelay(runState: RunnerSessionState): number {\n if (!runState.subagentProgressShown) return 0;\n return Math.max(0, runState.lastSubagentProgressAt + SUBAGENT_PROGRESS_THROTTLE_MS - Date.now());\n}\n\nfunction scheduleToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) return;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n const delay = subagentProgress ? subagentProgressDelay(runState) : TOOL_PROGRESS_DEBOUNCE_MS;\n runState.toolProgressTimer = setTimeout(() => {\n runState.toolProgressTimer = undefined;\n const snapshot = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (snapshot) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, snapshot),\n \"tool progress update\",\n );\n }, delay);\n runState.toolProgressTimer.unref();\n}\n\nfunction flushToolProgressUpdate(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n): void {\n if (runState.toolProgressTimer) clearTimeout(runState.toolProgressTimer);\n runState.toolProgressTimer = undefined;\n const subagentProgress = mergeSubagentProgress([...runState.subagentProgress.values()]);\n if (subagentProgress) {\n runState.subagentProgressShown = true;\n runState.lastSubagentProgressAt = Date.now();\n }\n runState.queue?.enqueue(\n () => replaceResponseWithToolProgress(responder, runState, subagentProgress),\n \"tool progress update\",\n );\n}\n\nfunction extractSubagentProgress(partialResult: unknown): SubagentProgressSnapshot | undefined {\n if (!partialResult || typeof partialResult !== \"object\") return undefined;\n const details = (partialResult as { details?: unknown }).details;\n if (!details || typeof details !== \"object\") return undefined;\n return parseSubagentProgressSnapshot((details as { progress?: unknown }).progress);\n}\n\nasync function finalizeErrorResponse(\n responder: ConversationResponder,\n runState: RunnerSessionState,\n options?: {\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (!runState.reportedLlmError) {\n runState.reportedLlmError = true;\n reportUserFacingError(new Error(\"LLM run completed with error stop reason\"), {\n domain: \"llm\",\n surface: \"assistant_response\",\n operation: \"llm_turn\",\n severity: \"error\",\n platform: options?.platform,\n provider: options?.model?.provider,\n model: options?.model?.name,\n stopReason: runState.stopReason,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n hasErrorMessage: true,\n llmCallCount: runState.llmCallCount,\n },\n });\n }\n try {\n await responder.replaceResponse(\"_Sorry, something went wrong_\");\n await responder.respondDiagnostic(`Error: ${runState.errorMessage}`, { style: \"error\" });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to post error message\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"finalize_error_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n stopReason: runState.stopReason,\n },\n });\n }\n}\n\nexport async function finalizeRunResponse(\n responder: ConversationResponder,\n session: MikanAgentSession,\n runState: RunnerSessionState,\n options?: {\n triggerSessionLink?: string;\n createOverflowLink?: () => string;\n platform?: string;\n model?: Model<Api>;\n sessionConversation?: string;\n sessionUuid?: string;\n },\n): Promise<void> {\n if (runState.stopReason === \"error\" && runState.errorMessage) {\n await finalizeErrorResponse(responder, runState, options);\n return;\n }\n\n const finalText = getFinalAssistantText(session);\n if (runState.finalResponseHandledByTool) {\n log.logInfo(\"Final response already handled by tool - skipping final replacement\");\n return;\n }\n if (finalText.trim() === \"[SILENT]\" || finalText.trim().startsWith(\"[SILENT]\")) {\n try {\n await responder.deleteResponse();\n log.logInfo(\"Silent response - deleted message and thread\");\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to delete message for silent response\", errMsg);\n }\n return;\n }\n\n if (!finalText.trim()) return;\n\n try {\n const finalResponse = appendTriggerAttribution(\n finalText,\n runState.triggerAttribution,\n options?.triggerSessionLink,\n );\n const finalDashboard = mergeSubagentProgress(runState.completedSubagentProgress);\n if (finalDashboard) {\n await replaceWithSubagentDashboard(responder, finalDashboard, finalResponse, {\n createOverflowLink: options?.createOverflowLink,\n });\n return;\n }\n await responder.replaceResponse(formatResponseWithToolProgress(finalResponse, runState), {\n createOverflowLink: options?.createOverflowLink,\n });\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n log.logWarning(\"Failed to replace message with final text\", errMsg);\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"final_response\",\n operation: \"replace_final_response\",\n severity: \"error\",\n platform: options?.platform,\n context: {\n sessionConversation: options?.sessionConversation,\n sessionUuid: options?.sessionUuid,\n finalTextLength: finalText.length,\n },\n });\n }\n}\n\nexport async function reportUsageSummary(ctx: UsageReportContext): Promise<void> {\n const {\n session,\n runState,\n responder,\n platform,\n model,\n agentConfig,\n sessionConversation,\n sessionUuid,\n waitForQueue,\n } = ctx;\n const lastAssistantMessage = session.messages.findLast(\n (message): message is Extract<typeof message, { role: \"assistant\" }> =>\n message.role === \"assistant\" && message.stopReason !== \"aborted\",\n );\n\n const contextTokens = lastAssistantMessage\n ? lastAssistantMessage.usage.input +\n lastAssistantMessage.usage.output +\n lastAssistantMessage.usage.cacheRead +\n lastAssistantMessage.usage.cacheWrite\n : 0;\n const contextWindow = model.contextWindow || 200000;\n\n const { totalUsage } = runState;\n const runMetricAttributes = metricAttributes({\n provider: model.provider,\n model: agentConfig.model,\n channel_id: sessionConversation,\n session_id: sessionUuid,\n stop_reason: runState.stopReason,\n llm_calls: runState.llmCallCount,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_in\", totalUsage.input, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.tokens_out\", totalUsage.output, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_read\", totalUsage.cacheRead, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cache_write\", totalUsage.cacheWrite, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.distribution(\"agent.run.cost\", totalUsage.cost.total, {\n attributes: runMetricAttributes,\n });\n Sentry.metrics.gauge(\"agent.context.utilization\", contextTokens / contextWindow, {\n unit: \"ratio\",\n attributes: runMetricAttributes,\n });\n\n const summary = log.logUsageSummary(\n runState.logCtx!,\n runState.totalUsage,\n contextTokens,\n contextWindow,\n );\n if (platform.diagnostics?.showUsageSummary === true) {\n runState.queue!.enqueue(\n () => responder.respondDiagnostic(summary, { style: \"muted\" }),\n \"usage summary\",\n );\n await waitForQueue();\n }\n}\n\nfunction extractToolResultText(result: unknown): string {\n if (typeof result === \"string\") {\n return result;\n }\n\n if (\n result &&\n typeof result === \"object\" &&\n \"content\" in result &&\n Array.isArray((result as { content: unknown }).content)\n ) {\n const content = (result as { content: Array<{ type: string; text?: string }> }).content;\n const textParts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\" && part.text) {\n textParts.push(part.text);\n }\n }\n if (textParts.length > 0) {\n return textParts.join(\"\\n\");\n }\n }\n\n return JSON.stringify(result);\n}\n\nexport function formatAgentActorName(userName: string | undefined, fallback: string): string {\n return userName ? `DM:${userName}` : fallback;\n}\n\nexport function sendAgentEvent(payload: {\n sessionId: string;\n actorName: string;\n event: AgentEventPayload;\n}): void {\n emitAgentEvent({ source: \"mikan\", ...payload });\n}\n\n// ponytail: additive SSE mirror only; keep responder rendering here until another frontend needs the same stream.\ntype PresenterEventContext = {\n runState: RunnerSessionState;\n responder: ConversationResponder;\n logCtx: NonNullable<RunnerSessionState[\"logCtx\"]>;\n queue: NonNullable<RunnerSessionState[\"queue\"]>;\n baseAttrs: { channel_id: string; session_id: string | undefined };\n agentEventSessionId: string;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n};\n\ntype ToolStartEvent = Extract<HarnessEvent, { type: \"tool_execution_start\" }>;\ntype ToolUpdateEvent = Extract<HarnessEvent, { type: \"tool_execution_update\" }>;\ntype ToolEndEvent = Extract<HarnessEvent, { type: \"tool_execution_end\" }>;\ntype MessageStartEvent = Extract<HarnessEvent, { type: \"message_start\" }>;\ntype MessageUpdateEvent = Extract<HarnessEvent, { type: \"message_update\" }>;\ntype MessageEndEvent = Extract<HarnessEvent, { type: \"message_end\" }>;\ntype AssistantMessage = Extract<MessageEndEvent[\"message\"], { role: \"assistant\" }>;\ntype LifecycleEvent = Extract<\n HarnessEvent,\n { type: \"compaction_start\" | \"compaction_end\" | \"auto_retry_start\" | \"budget_exceeded\" }\n>;\n\nfunction handleToolStart(event: ToolStartEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, queue, baseAttrs, agentEventSessionId } = context;\n const args = (event.args ?? {}) as { label?: string };\n const label = args.label || event.toolName;\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: {\n kind: \"toolStart\",\n toolId: event.toolCallId,\n toolName: event.toolName,\n input: { label },\n },\n });\n runState.pendingTools.set(event.toolCallId, {\n toolName: event.toolName,\n args: event.args,\n startTime: Date.now(),\n });\n runState.toolProgress.set(event.toolCallId, {\n label: extractToolLabel(event.toolName, event.args),\n status: \"running\",\n });\n if (event.toolName === \"subagent\") {\n runState.subagentToolCalls.add(event.toolCallId);\n } else {\n queue.enqueue(\n () => replaceResponseWithToolProgress(responder, runState),\n \"tool progress update\",\n );\n }\n addLifecycleBreadcrumb(\"agent.tool.started\", { tool: event.toolName, ...baseAttrs });\n log.logToolStart(logCtx, event.toolName, label, event.args as Record<string, unknown>);\n}\n\nfunction handleToolUpdate(event: ToolUpdateEvent, context: PresenterEventContext): void {\n const subagentProgress = extractSubagentProgress(event.partialResult);\n if (!subagentProgress) return;\n context.runState.subagentProgress.set(event.toolCallId, subagentProgress);\n context.runState.subagentToolCalls.add(event.toolCallId);\n context.runState.suppressResponseDeltas = true;\n scheduleToolProgressUpdate(context.responder, context.runState);\n}\n\nfunction recordToolMetrics(\n event: ToolEndEvent,\n durationMs: number,\n context: PresenterEventContext,\n): void {\n Sentry.metrics.count(\"agent.tool.calls\", 1, {\n attributes: metricAttributes({\n tool: event.toolName,\n error: String(event.isError),\n ...context.baseAttrs,\n }),\n });\n Sentry.metrics.distribution(\"agent.tool.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: metricAttributes({ tool: event.toolName, ...context.baseAttrs }),\n });\n addLifecycleBreadcrumb(\"agent.tool.completed\", {\n tool: event.toolName,\n error: event.isError,\n duration_ms: durationMs,\n ...context.baseAttrs,\n });\n}\n\nfunction handleToolEnd(event: ToolEndEvent, context: PresenterEventContext): void {\n const { runState, responder, logCtx, agentEventSessionId } = context;\n const resultStr = extractToolResultText(event.result);\n const pending = runState.pendingTools.get(event.toolCallId);\n sendAgentEvent({\n sessionId: agentEventSessionId,\n actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),\n event: { kind: \"toolEnd\", toolId: event.toolCallId },\n });\n const progress = runState.toolProgress.get(event.toolCallId);\n if (progress) progress.status = event.isError ? \"error\" : \"done\";\n const subagentProgress = runState.subagentProgress.get(event.toolCallId);\n if (subagentProgress) {\n runState.subagentProgress.set(\n event.toolCallId,\n settleSubagentProgress(subagentProgress, event.isError),\n );\n }\n flushToolProgressUpdate(responder, runState);\n const completedProgress = runState.subagentProgress.get(event.toolCallId);\n if (completedProgress) runState.completedSubagentProgress.push(completedProgress);\n runState.subagentProgress.delete(event.toolCallId);\n runState.pendingTools.delete(event.toolCallId);\n const durationMs = pending ? Date.now() - pending.startTime : 0;\n recordToolMetrics(event, durationMs, context);\n if (event.isError) {\n log.logToolError(logCtx, event.toolName, durationMs, resultStr);\n return;\n }\n log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);\n if (event.toolName === \"slack_blockkit\") runState.finalResponseHandledByTool = true;\n}\n\nfunction handleMessageStart(event: MessageStartEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n context.runState.llmCallCount += 1;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n addLifecycleBreadcrumb(\"agent.llm.call.started\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n });\n log.logResponseStart(context.logCtx);\n}\n\nfunction handleMessageUpdate(event: MessageUpdateEvent, context: PresenterEventContext): void {\n const update = event.assistantMessageEvent;\n if (update.type !== \"text_delta\" || !update.delta) return;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"responseDelta\", delta: update.delta },\n });\n if (context.responder.appendResponseDelta && !context.runState.suppressResponseDeltas) {\n context.queue.enqueue(async () => {\n await context.responder.appendResponseDelta?.(update.delta);\n }, \"response delta\");\n }\n}\n\nfunction recordAssistantUsage(message: AssistantMessage, context: PresenterEventContext): void {\n if (!message.usage) return;\n const { totalUsage } = context.runState;\n totalUsage.input += message.usage.input;\n totalUsage.output += message.usage.output;\n totalUsage.cacheRead += message.usage.cacheRead;\n totalUsage.cacheWrite += message.usage.cacheWrite;\n totalUsage.cost.input += message.usage.cost.input;\n totalUsage.cost.output += message.usage.cost.output;\n totalUsage.cost.cacheRead += message.usage.cost.cacheRead;\n totalUsage.cost.cacheWrite += message.usage.cost.cacheWrite;\n totalUsage.cost.total += message.usage.cost.total;\n\n const attributes = metricAttributes({\n provider: context.model.provider,\n model: context.agentConfig.model,\n ...context.baseAttrs,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n });\n Sentry.metrics.count(\"agent.llm.calls\", 1, { attributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_in\", message.usage.input, { attributes });\n Sentry.metrics.distribution(\"agent.llm.tokens_out\", message.usage.output, { attributes });\n if (message.usage.cacheRead > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_read\", message.usage.cacheRead, { attributes });\n }\n if (message.usage.cacheWrite > 0) {\n Sentry.metrics.distribution(\"agent.llm.cache_write\", message.usage.cacheWrite, { attributes });\n }\n Sentry.metrics.distribution(\"agent.llm.cost_per_turn\", message.usage.cost.total, { attributes });\n addLifecycleBreadcrumb(\"agent.llm.call.completed\", {\n call_index: context.runState.llmCallCount,\n provider: context.model.provider,\n model: context.agentConfig.model,\n stop_reason: message.stopReason,\n error: Boolean(message.errorMessage),\n input_tokens: message.usage.input,\n output_tokens: message.usage.output,\n cost_total_usd: message.usage.cost.total,\n });\n}\n\nfunction presentAssistantMessage(message: AssistantMessage, context: PresenterEventContext): void {\n const thinkingParts: string[] = [];\n const textParts: string[] = [];\n const hasToolCall = message.content.some((part) =>\n [\"tool_use\", \"toolCall\", \"tool-call\"].includes((part as { type?: string }).type ?? \"\"),\n );\n for (const part of message.content) {\n if (part.type === \"thinking\") thinkingParts.push(part.thinking);\n else if (part.type === \"text\") textParts.push(part.text);\n }\n for (const thinking of thinkingParts) {\n log.logThinking(context.logCtx, thinking);\n context.queue.enqueue(() => context.responder.respond(`_${thinking}_`), \"thinking main\");\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(`_${thinking}_`),\n \"thinking diagnostic\",\n );\n }\n\n const text = textParts.join(\"\\n\");\n if (!text.trim() || hasToolCall || context.runState.finalResponseHandledByTool) return;\n const finalText = appendTriggerAttribution(\n formatResponseWithToolProgress(text, context.runState),\n context.runState.triggerAttribution,\n );\n log.logResponse(context.logCtx, text);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"responseFinal\", text: finalText },\n });\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"turnEnd\" },\n });\n // Subagent dashboard finalization must preserve \"dashboard, blank line, answer\".\n if (context.runState.completedSubagentProgress.length > 0) return;\n if (context.responder.finishResponse) {\n context.queue.enqueue(async () => {\n await context.responder.finishResponse?.(finalText);\n }, \"response finish\");\n } else {\n context.queue.enqueue(() => context.responder.respond(finalText), \"response main\");\n }\n}\n\nfunction handleMessageEnd(event: MessageEndEvent, context: PresenterEventContext): void {\n if (event.message.role !== \"assistant\") return;\n const message = event.message;\n if (message.stopReason) {\n context.runState.stopReason = message.stopReason;\n // The settling message clears any stale error left by a recovered retry.\n context.runState.errorMessage = message.errorMessage;\n }\n recordAssistantUsage(message, context);\n presentAssistantMessage(message, context);\n}\n\nfunction handleLifecycleEvent(event: LifecycleEvent, context: PresenterEventContext): void {\n if (event.type === \"compaction_start\") {\n const text = \"_Compacting context..._\";\n log.logInfo(`Auto-compaction started (reason: ${event.reason})`);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(() => context.responder.respond(text), \"compaction start\");\n return;\n }\n if (event.type === \"compaction_end\") {\n if (event.result) {\n log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);\n } else if (event.aborted) {\n log.logInfo(\"Auto-compaction aborted\");\n }\n return;\n }\n if (event.type === \"auto_retry_start\") {\n log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"sessionStart\" },\n });\n const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(() => context.responder.respond(text), \"retry\");\n return;\n }\n\n log.logWarning(\n \"Run stopped by budget circuit breaker\",\n `${event.reason} (tokens=${event.tokens}, cost=${event.costUsd.toFixed(2)}, calls=${event.llmCalls}, ${event.durationMs}ms)`,\n );\n const text = `_Stopped: run budget exceeded (${event.reason})_`;\n sendAgentEvent({\n sessionId: context.agentEventSessionId,\n actorName: formatAgentActorName(context.logCtx.userName, context.logCtx.conversationId),\n event: { kind: \"diagnostic\", text },\n });\n context.queue.enqueue(\n () => context.responder.respondDiagnostic(text, { style: \"error\" }),\n \"budget exceeded\",\n );\n}\n\nfunction handlePresenterEvent(event: HarnessEvent, context: PresenterEventContext): void {\n switch (event.type) {\n case \"tool_execution_start\":\n handleToolStart(event, context);\n return;\n case \"tool_execution_update\":\n handleToolUpdate(event, context);\n return;\n case \"tool_execution_end\":\n handleToolEnd(event, context);\n return;\n case \"message_start\":\n handleMessageStart(event, context);\n return;\n case \"message_update\":\n handleMessageUpdate(event, context);\n return;\n case \"message_end\":\n handleMessageEnd(event, context);\n return;\n case \"compaction_start\":\n case \"compaction_end\":\n case \"auto_retry_start\":\n case \"budget_exceeded\":\n handleLifecycleEvent(event, context);\n return;\n default:\n return;\n }\n}\n\nexport function attachSessionEventHandlers(params: {\n session: MikanAgentSession;\n runState: RunnerSessionState;\n model: Model<Api>;\n agentConfig: ReturnType<typeof resolveConversationSettings>;\n}): void {\n const { session, runState, model, agentConfig } = params;\n session.subscribe((event) => {\n if (!runState.responder || !runState.logCtx || !runState.queue) return;\n handlePresenterEvent(event, {\n runState,\n responder: runState.responder,\n logCtx: runState.logCtx,\n queue: runState.queue,\n baseAttrs: {\n channel_id: runState.logCtx.conversationId,\n session_id: runState.logCtx.sessionId,\n },\n agentEventSessionId: runState.logCtx.sessionId ?? runState.logCtx.conversationId,\n model,\n agentConfig,\n });\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;AAupBtF,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8FxF"}
|