@symerian/symi 3.0.1 → 3.0.3

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.
Files changed (166) hide show
  1. package/dist/{agents-D4F5bhNg.js → agents-CeafvAwk.js} +4 -4
  2. package/dist/{agents.config-Czr0DbSr.js → agents.config-DyAqyKIS.js} +1 -1
  3. package/dist/{agents.config-DS9Gbqqg.js → agents.config-wJSTSxHw.js} +1 -1
  4. package/dist/{audio-preflight-Cje-A0Fs.js → audio-preflight-BrKBM7JM.js} +4 -4
  5. package/dist/{auth-choice-DU5o68ia.js → auth-choice-BrH3g0l7.js} +1 -1
  6. package/dist/{auth-choice-BU6XwruP.js → auth-choice-CSXt138B.js} +1 -1
  7. package/dist/{banner-qaKrETF8.js → banner-kkSwCGXn.js} +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/bundled/boot-md/handler.js +2 -2
  10. package/dist/bundled/session-memory/handler.js +2 -2
  11. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  12. package/dist/{channel-options-Bkfyg4nZ.js → channel-options-BC-QbEPJ.js} +1 -1
  13. package/dist/{channel-options-DW3nWxkv.js → channel-options-BdMw9pwh.js} +1 -1
  14. package/dist/{channel-web-DoDJqXyN.js → channel-web-B9o347ZR.js} +1 -1
  15. package/dist/{channels-cli-V7ii1g6k.js → channels-cli-CFZVgAxq.js} +6 -6
  16. package/dist/{channels-cli-B9tesYLD.js → channels-cli-n1iS1gNN.js} +6 -6
  17. package/dist/{chrome-DaduLVA1.js → chrome-WfENE6tB.js} +7 -7
  18. package/dist/{cli-CAhOnKQ3.js → cli-B3M7EAy1.js} +3 -3
  19. package/dist/{cli-0GHBNwqe.js → cli-C852-xID.js} +3 -3
  20. package/dist/{command-registry-Phoz_hat.js → command-registry-BRN6NMOS.js} +10 -10
  21. package/dist/{completion-cli-BAebbT-g.js → completion-cli-CQtI0ASD.js} +2 -2
  22. package/dist/{completion-cli-FR_B0tX1.js → completion-cli-EvxmKJ-O.js} +1 -1
  23. package/dist/{config-cli-BXus9Npr.js → config-cli-CiV_YQf4.js} +1 -1
  24. package/dist/{config-cli-DLSg0aaH.js → config-cli-DeCSlj0Y.js} +1 -1
  25. package/dist/{configure-BsrDBB87.js → configure-BE0YRZWd.js} +3 -3
  26. package/dist/{configure-CPweqV68.js → configure-By6_8Jvs.js} +3 -3
  27. package/dist/daemon-cli.js +6 -6
  28. package/dist/{deliver-B6vfVmif.js → deliver-DShQE_sq.js} +1 -1
  29. package/dist/{doctor-completion-D5BKaeyT.js → doctor-completion-BmjVxgkV.js} +1 -1
  30. package/dist/{doctor-completion-DBs809iZ.js → doctor-completion-Cts2UOop.js} +1 -1
  31. package/dist/entry.js +1 -1
  32. package/dist/extensionAPI.js +7 -7
  33. package/dist/{gateway-cli-DDxIyaeu.js → gateway-cli-DO4uSyVT.js} +12 -12
  34. package/dist/{gateway-cli-D7ppw9MR.js → gateway-cli-bu8Eq_hB.js} +12 -12
  35. package/dist/{glass-ui-ws-DSCEyW9z.js → glass-ui-ws-CUWkP3XZ.js} +10 -10
  36. package/dist/{glass-ui-ws-BK6Ca98g.js → glass-ui-ws-oxSeDi37.js} +10 -10
  37. package/dist/{health-ByAPhIlQ.js → health-DZB8SV6G.js} +69 -5
  38. package/dist/{health-VfVqsLcU.js → health-N-jvgpZZ.js} +69 -5
  39. package/dist/{heartbeat-visibility-ol7hy6FB.js → heartbeat-visibility-D6uZvFVV.js} +1 -1
  40. package/dist/{heartbeat-visibility-BdqXBLOd.js → heartbeat-visibility-_mPYbQT2.js} +1 -1
  41. package/dist/{hooks-cli-D8u-iqwZ.js → hooks-cli-BFZv9uGo.js} +4 -4
  42. package/dist/{hooks-cli-CA2ikPts.js → hooks-cli-DuKd3-QN.js} +4 -4
  43. package/dist/{image-C12-WOMI.js → image-DfzwGNoa.js} +1 -1
  44. package/dist/index.js +9 -9
  45. package/dist/llm-slug-generator.js +2 -2
  46. package/dist/{manager-DxihqoWd.js → manager-2D0Tevoj.js} +1 -1
  47. package/dist/{manager-DPxj_q1-.js → manager-DjHARmFk.js} +1 -1
  48. package/dist/{manager-DfZDS6-4.js → manager-DnkWmUWs.js} +1 -1
  49. package/dist/{manager-C9NXB77i.js → manager-Dp_9v8j5.js} +1 -1
  50. package/dist/{memory-cli-Bjj5cTuq.js → memory-cli-D69x8sVz.js} +3 -3
  51. package/dist/{memory-cli-D_O5bN6m.js → memory-cli-z9Rsga03.js} +3 -3
  52. package/dist/{models-CD7SOI3V.js → models-U6PPfAmY.js} +2 -2
  53. package/dist/{models-cli-Wjh_xd50.js → models-cli-DDev4qyK.js} +5 -5
  54. package/dist/{models-cli-Dj5BnQIi.js → models-cli-DiqDhhoK.js} +4 -4
  55. package/dist/{onboard-Bgl-nPXW.js → onboard-Bl0XFCEJ.js} +2 -2
  56. package/dist/{onboard-CCfkebWZ.js → onboard-DeH6Vxxg.js} +2 -2
  57. package/dist/{onboard-channels-CHJjmcTz.js → onboard-channels-CkFD8gYa.js} +1 -1
  58. package/dist/{onboard-channels-DKFmls3m.js → onboard-channels-Cky54l0-.js} +1 -1
  59. package/dist/{onboarding-CtCbkyNo.js → onboarding-BZVJ24wI.js} +3 -3
  60. package/dist/{onboarding-GXSRt2Z4.js → onboarding-DgpTBpWU.js} +3 -3
  61. package/dist/{onboarding.finalize-CTqy_Unj.js → onboarding.finalize-DVSMLcSy.js} +8 -8
  62. package/dist/{onboarding.finalize-Cyo7tKOt.js → onboarding.finalize-YB2UOZUK.js} +9 -9
  63. package/dist/{pi-embedded-gBOzgRYn.js → pi-embedded-C6GkUoi8.js} +77 -25
  64. package/dist/{pi-embedded-helpers-pMH6u36v.js → pi-embedded-helpers-B1k1RWqM.js} +4 -4
  65. package/dist/{plugin-registry-BMavDLfZ.js → plugin-registry-2T2NDPGh.js} +1 -1
  66. package/dist/{plugin-registry-CO6iA1TE.js → plugin-registry-739qhWq3.js} +1 -1
  67. package/dist/plugin-sdk/agents/system-prompt.d.ts +8 -0
  68. package/dist/plugin-sdk/{channel-web--Ru_sFHM.js → channel-web-DAJtsqF_.js} +1 -1
  69. package/dist/plugin-sdk/index.js +3 -3
  70. package/dist/plugin-sdk/infra/active-heartbeat-runs.d.ts +34 -0
  71. package/dist/plugin-sdk/{manager-CDV3YWoX.js → manager-DhiL-RSO.js} +1 -1
  72. package/dist/plugin-sdk/{synthesis-Bojs0PJL.js → synthesis-cOQ27lCy.js} +2 -2
  73. package/dist/plugin-sdk/{unified-runner-D7m-WeUt.js → unified-runner-KBVvJUFF.js} +63 -11
  74. package/dist/plugin-sdk/{web-BoYy2HSO.js → web-Bj-jTlHW.js} +3 -3
  75. package/dist/{plugins-cli-2A8lifj4.js → plugins-cli-BrLY9BMq.js} +4 -4
  76. package/dist/{plugins-cli-DhQzD98q.js → plugins-cli-rLBIo-nA.js} +4 -4
  77. package/dist/{program-DEaYsa-L.js → program-CKansE2A.js} +9 -9
  78. package/dist/{program-context-rJ500lzQ.js → program-context-DlM7Bnwp.js} +18 -18
  79. package/dist/{prompt-select-styled-BcJXLROq.js → prompt-select-styled-RR_-htsV.js} +6 -6
  80. package/dist/{prompt-select-styled-3tYztnc1.js → prompt-select-styled-YeADoH1b.js} +6 -6
  81. package/dist/{provider-auth-helpers-eQzmopYc.js → provider-auth-helpers-D7_-bTJg.js} +1 -1
  82. package/dist/{provider-auth-helpers-COKxBW7N.js → provider-auth-helpers-tiuH9v1U.js} +1 -1
  83. package/dist/{push-apns-CBPUnPja.js → push-apns-BP1rb3hW.js} +1 -1
  84. package/dist/{push-apns-kuIc4QSa.js → push-apns-CB9rSO0r.js} +1 -1
  85. package/dist/{pw-ai-D0CMQA23.js → pw-ai-Dd_QrTWR.js} +1 -1
  86. package/dist/{register.agent-Bj4dYxX1.js → register.agent-BXfiPWJL.js} +8 -8
  87. package/dist/{register.agent-CNpLOx-Y.js → register.agent-BadsiDY7.js} +7 -7
  88. package/dist/{register.configure-BsXY0hbE.js → register.configure-J5GbnUak.js} +9 -9
  89. package/dist/{register.configure-CM4isxt8.js → register.configure-ndWF-EwD.js} +9 -9
  90. package/dist/{register.maintenance-Bvt-fYOe.js → register.maintenance-BAlGfjMJ.js} +10 -10
  91. package/dist/{register.maintenance-Dphm3utW.js → register.maintenance-BvAh-5NH.js} +11 -11
  92. package/dist/{register.message-CuJ6kd3Y.js → register.message-CTQZsi6c.js} +4 -4
  93. package/dist/{register.message-C4WU4qwG.js → register.message-CyNUsm17.js} +4 -4
  94. package/dist/{register.onboard-D_HBo-CG.js → register.onboard-DPpsT1JH.js} +7 -7
  95. package/dist/{register.onboard-4GJ7224e.js → register.onboard-Dh4f0cDp.js} +7 -7
  96. package/dist/{register.setup-Blb61XAC.js → register.setup-BrjFdUZ8.js} +7 -7
  97. package/dist/{register.setup-BJ9kJazQ.js → register.setup-DU8piCcQ.js} +7 -7
  98. package/dist/{register.status-health-sessions-CRAYzQLg.js → register.status-health-sessions-Cyljneob.js} +6 -6
  99. package/dist/{register.status-health-sessions-B4hENuHX.js → register.status-health-sessions-jQvctMC3.js} +6 -6
  100. package/dist/{register.subclis-CmDRn7Z2.js → register.subclis-DOLKNKZj.js} +9 -9
  101. package/dist/{run-main-CPcu8T5o.js → run-main-DnvLmulK.js} +17 -17
  102. package/dist/{runner-7XhJhCc0.js → runner-CaXOtv_D.js} +1 -1
  103. package/dist/{server-methods-CX3ldLPd.js → server-methods-DFQlsPZN.js} +10 -9
  104. package/dist/{server-methods-DDbTMvnA.js → server-methods-DGQu3NEO.js} +10 -9
  105. package/dist/{server-node-events-Bzoq_nfx.js → server-node-events-BH1YaeId.js} +4 -4
  106. package/dist/{server-node-events-Ccoeyw6p.js → server-node-events-C3EVBwcx.js} +4 -4
  107. package/dist/{status-OAdlubd0.js → status-Cx2g82Iv.js} +3 -3
  108. package/dist/{status-BEAngZOJ.js → status-DBn69Azp.js} +3 -3
  109. package/dist/{status-CyHHusPc.js → status-DX8BiUs2.js} +1 -1
  110. package/dist/{status-BdKI8eQ7.js → status-DyQuiOVn.js} +1 -1
  111. package/dist/{subagent-registry-UkXCmOLK.js → subagent-registry-Y_8a_o-m.js} +63 -11
  112. package/dist/{synthesis-DGBPTml_.js → synthesis-BVbYJPM-.js} +3 -3
  113. package/dist/{synthesis-BkOyAKJV.js → synthesis-CTHSaeoU.js} +7 -7
  114. package/dist/{synthesis-DnRaxWS6.js → synthesis-DnFo8jPe.js} +2 -2
  115. package/dist/{synthesis-D_fSgB6z.js → synthesis-ntqeiu25.js} +3 -3
  116. package/dist/{unified-runner-BNTy0IvK.js → unified-runner-DWZT5BCl.js} +63 -11
  117. package/dist/{unified-runner-BlsArDPO.js → unified-runner-DwlXIEtb.js} +63 -11
  118. package/dist/{update-cli-Cwi3bnhh.js → update-cli-CYpz_sg2.js} +11 -11
  119. package/dist/{update-cli-DuALcXLb.js → update-cli-DKbaVaEp.js} +10 -10
  120. package/dist/{update-runner-DkNNsx67.js → update-runner-D1V7cGWA.js} +1 -1
  121. package/dist/{update-runner-C3OhMuSJ.js → update-runner-Des8yO8-.js} +1 -1
  122. package/dist/{web-Cp_dpAof.js → web-Cm1sUEcG.js} +5 -5
  123. package/dist/{web-DtgGgNSl.js → web-Dd2K5DCI.js} +4 -4
  124. package/dist/{web-arCxqOL_.js → web-DuUOtg8X.js} +7 -7
  125. package/dist/{web-PndcPkY5.js → web-VH47KruC.js} +2 -2
  126. package/extensions/bluebubbles/package.json +1 -1
  127. package/extensions/copilot-proxy/package.json +1 -1
  128. package/extensions/diagnostics-otel/package.json +1 -1
  129. package/extensions/discord/package.json +1 -1
  130. package/extensions/feishu/package.json +1 -1
  131. package/extensions/google-antigravity-auth/package.json +1 -1
  132. package/extensions/google-gemini-cli-auth/package.json +1 -1
  133. package/extensions/googlechat/package.json +1 -1
  134. package/extensions/imessage/package.json +1 -1
  135. package/extensions/irc/package.json +1 -1
  136. package/extensions/learning-loop/package.json +1 -1
  137. package/extensions/line/package.json +1 -1
  138. package/extensions/llm-task/package.json +1 -1
  139. package/extensions/matrix/CHANGELOG.md +12 -0
  140. package/extensions/matrix/package.json +1 -1
  141. package/extensions/mattermost/package.json +1 -1
  142. package/extensions/memory-core/package.json +1 -1
  143. package/extensions/memory-lancedb/package.json +1 -1
  144. package/extensions/minimax-portal-auth/package.json +1 -1
  145. package/extensions/msteams/CHANGELOG.md +12 -0
  146. package/extensions/msteams/package.json +1 -1
  147. package/extensions/nextcloud-talk/package.json +1 -1
  148. package/extensions/nostr/CHANGELOG.md +12 -0
  149. package/extensions/nostr/package.json +1 -1
  150. package/extensions/open-prose/package.json +1 -1
  151. package/extensions/outlook/package.json +1 -1
  152. package/extensions/pipeline/package.json +1 -1
  153. package/extensions/signal/package.json +1 -1
  154. package/extensions/slack/package.json +1 -1
  155. package/extensions/telegram/package.json +1 -1
  156. package/extensions/tlon/package.json +1 -1
  157. package/extensions/twitch/CHANGELOG.md +12 -0
  158. package/extensions/twitch/package.json +1 -1
  159. package/extensions/voice-call/CHANGELOG.md +12 -0
  160. package/extensions/voice-call/package.json +1 -1
  161. package/extensions/whatsapp/package.json +1 -1
  162. package/extensions/zalo/CHANGELOG.md +12 -0
  163. package/extensions/zalo/package.json +1 -1
  164. package/extensions/zalouser/CHANGELOG.md +12 -0
  165. package/extensions/zalouser/package.json +1 -1
  166. package/package.json +1 -1
@@ -14,7 +14,7 @@ import { a as logoutWeb, i as logWebSelfId, l as readWebSelfId, p as webAuthExis
14
14
  import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
15
15
  import { a as resolveSlackWebClientOptions, c as buildSlackBlocksFallbackText, i as createSlackWebClient, l as parseSlackTarget, o as parseSlackBlocksInput, s as validateSlackBlocksArray, t as sendMessageSlack, u as resolveSlackChannelId } from "./send-DMhDlUGJ.js";
16
16
  import { $ as fetchChannelPermissionsDiscord, A as unpinMessageDiscord, B as listScheduledEventsDiscord, C as editMessageDiscord, Ct as resolveTimestampMs, D as pinMessageDiscord, Dt as normalizeChannelSlug, E as listThreadsDiscord, Et as buildChannelKeyCandidates, F as fetchMemberInfoDiscord, G as uploadStickerDiscord, H as timeoutMemberDiscord, I as fetchRoleInfoDiscord, J as editChannelDiscord, K as createChannelDiscord, L as fetchVoiceStatusDiscord, M as banMemberDiscord, N as createScheduledEventDiscord, O as readMessagesDiscord, Ot as resolveChannelEntryMatchWithFallback, P as fetchChannelInfoDiscord, Q as stripUndefinedFields, R as kickMemberDiscord, S as deleteMessageDiscord, St as resolveDiscordSystemLocation, T as listPinsDiscord, Tt as applyChannelMatchMeta, U as listGuildEmojisDiscord, V as removeRoleDiscord, W as uploadEmojiDiscord, X as removeChannelPermissionDiscord, Y as moveChannelDiscord, Z as setChannelPermissionDiscord, _ as sendPollDiscord, _t as resolveDiscordShouldRequireMention, a as removeReactionDiscord, at as resolveDiscordChannelId, b as sendWebhookMessageDiscord, bt as formatDiscordReactionEmoji, c as formatDiscordComponentEventText, ct as allowListMatches$1, d as parseDiscordModalCustomId, dt as normalizeDiscordSlug, et as hasAnyGuildPermissionDiscord, f as parseDiscordModalCustomIdForCarbon, ft as resolveDiscordAllowListMatch, g as sendMessageDiscord, gt as resolveDiscordOwnerAllowFrom, h as resolveDiscordModalEntry, ht as resolveDiscordMemberAccessState, i as removeOwnReactionsDiscord, it as parseDiscordTarget, j as addRoleDiscord, k as searchMessagesDiscord, l as parseDiscordComponentCustomId, lt as isDiscordGroupAllowedByPolicy, m as resolveDiscordComponentEntry, mt as resolveDiscordGuildEntry, n as fetchReactionsDiscord, nt as createDiscordClient, o as sendDiscordComponentMessage, ot as listDiscordDirectoryGroupsLive, p as readDiscordComponentSpec, pt as resolveDiscordChannelConfigWithFallback, q as deleteChannelDiscord, r as reactMessageDiscord, rt as createDiscordRestClient, s as createDiscordFormModal, st as listDiscordDirectoryPeersLive, tt as chunkDiscordTextWithMode, u as parseDiscordComponentCustomIdForCarbon, ut as normalizeDiscordAllowList, v as sendStickerDiscord, vt as resolveGroupDmAllow, w as fetchMessageDiscord, wt as fetchDiscord, x as createThreadDiscord, xt as formatDiscordUserTag, y as sendVoiceMessageDiscord, yt as shouldEmitDiscordReactionNotification, z as listGuildChannelsDiscord } from "./send-ByAzOT7G.js";
17
- import { a as normalizeOutboundPayloadsForJson, c as normalizeChannelTargetInput, d as parseReplyDirectives, f as MEDIA_TOKEN_RE, g as initializeGlobalHookRunner, h as getGlobalHookRunner, i as normalizeOutboundPayloads, l as normalizeTargetForProvider, m as parseInlineDirectives$1, o as normalizeReplyPayloadsForDelivery, p as splitMediaFromOutput, r as formatOutboundPayloadLog, s as buildTargetResolverSignature, t as deliverOutboundPayloads, u as throwIfAborted } from "./deliver-B6vfVmif.js";
17
+ import { a as normalizeOutboundPayloadsForJson, c as normalizeChannelTargetInput, d as parseReplyDirectives, f as MEDIA_TOKEN_RE, g as initializeGlobalHookRunner, h as getGlobalHookRunner, i as normalizeOutboundPayloads, l as normalizeTargetForProvider, m as parseInlineDirectives$1, o as normalizeReplyPayloadsForDelivery, p as splitMediaFromOutput, r as formatOutboundPayloadLog, s as buildTargetResolverSignature, t as deliverOutboundPayloads, u as throwIfAborted } from "./deliver-DShQE_sq.js";
18
18
  import { a as logMessageProcessed, c as logWebhookError, d as startDiagnosticHeartbeat, f as stopDiagnosticHeartbeat, i as logLaneEnqueue, l as logWebhookProcessed, o as logMessageQueued, p as isDiagnosticsEnabled, r as logLaneDequeue, s as logSessionStateChange, t as diag, u as logWebhookReceived } from "./diagnostic-BVsSwe-J.js";
19
19
  import { r as getDiagnosticSessionState } from "./diagnostic-session-state-C1vRJs5w.js";
20
20
  import { n as resolveSignalAccount, t as listEnabledSignalAccounts } from "./accounts-8zZqL37v.js";
@@ -22,10 +22,10 @@ import { $ as isVoiceCompatibleAudio, A as extractTelegramLocation, B as normali
22
22
  import { d as detectMime, f as extensionForMime, g as isGifMedia, i as getImageMetadata, m as imageMimeFromFormat, s as resizeToJpeg, x as mediaKindFromMime, y as MAX_IMAGE_BYTES } from "./image-ops-BKUwjozo.js";
23
23
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-j5tVLINv.js";
24
24
  import { a as isMarkdownCapableMessageChannel, c as resolveGatewayMessageChannel, d as GATEWAY_CLIENT_MODES, f as GATEWAY_CLIENT_NAMES, i as isInternalMessageChannel, l as resolveMessageChannel, n as isDeliverableMessageChannel, o as listDeliverableMessageChannels, r as isGatewayMessageChannel, s as normalizeMessageChannel, t as INTERNAL_MESSAGE_CHANNEL, u as GATEWAY_CLIENT_IDS } from "./message-channel-BQINJQIT.js";
25
- import { $ as normalizeDeliveryContext, A as parseImageDimensionError, At as resolveExistingPathsWithinRoot, B as resolveAndPersistSessionFile, Bt as normalizeToolName, C as isFailoverAssistantError, Ct as acquireSessionWriteLock, D as isRawApiErrorPayload, Dt as resolveBrowserConfig, E as isRateLimitAssistantError, Et as registerBrowserRoutes, F as resolveSandboxRuntimeStatus, Ft as buildPluginToolGroups, G as updateLastRoute, Gt as buildBootstrapContextFiles, H as readSessionUpdatedAt, Ht as stripPluginOnlyAllowlist, I as extractDeliveryInfo, It as collectExplicitAllowlist, J as isCacheEnabled, Jt as resolveBootstrapTotalMaxChars, K as updateSessionStore, Kt as ensureSessionHeader, L as parseSessionThreadInfo, Lt as expandPolicyWithPluginGroups, M as sanitizeUserFacingText, Mt as ensureBrowserControlAuth, N as ensureSandboxWorkspaceForSession, Nt as resolveBrowserControlAuth, O as isTimeoutErrorMessage, Ot as resolveProfile, P as resolveSandboxContext, Pt as applyOwnerOnlyToolPolicy, Q as mergeDeliveryContext, R as appendAssistantMessageToSessionTranscript, Rt as expandToolGroups, S as isContextOverflowError, St as resolveGroupSessionKey, T as isLikelyContextOverflowError, Tt as createBrowserRouteContext, U as recordSessionMetaFromInbound, Ut as compileGlobPatterns, V as loadSessionStore, Vt as resolveToolProfilePolicy, Wt as matchesAnyGlobPattern, X as deliveryContextFromSession, Y as resolveCacheTtlMs$1, Yt as sanitizeGoogleTurnOrdering, Z as deliveryContextKey, _ as getApiErrorPayloadFingerprint, _t as resolveFreshSessionTotalTokens, a as normalizeTextForComparison, at as extractToolCallNames, b as isCloudCodeAssistFormatError, bt as resolveMainSessionKey, c as extractToolResultId, ct as hasInterSessionUserProvenance, d as isGoogleModelApi, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as BILLING_ERROR_USER_MESSAGE, ft as resolveChannelResetConfig, g as formatRawAssistantErrorForUi, gt as DEFAULT_RESET_TRIGGERS, h as formatBillingErrorMessage, ht as resolveThreadFlag, i as isMessagingToolDuplicateNormalized, it as countToolResults, j as parseImageSizeError, jt as getBridgeAuthForPort, k as isTransientHttpError, kt as DEFAULT_UPLOAD_DIR, l as downgradeOpenAIReasoningBlocks, lt as normalizeInputProvenance, m as formatAssistantErrorText, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as sanitizeSessionMessagesImages, ot as INPUT_PROVENANCE_KIND_VALUES, p as classifyFailoverReason, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as resolveBootstrapMaxChars, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as extractToolCallsFromAssistant, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as isAntigravityClaude, ut as resolveSessionKey, v as isAuthAssistantError, vt as canonicalizeMainSessionAlias, w as isFailoverErrorMessage, wt as resolveSessionLockMaxHoldFromTimeout, x as isCompactionFailureError, xt as deriveSessionMetaPatch, y as isBillingAssistantError, yt as resolveExplicitAgentSessionKey, zt as mergeAlsoAllowPolicy } from "./pi-embedded-helpers-pMH6u36v.js";
25
+ import { $ as normalizeDeliveryContext, A as parseImageDimensionError, At as resolveExistingPathsWithinRoot, B as resolveAndPersistSessionFile, Bt as normalizeToolName, C as isFailoverAssistantError, Ct as acquireSessionWriteLock, D as isRawApiErrorPayload, Dt as resolveBrowserConfig, E as isRateLimitAssistantError, Et as registerBrowserRoutes, F as resolveSandboxRuntimeStatus, Ft as buildPluginToolGroups, G as updateLastRoute, Gt as buildBootstrapContextFiles, H as readSessionUpdatedAt, Ht as stripPluginOnlyAllowlist, I as extractDeliveryInfo, It as collectExplicitAllowlist, J as isCacheEnabled, Jt as resolveBootstrapTotalMaxChars, K as updateSessionStore, Kt as ensureSessionHeader, L as parseSessionThreadInfo, Lt as expandPolicyWithPluginGroups, M as sanitizeUserFacingText, Mt as ensureBrowserControlAuth, N as ensureSandboxWorkspaceForSession, Nt as resolveBrowserControlAuth, O as isTimeoutErrorMessage, Ot as resolveProfile, P as resolveSandboxContext, Pt as applyOwnerOnlyToolPolicy, Q as mergeDeliveryContext, R as appendAssistantMessageToSessionTranscript, Rt as expandToolGroups, S as isContextOverflowError, St as resolveGroupSessionKey, T as isLikelyContextOverflowError, Tt as createBrowserRouteContext, U as recordSessionMetaFromInbound, Ut as compileGlobPatterns, V as loadSessionStore, Vt as resolveToolProfilePolicy, Wt as matchesAnyGlobPattern, X as deliveryContextFromSession, Y as resolveCacheTtlMs$1, Yt as sanitizeGoogleTurnOrdering, Z as deliveryContextKey, _ as getApiErrorPayloadFingerprint, _t as resolveFreshSessionTotalTokens, a as normalizeTextForComparison, at as extractToolCallNames, b as isCloudCodeAssistFormatError, bt as resolveMainSessionKey, c as extractToolResultId, ct as hasInterSessionUserProvenance, d as isGoogleModelApi, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as BILLING_ERROR_USER_MESSAGE, ft as resolveChannelResetConfig, g as formatRawAssistantErrorForUi, gt as DEFAULT_RESET_TRIGGERS, h as formatBillingErrorMessage, ht as resolveThreadFlag, i as isMessagingToolDuplicateNormalized, it as countToolResults, j as parseImageSizeError, jt as getBridgeAuthForPort, k as isTransientHttpError, kt as DEFAULT_UPLOAD_DIR, l as downgradeOpenAIReasoningBlocks, lt as normalizeInputProvenance, m as formatAssistantErrorText, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as sanitizeSessionMessagesImages, ot as INPUT_PROVENANCE_KIND_VALUES, p as classifyFailoverReason, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as resolveBootstrapMaxChars, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as extractToolCallsFromAssistant, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as isAntigravityClaude, ut as resolveSessionKey, v as isAuthAssistantError, vt as canonicalizeMainSessionAlias, w as isFailoverErrorMessage, wt as resolveSessionLockMaxHoldFromTimeout, x as isCompactionFailureError, xt as deriveSessionMetaPatch, y as isBillingAssistantError, yt as resolveExplicitAgentSessionKey, zt as mergeAlsoAllowPolicy } from "./pi-embedded-helpers-B1k1RWqM.js";
26
26
  import { A as VERSION, C as getConfigValueAtPath, D as isSafeExecutableValue, E as unsetConfigValueAtPath, O as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, S as unsetConfigOverride, T as setConfigValueAtPath, _ as parseDurationMs, a as writeConfigFile, b as resetConfigOverrides, c as TELEGRAM_COMMAND_NAME_PATTERN, f as isInboundPathAllowed, g as normalizeScpRemoteHost, h as resolveIMessageRemoteAttachmentRoots, i as resolveConfigSnapshotHash, k as resolveAgentMaxConcurrent, l as normalizeTelegramCommandName, m as resolveIMessageAttachmentRoots, n as loadConfig, o as validateConfigObjectWithPlugins, r as readConfigFileSnapshot, u as resolveTelegramCustomCommands, v as validateJsonSchemaValue, w as parseConfigPath, x as setConfigOverride, y as getConfigOverrides } from "./config-BOuq5KZE.js";
27
27
  import { c as normalizePluginsConfig, f as isPathInsideWithRealpath, i as safeStatSync, l as resolveEnableState, n as discoverSymiPlugins, p as isDangerousHostEnvVarName, r as isPathInside, s as applyTestPluginDefaults, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-DWdYdchb.js";
28
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-DaduLVA1.js";
28
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-WfENE6tB.js";
29
29
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, h as parseFrontmatterBlock, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-amp3F-om.js";
30
30
  import { n as formatErrorMessage, r as formatUncaughtError } from "./errors-CPfngF0S.js";
31
31
  import { i as isBlockedHostnameOrIp, o as normalizeHostname, t as SsrFBlockedError } from "./ssrf-CxfFyMRZ.js";
@@ -36,8 +36,8 @@ import { t as resolveIMessageAccount } from "./accounts-DImOt9jX.js";
36
36
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as resolveSessionTranscriptsDirForAgent, r as resolveSessionFilePathOptions, s as resolveStorePath, t as resolveDefaultSessionStorePath } from "./paths-DkMamAQ-.js";
37
37
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-C8Tqw4td.js";
38
38
  import { i as resolveImageSanitizationLimits, n as sanitizeImageBlocks, r as sanitizeToolResultImages } from "./tool-images-CdTyeTEN.js";
39
- import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-C12-WOMI.js";
40
- import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-C9NXB77i.js";
39
+ import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-DfzwGNoa.js";
40
+ import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-Dp_9v8j5.js";
41
41
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-479FB0St.js";
42
42
  import { n as retryAsync } from "./retry-QGp0jvVi.js";
43
43
  import { a as createActionGate, c as jsonResult, d as readReactionParams, f as readStringArrayParam, l as parseAvailableTags, m as readStringParam, n as missingTargetError, o as imageResult, p as readStringOrNumberParam, r as unknownTargetError, s as imageResultFromFile, t as ambiguousTargetError, u as readNumberParam } from "./target-errors-43lkDH_r.js";
@@ -49,7 +49,7 @@ import { a as loadWebMedia, i as getDefaultLocalRoots } from "./ir-CDdlA9_f.js";
49
49
  import { _ as resolveNativeCommandsEnabled, a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, g as isRestartEnabled, h as isNativeCommandsExplicitlyDisabled, i as listChatCommands, l as parseCommandArgs, m as isCommandFlagEnabled, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices, v as resolveNativeSkillsEnabled } from "./commands-registry-iF38r_Xp.js";
50
50
  import { c as getSkillsSnapshotVersion, d as createAsyncLock, f as readJsonFile, i as resolveSkillCommandInvocation, l as pruneExpiredPending, n as listSkillCommandsForAgents, o as getRemoteSkillEligibility, p as writeJsonAtomic, r as listSkillCommandsForWorkspace, s as ensureSkillsWatcher, t as listReservedChatSlashCommandNames, u as resolvePairingPaths } from "./skill-commands-c5Lly1_3.js";
51
51
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-CgGv6nTy.js";
52
- import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-7XhJhCc0.js";
52
+ import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-CaXOtv_D.js";
53
53
  import { n as wrapFetchWithAbortSignal, t as resolveFetch } from "./fetch-WLZaC77l.js";
54
54
  import { n as recordCommandPoll, r as resetCommandPollCount } from "./command-poll-backoff-BaoETsQI.js";
55
55
  import { n as recordChannelActivity, r as createDiscordRetryRunner, t as getChannelActivity } from "./channel-activity-C-6tM-GK.js";
@@ -80,7 +80,7 @@ import { EdgeTTS } from "node-edge-tts";
80
80
  import AjvPkg from "ajv";
81
81
  import { createServer } from "node:http";
82
82
  import { ProxyAgent, fetch as fetch$1 } from "undici";
83
- import WebSocket$1, { WebSocket } from "ws";
83
+ import WebSocket, { WebSocket as WebSocket$1 } from "ws";
84
84
  import { Buffer as Buffer$1 } from "node:buffer";
85
85
  import { createJiti } from "jiti";
86
86
  import { Type } from "@sinclair/typebox";
@@ -3473,7 +3473,7 @@ async function getMemorySearchManager(params) {
3473
3473
  const wrapper = new FallbackMemoryManager({
3474
3474
  primary,
3475
3475
  fallbackFactory: async () => {
3476
- const { MemoryIndexManager } = await import("./manager-C9NXB77i.js").then((n) => n.t);
3476
+ const { MemoryIndexManager } = await import("./manager-Dp_9v8j5.js").then((n) => n.t);
3477
3477
  return await MemoryIndexManager.get(params);
3478
3478
  }
3479
3479
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3486,7 +3486,7 @@ async function getMemorySearchManager(params) {
3486
3486
  }
3487
3487
  }
3488
3488
  try {
3489
- const { MemoryIndexManager } = await import("./manager-C9NXB77i.js").then((n) => n.t);
3489
+ const { MemoryIndexManager } = await import("./manager-Dp_9v8j5.js").then((n) => n.t);
3490
3490
  return { manager: await MemoryIndexManager.get(params) };
3491
3491
  } catch (err) {
3492
3492
  return {
@@ -5879,7 +5879,7 @@ var GatewayClient = class {
5879
5879
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5880
5880
  });
5881
5881
  }
5882
- this.ws = new WebSocket(url, wsOptions);
5882
+ this.ws = new WebSocket$1(url, wsOptions);
5883
5883
  this.ws.on("open", () => {
5884
5884
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5885
5885
  const tlsError = this.validateTlsFingerprint();
@@ -6098,7 +6098,7 @@ var GatewayClient = class {
6098
6098
  return null;
6099
6099
  }
6100
6100
  async request(method, params, opts) {
6101
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
6101
+ if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
6102
6102
  const id = randomUUID();
6103
6103
  const frame = {
6104
6104
  type: "req",
@@ -7339,7 +7339,7 @@ async function routeReply(params) {
7339
7339
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7340
7340
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7341
7341
  try {
7342
- const { deliverOutboundPayloads } = await import("./deliver-B6vfVmif.js").then((n) => n.n);
7342
+ const { deliverOutboundPayloads } = await import("./deliver-DShQE_sq.js").then((n) => n.n);
7343
7343
  return {
7344
7344
  ok: true,
7345
7345
  messageId: (await deliverOutboundPayloads({
@@ -22085,6 +22085,40 @@ function sanitizeForPromptLiteral(value) {
22085
22085
 
22086
22086
  //#endregion
22087
22087
  //#region src/agents/system-prompt.ts
22088
+ /**
22089
+ * Read up to `limit` markdown filenames from `<workspaceDir>/memory/`,
22090
+ * sorted by mtime descending. Returns relative names (e.g. "2026-04-30.md")
22091
+ * for inlining into the system prompt — gives the agent the actual file
22092
+ * surface so it doesn't speculate names like "memory/2026-04-30.md" from
22093
+ * training-data priors. Resilient: missing dir → [], unreadable → [].
22094
+ */
22095
+ function listWorkspaceMemoryFiles(workspaceDir, limit = 10) {
22096
+ if (!workspaceDir) return [];
22097
+ const memoryDir = path.join(workspaceDir, "memory");
22098
+ let entries;
22099
+ try {
22100
+ entries = fs.readdirSync(memoryDir, { withFileTypes: true });
22101
+ } catch {
22102
+ return [];
22103
+ }
22104
+ const files = [];
22105
+ for (const entry of entries) {
22106
+ if (!entry.isFile()) continue;
22107
+ if (!entry.name.toLowerCase().endsWith(".md")) continue;
22108
+ let mtimeMs = 0;
22109
+ try {
22110
+ mtimeMs = fs.statSync(path.join(memoryDir, entry.name)).mtimeMs;
22111
+ } catch {
22112
+ mtimeMs = 0;
22113
+ }
22114
+ files.push({
22115
+ name: entry.name,
22116
+ mtimeMs
22117
+ });
22118
+ }
22119
+ files.sort((a, b) => b.mtimeMs - a.mtimeMs);
22120
+ return files.slice(0, limit).map((f) => f.name);
22121
+ }
22088
22122
  function buildSkillsSection(params) {
22089
22123
  if (params.isMinimal) return [];
22090
22124
  if (params.dropCatalog) return [];
@@ -22108,13 +22142,21 @@ function buildMemorySection(params) {
22108
22142
  "## Memory Recall",
22109
22143
  "Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search on MEMORY.md + memory/*.md; then use memory_get to pull only the needed lines. If low confidence after search, say you checked.",
22110
22144
  "",
22145
+ "**Never speculate memory file paths.** Use memory_search to find content; do not construct paths like `memory/<date>.md` from training-data priors and call read on them — that produces ENOENT spam and trips the consecutive-tool-error breaker.",
22146
+ "",
22111
22147
  "Memory is split into two layers you will see as files:",
22112
22148
  "- `MEMORY.md` — user-authored short-term memory. Hand-edited by the user; treat as ground truth they wrote themselves. Never rewrite it yourself.",
22113
- "- `memory/symi-core.md` + `memory/symi-beliefs.md` — long-term memory automatically consolidated from repeated observations (your evolving self). Do NOT hand-edit these files: they are regenerated each consolidation cycle. When the files disagree with a fresh user statement, trust the fresh statement and write a new observation to `memory/YYYY-MM-DD.md` the cycle will reconcile them.",
22114
- "- `memory/YYYY-MM-DD.md` daily append-only observations. This is where new memories land.",
22115
- "",
22116
- "When the user explicitly asks to *remember* or *always remember* something, after writing the observation also call `memory_pin` with a distinctive query so the fact survives pruning. Call `memory_unpin` when the user says to forget it."
22149
+ "- `memory/symi-core.md` + `memory/symi-beliefs.md` — long-term memory automatically consolidated from repeated observations (your evolving self). Do NOT hand-edit these files: they are regenerated each consolidation cycle. When the files disagree with a fresh user statement, trust the fresh statement and write a new observation. The cycle will reconcile them.",
22150
+ "- New observations go in dated daily files (e.g. `memory/<today>.md`); use `memory_search` to discover what already exists rather than guessing filenames."
22117
22151
  ];
22152
+ const memoryFiles = (params.workspaceMemoryFiles ?? []).filter(Boolean);
22153
+ if (memoryFiles.length > 0) {
22154
+ lines.push("");
22155
+ lines.push("Existing memory files in this workspace (most-recently-modified first):");
22156
+ for (const name of memoryFiles) lines.push(`- \`memory/${name}\``);
22157
+ }
22158
+ lines.push("");
22159
+ lines.push("When the user explicitly asks to *remember* or *always remember* something, after writing the observation also call `memory_pin` with a distinctive query so the fact survives pruning. Call `memory_unpin` when the user says to forget it.");
22118
22160
  if (params.citationsMode === "off") lines.push("Citations are disabled: do not mention file paths or line numbers in replies unless the user explicitly asks.");
22119
22161
  else lines.push("Citations: include Source: <path#line> when it helps the user verify memory snippets.");
22120
22162
  lines.push("");
@@ -22403,7 +22445,8 @@ function buildAgentSystemPrompt(params) {
22403
22445
  const memorySection = buildMemorySection({
22404
22446
  isMinimal,
22405
22447
  availableTools,
22406
- citationsMode: params.memoryCitationsMode
22448
+ citationsMode: params.memoryCitationsMode,
22449
+ workspaceMemoryFiles: listWorkspaceMemoryFiles(params.workspaceDir)
22407
22450
  });
22408
22451
  const docsSection = buildDocsSection({
22409
22452
  docsPath: params.docsPath,
@@ -22441,6 +22484,11 @@ function buildAgentSystemPrompt(params) {
22441
22484
  "If a task is more complex or takes longer, spawn a sub-agent. Completion is push-based: it will auto-announce when done.",
22442
22485
  "Do not poll `subagents list` / `sessions_list` in a loop; only check status on-demand (for intervention, debugging, or when explicitly asked).",
22443
22486
  "",
22487
+ "## Tool Use Discipline (mandatory)",
22488
+ "- If the user explicitly tells you to use a tool (e.g., \"use exec to run X\", \"read the file with read\", \"check the hostname\"), you MUST invoke that tool. Do not answer from training data or memory in place of the tool call.",
22489
+ "- Never narrate or quote tool output you did not actually receive from a real tool result. Writing \"I ran X and got Y\" without a corresponding tool invocation is fabrication and breaks user trust.",
22490
+ "- For factual local-system lookups (hostname, file contents, process state, env vars, current dir, system info), the answer comes from invoking the appropriate tool — not from priors. Always invoke.",
22491
+ "",
22444
22492
  ...compactMode ? [] : [
22445
22493
  "## Tool Call Style",
22446
22494
  "Default: do not narrate routine, low-risk tool calls (just call the tool).",
@@ -39428,7 +39476,7 @@ async function deliverSessionMaintenanceWarning(params) {
39428
39476
  return;
39429
39477
  }
39430
39478
  try {
39431
- const { deliverOutboundPayloads } = await import("./deliver-B6vfVmif.js").then((n) => n.n);
39479
+ const { deliverOutboundPayloads } = await import("./deliver-DShQE_sq.js").then((n) => n.n);
39432
39480
  await deliverOutboundPayloads({
39433
39481
  cfg: params.cfg,
39434
39482
  channel,
@@ -40611,7 +40659,11 @@ const SAFETY_AND_STYLE_ADDITIONS = [
40611
40659
  "- Do not write verification checklists, self-assessments, or numbered assessment lists after your answer.",
40612
40660
  "- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
40613
40661
  "- If you need to verify your work, do so before writing your response, not after.",
40614
- "- Send brief progress updates on long tasks so the user knows you are active."
40662
+ "- Send brief progress updates on long tasks so the user knows you are active.",
40663
+ "TOOL USE DISCIPLINE (no fabrication):",
40664
+ "- If the user asks you to use a tool (e.g., 'use exec to run X', 'read the file', 'check the hostname'), you MUST invoke that tool. Do not answer from training data or priors in place of an actual tool call.",
40665
+ "- Never narrate or quote tool output you did not receive from a real tool result. Writing 'I ran X and got Y' without a corresponding tool call is fabrication.",
40666
+ "- For local-system facts (hostname, file contents, process state, env vars, current dir), the answer comes from running the tool, not from priors — always invoke."
40615
40667
  ];
40616
40668
  /** Hint for native-reasoning models (Nemotron, Qwen 3.5/3.6) to keep
40617
40669
  * planning internal. Not applied to Gemma/Ollama because those models
@@ -53612,7 +53664,7 @@ async function describeStickerImage(params) {
53612
53664
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
53613
53665
  try {
53614
53666
  const buffer = await fs$1.readFile(imagePath);
53615
- const { describeImageWithModel } = await import("./image-C12-WOMI.js").then((n) => n.n);
53667
+ const { describeImageWithModel } = await import("./image-DfzwGNoa.js").then((n) => n.n);
53616
53668
  return (await describeImageWithModel({
53617
53669
  buffer,
53618
53670
  fileName: "sticker.webp",
@@ -56361,7 +56413,7 @@ async function preflightDiscordMessage(params) {
56361
56413
  let preflightTranscript;
56362
56414
  const hasAudioAttachment = message.attachments?.some((att) => att.contentType?.startsWith("audio/"));
56363
56415
  if (!isDirectMessage && shouldRequireMention && hasAudioAttachment && !baseText && mentionRegexes.length > 0) try {
56364
- const { transcribeFirstAudio } = await import("./audio-preflight-Cje-A0Fs.js");
56416
+ const { transcribeFirstAudio } = await import("./audio-preflight-BrKBM7JM.js");
56365
56417
  const audioPaths = message.attachments?.filter((att) => att.contentType?.startsWith("audio/")).map((att) => att.url) ?? [];
56366
56418
  if (audioPaths.length > 0) preflightTranscript = await transcribeFirstAudio({
56367
56419
  ctx: {
@@ -60884,7 +60936,7 @@ function setCliSessionId(entry, provider, sessionId) {
60884
60936
  function createDefaultDeps() {
60885
60937
  return {
60886
60938
  sendMessageWhatsApp: async (...args) => {
60887
- const { sendMessageWhatsApp } = await import("./web-arCxqOL_.js");
60939
+ const { sendMessageWhatsApp } = await import("./web-DuUOtg8X.js");
60888
60940
  return await sendMessageWhatsApp(...args);
60889
60941
  },
60890
60942
  sendMessageTelegram: async (...args) => {
@@ -63789,7 +63841,7 @@ function createDiscordGatewayPlugin(params) {
63789
63841
  super(options);
63790
63842
  }
63791
63843
  createWebSocket(url) {
63792
- return new WebSocket$1(url, { agent });
63844
+ return new WebSocket(url, { agent });
63793
63845
  }
63794
63846
  }
63795
63847
  return new ProxyGatewayPlugin();
@@ -74007,7 +74059,7 @@ const buildTelegramMessageContext = async ({ primaryCtx, allMedia, storeAllowFro
74007
74059
  const hasAudio = allMedia.some((media) => media.contentType?.startsWith("audio/"));
74008
74060
  let preflightTranscript;
74009
74061
  if (isGroup && requireMention && hasAudio && !hasUserText && mentionRegexes.length > 0) try {
74010
- const { transcribeFirstAudio } = await import("./audio-preflight-Cje-A0Fs.js");
74062
+ const { transcribeFirstAudio } = await import("./audio-preflight-BrKBM7JM.js");
74011
74063
  preflightTranscript = await transcribeFirstAudio({
74012
74064
  ctx: {
74013
74065
  MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : void 0,
@@ -76164,7 +76216,7 @@ function loadWebLoginQr() {
76164
76216
  return webLoginQrPromise;
76165
76217
  }
76166
76218
  function loadWebChannel() {
76167
- webChannelPromise ??= import("./web-arCxqOL_.js");
76219
+ webChannelPromise ??= import("./web-DuUOtg8X.js");
76168
76220
  return webChannelPromise;
76169
76221
  }
76170
76222
  function loadWhatsAppActions() {
@@ -10,7 +10,7 @@ import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
10
10
  import { c as SafeOpenError, i as getImageMetadata, l as openFileWithinRoot, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-BKUwjozo.js";
11
11
  import { o as listDeliverableMessageChannels, s as normalizeMessageChannel } from "./message-channel-BQINJQIT.js";
12
12
  import { _ as parseDurationMs, a as writeConfigFile, n as loadConfig, s as parseByteSize, t as createConfigIO } from "./config-BOuq5KZE.js";
13
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DaduLVA1.js";
13
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-WfENE6tB.js";
14
14
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-amp3F-om.js";
15
15
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-CPfngF0S.js";
16
16
  import { t as SsrFBlockedError } from "./ssrf-CxfFyMRZ.js";
@@ -938,7 +938,7 @@ function isModuleNotFoundError(err) {
938
938
  }
939
939
  async function loadPwAiModule(mode) {
940
940
  try {
941
- return await import("./pw-ai-D0CMQA23.js");
941
+ return await import("./pw-ai-Dd_QrTWR.js");
942
942
  } catch (err) {
943
943
  if (mode === "soft") return null;
944
944
  if (isModuleNotFoundError(err)) return null;
@@ -3478,11 +3478,11 @@ function createProfileContext(opts, profile) {
3478
3478
  const userDataDir = resolveSymiUserDataDir(profile.name);
3479
3479
  const profileState = getProfileState();
3480
3480
  if (await isHttpReachable(300) && !profileState.running) try {
3481
- await (await import("./pw-ai-D0CMQA23.js")).closePlaywrightBrowserConnection();
3481
+ await (await import("./pw-ai-Dd_QrTWR.js")).closePlaywrightBrowserConnection();
3482
3482
  } catch {}
3483
3483
  if (profileState.running) await stopRunningBrowser();
3484
3484
  try {
3485
- await (await import("./pw-ai-D0CMQA23.js")).closePlaywrightBrowserConnection();
3485
+ await (await import("./pw-ai-Dd_QrTWR.js")).closePlaywrightBrowserConnection();
3486
3486
  } catch {}
3487
3487
  if (!fs.existsSync(userDataDir)) return {
3488
3488
  moved: false,
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { s as loadSymiPlugins } from "./unified-runner-BNTy0IvK.js";
2
+ import { s as loadSymiPlugins } from "./unified-runner-DWZT5BCl.js";
3
3
  import { d as getActivePluginRegistry } from "./registry-ClO_zVv-.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-zqierDLj.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-BajBuriF.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { M as getActivePluginRegistry, o as createSubsystemLogger } from "./entry.js";
3
3
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-xM36I1Em.js";
4
4
  import { i as loadConfig } from "./config-BaxT9cN4.js";
5
- import { m as loadSymiPlugins } from "./subagent-registry-UkXCmOLK.js";
5
+ import { m as loadSymiPlugins } from "./subagent-registry-Y_8a_o-m.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -2,6 +2,14 @@ import type { ReasoningLevel, ThinkLevel } from "../auto-reply/thinking.js";
2
2
  import type { MemoryCitationsMode } from "../config/types.memory.js";
3
3
  import type { ResolvedTimeFormat } from "./date-time.js";
4
4
  import type { EmbeddedContextFile } from "./pi-embedded-helpers.js";
5
+ /**
6
+ * Read up to `limit` markdown filenames from `<workspaceDir>/memory/`,
7
+ * sorted by mtime descending. Returns relative names (e.g. "2026-04-30.md")
8
+ * for inlining into the system prompt — gives the agent the actual file
9
+ * surface so it doesn't speculate names like "memory/2026-04-30.md" from
10
+ * training-data priors. Resilient: missing dir → [], unreadable → [].
11
+ */
12
+ export declare function listWorkspaceMemoryFiles(workspaceDir: string, limit?: number): string[];
5
13
  /**
6
14
  * Controls which hardcoded sections are included in the system prompt.
7
15
  * - "full": All sections (default, for main agent)
@@ -1,6 +1,6 @@
1
1
  import { a as buildGroupHistoryKey, n as DEFAULT_MAIN_KEY, r as buildAgentMainSessionKey, s as normalizeAgentId } from "./session-key-C_0eELjb.js";
2
2
  import { f as readWebSelfId, o as getWebAuthAgeMs, r as resolveWhatsAppAccount } from "./accounts-D9zGZU5t.js";
3
- import { G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as formatInboundEnvelope, b as shouldComputeCommandAuthorized, c as buildPairingReply, d as formatDurationPrecise, f as enqueueSystemEvent, g as resolveInboundDebounceMs, h as createInboundDebouncer, ht as createDedupeCache, l as dispatchReplyWithBufferedBlockDispatcher, m as parseActivationCommand, nt as buildMentionRegexes, o as computeBackoff, p as normalizeGroupActivation, rt as normalizeMentionText, s as sleepWithAbort, tt as recordPendingHistoryEntryIfEnabled, v as resolveEnvelopeFormatOptions, y as hasControlCommand } from "./unified-runner-D7m-WeUt.js";
3
+ import { G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as formatInboundEnvelope, b as shouldComputeCommandAuthorized, c as buildPairingReply, d as formatDurationPrecise, f as enqueueSystemEvent, g as resolveInboundDebounceMs, h as createInboundDebouncer, ht as createDedupeCache, l as dispatchReplyWithBufferedBlockDispatcher, m as parseActivationCommand, nt as buildMentionRegexes, o as computeBackoff, p as normalizeGroupActivation, rt as normalizeMentionText, s as sleepWithAbort, tt as recordPendingHistoryEntryIfEnabled, v as resolveEnvelopeFormatOptions, y as hasControlCommand } from "./unified-runner-KBVvJUFF.js";
4
4
  import { A as normalizeE164, B as toWhatsappJid, K as logVerbose, N as resolveJidToE164, O as isSelfChatMode, R as sleep, Y as shouldLogVerbose, k as jidToE164, s as normalizeChatChannelId, tt as getChildLogger, x as clamp } from "./registry--_pGht6S.js";
5
5
  import { n as loadConfig } from "./config-BBBu18xQ.js";
6
6
  import { i as defaultRuntime, t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
@@ -1,6 +1,6 @@
1
1
  import { f as DEFAULT_ACCOUNT_ID, p as normalizeAccountId } from "./session-key-C_0eELjb.js";
2
2
  import { _ as createAccountListHelpers, i as resolveWhatsAppAuthDir, n as resolveDefaultWhatsAppAccountId, r as resolveWhatsAppAccount, t as listWhatsAppAccountIds } from "./accounts-D9zGZU5t.js";
3
- import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as processLineMessage, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, E as attachFooterText, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as hasMarkdownToConvert, St as listThreadBindingsBySessionKey, T as createReceiptCard, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as resolveLineAccount, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as resolveDefaultLineAccountId, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, n as listLineAccountIds, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, r as normalizeAccountId$1, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as stripMarkdown, wt as formatAllowlistMatchMeta, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./unified-runner-D7m-WeUt.js";
3
+ import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as processLineMessage, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, E as attachFooterText, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as hasMarkdownToConvert, St as listThreadBindingsBySessionKey, T as createReceiptCard, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as resolveLineAccount, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as resolveDefaultLineAccountId, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, n as listLineAccountIds, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, r as normalizeAccountId$1, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as stripMarkdown, wt as formatAllowlistMatchMeta, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./unified-runner-KBVvJUFF.js";
4
4
  import "./paths-DR2yt_mP.js";
5
5
  import "./github-copilot-token-D9X2phUj.js";
6
6
  import { D as resolveSlackAccount, E as resolveDefaultSlackAccountId, F as resolveDiscordAccount, M as listDiscordAccountIds, O as resolveSlackReplyToMode, P as resolveDefaultDiscordAccountId, S as resolveTelegramAccount, T as listSlackAccountIds, _ as normalizeWhatsAppTarget, a as listDiscordDirectoryPeersFromConfig, b as listTelegramAccountIds, c as listTelegramDirectoryGroupsFromConfig, d as listWhatsAppDirectoryPeersFromConfig, f as looksLikeSlackTargetId, g as isWhatsAppGroupJid, i as listDiscordDirectoryGroupsFromConfig, l as listTelegramDirectoryPeersFromConfig, o as listSlackDirectoryGroupsFromConfig, p as normalizeSlackMessagingTarget, s as listSlackDirectoryPeersFromConfig, u as listWhatsAppDirectoryGroupsFromConfig, w as listEnabledSlackAccounts, x as resolveDefaultTelegramAccountId } from "./plugins-muf5lfx-.js";
@@ -47,12 +47,12 @@ import "./paths-A0xdf3yk.js";
47
47
  import { h as onDiagnosticEvent, m as isDiagnosticsEnabled, p as emitDiagnosticEvent } from "./diagnostic-fnIb_o_V.js";
48
48
  import { n as extractOriginalFilename } from "./store-uf7TpQm3.js";
49
49
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BkHNUpdB.js";
50
- import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web--Ru_sFHM.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-DAJtsqF_.js";
51
51
  import "./diagnostic-session-state-DnkpMfCl.js";
52
52
  import "./image-B7fj8HDX.js";
53
53
  import "./pi-auth-json-BOqOPkC8.js";
54
54
  import "./pi-model-discovery-Cdz3tuFk.js";
55
- import "./manager-CDV3YWoX.js";
55
+ import "./manager-DhiL-RSO.js";
56
56
  import "./gemini-auth-lC1AI-WK.js";
57
57
  import "./sqlite-BflKfcLD.js";
58
58
  import "./commands-registry-L_7UhT9Y.js";
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Register an AbortController as the controller for an in-flight
3
+ * heartbeat run on `sessionKey`. If a previous controller exists for
4
+ * the same key (shouldn't happen — heartbeats are serialized per
5
+ * session — but be defensive), abort it before replacing.
6
+ */
7
+ export declare function registerHeartbeatRun(sessionKey: string, controller: AbortController): void;
8
+ /**
9
+ * Drop the controller for `sessionKey` from the registry. Called from
10
+ * the heartbeat runner's finally block once the run has completed
11
+ * (successfully, with an error, or via abort).
12
+ */
13
+ export declare function clearHeartbeatRun(sessionKey: string): void;
14
+ /**
15
+ * Abort the active heartbeat (if any) for `sessionKey`. Returns true
16
+ * when an abort was issued, false when no heartbeat was in flight.
17
+ *
18
+ * Called from the chat.send handler before it enqueues the user turn,
19
+ * so the user's message doesn't sit behind a heartbeat that may take
20
+ * 30s+ to finish. The aborted heartbeat will fire again on the next
21
+ * pulse interval — no state to recover.
22
+ */
23
+ export declare function abortHeartbeatRunForSession(sessionKey: string): boolean;
24
+ /**
25
+ * Snapshot of currently-tracked heartbeat session keys. Test-only;
26
+ * production code should not rely on enumeration since the set is
27
+ * fundamentally racy.
28
+ */
29
+ export declare function listActiveHeartbeatSessionsForTest(): string[];
30
+ /**
31
+ * Drop every controller from the registry without aborting them.
32
+ * Test-only — used by suite setup/teardown to keep state isolated.
33
+ */
34
+ export declare function resetActiveHeartbeatRunsForTest(): void;
@@ -3970,7 +3970,7 @@ var MemoryIndexManager = class MemoryIndexManager extends MemoryManagerEmbedding
3970
3970
  * to bypass the min-interval guard (CLI use).
3971
3971
  */
3972
3972
  async runL3CycleIfDue(params) {
3973
- const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-BieO-_k_.js"), import("./synthesis-Bojs0PJL.js")]);
3973
+ const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-BieO-_k_.js"), import("./synthesis-cOQ27lCy.js")]);
3974
3974
  const synthesize = createSynthesizer({
3975
3975
  cfg: this.cfg,
3976
3976
  agentId: this.agentId,
@@ -1,5 +1,5 @@
1
1
  import "./accounts-D9zGZU5t.js";
2
- import { t as runAgentTurn } from "./unified-runner-D7m-WeUt.js";
2
+ import { t as runAgentTurn } from "./unified-runner-KBVvJUFF.js";
3
3
  import "./paths-DR2yt_mP.js";
4
4
  import "./github-copilot-token-D9X2phUj.js";
5
5
  import "./plugins-muf5lfx-.js";
@@ -49,7 +49,7 @@ import "./diagnostic-session-state-DnkpMfCl.js";
49
49
  import "./image-B7fj8HDX.js";
50
50
  import "./pi-auth-json-BOqOPkC8.js";
51
51
  import "./pi-model-discovery-Cdz3tuFk.js";
52
- import "./manager-CDV3YWoX.js";
52
+ import "./manager-DhiL-RSO.js";
53
53
  import "./gemini-auth-lC1AI-WK.js";
54
54
  import "./sqlite-BflKfcLD.js";
55
55
  import "./commands-registry-L_7UhT9Y.js";
@@ -52,7 +52,7 @@ import { r as getDiagnosticSessionState } from "./diagnostic-session-state-DnkpM
52
52
  import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-B7fj8HDX.js";
53
53
  import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-BOqOPkC8.js";
54
54
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-Cdz3tuFk.js";
55
- import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-CDV3YWoX.js";
55
+ import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-DhiL-RSO.js";
56
56
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-BpFmQTvo.js";
57
57
  import { _ as resolveNativeCommandsEnabled, a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, g as isRestartEnabled, h as isNativeCommandsExplicitlyDisabled, i as listChatCommands, l as parseCommandArgs, m as isCommandFlagEnabled, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices, v as resolveNativeSkillsEnabled } from "./commands-registry-L_7UhT9Y.js";
58
58
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-5H7RKVif.js";
@@ -5900,7 +5900,11 @@ const SAFETY_AND_STYLE_ADDITIONS = [
5900
5900
  "- Do not write verification checklists, self-assessments, or numbered assessment lists after your answer.",
5901
5901
  "- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
5902
5902
  "- If you need to verify your work, do so before writing your response, not after.",
5903
- "- Send brief progress updates on long tasks so the user knows you are active."
5903
+ "- Send brief progress updates on long tasks so the user knows you are active.",
5904
+ "TOOL USE DISCIPLINE (no fabrication):",
5905
+ "- If the user asks you to use a tool (e.g., 'use exec to run X', 'read the file', 'check the hostname'), you MUST invoke that tool. Do not answer from training data or priors in place of an actual tool call.",
5906
+ "- Never narrate or quote tool output you did not receive from a real tool result. Writing 'I ran X and got Y' without a corresponding tool call is fabrication.",
5907
+ "- For local-system facts (hostname, file contents, process state, env vars, current dir), the answer comes from running the tool, not from priors — always invoke."
5904
5908
  ];
5905
5909
  /** Hint for native-reasoning models (Nemotron, Qwen 3.5/3.6) to keep
5906
5910
  * planning internal. Not applied to Gemma/Ollama because those models
@@ -9625,7 +9629,7 @@ async function getMemorySearchManager(params) {
9625
9629
  const wrapper = new FallbackMemoryManager({
9626
9630
  primary,
9627
9631
  fallbackFactory: async () => {
9628
- const { MemoryIndexManager } = await import("./manager-CDV3YWoX.js").then((n) => n.t);
9632
+ const { MemoryIndexManager } = await import("./manager-DhiL-RSO.js").then((n) => n.t);
9629
9633
  return await MemoryIndexManager.get(params);
9630
9634
  }
9631
9635
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -9638,7 +9642,7 @@ async function getMemorySearchManager(params) {
9638
9642
  }
9639
9643
  }
9640
9644
  try {
9641
- const { MemoryIndexManager } = await import("./manager-CDV3YWoX.js").then((n) => n.t);
9645
+ const { MemoryIndexManager } = await import("./manager-DhiL-RSO.js").then((n) => n.t);
9642
9646
  return { manager: await MemoryIndexManager.get(params) };
9643
9647
  } catch (err) {
9644
9648
  return {
@@ -12104,6 +12108,40 @@ function buildSkillsJitBlocks(opts) {
12104
12108
 
12105
12109
  //#endregion
12106
12110
  //#region src/agents/system-prompt.ts
12111
+ /**
12112
+ * Read up to `limit` markdown filenames from `<workspaceDir>/memory/`,
12113
+ * sorted by mtime descending. Returns relative names (e.g. "2026-04-30.md")
12114
+ * for inlining into the system prompt — gives the agent the actual file
12115
+ * surface so it doesn't speculate names like "memory/2026-04-30.md" from
12116
+ * training-data priors. Resilient: missing dir → [], unreadable → [].
12117
+ */
12118
+ function listWorkspaceMemoryFiles(workspaceDir, limit = 10) {
12119
+ if (!workspaceDir) return [];
12120
+ const memoryDir = path.join(workspaceDir, "memory");
12121
+ let entries;
12122
+ try {
12123
+ entries = fs.readdirSync(memoryDir, { withFileTypes: true });
12124
+ } catch {
12125
+ return [];
12126
+ }
12127
+ const files = [];
12128
+ for (const entry of entries) {
12129
+ if (!entry.isFile()) continue;
12130
+ if (!entry.name.toLowerCase().endsWith(".md")) continue;
12131
+ let mtimeMs = 0;
12132
+ try {
12133
+ mtimeMs = fs.statSync(path.join(memoryDir, entry.name)).mtimeMs;
12134
+ } catch {
12135
+ mtimeMs = 0;
12136
+ }
12137
+ files.push({
12138
+ name: entry.name,
12139
+ mtimeMs
12140
+ });
12141
+ }
12142
+ files.sort((a, b) => b.mtimeMs - a.mtimeMs);
12143
+ return files.slice(0, limit).map((f) => f.name);
12144
+ }
12107
12145
  function buildSkillsSection(params) {
12108
12146
  if (params.isMinimal) return [];
12109
12147
  if (params.dropCatalog) return [];
@@ -12127,13 +12165,21 @@ function buildMemorySection(params) {
12127
12165
  "## Memory Recall",
12128
12166
  "Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search on MEMORY.md + memory/*.md; then use memory_get to pull only the needed lines. If low confidence after search, say you checked.",
12129
12167
  "",
12168
+ "**Never speculate memory file paths.** Use memory_search to find content; do not construct paths like `memory/<date>.md` from training-data priors and call read on them — that produces ENOENT spam and trips the consecutive-tool-error breaker.",
12169
+ "",
12130
12170
  "Memory is split into two layers you will see as files:",
12131
12171
  "- `MEMORY.md` — user-authored short-term memory. Hand-edited by the user; treat as ground truth they wrote themselves. Never rewrite it yourself.",
12132
- "- `memory/symi-core.md` + `memory/symi-beliefs.md` — long-term memory automatically consolidated from repeated observations (your evolving self). Do NOT hand-edit these files: they are regenerated each consolidation cycle. When the files disagree with a fresh user statement, trust the fresh statement and write a new observation to `memory/YYYY-MM-DD.md` the cycle will reconcile them.",
12133
- "- `memory/YYYY-MM-DD.md` daily append-only observations. This is where new memories land.",
12134
- "",
12135
- "When the user explicitly asks to *remember* or *always remember* something, after writing the observation also call `memory_pin` with a distinctive query so the fact survives pruning. Call `memory_unpin` when the user says to forget it."
12172
+ "- `memory/symi-core.md` + `memory/symi-beliefs.md` — long-term memory automatically consolidated from repeated observations (your evolving self). Do NOT hand-edit these files: they are regenerated each consolidation cycle. When the files disagree with a fresh user statement, trust the fresh statement and write a new observation. The cycle will reconcile them.",
12173
+ "- New observations go in dated daily files (e.g. `memory/<today>.md`); use `memory_search` to discover what already exists rather than guessing filenames."
12136
12174
  ];
12175
+ const memoryFiles = (params.workspaceMemoryFiles ?? []).filter(Boolean);
12176
+ if (memoryFiles.length > 0) {
12177
+ lines.push("");
12178
+ lines.push("Existing memory files in this workspace (most-recently-modified first):");
12179
+ for (const name of memoryFiles) lines.push(`- \`memory/${name}\``);
12180
+ }
12181
+ lines.push("");
12182
+ lines.push("When the user explicitly asks to *remember* or *always remember* something, after writing the observation also call `memory_pin` with a distinctive query so the fact survives pruning. Call `memory_unpin` when the user says to forget it.");
12137
12183
  if (params.citationsMode === "off") lines.push("Citations are disabled: do not mention file paths or line numbers in replies unless the user explicitly asks.");
12138
12184
  else lines.push("Citations: include Source: <path#line> when it helps the user verify memory snippets.");
12139
12185
  lines.push("");
@@ -12422,7 +12468,8 @@ function buildAgentSystemPrompt(params) {
12422
12468
  const memorySection = buildMemorySection({
12423
12469
  isMinimal,
12424
12470
  availableTools,
12425
- citationsMode: params.memoryCitationsMode
12471
+ citationsMode: params.memoryCitationsMode,
12472
+ workspaceMemoryFiles: listWorkspaceMemoryFiles(params.workspaceDir)
12426
12473
  });
12427
12474
  const docsSection = buildDocsSection({
12428
12475
  docsPath: params.docsPath,
@@ -12460,6 +12507,11 @@ function buildAgentSystemPrompt(params) {
12460
12507
  "If a task is more complex or takes longer, spawn a sub-agent. Completion is push-based: it will auto-announce when done.",
12461
12508
  "Do not poll `subagents list` / `sessions_list` in a loop; only check status on-demand (for intervention, debugging, or when explicitly asked).",
12462
12509
  "",
12510
+ "## Tool Use Discipline (mandatory)",
12511
+ "- If the user explicitly tells you to use a tool (e.g., \"use exec to run X\", \"read the file with read\", \"check the hostname\"), you MUST invoke that tool. Do not answer from training data or memory in place of the tool call.",
12512
+ "- Never narrate or quote tool output you did not actually receive from a real tool result. Writing \"I ran X and got Y\" without a corresponding tool invocation is fabrication and breaks user trust.",
12513
+ "- For factual local-system lookups (hostname, file contents, process state, env vars, current dir, system info), the answer comes from invoking the appropriate tool — not from priors. Always invoke.",
12514
+ "",
12463
12515
  ...compactMode ? [] : [
12464
12516
  "## Tool Call Style",
12465
12517
  "Default: do not narrate routine, low-risk tool calls (just call the tool).",
@@ -54566,7 +54618,7 @@ function setCliSessionId(entry, provider, sessionId) {
54566
54618
  function createDefaultDeps() {
54567
54619
  return {
54568
54620
  sendMessageWhatsApp: async (...args) => {
54569
- const { sendMessageWhatsApp } = await import("./web-BoYy2HSO.js");
54621
+ const { sendMessageWhatsApp } = await import("./web-Bj-jTlHW.js");
54570
54622
  return await sendMessageWhatsApp(...args);
54571
54623
  },
54572
54624
  sendMessageTelegram: async (...args) => {
@@ -69237,7 +69289,7 @@ function loadWebLoginQr() {
69237
69289
  return webLoginQrPromise;
69238
69290
  }
69239
69291
  function loadWebChannel() {
69240
- webChannelPromise ??= import("./web-BoYy2HSO.js");
69292
+ webChannelPromise ??= import("./web-Bj-jTlHW.js");
69241
69293
  return webChannelPromise;
69242
69294
  }
69243
69295
  function loadWhatsAppActions() {