@geminixiang/mikan 1.0.2 → 1.1.0
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 +39 -0
- package/dist/adapters/discord/context.js +1 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/messages.d.ts +1 -0
- package/dist/adapters/messages.d.ts.map +1 -1
- package/dist/adapters/messages.js +3 -0
- package/dist/adapters/messages.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +132 -147
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +3 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +88 -33
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -3
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/telegram/context.js +1 -1
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +1 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +82 -5
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +21 -28
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +5 -3
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.js +2 -2
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +2 -0
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +49 -8
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/tools/task.d.ts +4 -0
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +12 -0
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/harness/types.d.ts +2 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +15 -0
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +1 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +17 -1
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +1 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sessions/session-store.d.ts +4 -0
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +83 -4
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/types.d.ts +1 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/types.d.ts +7 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAOjG,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAOjG,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoPzF,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,GAAG,qBAAqB,CAuFxB"}
|
|
@@ -8,7 +8,6 @@ import { normalizeSlackCurrencyBold } from "./markdown.js";
|
|
|
8
8
|
import { slackPersonaForProfile } from "./persona.js";
|
|
9
9
|
import { errorMessage } from "../../unknown-values.js";
|
|
10
10
|
const MAX_MAIN_LENGTH = 35000;
|
|
11
|
-
const STREAM_MIN_DELTA_CHARS = 256;
|
|
12
11
|
const MAX_THREAD_LENGTH = 20000;
|
|
13
12
|
const FALLBACK_MAIN_LENGTH = 3000;
|
|
14
13
|
const WORKING_INDICATOR = "\n\n...";
|
|
@@ -216,13 +215,12 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
216
215
|
workingIndicator: streamKind === "buffered" ? WORKING_INDICATOR : undefined,
|
|
217
216
|
formatProvisional: formatProvisionalSlackText,
|
|
218
217
|
prepareSource: prepareSlackSource,
|
|
219
|
-
|
|
218
|
+
showsPartialAnswer: true,
|
|
220
219
|
stream: streamKind === "native"
|
|
221
220
|
? {
|
|
222
221
|
start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),
|
|
223
222
|
append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),
|
|
224
223
|
stop: (id) => slack.stopMessageStream(event.channel, id),
|
|
225
|
-
minDeltaChars: STREAM_MIN_DELTA_CHARS,
|
|
226
224
|
}
|
|
227
225
|
: undefined,
|
|
228
226
|
needsCanonicalRender,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { splitText } from \"../shared.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock, italicizeLines } from \"./bot.js\";\nimport type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from \"./types.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\nconst STREAM_MIN_DELTA_CHARS = 256;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = errorMessage(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n errorMessage(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? italicizeLines(part) : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n { answer: { replyTo: event.ts, sessionKey: sessionPlan.sessionKey } },\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n supportsDeltas: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n minDeltaChars: STREAM_MIN_DELTA_CHARS,\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { splitText } from \"../shared.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock, italicizeLines } from \"./bot.js\";\nimport type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from \"./types.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = errorMessage(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n errorMessage(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? italicizeLines(part) : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n { answer: { replyTo: event.ts, sessionKey: sessionPlan.sessionKey } },\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n showsPartialAnswer: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
|
|
@@ -32,7 +32,7 @@ export function createTelegramAdapters(event, bot) {
|
|
|
32
32
|
maxLength: MAX_LENGTH,
|
|
33
33
|
formatContinuation: (partNum) => `(continued ${partNum})`,
|
|
34
34
|
errorPrefix: "Error: ",
|
|
35
|
-
|
|
35
|
+
showsPartialAnswer: true,
|
|
36
36
|
typing: {
|
|
37
37
|
send: () => bot.sendTyping(chatId),
|
|
38
38
|
intervalMs: 4000,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,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,GAAwB;IAExB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;IACpD,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,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,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage } from \"../../office/index.js\";\nimport type { ChatToolResult, ConversationContext } from \"../../types.js\";\nimport { deriveSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { TelegramEvent, TelegramResponseBot } from \"./types.js\";\n\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: TelegramResponseBot,\n): ConversationContext {\n const conversationId = event.address.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 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 showsPartialAnswer: true,\n typing: {\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 postExtra: (text) => bot.postMessageRaw(chatId, text),\n delete: (id) => bot.deleteMessageRaw(chatId, Number(id)),\n logBotResponse: (text, id) =>\n bot.logBotResponse(conversationId, text, id, undefined, {\n answer: { replyTo: message.id, sessionKey: message.sessionKey },\n }),\n uploadFile: (filePath, title) => bot.uploadFile(conversationId, filePath, title),\n react: (emoji) => bot.addReaction(conversationId, event.ts, emoji),\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -41,7 +41,6 @@ interface ProgressiveStreamTransport {
|
|
|
41
41
|
start(text: string): Promise<string>;
|
|
42
42
|
append(messageId: string, delta: string): Promise<void>;
|
|
43
43
|
stop(messageId: string): Promise<void>;
|
|
44
|
-
minDeltaChars?: number;
|
|
45
44
|
}
|
|
46
45
|
export interface ProgressiveRendererPlatform {
|
|
47
46
|
label: string;
|
|
@@ -58,7 +57,7 @@ export interface ProgressiveRendererPlatform {
|
|
|
58
57
|
setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;
|
|
59
58
|
onFinish?: (text: string, responseId: string | null) => void | Promise<void>;
|
|
60
59
|
logIntermediateResponses?: boolean;
|
|
61
|
-
|
|
60
|
+
showsPartialAnswer?: boolean;
|
|
62
61
|
stream?: ProgressiveStreamTransport;
|
|
63
62
|
needsCanonicalRender?: (text: string) => boolean;
|
|
64
63
|
formatSubagentProgress?: (progress: SubagentProgressSnapshot) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,0BAA0B,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,0BAA0B,EACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,IAAI,CAAC;AAEV,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,UAAU,0BAA0B;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Attachment,\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n ConversationLogMessage,\n LoggedAttachment,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n isRateLimited: (err: Error) => boolean;\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n address: OfficeAddress;\n sessionKey?: string;\n}\n\nexport interface HandleTooLongInput {\n text: string;\n operation: \"render\" | \"replace\";\n options: { createOverflowLink?: () => string } | undefined;\n responseId: string | null;\n write: (text: string) => Promise<void>;\n getResponseId: () => string | null;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Attachment,\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n ConversationLogMessage,\n LoggedAttachment,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n isRateLimited: (err: Error) => boolean;\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n address: OfficeAddress;\n sessionKey?: string;\n}\n\nexport interface HandleTooLongInput {\n text: string;\n operation: \"render\" | \"replace\";\n options: { createOverflowLink?: () => string } | undefined;\n responseId: string | null;\n write: (text: string) => Promise<void>;\n getResponseId: () => string | null;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n}\n\nexport interface ProgressiveRendererPlatform {\n label: string;\n maxLength: number;\n flushIntervalMs?: number;\n initialResponseId?: string | null;\n formatContinuation: (partNum: number) => string;\n errorPrefix: string;\n sanitize?: (text: string) => string;\n workingIndicator?: string;\n formatProvisional?: (text: string, working: boolean) => string;\n prepareSource?: (text: string, working: boolean) => string;\n onWorkingChanged?: (working: boolean, responseId: string | null) => Promise<void>;\n setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;\n onFinish?: (text: string, responseId: string | null) => void | Promise<void>;\n logIntermediateResponses?: boolean;\n showsPartialAnswer?: boolean;\n stream?: ProgressiveStreamTransport;\n needsCanonicalRender?: (text: string) => boolean;\n formatSubagentProgress?: (progress: SubagentProgressSnapshot) => string;\n typing?: {\n send: () => Promise<unknown>;\n intervalMs: number;\n stopOnSend?: boolean;\n };\n formatToolResult: (result: ChatToolResult) => string;\n responseErrorContext?: (\n responseId: string | null,\n ) => Omit<ChatResponseErrorContext, \"operation\" | \"extra\">;\n notifySendFailure?: (errorMessage: string) => Promise<void>;\n post: (text: string) => Promise<string>;\n update: (id: string, text: string) => Promise<void>;\n postExtra: (text: string, responseId: string | null) => Promise<string | number | void>;\n postDiagnostic?: (\n text: string,\n options: { style?: \"muted\" | \"error\" },\n responseId: string | null,\n ) => Promise<Array<string | number>>;\n delete?: (id: string) => Promise<void>;\n deleteExtra?: (id: string | number) => Promise<void>;\n logBotResponse?: (text: string, id: string) => void;\n uploadFile?: (filePath: string, title?: string) => Promise<void>;\n uploadFallbackNote?: (name: string) => string;\n react?: (emoji: string) => Promise<void>;\n isTooLongError?: (err: unknown) => boolean;\n handleTooLong?: (input: HandleTooLongInput) => Promise<{ text: string; prefixLength?: number }>;\n}\n\nexport type MessageIntakeOutcome = \"magic-word\" | \"not-triggered\" | \"rejected-busy\" | \"enqueued\";\n\nexport type QueueAdmission = \"started\" | \"waiting\" | \"closed\";\n\nexport interface MagicWordIntakeOptions {\n text?: string;\n addressed: boolean;\n scopeFallback: \"top-level\" | \"always\" | \"never\";\n}\n\nexport interface IncomingAttachment {\n name: string;\n timestampMs?: number;\n download(destPath: string): Promise<void>;\n}\n\nexport interface SavedAttachments {\n saved: Attachment[];\n failed: { name: string; error: unknown }[];\n}\n\nexport interface MessageIntakeOptions<TEvent extends ConversationEvent> {\n eventBase: TEvent;\n addressed: boolean;\n magicWord: MagicWordIntakeOptions;\n busyPolicy: \"queue\" | \"reject\";\n logEntryBase: ConversationLogMessage;\n log?: (entry: ConversationLogMessage) => void;\n processAttachments: () => Promise<LoggedAttachment[]>;\n queueKey: string;\n enqueue: (queueKey: string, work: () => Promise<void>) => QueueAdmission;\n react?: (emoji: string) => Promise<void>;\n handler: MessagingEventHandler;\n bot: MessagingBot;\n createContext: (event: TEvent) => ConversationContext;\n deferAttachmentsUntilRun?: boolean;\n}\n\nexport interface MarkdownTable {\n headers: string[];\n rows: string[][];\n startLine: number;\n endLine: number;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-env.d.ts","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"execution-env.d.ts","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,YAAY,EAUlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAanE,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,oBAAoB,EAAE,MAAM,GAC3B,YAAY,CAKd"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import { posix } from "node:path";
|
|
3
|
-
import { ExecutionError, FileError, err, ok, } from "@earendil-works/pi-durable/env";
|
|
3
|
+
import { ExecutionError, FileError, LineScanner, err, ok, } from "@earendil-works/pi-durable/env";
|
|
4
4
|
import { NodeExecutionEnv } from "@earendil-works/pi-durable/env/node";
|
|
5
5
|
import { execAppendFile, execWriteFile, shellEscape } from "../sandbox/utils.js";
|
|
6
6
|
import { errorMessage } from "../unknown-values.js";
|
|
7
7
|
const SPILL_DIR = ".mikan/bash-output";
|
|
8
|
+
const READ_REGULAR_FILE = [
|
|
9
|
+
'if [ "$2" = 1 ] && [ -L "$1" ]; then echo link;',
|
|
10
|
+
'elif [ -d "$1" ]; then echo directory;',
|
|
11
|
+
'elif [ -f "$1" ]; then echo "file $(date -r "$1" +%s)"; base64 < "$1";',
|
|
12
|
+
'elif [ -e "$1" ]; then echo other; else echo missing; fi',
|
|
13
|
+
].join(" ");
|
|
8
14
|
export function createSandboxExecutionEnv(executor, sandboxType, runtimeWorkspaceRoot) {
|
|
9
15
|
if (sandboxType === "host") {
|
|
10
16
|
return new NodeExecutionEnv({ cwd: runtimeWorkspaceRoot });
|
|
@@ -90,6 +96,38 @@ class ShellExecutionEnv {
|
|
|
90
96
|
return { name: posix.basename(path), path, kind, size, mtimeMs };
|
|
91
97
|
});
|
|
92
98
|
}
|
|
99
|
+
async openBinaryReader(path, options, context) {
|
|
100
|
+
return this.fileOp(async () => {
|
|
101
|
+
const { stdout } = await this.run(`sh -c ${shellEscape(READ_REGULAR_FILE)} _ ${shellEscape(path)} ${options?.noFollow ? 1 : 0}`, context);
|
|
102
|
+
const headerEnd = stdout.indexOf("\n");
|
|
103
|
+
const [kind, mtime] = stdout.slice(0, headerEnd).split(" ");
|
|
104
|
+
if (kind === "missing")
|
|
105
|
+
throw new FileError("not_found", `No such file: ${path}`, path);
|
|
106
|
+
if (kind === "directory")
|
|
107
|
+
throw new FileError("is_directory", `Is a directory: ${path}`, path);
|
|
108
|
+
if (kind !== "file")
|
|
109
|
+
throw new FileError("invalid", `Not a regular file: ${path}`, path);
|
|
110
|
+
const bytes = Buffer.from(stdout.slice(headerEnd + 1).replace(/\s+/g, ""), "base64");
|
|
111
|
+
return new SnapshotBinaryReader(bytes, {
|
|
112
|
+
name: posix.basename(path),
|
|
113
|
+
path,
|
|
114
|
+
kind: "file",
|
|
115
|
+
size: bytes.length,
|
|
116
|
+
mtimeMs: (Number.parseInt(mtime ?? "", 10) || 0) * 1000,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
openDirReader(path, context) {
|
|
121
|
+
return this.fileOp(async () => {
|
|
122
|
+
const listed = await this.listDir(path, context);
|
|
123
|
+
if (!listed.ok)
|
|
124
|
+
throw listed.error;
|
|
125
|
+
return new SnapshotDirReader(listed.value);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async watch() {
|
|
129
|
+
return err(new FileError("not_supported", "The sandbox does not report file changes"));
|
|
130
|
+
}
|
|
93
131
|
async listDir(path, context) {
|
|
94
132
|
return this.fileOp(async () => {
|
|
95
133
|
const { stdout } = await this.run(`ls -A ${shellEscape(path)}`, context);
|
|
@@ -148,14 +186,19 @@ class ShellExecutionEnv {
|
|
|
148
186
|
async cleanup(_context) { }
|
|
149
187
|
async exec(command, options, context) {
|
|
150
188
|
try {
|
|
151
|
-
const
|
|
189
|
+
const shellCommand = typeof command === "string" ? command : command.map(shellEscape).join(" ");
|
|
190
|
+
const result = await this.executor.exec(shellCommand, {
|
|
152
191
|
cwd: options?.cwd || undefined,
|
|
153
192
|
timeout: options?.timeout || undefined,
|
|
154
193
|
signal: context.abortSignal,
|
|
155
194
|
});
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
158
|
-
options?.onOutput?.(
|
|
195
|
+
const stdout = result.stdout.length > 0 && result.stderr.length > 0 ? `${result.stdout}\n` : result.stdout;
|
|
196
|
+
if (stdout.length > 0)
|
|
197
|
+
options?.onOutput?.(stdout, context, { stream: "stdout" });
|
|
198
|
+
if (result.stderr.length > 0) {
|
|
199
|
+
options?.onOutput?.(result.stderr, context, { stream: "stderr" });
|
|
200
|
+
}
|
|
201
|
+
const combined = `${stdout}${result.stderr}`;
|
|
159
202
|
return ok({ exitCode: result.code, spillPath: await this.spill(combined, options, context) });
|
|
160
203
|
}
|
|
161
204
|
catch (error) {
|
|
@@ -197,6 +240,38 @@ class ShellExecutionEnv {
|
|
|
197
240
|
}
|
|
198
241
|
}
|
|
199
242
|
}
|
|
243
|
+
class SnapshotBinaryReader {
|
|
244
|
+
constructor(bytes, metadata) {
|
|
245
|
+
this.bytes = bytes;
|
|
246
|
+
this.metadata = metadata;
|
|
247
|
+
}
|
|
248
|
+
async info(_context) {
|
|
249
|
+
return ok(this.metadata);
|
|
250
|
+
}
|
|
251
|
+
async read(offset, length, _context) {
|
|
252
|
+
return ok(this.bytes.subarray(offset, offset + length));
|
|
253
|
+
}
|
|
254
|
+
async scanLines(options, _context) {
|
|
255
|
+
const scanner = new LineScanner(options.startLine, options.endLine);
|
|
256
|
+
scanner.push(this.bytes);
|
|
257
|
+
return ok(scanner.finish());
|
|
258
|
+
}
|
|
259
|
+
async close(_context) { }
|
|
260
|
+
}
|
|
261
|
+
class SnapshotDirReader {
|
|
262
|
+
constructor(entries) {
|
|
263
|
+
this.entries = entries;
|
|
264
|
+
this.offset = 0;
|
|
265
|
+
}
|
|
266
|
+
async next(maxEntries, _context) {
|
|
267
|
+
const page = this.entries.slice(this.offset, this.offset + Math.max(1, maxEntries));
|
|
268
|
+
this.offset += page.length;
|
|
269
|
+
return ok({ entries: page, done: this.offset >= this.entries.length });
|
|
270
|
+
}
|
|
271
|
+
async close(_context) {
|
|
272
|
+
this.offset = this.entries.length;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
200
275
|
class ShellTextLineReader {
|
|
201
276
|
constructor(content) {
|
|
202
277
|
this.content = content;
|
|
@@ -220,6 +295,8 @@ class ShellTextLineReader {
|
|
|
220
295
|
}
|
|
221
296
|
}
|
|
222
297
|
function toFileError(error) {
|
|
298
|
+
if (error instanceof FileError)
|
|
299
|
+
return error;
|
|
223
300
|
const message = errorMessage(error);
|
|
224
301
|
if (/aborted/i.test(message))
|
|
225
302
|
return new FileError("aborted", message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-env.js","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { posix } from \"node:path\";\nimport type { Context } from \"@earendil-works/chord\";\nimport {\n ExecutionError,\n FileError,\n err,\n ok,\n type ExecutionEnv,\n type FileInfo,\n type FileKind,\n type Result,\n type ShellExecOptions,\n type ShellExecResult,\n type TextLine,\n type TextLineReader,\n} from \"@earendil-works/pi-durable/env\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-durable/env/node\";\nimport type { Executor, SandboxConfig } from \"../sandbox/types.js\";\nimport { execAppendFile, execWriteFile, shellEscape } from \"../sandbox/utils.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst SPILL_DIR = \".mikan/bash-output\";\n\nexport function createSandboxExecutionEnv(\n executor: Executor,\n sandboxType: SandboxConfig[\"type\"],\n runtimeWorkspaceRoot: string,\n): ExecutionEnv {\n if (sandboxType === \"host\") {\n return new NodeExecutionEnv({ cwd: runtimeWorkspaceRoot });\n }\n return new ShellExecutionEnv(executor, runtimeWorkspaceRoot);\n}\n\nclass ShellExecutionEnv implements ExecutionEnv {\n readonly id: string;\n readonly cwd: string;\n\n constructor(\n private readonly executor: Executor,\n runtimeWorkspaceRoot: string,\n ) {\n this.id = `mikan-sandbox:${randomBytes(8).toString(\"hex\")}`;\n this.cwd = runtimeWorkspaceRoot;\n }\n\n async absolutePath(path: string, _context: Context): Promise<Result<string, FileError>> {\n return ok(posix.isAbsolute(path) ? posix.normalize(path) : posix.resolve(this.cwd, path));\n }\n\n async joinPath(parts: string[], _context: Context): Promise<Result<string, FileError>> {\n return ok(posix.join(...parts));\n }\n\n readTextFile(path: string, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(() => this.executor.readFile(path, this.execOptions(context)));\n }\n\n openTextLineReader(path: string, context: Context): Promise<Result<TextLineReader, FileError>> {\n return this.fileOp(async () => {\n const content = await this.executor.readFile(path, this.execOptions(context));\n return new ShellTextLineReader(content);\n });\n }\n\n async readBinaryFile(path: string, context: Context): Promise<Result<Uint8Array, FileError>> {\n return this.fileOp(async () =>\n Buffer.from(await this.executor.readFileBase64(path, this.execOptions(context)), \"base64\"),\n );\n }\n\n readTextLines(\n path: string,\n options: { maxLines?: number } | undefined,\n context: Context,\n ): Promise<Result<string[], FileError>> {\n return this.fileOp(async () => {\n const max = options?.maxLines;\n const command =\n max === undefined\n ? `cat ${shellEscape(path)}`\n : `head -n ${Math.max(0, Math.floor(max))} ${shellEscape(path)}`;\n const { stdout } = await this.run(command, context);\n const lines = stdout.split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n });\n }\n\n writeFile(\n path: string,\n content: string | Uint8Array,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(() =>\n execWriteFile(this.executor, path, content, this.execOptions(context)),\n );\n }\n\n appendFile(\n path: string,\n content: string | Uint8Array,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(() =>\n execAppendFile(this.executor, path, content, this.execOptions(context)),\n );\n }\n\n truncateFile(path: string, size: number, context: Context): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`truncate -s ${Math.max(0, Math.floor(size))} ${shellEscape(path)}`, context);\n });\n }\n\n flushFile(path: string, context: Context): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`sync ${shellEscape(path)}`, context);\n });\n }\n\n renameFile(\n sourcePath: string,\n destinationPath: string,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`mv -f ${shellEscape(sourcePath)} ${shellEscape(destinationPath)}`, context);\n });\n }\n\n fileInfo(path: string, context: Context): Promise<Result<FileInfo, FileError>> {\n return this.fileOp(async () => {\n const escaped = shellEscape(path);\n const probe = await this.executor.exec(\n `if [ -L ${escaped} ]; then printf 'symlink'; elif [ -d ${escaped} ]; then printf 'directory'; ` +\n `elif [ -f ${escaped} ]; then printf 'file'; else exit 1; fi`,\n this.execOptions(context),\n );\n if (probe.code !== 0) throw new Error(`No such file or directory: ${path}`);\n const kind = probe.stdout.trim() as FileKind;\n let size = 0;\n if (kind === \"file\") {\n const stat = await this.executor.exec(`wc -c < ${escaped}`, this.execOptions(context));\n if (stat.code === 0) size = Number.parseInt(stat.stdout.trim(), 10) || 0;\n }\n let mtimeMs = 0;\n const mtime = await this.executor.exec(`date -r ${escaped} +%s`, this.execOptions(context));\n if (mtime.code === 0) mtimeMs = (Number.parseInt(mtime.stdout.trim(), 10) || 0) * 1000;\n return { name: posix.basename(path), path, kind, size, mtimeMs };\n });\n }\n\n async listDir(path: string, context: Context): Promise<Result<FileInfo[], FileError>> {\n return this.fileOp(async () => {\n const { stdout } = await this.run(`ls -A ${shellEscape(path)}`, context);\n const names = stdout.split(\"\\n\").filter(Boolean).toSorted();\n const entries: FileInfo[] = [];\n for (const name of names) {\n const child = posix.join(path, name);\n const info = await this.fileInfo(child, context);\n if (info.ok) entries.push(info.value);\n }\n return entries;\n });\n }\n\n canonicalPath(path: string, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(async () =>\n (await this.run(`realpath ${shellEscape(path)}`, context)).stdout.trim(),\n );\n }\n\n async exists(path: string, context: Context): Promise<Result<boolean, FileError>> {\n try {\n const result = await this.executor.exec(\n `test -e ${shellEscape(path)}`,\n this.execOptions(context),\n );\n return ok(result.code === 0);\n } catch (error) {\n return err(toFileError(error));\n }\n }\n\n createDir(\n path: string,\n options: { recursive?: boolean } | undefined,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n const flag = options?.recursive === false ? \"\" : \"-p \";\n await this.run(`mkdir ${flag}${shellEscape(path)}`, context);\n });\n }\n\n remove(\n path: string,\n options: { recursive?: boolean; force?: boolean } | undefined,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n const recursive = options?.recursive ? \"-r\" : \"\";\n const force = options?.force ? \"-f\" : \"\";\n await this.run(`rm ${recursive} ${force} ${shellEscape(path)}`, context);\n });\n }\n\n createTempDir(prefix: string | undefined, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(async () => {\n const template = prefix === undefined ? \"\" : shellEscape(`${prefix}XXXXXX`);\n const { stdout } = await this.run(`mktemp -d ${template}`.trim(), context);\n return stdout.trim();\n });\n }\n\n createTempFile(\n options: { prefix?: string; suffix?: string } | undefined,\n context: Context,\n ): Promise<Result<string, FileError>> {\n return this.fileOp(async () => {\n const template =\n options?.prefix === undefined && options?.suffix === undefined\n ? \"\"\n : shellEscape(`${options?.prefix ?? \"\"}XXXXXX${options?.suffix ?? \"\"}`);\n const { stdout } = await this.run(`mktemp ${template}`.trim(), context);\n return stdout.trim();\n });\n }\n\n async cleanup(_context: Context): Promise<void> {}\n\n async exec(\n command: string,\n options: ShellExecOptions | undefined,\n context: Context,\n ): Promise<Result<ShellExecResult, ExecutionError>> {\n try {\n const result = await this.executor.exec(command, {\n cwd: options?.cwd || undefined,\n timeout: options?.timeout || undefined,\n signal: context.abortSignal,\n });\n const combined = [result.stdout, result.stderr].filter((part) => part.length > 0).join(\"\\n\");\n if (combined.length > 0) options?.onOutput?.(combined, context);\n return ok({ exitCode: result.code, spillPath: await this.spill(combined, options, context) });\n } catch (error) {\n return err(toExecutionError(error, context));\n }\n }\n\n private async spill(\n output: string,\n options: ShellExecOptions | undefined,\n context: Context,\n ): Promise<string | undefined> {\n const limits = options?.spill;\n if (!limits) return undefined;\n const lines = output.split(\"\\n\").length;\n if (Buffer.byteLength(output, \"utf8\") <= limits.afterBytes && lines <= limits.afterLines)\n return undefined;\n try {\n const spillPath = posix.join(this.cwd, SPILL_DIR, `${randomBytes(8).toString(\"hex\")}.log`);\n await this.executor.writeFile(spillPath, output, this.execOptions(context));\n return spillPath;\n } catch {\n return undefined;\n }\n }\n\n private execOptions(context: Context): { signal: AbortSignal | undefined } {\n return { signal: context.abortSignal };\n }\n\n private async run(\n command: string,\n context: Context,\n ): Promise<{ stdout: string; stderr: string }> {\n const result = await this.executor.exec(command, this.execOptions(context));\n if (result.code !== 0) {\n throw new Error(result.stderr.trim() || `Command failed (${result.code}): ${command}`);\n }\n return result;\n }\n\n private async fileOp<T>(op: () => Promise<T>): Promise<Result<T, FileError>> {\n try {\n return ok(await op());\n } catch (error) {\n return err(toFileError(error));\n }\n }\n}\n\nclass ShellTextLineReader implements TextLineReader {\n private offset = 0;\n\n constructor(private readonly content: string) {}\n\n async readLine(_context: Context): Promise<Result<TextLine | undefined, FileError>> {\n if (this.offset >= this.content.length) return ok(undefined);\n const newline = this.content.indexOf(\"\\n\", this.offset);\n if (newline === -1) {\n const text = this.content.slice(this.offset);\n this.offset = this.content.length;\n return ok({ text, terminated: false });\n }\n const text = this.content.slice(this.offset, newline);\n this.offset = newline + 1;\n return ok({ text, terminated: true });\n }\n\n async close(_context: Context): Promise<void> {\n this.offset = this.content.length;\n }\n}\n\nfunction toFileError(error: unknown): FileError {\n const message = errorMessage(error);\n if (/aborted/i.test(message)) return new FileError(\"aborted\", message);\n if (/no such file|not found/i.test(message)) return new FileError(\"not_found\", message);\n if (/permission denied/i.test(message)) return new FileError(\"permission_denied\", message);\n if (/not a directory/i.test(message)) return new FileError(\"not_directory\", message);\n if (/is a directory/i.test(message)) return new FileError(\"is_directory\", message);\n return new FileError(\"unknown\", message, undefined, error instanceof Error ? error : undefined);\n}\n\nfunction toExecutionError(error: unknown, context: Context): ExecutionError {\n const message = errorMessage(error);\n if (context.abortSignal?.aborted || /aborted/i.test(message)) {\n return new ExecutionError(\"aborted\", message);\n }\n if (/timed out/i.test(message)) return new ExecutionError(\"timeout\", message);\n return new ExecutionError(\"unknown\", message, error instanceof Error ? error : undefined);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"execution-env.js","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { posix } from \"node:path\";\nimport type { Context } from \"@earendil-works/chord\";\nimport {\n ExecutionError,\n FileError,\n LineScanner,\n err,\n ok,\n type BinaryReader,\n type DirReader,\n type ExecutionEnv,\n type FileInfo,\n type FileKind,\n type FileWatcher,\n type LineScan,\n type Result,\n type ShellExecOptions,\n type ShellExecResult,\n type TextLine,\n type TextLineReader,\n} from \"@earendil-works/pi-durable/env\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-durable/env/node\";\nimport type { Executor, SandboxConfig } from \"../sandbox/types.js\";\nimport { execAppendFile, execWriteFile, shellEscape } from \"../sandbox/utils.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst SPILL_DIR = \".mikan/bash-output\";\n\nconst READ_REGULAR_FILE = [\n 'if [ \"$2\" = 1 ] && [ -L \"$1\" ]; then echo link;',\n 'elif [ -d \"$1\" ]; then echo directory;',\n 'elif [ -f \"$1\" ]; then echo \"file $(date -r \"$1\" +%s)\"; base64 < \"$1\";',\n 'elif [ -e \"$1\" ]; then echo other; else echo missing; fi',\n].join(\" \");\n\nexport function createSandboxExecutionEnv(\n executor: Executor,\n sandboxType: SandboxConfig[\"type\"],\n runtimeWorkspaceRoot: string,\n): ExecutionEnv {\n if (sandboxType === \"host\") {\n return new NodeExecutionEnv({ cwd: runtimeWorkspaceRoot });\n }\n return new ShellExecutionEnv(executor, runtimeWorkspaceRoot);\n}\n\nclass ShellExecutionEnv implements ExecutionEnv {\n readonly id: string;\n readonly cwd: string;\n\n constructor(\n private readonly executor: Executor,\n runtimeWorkspaceRoot: string,\n ) {\n this.id = `mikan-sandbox:${randomBytes(8).toString(\"hex\")}`;\n this.cwd = runtimeWorkspaceRoot;\n }\n\n async absolutePath(path: string, _context: Context): Promise<Result<string, FileError>> {\n return ok(posix.isAbsolute(path) ? posix.normalize(path) : posix.resolve(this.cwd, path));\n }\n\n async joinPath(parts: string[], _context: Context): Promise<Result<string, FileError>> {\n return ok(posix.join(...parts));\n }\n\n readTextFile(path: string, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(() => this.executor.readFile(path, this.execOptions(context)));\n }\n\n openTextLineReader(path: string, context: Context): Promise<Result<TextLineReader, FileError>> {\n return this.fileOp(async () => {\n const content = await this.executor.readFile(path, this.execOptions(context));\n return new ShellTextLineReader(content);\n });\n }\n\n async readBinaryFile(path: string, context: Context): Promise<Result<Uint8Array, FileError>> {\n return this.fileOp(async () =>\n Buffer.from(await this.executor.readFileBase64(path, this.execOptions(context)), \"base64\"),\n );\n }\n\n readTextLines(\n path: string,\n options: { maxLines?: number } | undefined,\n context: Context,\n ): Promise<Result<string[], FileError>> {\n return this.fileOp(async () => {\n const max = options?.maxLines;\n const command =\n max === undefined\n ? `cat ${shellEscape(path)}`\n : `head -n ${Math.max(0, Math.floor(max))} ${shellEscape(path)}`;\n const { stdout } = await this.run(command, context);\n const lines = stdout.split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n });\n }\n\n writeFile(\n path: string,\n content: string | Uint8Array,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(() =>\n execWriteFile(this.executor, path, content, this.execOptions(context)),\n );\n }\n\n appendFile(\n path: string,\n content: string | Uint8Array,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(() =>\n execAppendFile(this.executor, path, content, this.execOptions(context)),\n );\n }\n\n truncateFile(path: string, size: number, context: Context): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`truncate -s ${Math.max(0, Math.floor(size))} ${shellEscape(path)}`, context);\n });\n }\n\n flushFile(path: string, context: Context): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`sync ${shellEscape(path)}`, context);\n });\n }\n\n renameFile(\n sourcePath: string,\n destinationPath: string,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n await this.run(`mv -f ${shellEscape(sourcePath)} ${shellEscape(destinationPath)}`, context);\n });\n }\n\n fileInfo(path: string, context: Context): Promise<Result<FileInfo, FileError>> {\n return this.fileOp(async () => {\n const escaped = shellEscape(path);\n const probe = await this.executor.exec(\n `if [ -L ${escaped} ]; then printf 'symlink'; elif [ -d ${escaped} ]; then printf 'directory'; ` +\n `elif [ -f ${escaped} ]; then printf 'file'; else exit 1; fi`,\n this.execOptions(context),\n );\n if (probe.code !== 0) throw new Error(`No such file or directory: ${path}`);\n const kind = probe.stdout.trim() as FileKind;\n let size = 0;\n if (kind === \"file\") {\n const stat = await this.executor.exec(`wc -c < ${escaped}`, this.execOptions(context));\n if (stat.code === 0) size = Number.parseInt(stat.stdout.trim(), 10) || 0;\n }\n let mtimeMs = 0;\n const mtime = await this.executor.exec(`date -r ${escaped} +%s`, this.execOptions(context));\n if (mtime.code === 0) mtimeMs = (Number.parseInt(mtime.stdout.trim(), 10) || 0) * 1000;\n return { name: posix.basename(path), path, kind, size, mtimeMs };\n });\n }\n\n async openBinaryReader(\n path: string,\n options: { noFollow?: boolean } | undefined,\n context: Context,\n ): Promise<Result<BinaryReader, FileError>> {\n return this.fileOp(async () => {\n const { stdout } = await this.run(\n `sh -c ${shellEscape(READ_REGULAR_FILE)} _ ${shellEscape(path)} ${options?.noFollow ? 1 : 0}`,\n context,\n );\n const headerEnd = stdout.indexOf(\"\\n\");\n const [kind, mtime] = stdout.slice(0, headerEnd).split(\" \");\n if (kind === \"missing\") throw new FileError(\"not_found\", `No such file: ${path}`, path);\n if (kind === \"directory\")\n throw new FileError(\"is_directory\", `Is a directory: ${path}`, path);\n if (kind !== \"file\") throw new FileError(\"invalid\", `Not a regular file: ${path}`, path);\n const bytes = Buffer.from(stdout.slice(headerEnd + 1).replace(/\\s+/g, \"\"), \"base64\");\n return new SnapshotBinaryReader(bytes, {\n name: posix.basename(path),\n path,\n kind: \"file\",\n size: bytes.length,\n mtimeMs: (Number.parseInt(mtime ?? \"\", 10) || 0) * 1000,\n });\n });\n }\n\n openDirReader(path: string, context: Context): Promise<Result<DirReader, FileError>> {\n return this.fileOp(async () => {\n const listed = await this.listDir(path, context);\n if (!listed.ok) throw listed.error;\n return new SnapshotDirReader(listed.value);\n });\n }\n\n async watch(): Promise<Result<FileWatcher, FileError>> {\n return err(new FileError(\"not_supported\", \"The sandbox does not report file changes\"));\n }\n\n async listDir(path: string, context: Context): Promise<Result<FileInfo[], FileError>> {\n return this.fileOp(async () => {\n const { stdout } = await this.run(`ls -A ${shellEscape(path)}`, context);\n const names = stdout.split(\"\\n\").filter(Boolean).toSorted();\n const entries: FileInfo[] = [];\n for (const name of names) {\n const child = posix.join(path, name);\n const info = await this.fileInfo(child, context);\n if (info.ok) entries.push(info.value);\n }\n return entries;\n });\n }\n\n canonicalPath(path: string, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(async () =>\n (await this.run(`realpath ${shellEscape(path)}`, context)).stdout.trim(),\n );\n }\n\n async exists(path: string, context: Context): Promise<Result<boolean, FileError>> {\n try {\n const result = await this.executor.exec(\n `test -e ${shellEscape(path)}`,\n this.execOptions(context),\n );\n return ok(result.code === 0);\n } catch (error) {\n return err(toFileError(error));\n }\n }\n\n createDir(\n path: string,\n options: { recursive?: boolean } | undefined,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n const flag = options?.recursive === false ? \"\" : \"-p \";\n await this.run(`mkdir ${flag}${shellEscape(path)}`, context);\n });\n }\n\n remove(\n path: string,\n options: { recursive?: boolean; force?: boolean } | undefined,\n context: Context,\n ): Promise<Result<void, FileError>> {\n return this.fileOp(async () => {\n const recursive = options?.recursive ? \"-r\" : \"\";\n const force = options?.force ? \"-f\" : \"\";\n await this.run(`rm ${recursive} ${force} ${shellEscape(path)}`, context);\n });\n }\n\n createTempDir(prefix: string | undefined, context: Context): Promise<Result<string, FileError>> {\n return this.fileOp(async () => {\n const template = prefix === undefined ? \"\" : shellEscape(`${prefix}XXXXXX`);\n const { stdout } = await this.run(`mktemp -d ${template}`.trim(), context);\n return stdout.trim();\n });\n }\n\n createTempFile(\n options: { prefix?: string; suffix?: string } | undefined,\n context: Context,\n ): Promise<Result<string, FileError>> {\n return this.fileOp(async () => {\n const template =\n options?.prefix === undefined && options?.suffix === undefined\n ? \"\"\n : shellEscape(`${options?.prefix ?? \"\"}XXXXXX${options?.suffix ?? \"\"}`);\n const { stdout } = await this.run(`mktemp ${template}`.trim(), context);\n return stdout.trim();\n });\n }\n\n async cleanup(_context: Context): Promise<void> {}\n\n async exec(\n command: string | readonly string[],\n options: ShellExecOptions | undefined,\n context: Context,\n ): Promise<Result<ShellExecResult, ExecutionError>> {\n try {\n const shellCommand =\n typeof command === \"string\" ? command : command.map(shellEscape).join(\" \");\n const result = await this.executor.exec(shellCommand, {\n cwd: options?.cwd || undefined,\n timeout: options?.timeout || undefined,\n signal: context.abortSignal,\n });\n const stdout =\n result.stdout.length > 0 && result.stderr.length > 0 ? `${result.stdout}\\n` : result.stdout;\n if (stdout.length > 0) options?.onOutput?.(stdout, context, { stream: \"stdout\" });\n if (result.stderr.length > 0) {\n options?.onOutput?.(result.stderr, context, { stream: \"stderr\" });\n }\n const combined = `${stdout}${result.stderr}`;\n return ok({ exitCode: result.code, spillPath: await this.spill(combined, options, context) });\n } catch (error) {\n return err(toExecutionError(error, context));\n }\n }\n\n private async spill(\n output: string,\n options: ShellExecOptions | undefined,\n context: Context,\n ): Promise<string | undefined> {\n const limits = options?.spill;\n if (!limits) return undefined;\n const lines = output.split(\"\\n\").length;\n if (Buffer.byteLength(output, \"utf8\") <= limits.afterBytes && lines <= limits.afterLines)\n return undefined;\n try {\n const spillPath = posix.join(this.cwd, SPILL_DIR, `${randomBytes(8).toString(\"hex\")}.log`);\n await this.executor.writeFile(spillPath, output, this.execOptions(context));\n return spillPath;\n } catch {\n return undefined;\n }\n }\n\n private execOptions(context: Context): { signal: AbortSignal | undefined } {\n return { signal: context.abortSignal };\n }\n\n private async run(\n command: string,\n context: Context,\n ): Promise<{ stdout: string; stderr: string }> {\n const result = await this.executor.exec(command, this.execOptions(context));\n if (result.code !== 0) {\n throw new Error(result.stderr.trim() || `Command failed (${result.code}): ${command}`);\n }\n return result;\n }\n\n private async fileOp<T>(op: () => Promise<T>): Promise<Result<T, FileError>> {\n try {\n return ok(await op());\n } catch (error) {\n return err(toFileError(error));\n }\n }\n}\n\nclass SnapshotBinaryReader implements BinaryReader {\n constructor(\n private readonly bytes: Uint8Array,\n private readonly metadata: FileInfo,\n ) {}\n\n async info(_context: Context): Promise<Result<FileInfo, FileError>> {\n return ok(this.metadata);\n }\n\n async read(\n offset: number,\n length: number,\n _context: Context,\n ): Promise<Result<Uint8Array, FileError>> {\n return ok(this.bytes.subarray(offset, offset + length));\n }\n\n async scanLines(\n options: { startLine: number; endLine?: number },\n _context: Context,\n ): Promise<Result<LineScan, FileError>> {\n const scanner = new LineScanner(options.startLine, options.endLine);\n scanner.push(this.bytes);\n return ok(scanner.finish());\n }\n\n async close(_context: Context): Promise<void> {}\n}\n\nclass SnapshotDirReader implements DirReader {\n private offset = 0;\n\n constructor(private readonly entries: FileInfo[]) {}\n\n async next(\n maxEntries: number,\n _context: Context,\n ): Promise<Result<{ entries: FileInfo[]; done: boolean }, FileError>> {\n const page = this.entries.slice(this.offset, this.offset + Math.max(1, maxEntries));\n this.offset += page.length;\n return ok({ entries: page, done: this.offset >= this.entries.length });\n }\n\n async close(_context: Context): Promise<void> {\n this.offset = this.entries.length;\n }\n}\n\nclass ShellTextLineReader implements TextLineReader {\n private offset = 0;\n\n constructor(private readonly content: string) {}\n\n async readLine(_context: Context): Promise<Result<TextLine | undefined, FileError>> {\n if (this.offset >= this.content.length) return ok(undefined);\n const newline = this.content.indexOf(\"\\n\", this.offset);\n if (newline === -1) {\n const text = this.content.slice(this.offset);\n this.offset = this.content.length;\n return ok({ text, terminated: false });\n }\n const text = this.content.slice(this.offset, newline);\n this.offset = newline + 1;\n return ok({ text, terminated: true });\n }\n\n async close(_context: Context): Promise<void> {\n this.offset = this.content.length;\n }\n}\n\nfunction toFileError(error: unknown): FileError {\n if (error instanceof FileError) return error;\n const message = errorMessage(error);\n if (/aborted/i.test(message)) return new FileError(\"aborted\", message);\n if (/no such file|not found/i.test(message)) return new FileError(\"not_found\", message);\n if (/permission denied/i.test(message)) return new FileError(\"permission_denied\", message);\n if (/not a directory/i.test(message)) return new FileError(\"not_directory\", message);\n if (/is a directory/i.test(message)) return new FileError(\"is_directory\", message);\n return new FileError(\"unknown\", message, undefined, error instanceof Error ? error : undefined);\n}\n\nfunction toExecutionError(error: unknown, context: Context): ExecutionError {\n const message = errorMessage(error);\n if (context.abortSignal?.aborted || /aborted/i.test(message)) {\n return new ExecutionError(\"aborted\", message);\n }\n if (/timed out/i.test(message)) return new ExecutionError(\"timeout\", message);\n return new ExecutionError(\"unknown\", message, error instanceof Error ? error : undefined);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EAEtB,kBAAkB,EAClB,yBAAyB,EAEzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAG1B,eAAe,EACf,sBAAsB,EAEtB,kBAAkB,EAClB,yBAAyB,EAEzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,aAAa,CAAC;AAmGrB,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA6CjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAwID,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC,CAsBf;AA+ED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyF/E;AAmfD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAyBlF"}
|