mirror of
https://github.com/stablyai/orca.git
synced 2026-10-03 08:02:12 +00:00
* refactor: split agent config and auth services * chore: repoint wsl and global-fetch guards at split module paths * fix: restore merge-base Claude CLI error propagation Drop the secret-redaction rewriting added to Claude CLI error paths in the refactor: spawn errors again reject with the original Error (preserving .code/.errno/.syscall/.stack) and command output/auth-status logs are no longer rewritten.
79 lines
3.3 KiB
TypeScript
79 lines
3.3 KiB
TypeScript
export function getStatusPluginMessagePreviewSource(): string[] {
|
|
return [
|
|
'',
|
|
'function capMessagePartText(text) {',
|
|
' return text.length > MESSAGE_PART_MAX_CHARS ? text.slice(0, MESSAGE_PART_MAX_CHARS) : text;',
|
|
'}',
|
|
'',
|
|
'async function postMessagePart(properties, factoryID) {',
|
|
' while (messagePartPostInFlight) await messagePartPostInFlight;',
|
|
' const delivery = post("MessagePart", properties);',
|
|
' messagePartPostInFlight = delivery;',
|
|
' try {',
|
|
' const delivered = await delivery;',
|
|
' if (delivered) deliveredMessagePartFactoryID = factoryID;',
|
|
' } finally {',
|
|
' if (messagePartPostInFlight === delivery) messagePartPostInFlight = null;',
|
|
' }',
|
|
'}',
|
|
'',
|
|
'async function flushPendingAssistantPart(force = false) {',
|
|
' if (assistantPartFlushTimer) {',
|
|
' clearTimeout(assistantPartFlushTimer);',
|
|
' assistantPartFlushTimer = null;',
|
|
' }',
|
|
' // Why: an idle/waiting transition must wait for every older preview;',
|
|
' // keep one post in flight while later snapshots coalesce in memory.',
|
|
' while (messagePartPostInFlight) await messagePartPostInFlight;',
|
|
' const pending = pendingAssistantPart;',
|
|
' pendingAssistantPart = null;',
|
|
' if (!pending) return;',
|
|
' if (',
|
|
' !activeFactoryIDs.has(pending.factoryID) ||',
|
|
' disposingFactoryIDs.has(pending.factoryID)',
|
|
' ) return;',
|
|
' if (!force && pending.authorityRevision !== stateArrivalRevision) return;',
|
|
' lastAssistantPartPostAt = Date.now();',
|
|
' await postMessagePart({',
|
|
' role: pending.role,',
|
|
' text: capMessagePartText(pending.text),',
|
|
' messageID: pending.messageID,',
|
|
' sessionID: pending.sessionID,',
|
|
' }, pending.factoryID);',
|
|
'}',
|
|
'',
|
|
'function queueAssistantPart(part) {',
|
|
' // Why: keep only the latest snapshot — each event already contains the',
|
|
' // full accumulated text, so intermediate snapshots are pure waste.',
|
|
' pendingAssistantPart = part;',
|
|
' const sinceLastPost = Date.now() - lastAssistantPartPostAt;',
|
|
' if (sinceLastPost >= MESSAGE_PART_THROTTLE_MS) {',
|
|
' void flushPendingAssistantPart();',
|
|
' return;',
|
|
' }',
|
|
' if (!assistantPartFlushTimer) {',
|
|
' assistantPartFlushTimer = setTimeout(() => {',
|
|
' void flushPendingAssistantPart();',
|
|
' }, MESSAGE_PART_THROTTLE_MS - sinceLastPost);',
|
|
' if (assistantPartFlushTimer.unref) assistantPartFlushTimer.unref();',
|
|
' }',
|
|
'}',
|
|
'',
|
|
'// Why: message.part.updated fires for every Part (text, tool, reasoning)',
|
|
'// but does not include the message role — that lives on the parent',
|
|
'// message.updated event. Cache the role per messageID so the plugin can',
|
|
'// tag a TextPart as user vs assistant when POSTing. Capped at 128 entries',
|
|
'// so long-running sessions do not grow this map unboundedly.',
|
|
'const messageRoleById = new Map();',
|
|
'function rememberMessageRole(messageID, role) {',
|
|
' if (!messageID || !role) return;',
|
|
' if (messageRoleById.size >= 128) {',
|
|
' const first = messageRoleById.keys().next().value;',
|
|
' if (first !== undefined) messageRoleById.delete(first);',
|
|
' }',
|
|
' messageRoleById.set(messageID, role);',
|
|
'}',
|
|
''
|
|
]
|
|
}
|