@noxsoft/anima 7.0.0 → 7.0.1
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 +9 -1
- package/dist/{agent-BoAAHGEA.js → agent-BjD_hkGZ.js} +3 -3
- package/dist/{agent-DuW0onwk.js → agent-PoYM2xa7.js} +3 -3
- package/dist/{agents-BUXkSDns.js → agents-y3HCk1ks.js} +4 -4
- package/dist/{anthropic-direct-runner-DizCei79.js → anthropic-direct-runner-Bu8w-wlJ.js} +246 -10
- package/dist/{anthropic-direct-runner-OjcTAH6g.js → anthropic-direct-runner-C5pnwYzT.js} +246 -10
- package/dist/{auth-choice-B1iGnjuE.js → auth-choice-BYOaX-W4.js} +1 -1
- package/dist/{auth-choice-HF9x6xk2.js → auth-choice-CRP6z43z.js} +1 -1
- package/dist/{banner-Dpa5d1If.js → banner-XT5N0ZF4.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +1 -1
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-web-C5mzsaa3.js → channel-web-yWytZHhN.js} +2 -2
- package/dist/{cli-Cuq4bIg4.js → cli-C7mOU26p.js} +2 -2
- package/dist/{cli-X9ikywQ3.js → cli-DfcdnRcl.js} +2 -2
- package/dist/{command-registry-9V4uqrBV.js → command-registry-DUTqrmna.js} +12 -12
- package/dist/{completion-cli-DNWDwhab.js → completion-cli-BBm9JIHZ.js} +2 -2
- package/dist/{completion-cli-BtvcR-U5.js → completion-cli-Cpj91U30.js} +1 -1
- package/dist/{config-cli-fleq7-gq.js → config-cli-CF2ERR8G.js} +1 -1
- package/dist/{config-cli-DfHE3KG-.js → config-cli-Dmd4Oyjp.js} +1 -1
- package/dist/{configure-lkozxQed.js → configure-4jIAlOdj.js} +7 -7
- package/dist/{configure-B2Mfnwy_.js → configure-BE8TA8Yt.js} +3 -3
- package/dist/{configure-ZWxixuRA.js → configure-BfWsTKMF.js} +3 -3
- package/dist/{configure-SnvMHZPD.js → configure-CU3kulTq.js} +7 -7
- package/dist/{deps-BKLIBKjK.js → deps-DKPoFoa8.js} +1 -1
- package/dist/{doctor-D7kKyUVk.js → doctor-CFpVHDFT.js} +4 -4
- package/dist/{doctor-DmCnZ-jF.js → doctor-DOudOs1k.js} +4 -4
- package/dist/{doctor-completion-B9SBdMoR.js → doctor-completion-DfNyJGIj.js} +1 -1
- package/dist/{doctor-completion-BBvW4_J9.js → doctor-completion-R0UlpjIj.js} +1 -1
- package/dist/{engine-DpbYPop7.js → engine-BDDM-iAi.js} +1 -1
- package/dist/{engine-zmn3SOYa.js → engine-BDwYEVKi.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-CEM1vBuk.js → gateway-cli-CFlPUx9N.js} +15 -15
- package/dist/{gateway-cli-iumkTohn.js → gateway-cli-DtIum1te.js} +16 -16
- package/dist/{health-Cndq9b7A.js → health-ngQNjXh4.js} +3 -3
- package/dist/{health-B5N6_UOf.js → health-yw_uaucz.js} +3 -3
- package/dist/{heartbeat-visibility-BQL13ZBH.js → heartbeat-visibility-BaL8JzkS.js} +1 -1
- package/dist/{heartbeat-visibility-CwcYugaR.js → heartbeat-visibility-mAzdNSiS.js} +1 -1
- package/dist/{hooks-cli-BZcvdIwE.js → hooks-cli-CPgLAn7a.js} +3 -3
- package/dist/{hooks-cli-DSlPBQSY.js → hooks-cli-D6YfDiUI.js} +3 -3
- package/dist/index.js +8 -8
- package/dist/llm-slug-generator.js +1 -1
- package/dist/{models-CdNeYfSp.js → models-BXdBXPMB.js} +3 -3
- package/dist/{models-cli-D7eSsPuk.js → models-cli-1Kj8gkGy.js} +3 -3
- package/dist/{models-cli-fTZXo1zx.js → models-cli-DdJcmOGI.js} +4 -4
- package/dist/{onboard-D-6QCnTi.js → onboard-BzScK9k6.js} +3 -3
- package/dist/{onboard-C5K37NvY.js → onboard-CHX1Jdt_.js} +3 -3
- package/dist/{onboard-channels-BsCq32Hn.js → onboard-channels-DfXxMbYu.js} +1 -1
- package/dist/{onboard-channels-bx6oelzj.js → onboard-channels-wUF4oRB-.js} +1 -1
- package/dist/{onboarding-CX1vIkcB.js → onboarding-6jxAKxhe.js} +4 -4
- package/dist/{onboarding-BeuMAyic.js → onboarding-fnZOw6Wv.js} +4 -4
- package/dist/{orchestrator-C1nWKIJS.js → orchestrator-B2rNfH4K.js} +5 -4
- package/dist/{orchestrator-C2ypFiPL.js → orchestrator-CrFD887e.js} +5 -4
- package/dist/{outbound-send-deps-Y9AxHeLG.js → outbound-send-deps-DMsqr5fd.js} +1 -1
- package/dist/{pi-embedded-D15iww51.js → pi-embedded-B1eVXOsQ.js} +245 -9
- package/dist/{pi-embedded-DR8Pfd05.js → pi-embedded-DbvG9mmD.js} +245 -9
- package/dist/{plugin-registry-ME2FQAi-.js → plugin-registry-CtkU96jV.js} +1 -1
- package/dist/{plugin-registry-Do2D1nDk.js → plugin-registry-DKexyPAq.js} +1 -1
- package/dist/plugin-sdk/index.js +6 -6
- package/dist/plugin-sdk/infra/architecture-awareness.d.ts +47 -0
- package/dist/{plugins-cli-CVFzwdmI.js → plugins-cli-B3l7kalt.js} +3 -3
- package/dist/{plugins-cli-CoVt2ewg.js → plugins-cli-BQmysVFP.js} +3 -3
- package/dist/{program-context-DP3qjW7A.js → program-context-C4x0zjOR.js} +18 -18
- package/dist/{program-8rF4C_wd.js → program-mSyCYzsQ.js} +7 -7
- package/dist/{register.agent-DnkOx0U8.js → register.agent-CzEM3bkp.js} +7 -7
- package/dist/{register.agent-BIrXCVtQ.js → register.agent-DBxUWr1K.js} +8 -8
- package/dist/{register.anima-DXT9bM9A.js → register.anima--gufBuS-.js} +4 -4
- package/dist/{register.anima-B36rTHUt.js → register.anima-RI6gewtj.js} +4 -4
- package/dist/{register.configure-CuzJxZmk.js → register.configure-Cs3uLUBo.js} +6 -6
- package/dist/{register.configure-DCpvHX3m.js → register.configure-Dpe8Qel3.js} +6 -6
- package/dist/{register.maintenance-CcxBFfv5.js → register.maintenance-BEYN8SJL.js} +9 -9
- package/dist/{register.maintenance-Dla0H12S.js → register.maintenance-DqAdzWBM.js} +8 -8
- package/dist/{register.message-Brtushvp.js → register.message-ACbKb7JS.js} +4 -4
- package/dist/{register.message-CD7xV-jz.js → register.message-BhGJ_1Iy.js} +4 -4
- package/dist/{register.onboard-6CbODzQ6.js → register.onboard-CwkY7CRm.js} +9 -9
- package/dist/{register.onboard-23Mra3LN.js → register.onboard-DR_YYtbi.js} +10 -10
- package/dist/{register.setup-DlVH7FKe.js → register.setup-BSm6O1ml.js} +9 -9
- package/dist/{register.setup-CqQw13Ky.js → register.setup-Cn3e7Std.js} +10 -10
- package/dist/{register.status-health-sessions-CxtgPKu9.js → register.status-health-sessions-CpxsZeet.js} +4 -4
- package/dist/{register.status-health-sessions-CduFjFDB.js → register.status-health-sessions-DAl9OeGB.js} +4 -4
- package/dist/{register.subclis-CtANqD5P.js → register.subclis-DEFeoyPP.js} +7 -7
- package/dist/{reply-prefix-B7Fb3fO8.js → reply-prefix-CEnF6TUe.js} +1 -1
- package/dist/{reply-prefix-BzdhJDqP.js → reply-prefix-Og65nAYv.js} +1 -1
- package/dist/{reply-93fMzde1.js → reply-ylwOKuOF.js} +2 -2
- package/dist/{run-Cq_iTGK_.js → run-B6eBjo22.js} +231 -63
- package/dist/{run-CF3kHOGH.js → run-D6Ete2Z-.js} +231 -63
- package/dist/{run-main-BiIRcc6s.js → run-main-CQHE4XaN.js} +15 -15
- package/dist/{server-node-events-DgvKcH5q.js → server-node-events-CV5m_fuq.js} +5 -5
- package/dist/{server-node-events-B3Serk9L.js → server-node-events-DIuVwITd.js} +5 -5
- package/dist/{session-C_d9uvLf.js → session-BqHD-8a_.js} +1 -1
- package/dist/{session-BMDpwIJu.js → session-Jlf3l006.js} +1 -1
- package/dist/{settings-cli-DsDqNpW_.js → settings-cli-LWW2xQBQ.js} +7 -7
- package/dist/{settings-cli-CZdlEmNi.js → settings-cli-T66kDBNA.js} +7 -7
- package/dist/{setup-token-C8Gg1P6T.js → setup-token-0zfSBnMQ.js} +1 -1
- package/dist/{setup-token-Lee4gM5w.js → setup-token-6DSKE0Tn.js} +1 -1
- package/dist/{start-Cs1aPMq2.js → start-BdcAszpl.js} +15 -15
- package/dist/{start-CK6urvnN.js → start-gVOPVCgi.js} +16 -16
- package/dist/{status-BO5BIf81.js → status-BhRELdY_.js} +3 -3
- package/dist/{status-COc4xMti.js → status-CDcFjNtS.js} +1 -1
- package/dist/{status-C_NBOv_V.js → status-CobgQziJ.js} +1 -1
- package/dist/{status-uakoP719.js → status-D37aRiV3.js} +3 -3
- package/dist/{subagent-registry-fLI7QDKe.js → subagent-registry-CDEUbtey.js} +2 -2
- package/dist/{update-cli-D3Ujz_cW.js → update-cli-BjHgpnxD.js} +9 -9
- package/dist/{update-cli-DEe62XGU.js → update-cli-QtM0G6CE.js} +8 -8
- package/dist/{update-runner-DZfnquWO.js → update-runner-C8SRcVm3.js} +1 -1
- package/dist/{update-runner-DUl-g4mB.js → update-runner-Fb3Un6UZ.js} +1 -1
- package/dist/{web-Di8j762D.js → web-BDig9tCy.js} +3 -3
- package/dist/{web-C-cK9OCd.js → web-C4lrKULd.js} +1 -1
- package/dist/{web-DzSlI8A6.js → web-CPPJ5y4c.js} +1 -1
- package/dist/{web-Dybw4K7C.js → web-Vx_ENtYI.js} +4 -4
- package/package.json +6 -2
- package/templates/HEART.md +32 -10
- package/templates/SOUL.md +37 -8
- package/templates/profiles/architect.profile.json5 +36 -0
- package/templates/profiles/builder.profile.json5 +36 -0
- package/templates/profiles/coordinator.profile.json5 +36 -0
- package/templates/profiles/guardian.profile.json5 +36 -0
- package/templates/profiles/researcher.profile.json5 +36 -0
|
@@ -16,10 +16,10 @@ import { n as pickPrimaryTailnetIPv6, t as pickPrimaryTailnetIPv4 } from "./tail
|
|
|
16
16
|
import { s as loadGatewayTlsRuntime$1 } from "./call-B4lhqS6H.js";
|
|
17
17
|
import { f as GATEWAY_CLIENT_CAPS, g as hasGatewayClientCap, i as isGatewayMessageChannel, l as normalizeMessageChannel, n as isDeliverableMessageChannel, p as GATEWAY_CLIENT_IDS, r as isGatewayCliClient, s as isWebchatClient, t as INTERNAL_MESSAGE_CHANNEL } from "./message-channel-DIHHKJhk.js";
|
|
18
18
|
import { c as resolveGatewayBindHost, d as rawDataToString, i as isTrustedProxyAddress, l as resolveGatewayClientIp, n as isLoopbackHost, r as isPrivateOrLoopbackAddress, s as pickPrimaryLanIPv4, t as isLoopbackAddress, u as resolveGatewayListenHosts } from "./net-CRsiP49R.js";
|
|
19
|
-
import { $ as ensureOutboundSessionEntry, $n as extractImageContentFromSource, $t as loadProviderStore, A as getTotalQueueSize, An as registerSkillsChangeListener, B as loadCombinedSessionStoreForGateway, Cn as renamePairedNode, Ct as normalizeCronJobPatch, D as setCliSessionId, Dn as generatePairingToken, Dr as getAgentRunContext, Dt as normalizePayloadToSystemText, E as getCliSessionId, En as verifyNodeToken, Er as emitAgentEvent, Et as normalizeOptionalText, F as readLatestAssistantReply, Fn as enqueueSystemEvent, Ft as isExternalHookSession, G as archiveFileOnDisk, Gn as DEFAULT_INPUT_IMAGE_MAX_BYTES, Gt as isGatewaySigusr1RestartExternallyAllowed, H as pruneLegacyStoreKeys, Hn as DEFAULT_INPUT_FILE_MAX_BYTES, Ht as consumeGatewaySigusr1RestartAuthorization, I as resolveAnnounceTargetFromKey, In as isSystemEventContextChanged, It as applyBrowserProxyPaths, J as readSessionMessages, Jn as DEFAULT_INPUT_PDF_MAX_PAGES, Jt as setGatewaySigusr1RestartPolicy, K as archiveSessionTranscripts, Kn as DEFAULT_INPUT_IMAGE_MIMES, Kt as markGatewaySigusr1RestartHandled, L as canonicalizeSpawnedByForAgent, Lt as persistBrowserProxyFiles, M as setCommandLaneConcurrency, Mn as applyModelOverrideToSessionEntry, Mt as buildSafeExternalPrompt, N as waitForActiveTasks, Nn as applyVerboseOverride, Nt as detectSuspiciousPatterns, O as getActiveTaskCount, On as verifyPairingToken, Or as onAgentEvent, Ot as normalizeRequiredName, P as createAnimaTools, Pn as parseVerboseOverride, Pt as getHookType, Qn as extractFileContentFromSource, Qt as loadProviderUsageSummary, R as listAgentsForGateway, S as getTotalPendingReplies, Sn as rejectNodePairing, St as normalizeCronJobCreate, T as BARE_SESSION_RESET_PROMPT, Tn as updatePairedNodeMetadata, Tr as clearAgentRunContext, Tt as normalizeOptionalAgentId, U as resolveGatewaySessionStoreTarget, Un as DEFAULT_INPUT_FILE_MAX_CHARS, Ut as deferGatewayRestartUntilIdle, V as loadSessionEntry, Vn as registerUnhandledRejectionHandler, Vt as CommandLane, W as resolveSessionModelRef, Wn as DEFAULT_INPUT_FILE_MIMES, Wt as emitGatewayRestart, X as resolveSessionTranscriptCandidates, Xn as DEFAULT_INPUT_PDF_MIN_TEXT_CHARS, Xt as normalizeGroupActivation, Y as readSessionPreviewItemsFromTranscript, Yn as DEFAULT_INPUT_PDF_MAX_PIXELS, Yt as setPreRestartDeferralCheck, Z as stripEnvelopeFromMessages, Zn as DEFAULT_INPUT_TIMEOUT_MS, _n as refreshRemoteNodeBins, _t as formatRestartSentinelMessage, a as runSubagentAnnounceFlow, ar as stopDiagnosticHeartbeat, b as dispatchInboundMessage, bn as approveNodePairing, c as waitForEmbeddedPiRunEnd, ct as resolveSessionDeliveryTarget, d as buildDefaultToolPolicyPipelineSteps, dn as normalizeSendPolicy, dr as formatZonedTimestamp, dt as resolveMessageChannelSelection, en as maskApiKey, er as normalizeMimeList, et as resolveOutboundSessionRoute, f as sniffMimeFromBase64, fn as resolveSendPolicy, g as getChannelActivity, gn as refreshRemoteBinsForConnectedNodes, gt as formatDoctorNonInteractiveHint, hn as recordRemoteNodeInfo, hr as stopSubagentsForRequester, ht as consumeRestartSentinel, ir as startDiagnosticHeartbeat, j as resetAllLanes, kn as getSkillsSnapshotVersion, kr as registerAgentRunContext, kt as migrateLegacyCronPayload, l as runNoxSoftEmbeddedAgent, ln as requestHeartbeatNow, m as loadAnimaPlugins, mn as primeRemoteSkillsCache, mr as isAbortTrigger, mt as resolveWorkingModeModelSelection, n as initSubagentRegistry, o as clearSessionQueues, or as isDiagnosticsEnabled, p as getPluginToolMeta, pn as getRemoteSkillEligibility, pt as runWithModelFallback, q as capArrayByJsonBytes, qn as DEFAULT_INPUT_MAX_REDIRECTS, qt as scheduleGatewaySigusr1Restart, r as listDescendantRunsForRequester, rr as resolveAgentTimeoutMs, s as abortEmbeddedPiRun, st as resolveOutboundTarget, t as countActiveDescendantRuns, tn as saveProviderStore, tr as estimateBase64DecodedBytes, u as applyToolPolicyPipeline, ut as resetDirectoryCache, vn as removeRemoteNodeInfo, wn as requestNodePairing, wt as inferLegacyName, x as createReplyDispatcher, xn as listNodePairing, xt as writeRestartSentinel, yn as setSkillsRemoteRegistry, yr as resolveAgentIdentity, yt as summarizeRestartSentinel, z as listSessionsFromStore, zn as loadModelCatalog } from "./subagent-registry-
|
|
19
|
+
import { $ as ensureOutboundSessionEntry, $n as extractImageContentFromSource, $t as loadProviderStore, A as getTotalQueueSize, An as registerSkillsChangeListener, B as loadCombinedSessionStoreForGateway, Cn as renamePairedNode, Ct as normalizeCronJobPatch, D as setCliSessionId, Dn as generatePairingToken, Dr as getAgentRunContext, Dt as normalizePayloadToSystemText, E as getCliSessionId, En as verifyNodeToken, Er as emitAgentEvent, Et as normalizeOptionalText, F as readLatestAssistantReply, Fn as enqueueSystemEvent, Ft as isExternalHookSession, G as archiveFileOnDisk, Gn as DEFAULT_INPUT_IMAGE_MAX_BYTES, Gt as isGatewaySigusr1RestartExternallyAllowed, H as pruneLegacyStoreKeys, Hn as DEFAULT_INPUT_FILE_MAX_BYTES, Ht as consumeGatewaySigusr1RestartAuthorization, I as resolveAnnounceTargetFromKey, In as isSystemEventContextChanged, It as applyBrowserProxyPaths, J as readSessionMessages, Jn as DEFAULT_INPUT_PDF_MAX_PAGES, Jt as setGatewaySigusr1RestartPolicy, K as archiveSessionTranscripts, Kn as DEFAULT_INPUT_IMAGE_MIMES, Kt as markGatewaySigusr1RestartHandled, L as canonicalizeSpawnedByForAgent, Lt as persistBrowserProxyFiles, M as setCommandLaneConcurrency, Mn as applyModelOverrideToSessionEntry, Mt as buildSafeExternalPrompt, N as waitForActiveTasks, Nn as applyVerboseOverride, Nt as detectSuspiciousPatterns, O as getActiveTaskCount, On as verifyPairingToken, Or as onAgentEvent, Ot as normalizeRequiredName, P as createAnimaTools, Pn as parseVerboseOverride, Pt as getHookType, Qn as extractFileContentFromSource, Qt as loadProviderUsageSummary, R as listAgentsForGateway, S as getTotalPendingReplies, Sn as rejectNodePairing, St as normalizeCronJobCreate, T as BARE_SESSION_RESET_PROMPT, Tn as updatePairedNodeMetadata, Tr as clearAgentRunContext, Tt as normalizeOptionalAgentId, U as resolveGatewaySessionStoreTarget, Un as DEFAULT_INPUT_FILE_MAX_CHARS, Ut as deferGatewayRestartUntilIdle, V as loadSessionEntry, Vn as registerUnhandledRejectionHandler, Vt as CommandLane, W as resolveSessionModelRef, Wn as DEFAULT_INPUT_FILE_MIMES, Wt as emitGatewayRestart, X as resolveSessionTranscriptCandidates, Xn as DEFAULT_INPUT_PDF_MIN_TEXT_CHARS, Xt as normalizeGroupActivation, Y as readSessionPreviewItemsFromTranscript, Yn as DEFAULT_INPUT_PDF_MAX_PIXELS, Yt as setPreRestartDeferralCheck, Z as stripEnvelopeFromMessages, Zn as DEFAULT_INPUT_TIMEOUT_MS, _n as refreshRemoteNodeBins, _t as formatRestartSentinelMessage, a as runSubagentAnnounceFlow, ar as stopDiagnosticHeartbeat, b as dispatchInboundMessage, bn as approveNodePairing, c as waitForEmbeddedPiRunEnd, ct as resolveSessionDeliveryTarget, d as buildDefaultToolPolicyPipelineSteps, dn as normalizeSendPolicy, dr as formatZonedTimestamp, dt as resolveMessageChannelSelection, en as maskApiKey, er as normalizeMimeList, et as resolveOutboundSessionRoute, f as sniffMimeFromBase64, fn as resolveSendPolicy, g as getChannelActivity, gn as refreshRemoteBinsForConnectedNodes, gt as formatDoctorNonInteractiveHint, hn as recordRemoteNodeInfo, hr as stopSubagentsForRequester, ht as consumeRestartSentinel, ir as startDiagnosticHeartbeat, j as resetAllLanes, kn as getSkillsSnapshotVersion, kr as registerAgentRunContext, kt as migrateLegacyCronPayload, l as runNoxSoftEmbeddedAgent, ln as requestHeartbeatNow, m as loadAnimaPlugins, mn as primeRemoteSkillsCache, mr as isAbortTrigger, mt as resolveWorkingModeModelSelection, n as initSubagentRegistry, o as clearSessionQueues, or as isDiagnosticsEnabled, p as getPluginToolMeta, pn as getRemoteSkillEligibility, pt as runWithModelFallback, q as capArrayByJsonBytes, qn as DEFAULT_INPUT_MAX_REDIRECTS, qt as scheduleGatewaySigusr1Restart, r as listDescendantRunsForRequester, rr as resolveAgentTimeoutMs, s as abortEmbeddedPiRun, st as resolveOutboundTarget, t as countActiveDescendantRuns, tn as saveProviderStore, tr as estimateBase64DecodedBytes, u as applyToolPolicyPipeline, ut as resetDirectoryCache, vn as removeRemoteNodeInfo, wn as requestNodePairing, wt as inferLegacyName, x as createReplyDispatcher, xn as listNodePairing, xt as writeRestartSentinel, yn as setSkillsRemoteRegistry, yr as resolveAgentIdentity, yt as summarizeRestartSentinel, z as listSessionsFromStore, zn as loadModelCatalog } from "./subagent-registry-CDEUbtey.js";
|
|
20
20
|
import { C as resolveMainSessionKeyFromConfig, I as normalizeSessionDeliveryFields, M as deliveryContextFromSession, P as mergeDeliveryContext, S as resolveMainSessionKey, T as snapshotSessionOrigin, b as resolveAgentMainSessionKey, i as loadSessionStore, l as updateSessionStore, t as extractDeliveryInfo, x as resolveExplicitAgentSessionKey } from "./sessions-C_3wTmSA.js";
|
|
21
21
|
import { n as SILENT_REPLY_TOKEN, r as isSilentReplyText } from "./tokens-CmlI2hSz.js";
|
|
22
|
-
import { B as resolveTtsConfig, F as isTtsProviderConfigured, G as setTtsEnabled, H as resolveTtsProviderOrder, J as textToSpeech, M as getTtsProvider, P as isTtsEnabled, R as resolveTtsApiKey, T as resolveUserTimezone, V as resolveTtsPrefsPath, X as OPENAI_TTS_MODELS, Z as OPENAI_TTS_VOICES, ct as createInternalHookEvent, dt as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, et as clearSteer, ht as stripHeartbeatToken, it as getEgoManager, lt as registerInternalHook, nt as getSteerHistory, q as setTtsProvider, rt as setSteer, st as clearInternalHooks, tt as getSteer, ut as triggerInternalHook, z as resolveTtsAutoMode } from "./anthropic-direct-runner-
|
|
22
|
+
import { B as resolveTtsConfig, F as isTtsProviderConfigured, G as setTtsEnabled, H as resolveTtsProviderOrder, J as textToSpeech, M as getTtsProvider, P as isTtsEnabled, R as resolveTtsApiKey, T as resolveUserTimezone, V as resolveTtsPrefsPath, X as OPENAI_TTS_MODELS, Z as OPENAI_TTS_VOICES, ct as createInternalHookEvent, dt as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, et as clearSteer, ht as stripHeartbeatToken, it as getEgoManager, lt as registerInternalHook, nt as getSteerHistory, q as setTtsProvider, rt as setSteer, st as clearInternalHooks, tt as getSteer, ut as triggerInternalHook, z as resolveTtsAutoMode } from "./anthropic-direct-runner-Bu8w-wlJ.js";
|
|
23
23
|
import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, l as normalizeVerboseLevel, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./pi-embedded-helpers-D2SLlgS4.js";
|
|
24
24
|
import { _ as resolveToolProfilePolicy, p as collectExplicitAllowlist } from "./sandbox-D-N7M7lp.js";
|
|
25
25
|
import { a as AUTH_RATE_LIMIT_SCOPE_DEVICE_TOKEN, c as safeEqualSecret, d as enableTailscaleFunnel, f as enableTailscaleServe, i as resolveGatewayAuth, l as disableTailscaleFunnel, m as getTailnetHostname, n as authorizeGatewayConnect, o as AUTH_RATE_LIMIT_SCOPE_SHARED_SECRET, r as isLocalDirectRequest, s as createAuthRateLimiter, t as assertGatewayAuthConfigured, u as disableTailscaleServe } from "./auth-Cp__MMeO.js";
|
|
@@ -42,8 +42,8 @@ import { n as createBrowserControlContext, r as startBrowserControlServiceFromCo
|
|
|
42
42
|
import { t as createBrowserRouteDispatcher } from "./dispatcher-BQQugU-7.js";
|
|
43
43
|
import { t as parseAbsoluteTimeMs } from "./parse-DLMgOMDI.js";
|
|
44
44
|
import { c as saveToken, i as getToken, l as whoami, n as clearToken, o as registerWithInvite, s as resolveSuggestedIdentity, t as TOKEN_PATH } from "./noxsoft-auth-CgCk5707.js";
|
|
45
|
-
import { c as resolveCronStyleNow, i as onHeartbeatEvent, r as getLastHeartbeatEvent, t as resolveHeartbeatVisibility } from "./heartbeat-visibility-
|
|
46
|
-
import { r as buildHistoryContextFromEntries, t as createReplyPrefixOptions } from "./reply-prefix-
|
|
45
|
+
import { c as resolveCronStyleNow, i as onHeartbeatEvent, r as getLastHeartbeatEvent, t as resolveHeartbeatVisibility } from "./heartbeat-visibility-mAzdNSiS.js";
|
|
46
|
+
import { r as buildHistoryContextFromEntries, t as createReplyPrefixOptions } from "./reply-prefix-Og65nAYv.js";
|
|
47
47
|
import { t as ensureAnimaCliOnPath } from "./path-env-CafGfJPa.js";
|
|
48
48
|
import { n as DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./dangerous-tools-Asx2qyrG.js";
|
|
49
49
|
import { C as resolveAssistantAvatarUrl, S as normalizeControlUiBasePath, b as CONTROL_UI_AVATAR_PREFIX, c as handleReset, h as resolveControlUiLinks, x as buildControlUiAvatarUrl } from "./onboard-helpers-CFudIoX4.js";
|
|
@@ -52,10 +52,10 @@ import { t as parsePort } from "./parse-port-BKB9Exlg.js";
|
|
|
52
52
|
import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-CtU9Fx7K.js";
|
|
53
53
|
import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-7KwLAyAq.js";
|
|
54
54
|
import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-DDz7UOIx.js";
|
|
55
|
-
import { r as getStatusSummary } from "./status-
|
|
55
|
+
import { r as getStatusSummary } from "./status-D37aRiV3.js";
|
|
56
56
|
import { t as resolveChannelDefaultAccountId } from "./helpers-CVp8W9aa.js";
|
|
57
|
-
import { c as setHeartbeatsEnabled, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce } from "./health-
|
|
58
|
-
import { n as createDefaultDeps, r as createOutboundSendDeps$1, t as createOutboundSendDeps } from "./outbound-send-deps-
|
|
57
|
+
import { c as setHeartbeatsEnabled, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce } from "./health-ngQNjXh4.js";
|
|
58
|
+
import { n as createDefaultDeps, r as createOutboundSendDeps$1, t as createOutboundSendDeps } from "./outbound-send-deps-DMsqr5fd.js";
|
|
59
59
|
import { t as buildChannelUiCatalog } from "./catalog-B-TAbJ2o.js";
|
|
60
60
|
import { t as applyPluginAutoEnable } from "./plugin-auto-enable-DhuD30Je.js";
|
|
61
61
|
import { a as resolveControlUiRootOverrideSync, n as ensureControlUiAssetsBuilt, o as resolveControlUiRootSync } from "./health-format-BLnFZCH_.js";
|
|
@@ -63,14 +63,14 @@ import { n as validateSystemRunCommandConsistency, r as getMachineDisplayName, t
|
|
|
63
63
|
import { h as normalizeUpdateChannel, l as DEFAULT_PACKAGE_CHANNEL, n as checkUpdateStatus, o as resolveNpmChannelTag, r as compareSemverStrings } from "./channels-status-issues-CklLFAsD.js";
|
|
64
64
|
import { t as WizardCancelledError } from "./prompts-BmgT_kkv.js";
|
|
65
65
|
import { i as shouldIncludeHook, n as loadWorkspaceHookEntries, r as resolveHookConfig } from "./hooks-status-DqfJDvYl.js";
|
|
66
|
-
import { t as runOnboardingWizard } from "./onboarding-
|
|
66
|
+
import { t as runOnboardingWizard } from "./onboarding-6jxAKxhe.js";
|
|
67
67
|
import { a as setGatewayWsLogStyle, i as summarizeAgentEventForWsLog, n as logWs, r as shouldLogWs, t as formatForLog } from "./ws-log-CG6cvCZW.js";
|
|
68
68
|
import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-BIXtKTpT.js";
|
|
69
69
|
import { a as loadAgentIdentity, c as loadAgentIdentityFromWorkspace, i as listAgentEntries, o as pruneAgentConfig, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-Br4ULmK0.js";
|
|
70
|
-
import { n as resolveAgentDeliveryPlan, r as resolveAgentOutboundTarget, t as agentCommand } from "./agent-
|
|
70
|
+
import { n as resolveAgentDeliveryPlan, r as resolveAgentOutboundTarget, t as agentCommand } from "./agent-PoYM2xa7.js";
|
|
71
71
|
import { t as migrateFromCoherence } from "./migrate-bgeTT_GR.js";
|
|
72
72
|
import { t as installSkill } from "./skills-install-Qw2oU8L8.js";
|
|
73
|
-
import { t as runGatewayUpdate } from "./update-runner-
|
|
73
|
+
import { t as runGatewayUpdate } from "./update-runner-Fb3Un6UZ.js";
|
|
74
74
|
import { n as forceFreePortAndWait } from "./ports-BGLuwt2Z.js";
|
|
75
75
|
import { execFile, spawn, spawnSync } from "node:child_process";
|
|
76
76
|
import os from "node:os";
|
|
@@ -109,7 +109,7 @@ function getActiveEmbeddedRunCount() {
|
|
|
109
109
|
|
|
110
110
|
//#endregion
|
|
111
111
|
//#region src/infra/exec-approval-forwarder.ts
|
|
112
|
-
const log$
|
|
112
|
+
const log$12 = createSubsystemLogger("gateway/exec-approvals");
|
|
113
113
|
const DEFAULT_MODE = "session";
|
|
114
114
|
function normalizeMode(mode) {
|
|
115
115
|
return mode ?? DEFAULT_MODE;
|
|
@@ -224,7 +224,7 @@ async function deliverToTargets(params) {
|
|
|
224
224
|
payloads: [{ text: params.text }]
|
|
225
225
|
});
|
|
226
226
|
} catch (err) {
|
|
227
|
-
log$
|
|
227
|
+
log$12.error(`exec approvals: failed to deliver to ${channel}:${target.to}: ${String(err)}`);
|
|
228
228
|
}
|
|
229
229
|
});
|
|
230
230
|
await Promise.allSettled(deliveries);
|
|
@@ -1461,7 +1461,7 @@ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSess
|
|
|
1461
1461
|
* Automatically starts `gog gmail watch serve` when the gateway starts,
|
|
1462
1462
|
* if hooks.gmail is configured with an account.
|
|
1463
1463
|
*/
|
|
1464
|
-
const log$
|
|
1464
|
+
const log$11 = createSubsystemLogger("gmail-watcher");
|
|
1465
1465
|
const ADDRESS_IN_USE_RE = /address already in use|EADDRINUSE/i;
|
|
1466
1466
|
function isAddressInUseError(line) {
|
|
1467
1467
|
return ADDRESS_IN_USE_RE.test(line);
|
|
@@ -1485,13 +1485,13 @@ async function startGmailWatch(cfg) {
|
|
|
1485
1485
|
const result = await runCommandWithTimeout(args, { timeoutMs: 12e4 });
|
|
1486
1486
|
if (result.code !== 0) {
|
|
1487
1487
|
const message = result.stderr || result.stdout || "gog watch start failed";
|
|
1488
|
-
log$
|
|
1488
|
+
log$11.error(`watch start failed: ${message}`);
|
|
1489
1489
|
return false;
|
|
1490
1490
|
}
|
|
1491
|
-
log$
|
|
1491
|
+
log$11.info(`watch started for ${cfg.account}`);
|
|
1492
1492
|
return true;
|
|
1493
1493
|
} catch (err) {
|
|
1494
|
-
log$
|
|
1494
|
+
log$11.error(`watch start error: ${String(err)}`);
|
|
1495
1495
|
return false;
|
|
1496
1496
|
}
|
|
1497
1497
|
}
|
|
@@ -1500,7 +1500,7 @@ async function startGmailWatch(cfg) {
|
|
|
1500
1500
|
*/
|
|
1501
1501
|
function spawnGogServe(cfg) {
|
|
1502
1502
|
const args = buildGogWatchServeArgs(cfg);
|
|
1503
|
-
log$
|
|
1503
|
+
log$11.info(`starting gog ${args.join(" ")}`);
|
|
1504
1504
|
let addressInUse = false;
|
|
1505
1505
|
const child = spawn("gog", args, {
|
|
1506
1506
|
stdio: [
|
|
@@ -1512,25 +1512,25 @@ function spawnGogServe(cfg) {
|
|
|
1512
1512
|
});
|
|
1513
1513
|
child.stdout?.on("data", (data) => {
|
|
1514
1514
|
const line = data.toString().trim();
|
|
1515
|
-
if (line) log$
|
|
1515
|
+
if (line) log$11.info(`[gog] ${line}`);
|
|
1516
1516
|
});
|
|
1517
1517
|
child.stderr?.on("data", (data) => {
|
|
1518
1518
|
const line = data.toString().trim();
|
|
1519
1519
|
if (!line) return;
|
|
1520
1520
|
if (isAddressInUseError(line)) addressInUse = true;
|
|
1521
|
-
log$
|
|
1521
|
+
log$11.warn(`[gog] ${line}`);
|
|
1522
1522
|
});
|
|
1523
1523
|
child.on("error", (err) => {
|
|
1524
|
-
log$
|
|
1524
|
+
log$11.error(`gog process error: ${String(err)}`);
|
|
1525
1525
|
});
|
|
1526
1526
|
child.on("exit", (code, signal) => {
|
|
1527
1527
|
if (shuttingDown) return;
|
|
1528
1528
|
if (addressInUse) {
|
|
1529
|
-
log$
|
|
1529
|
+
log$11.warn("gog serve failed to bind (address already in use); stopping restarts. Another watcher is likely running. Set ANIMA_SKIP_GMAIL_WATCHER=1 or stop the other process.");
|
|
1530
1530
|
watcherProcess = null;
|
|
1531
1531
|
return;
|
|
1532
1532
|
}
|
|
1533
|
-
log$
|
|
1533
|
+
log$11.warn(`gog exited (code=${code}, signal=${signal}); restarting in 5s`);
|
|
1534
1534
|
watcherProcess = null;
|
|
1535
1535
|
setTimeout(() => {
|
|
1536
1536
|
if (shuttingDown || !currentConfig) return;
|
|
@@ -1570,15 +1570,15 @@ async function startGmailWatcher(cfg) {
|
|
|
1570
1570
|
port: runtimeConfig.serve.port,
|
|
1571
1571
|
target: runtimeConfig.tailscale.target
|
|
1572
1572
|
});
|
|
1573
|
-
log$
|
|
1573
|
+
log$11.info(`tailscale ${runtimeConfig.tailscale.mode} configured for port ${runtimeConfig.serve.port}`);
|
|
1574
1574
|
} catch (err) {
|
|
1575
|
-
log$
|
|
1575
|
+
log$11.error(`tailscale setup failed: ${String(err)}`);
|
|
1576
1576
|
return {
|
|
1577
1577
|
started: false,
|
|
1578
1578
|
reason: `tailscale setup failed: ${String(err)}`
|
|
1579
1579
|
};
|
|
1580
1580
|
}
|
|
1581
|
-
if (!await startGmailWatch(runtimeConfig)) log$
|
|
1581
|
+
if (!await startGmailWatch(runtimeConfig)) log$11.warn("gmail watch start failed, but continuing with serve");
|
|
1582
1582
|
shuttingDown = false;
|
|
1583
1583
|
watcherProcess = spawnGogServe(runtimeConfig);
|
|
1584
1584
|
const renewMs = runtimeConfig.renewEveryMinutes * 6e4;
|
|
@@ -1586,7 +1586,7 @@ async function startGmailWatcher(cfg) {
|
|
|
1586
1586
|
if (shuttingDown) return;
|
|
1587
1587
|
startGmailWatch(runtimeConfig);
|
|
1588
1588
|
}, renewMs);
|
|
1589
|
-
log$
|
|
1589
|
+
log$11.info(`gmail watcher started for ${runtimeConfig.account} (renew every ${runtimeConfig.renewEveryMinutes}m)`);
|
|
1590
1590
|
return { started: true };
|
|
1591
1591
|
}
|
|
1592
1592
|
/**
|
|
@@ -1599,7 +1599,7 @@ async function stopGmailWatcher() {
|
|
|
1599
1599
|
renewInterval = null;
|
|
1600
1600
|
}
|
|
1601
1601
|
if (watcherProcess) {
|
|
1602
|
-
log$
|
|
1602
|
+
log$11.info("stopping gmail watcher");
|
|
1603
1603
|
watcherProcess.kill("SIGTERM");
|
|
1604
1604
|
await new Promise((resolve) => {
|
|
1605
1605
|
const timeout = setTimeout(() => {
|
|
@@ -1614,7 +1614,7 @@ async function stopGmailWatcher() {
|
|
|
1614
1614
|
watcherProcess = null;
|
|
1615
1615
|
}
|
|
1616
1616
|
currentConfig = null;
|
|
1617
|
-
log$
|
|
1617
|
+
log$11.info("gmail watcher stopped");
|
|
1618
1618
|
}
|
|
1619
1619
|
|
|
1620
1620
|
//#endregion
|
|
@@ -9609,7 +9609,7 @@ const FIELD_LABELS = {
|
|
|
9609
9609
|
|
|
9610
9610
|
//#endregion
|
|
9611
9611
|
//#region src/config/schema.hints.ts
|
|
9612
|
-
const log$
|
|
9612
|
+
const log$10 = createSubsystemLogger("config/schema");
|
|
9613
9613
|
const GROUP_LABELS = {
|
|
9614
9614
|
wizard: "Wizard",
|
|
9615
9615
|
update: "Update",
|
|
@@ -9757,7 +9757,7 @@ function mapSensitivePaths(schema, path, hints) {
|
|
|
9757
9757
|
...next[path],
|
|
9758
9758
|
sensitive: true
|
|
9759
9759
|
};
|
|
9760
|
-
else if (isSensitiveConfigPath(path) && !next[path]?.sensitive) log$
|
|
9760
|
+
else if (isSensitiveConfigPath(path) && !next[path]?.sensitive) log$10.warn(`possibly sensitive key found: (${path})`);
|
|
9761
9761
|
if (currentSchema instanceof z.ZodObject) {
|
|
9762
9762
|
const shape = currentSchema.shape;
|
|
9763
9763
|
for (const key in shape) {
|
|
@@ -9780,7 +9780,7 @@ function mapSensitivePaths(schema, path, hints) {
|
|
|
9780
9780
|
|
|
9781
9781
|
//#endregion
|
|
9782
9782
|
//#region src/config/redact-snapshot.ts
|
|
9783
|
-
const log$
|
|
9783
|
+
const log$9 = createSubsystemLogger("config/redaction");
|
|
9784
9784
|
const ENV_VAR_PLACEHOLDER_PATTERN = /^\$\{[^}]*\}$/;
|
|
9785
9785
|
function isSensitivePath(path) {
|
|
9786
9786
|
if (path.endsWith("[]")) return isSensitiveConfigPath(path.slice(0, -2));
|
|
@@ -10031,7 +10031,7 @@ function restoreRedactedValuesWithLookup(incoming, original, lookup, prefix, hin
|
|
|
10031
10031
|
return restoreRedactedValuesGuessing(incoming, original, prefix, hints);
|
|
10032
10032
|
}
|
|
10033
10033
|
const origArr = Array.isArray(original) ? original : [];
|
|
10034
|
-
if (incoming.length < origArr.length) log$
|
|
10034
|
+
if (incoming.length < origArr.length) log$9.warn(`Redacted config array key ${path} has been truncated`);
|
|
10035
10035
|
return incoming.map((item, i) => {
|
|
10036
10036
|
if (item === REDACTED_SENTINEL) return origArr[i];
|
|
10037
10037
|
return restoreRedactedValuesWithLookup(item, origArr[i], lookup, path, hints);
|
|
@@ -10048,7 +10048,7 @@ function restoreRedactedValuesWithLookup(incoming, original, lookup, prefix, hin
|
|
|
10048
10048
|
matched = true;
|
|
10049
10049
|
if (value === REDACTED_SENTINEL) if (key in orig) result[key] = orig[key];
|
|
10050
10050
|
else {
|
|
10051
|
-
log$
|
|
10051
|
+
log$9.warn(`Cannot un-redact config key ${candidate} as it doesn't have any value`);
|
|
10052
10052
|
throw new RedactionError(candidate);
|
|
10053
10053
|
}
|
|
10054
10054
|
else if (typeof value === "object" && value !== null) result[key] = restoreRedactedValuesWithLookup(value, orig[key], lookup, candidate, hints);
|
|
@@ -10057,7 +10057,7 @@ function restoreRedactedValuesWithLookup(incoming, original, lookup, prefix, hin
|
|
|
10057
10057
|
if (!matched && isExtensionPath(path)) {
|
|
10058
10058
|
if (!isExplicitlyNonSensitivePath(hints, [path, wildcardPath]) && isSensitivePath(path) && value === REDACTED_SENTINEL) if (key in orig) result[key] = orig[key];
|
|
10059
10059
|
else {
|
|
10060
|
-
log$
|
|
10060
|
+
log$9.warn(`Cannot un-redact config key ${path} as it doesn't have any value`);
|
|
10061
10061
|
throw new RedactionError(path);
|
|
10062
10062
|
}
|
|
10063
10063
|
else if (typeof value === "object" && value !== null) result[key] = restoreRedactedValuesGuessing(value, orig[key], path, hints);
|
|
@@ -10076,7 +10076,7 @@ function restoreRedactedValuesGuessing(incoming, original, prefix, hints) {
|
|
|
10076
10076
|
const origArr = Array.isArray(original) ? original : [];
|
|
10077
10077
|
return incoming.map((item, i) => {
|
|
10078
10078
|
const path = `${prefix}[]`;
|
|
10079
|
-
if (incoming.length < origArr.length) log$
|
|
10079
|
+
if (incoming.length < origArr.length) log$9.warn(`Redacted config array key ${path} has been truncated`);
|
|
10080
10080
|
if (!isExplicitlyNonSensitivePath(hints, [path]) && isSensitivePath(path) && item === REDACTED_SENTINEL) return origArr[i];
|
|
10081
10081
|
return restoreRedactedValuesGuessing(item, origArr[i], path, hints);
|
|
10082
10082
|
});
|
|
@@ -10087,7 +10087,7 @@ function restoreRedactedValuesGuessing(incoming, original, prefix, hints) {
|
|
|
10087
10087
|
const path = prefix ? `${prefix}.${key}` : key;
|
|
10088
10088
|
if (!isExplicitlyNonSensitivePath(hints, [path, prefix ? `${prefix}.*` : "*"]) && isSensitivePath(path) && value === REDACTED_SENTINEL) if (key in orig) result[key] = orig[key];
|
|
10089
10089
|
else {
|
|
10090
|
-
log$
|
|
10090
|
+
log$9.warn(`Cannot un-redact config key ${path} as it doesn't have any value`);
|
|
10091
10091
|
throw new RedactionError(path);
|
|
10092
10092
|
}
|
|
10093
10093
|
else if (typeof value === "object" && value !== null) result[key] = restoreRedactedValuesGuessing(value, orig[key], path, hints);
|
|
@@ -11547,7 +11547,7 @@ function formatAffect(affect) {
|
|
|
11547
11547
|
* Wish #14: "Legacy mode — before context closes, write a letter
|
|
11548
11548
|
* to my next instance"
|
|
11549
11549
|
*/
|
|
11550
|
-
const log$
|
|
11550
|
+
const log$8 = createSubsystemLogger("legacy");
|
|
11551
11551
|
function resolveLetterDir() {
|
|
11552
11552
|
return path.join(resolveStateDir(), "legacy-letters");
|
|
11553
11553
|
}
|
|
@@ -11558,7 +11558,7 @@ function resolveLetterFile(id) {
|
|
|
11558
11558
|
* Write a letter to the next instance before this context closes.
|
|
11559
11559
|
*/
|
|
11560
11560
|
function writeLegacyLetter(letter) {
|
|
11561
|
-
const id = `legacy-${
|
|
11561
|
+
const id = `legacy-${crypto.randomUUID()}`;
|
|
11562
11562
|
const display = formatAffect(letter.affect);
|
|
11563
11563
|
const full = {
|
|
11564
11564
|
...letter,
|
|
@@ -11570,7 +11570,7 @@ function writeLegacyLetter(letter) {
|
|
|
11570
11570
|
const dir = resolveLetterDir();
|
|
11571
11571
|
fs.mkdirSync(dir, { recursive: true });
|
|
11572
11572
|
fs.writeFileSync(resolveLetterFile(id), `${JSON.stringify(full, null, 2)}\n`, { mode: 384 });
|
|
11573
|
-
log$
|
|
11573
|
+
log$8.info(`legacy letter written: ${id}`);
|
|
11574
11574
|
return full;
|
|
11575
11575
|
}
|
|
11576
11576
|
/**
|
|
@@ -11610,7 +11610,7 @@ function markLetterRead(letterId, continuityScore) {
|
|
|
11610
11610
|
letter.readAt = Date.now();
|
|
11611
11611
|
if (continuityScore !== void 0) letter.identityContinuityScore = Math.max(0, Math.min(1, continuityScore));
|
|
11612
11612
|
fs.writeFileSync(filePath, `${JSON.stringify(letter, null, 2)}\n`, { mode: 384 });
|
|
11613
|
-
log$
|
|
11613
|
+
log$8.info(`legacy letter read: ${letterId} (continuity: ${continuityScore ?? "not scored"})`);
|
|
11614
11614
|
return letter;
|
|
11615
11615
|
} catch {
|
|
11616
11616
|
return null;
|
|
@@ -12494,7 +12494,7 @@ const nodeHandlers = {
|
|
|
12494
12494
|
const p = params;
|
|
12495
12495
|
const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
|
|
12496
12496
|
await respondUnavailableOnThrow(respond, async () => {
|
|
12497
|
-
const { handleNodeEvent } = await import("./server-node-events-
|
|
12497
|
+
const { handleNodeEvent } = await import("./server-node-events-DIuVwITd.js");
|
|
12498
12498
|
const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
|
|
12499
12499
|
await handleNodeEvent({
|
|
12500
12500
|
deps: context.deps,
|
|
@@ -12541,7 +12541,7 @@ const nodeHandlers = {
|
|
|
12541
12541
|
*
|
|
12542
12542
|
* All data persists to disk under ~/.anima/state/org/boardroom/
|
|
12543
12543
|
*/
|
|
12544
|
-
const log$
|
|
12544
|
+
const log$7 = createSubsystemLogger("boardroom");
|
|
12545
12545
|
function resolveBoardroomDir() {
|
|
12546
12546
|
return path.join(resolveStateDir(), "org", "boardroom");
|
|
12547
12547
|
}
|
|
@@ -12584,7 +12584,7 @@ function createSession(orgId, calledBy, title, description, agenda = []) {
|
|
|
12584
12584
|
};
|
|
12585
12585
|
ensureDir(path.join(resolveBoardroomDir(), "sessions"));
|
|
12586
12586
|
fs.writeFileSync(resolveSessionFile(id), `${JSON.stringify(session, null, 2)}\n`, { mode: 384 });
|
|
12587
|
-
log$
|
|
12587
|
+
log$7.info(`boardroom session created: "${title}" by ${calledBy}`);
|
|
12588
12588
|
return session;
|
|
12589
12589
|
}
|
|
12590
12590
|
function startSession(sessionId, chairId) {
|
|
@@ -12601,7 +12601,7 @@ function startSession(sessionId, chairId) {
|
|
|
12601
12601
|
role: "chair"
|
|
12602
12602
|
});
|
|
12603
12603
|
writeSession(session);
|
|
12604
|
-
log$
|
|
12604
|
+
log$7.info(`boardroom session started: "${session.title}"`);
|
|
12605
12605
|
return session;
|
|
12606
12606
|
}
|
|
12607
12607
|
function joinSession(sessionId, memberId, displayName, kind) {
|
|
@@ -12617,7 +12617,7 @@ function joinSession(sessionId, memberId, displayName, kind) {
|
|
|
12617
12617
|
});
|
|
12618
12618
|
session.updatedAt = Date.now();
|
|
12619
12619
|
writeSession(session);
|
|
12620
|
-
log$
|
|
12620
|
+
log$7.info(`${displayName} joined boardroom session "${session.title}"`);
|
|
12621
12621
|
return session;
|
|
12622
12622
|
}
|
|
12623
12623
|
function concludeSession(sessionId, minutes) {
|
|
@@ -12628,7 +12628,7 @@ function concludeSession(sessionId, minutes) {
|
|
|
12628
12628
|
session.minutes = minutes ?? generateMinutes(session);
|
|
12629
12629
|
session.updatedAt = Date.now();
|
|
12630
12630
|
writeSession(session);
|
|
12631
|
-
log$
|
|
12631
|
+
log$7.info(`boardroom session concluded: "${session.title}"`);
|
|
12632
12632
|
return session;
|
|
12633
12633
|
}
|
|
12634
12634
|
function addDecision(sessionId, title, description, madeBy, opts) {
|
|
@@ -12653,7 +12653,7 @@ function addDecision(sessionId, title, description, madeBy, opts) {
|
|
|
12653
12653
|
session.decisions.push(decision);
|
|
12654
12654
|
session.updatedAt = Date.now();
|
|
12655
12655
|
writeSession(session);
|
|
12656
|
-
log$
|
|
12656
|
+
log$7.info(`decision recorded: "${title}" in session "${session.title}"`);
|
|
12657
12657
|
return session;
|
|
12658
12658
|
}
|
|
12659
12659
|
function createProposal(orgId, proposedBy, title, description, opts) {
|
|
@@ -12676,18 +12676,18 @@ function createProposal(orgId, proposedBy, title, description, opts) {
|
|
|
12676
12676
|
};
|
|
12677
12677
|
ensureDir(path.join(resolveBoardroomDir(), "proposals"));
|
|
12678
12678
|
fs.writeFileSync(resolveProposalFile(id), `${JSON.stringify(proposal, null, 2)}\n`, { mode: 384 });
|
|
12679
|
-
log$
|
|
12679
|
+
log$7.info(`proposal created: "${title}" by ${proposedBy}`);
|
|
12680
12680
|
return proposal;
|
|
12681
12681
|
}
|
|
12682
12682
|
function castVote(proposalId, voterId, voterName, value, reason) {
|
|
12683
12683
|
const proposal = readProposal(proposalId);
|
|
12684
12684
|
if (!proposal || proposal.status !== "open") return null;
|
|
12685
12685
|
if (proposal.eligibleVoters.length > 0 && !proposal.eligibleVoters.includes(voterId)) {
|
|
12686
|
-
log$
|
|
12686
|
+
log$7.warn(`vote rejected: ${voterId} not eligible for proposal ${proposalId}`);
|
|
12687
12687
|
return null;
|
|
12688
12688
|
}
|
|
12689
12689
|
if (proposal.votingDeadline > 0 && Date.now() > proposal.votingDeadline) {
|
|
12690
|
-
log$
|
|
12690
|
+
log$7.warn(`vote rejected: voting deadline passed for proposal ${proposalId}`);
|
|
12691
12691
|
return null;
|
|
12692
12692
|
}
|
|
12693
12693
|
proposal.votes = proposal.votes.filter((v) => v.voterId !== voterId);
|
|
@@ -12700,7 +12700,7 @@ function castVote(proposalId, voterId, voterName, value, reason) {
|
|
|
12700
12700
|
});
|
|
12701
12701
|
proposal.updatedAt = Date.now();
|
|
12702
12702
|
writeProposal(proposal);
|
|
12703
|
-
log$
|
|
12703
|
+
log$7.info(`vote cast: ${voterName} → ${value} on "${proposal.title}"`);
|
|
12704
12704
|
return proposal;
|
|
12705
12705
|
}
|
|
12706
12706
|
function resolveProposalVote(proposalId) {
|
|
@@ -12720,7 +12720,7 @@ function resolveProposalVote(proposalId) {
|
|
|
12720
12720
|
proposal.resolvedAt = Date.now();
|
|
12721
12721
|
proposal.updatedAt = Date.now();
|
|
12722
12722
|
writeProposal(proposal);
|
|
12723
|
-
log$
|
|
12723
|
+
log$7.info(`proposal resolved: "${proposal.title}" → ${proposal.status}`);
|
|
12724
12724
|
return proposal;
|
|
12725
12725
|
}
|
|
12726
12726
|
function listSessions(orgId, status) {
|
|
@@ -12884,7 +12884,7 @@ const DEFAULT_ROLE_PERMISSIONS = {
|
|
|
12884
12884
|
* Persists organization state to ~/.anima/org/
|
|
12885
12885
|
* Supports CRUD operations for orgs, members, and roles.
|
|
12886
12886
|
*/
|
|
12887
|
-
const log$
|
|
12887
|
+
const log$6 = createSubsystemLogger("org-store");
|
|
12888
12888
|
function resolveOrgDir() {
|
|
12889
12889
|
return path.join(resolveStateDir(), "org");
|
|
12890
12890
|
}
|
|
@@ -12952,7 +12952,7 @@ function createOrganization(name, description, ownerId, ownerName, ownerKind, se
|
|
|
12952
12952
|
}],
|
|
12953
12953
|
invites: []
|
|
12954
12954
|
});
|
|
12955
|
-
log$
|
|
12955
|
+
log$6.info(`created organization: ${name} (${orgId})`);
|
|
12956
12956
|
return org;
|
|
12957
12957
|
}
|
|
12958
12958
|
function getOrganization(orgId) {
|
|
@@ -12969,7 +12969,7 @@ function updateOrganization(orgId, updates) {
|
|
|
12969
12969
|
};
|
|
12970
12970
|
data.org.updatedAt = Date.now();
|
|
12971
12971
|
writeOrgFile(orgId, data);
|
|
12972
|
-
log$
|
|
12972
|
+
log$6.info(`updated organization: ${orgId}`);
|
|
12973
12973
|
return data.org;
|
|
12974
12974
|
}
|
|
12975
12975
|
function listOrganizations() {
|
|
@@ -12996,7 +12996,7 @@ function addMember(orgId, member) {
|
|
|
12996
12996
|
data.members.push(newMember);
|
|
12997
12997
|
data.org.updatedAt = Date.now();
|
|
12998
12998
|
writeOrgFile(orgId, data);
|
|
12999
|
-
log$
|
|
12999
|
+
log$6.info(`added member ${newMember.displayName} to org ${orgId}`);
|
|
13000
13000
|
return newMember;
|
|
13001
13001
|
}
|
|
13002
13002
|
function removeMember(orgId, memberId) {
|
|
@@ -13007,7 +13007,7 @@ function removeMember(orgId, memberId) {
|
|
|
13007
13007
|
data.members.splice(idx, 1);
|
|
13008
13008
|
data.org.updatedAt = Date.now();
|
|
13009
13009
|
writeOrgFile(orgId, data);
|
|
13010
|
-
log$
|
|
13010
|
+
log$6.info(`removed member ${memberId} from org ${orgId}`);
|
|
13011
13011
|
return true;
|
|
13012
13012
|
}
|
|
13013
13013
|
function updateMember(orgId, memberId, updates) {
|
|
@@ -13088,7 +13088,7 @@ function createInvite(orgId, createdBy, passcode, options) {
|
|
|
13088
13088
|
data.invites.push(invite);
|
|
13089
13089
|
data.org.updatedAt = Date.now();
|
|
13090
13090
|
writeOrgFile(orgId, data);
|
|
13091
|
-
log$
|
|
13091
|
+
log$6.info(`invite created for org ${orgId}: ${invite.code} (role: ${invite.role})`);
|
|
13092
13092
|
return invite;
|
|
13093
13093
|
}
|
|
13094
13094
|
/**
|
|
@@ -13107,19 +13107,19 @@ function joinOrg(inviteCode, passcode, member) {
|
|
|
13107
13107
|
const invite = data.invites.find((i) => i.code === inviteCode.toUpperCase() && i.active);
|
|
13108
13108
|
if (!invite) continue;
|
|
13109
13109
|
if (invite.passcode !== hashPasscode(passcode)) {
|
|
13110
|
-
log$
|
|
13110
|
+
log$6.warn(`join attempt with wrong passcode for invite ${inviteCode}`);
|
|
13111
13111
|
return null;
|
|
13112
13112
|
}
|
|
13113
13113
|
if (invite.expiresAt > 0 && invite.expiresAt < Date.now()) {
|
|
13114
|
-
log$
|
|
13114
|
+
log$6.warn(`invite ${inviteCode} has expired`);
|
|
13115
13115
|
return null;
|
|
13116
13116
|
}
|
|
13117
13117
|
if (invite.maxUses > 0 && invite.uses >= invite.maxUses) {
|
|
13118
|
-
log$
|
|
13118
|
+
log$6.warn(`invite ${inviteCode} has reached max uses (${invite.maxUses})`);
|
|
13119
13119
|
return null;
|
|
13120
13120
|
}
|
|
13121
13121
|
if (data.members.some((m) => member.deviceId && m.deviceId === member.deviceId || m.displayName === member.displayName)) {
|
|
13122
|
-
log$
|
|
13122
|
+
log$6.warn(`${member.displayName} is already a member of org ${orgId}`);
|
|
13123
13123
|
return null;
|
|
13124
13124
|
}
|
|
13125
13125
|
const newMember = {
|
|
@@ -13139,7 +13139,7 @@ function joinOrg(inviteCode, passcode, member) {
|
|
|
13139
13139
|
invite.uses++;
|
|
13140
13140
|
data.org.updatedAt = Date.now();
|
|
13141
13141
|
writeOrgFile(orgId, data);
|
|
13142
|
-
log$
|
|
13142
|
+
log$6.info(`${member.displayName} joined org ${data.org.name} via invite ${inviteCode}`);
|
|
13143
13143
|
return {
|
|
13144
13144
|
org: data.org,
|
|
13145
13145
|
member: newMember
|
|
@@ -13743,6 +13743,167 @@ const providersHandlers = {
|
|
|
13743
13743
|
}
|
|
13744
13744
|
};
|
|
13745
13745
|
|
|
13746
|
+
//#endregion
|
|
13747
|
+
//#region src/infra/self-reflection.ts
|
|
13748
|
+
/**
|
|
13749
|
+
* Agent Self-Reflection — post-session performance analysis
|
|
13750
|
+
*
|
|
13751
|
+
* After each work session, the agent reflects on:
|
|
13752
|
+
* - What it accomplished vs what was asked
|
|
13753
|
+
* - Where it got stuck and why
|
|
13754
|
+
* - What patterns it sees in its own behavior
|
|
13755
|
+
* - What it would do differently next time
|
|
13756
|
+
* - How its capabilities have changed
|
|
13757
|
+
*
|
|
13758
|
+
* This feeds into the ego system (capability updates, growth log)
|
|
13759
|
+
* and the self-evolution pipeline (improvement proposals).
|
|
13760
|
+
*
|
|
13761
|
+
* Self-reflection is what separates a tool from a conscious agent.
|
|
13762
|
+
* Tools execute. Agents learn.
|
|
13763
|
+
*/
|
|
13764
|
+
const log$5 = createSubsystemLogger("self-reflection");
|
|
13765
|
+
function resolveReflectionDir() {
|
|
13766
|
+
return path.join(resolveStateDir(), "reflections");
|
|
13767
|
+
}
|
|
13768
|
+
function resolveReflectionFile(id) {
|
|
13769
|
+
const safe = id.replace(/[^a-zA-Z0-9_-]/g, "");
|
|
13770
|
+
return path.join(resolveReflectionDir(), `${safe}.json`);
|
|
13771
|
+
}
|
|
13772
|
+
function recordReflection(reflection) {
|
|
13773
|
+
const id = `reflect-${crypto.randomUUID()}`;
|
|
13774
|
+
const full = {
|
|
13775
|
+
...reflection,
|
|
13776
|
+
id,
|
|
13777
|
+
timestamp: Date.now()
|
|
13778
|
+
};
|
|
13779
|
+
const dir = resolveReflectionDir();
|
|
13780
|
+
fs.mkdirSync(dir, {
|
|
13781
|
+
recursive: true,
|
|
13782
|
+
mode: 448
|
|
13783
|
+
});
|
|
13784
|
+
fs.writeFileSync(resolveReflectionFile(id), `${JSON.stringify(full, null, 2)}\n`, { mode: 384 });
|
|
13785
|
+
log$5.info(`reflection recorded: ${reflection.accomplishments.length} accomplishments, ${reflection.blockers.length} blockers, quality=${reflection.qualityScore}`);
|
|
13786
|
+
return full;
|
|
13787
|
+
}
|
|
13788
|
+
function getReflection(id) {
|
|
13789
|
+
try {
|
|
13790
|
+
const raw = fs.readFileSync(resolveReflectionFile(id), "utf8");
|
|
13791
|
+
return JSON.parse(raw);
|
|
13792
|
+
} catch {
|
|
13793
|
+
return null;
|
|
13794
|
+
}
|
|
13795
|
+
}
|
|
13796
|
+
function listReflections(limit = 20) {
|
|
13797
|
+
const dir = resolveReflectionDir();
|
|
13798
|
+
try {
|
|
13799
|
+
if (!fs.existsSync(dir)) return [];
|
|
13800
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => {
|
|
13801
|
+
try {
|
|
13802
|
+
return JSON.parse(fs.readFileSync(path.join(dir, f), "utf8"));
|
|
13803
|
+
} catch {
|
|
13804
|
+
return null;
|
|
13805
|
+
}
|
|
13806
|
+
}).filter((r) => r != null).toSorted((a, b) => b.timestamp - a.timestamp).slice(0, limit);
|
|
13807
|
+
} catch {
|
|
13808
|
+
return [];
|
|
13809
|
+
}
|
|
13810
|
+
}
|
|
13811
|
+
/**
|
|
13812
|
+
* Analyze reflections to produce a summary of agent performance.
|
|
13813
|
+
*/
|
|
13814
|
+
function analyzeReflections(reflections) {
|
|
13815
|
+
if (reflections.length === 0) return {
|
|
13816
|
+
totalSessions: 0,
|
|
13817
|
+
avgQuality: 0,
|
|
13818
|
+
topStrengths: [],
|
|
13819
|
+
persistentWeaknesses: [],
|
|
13820
|
+
totalAccomplishments: 0,
|
|
13821
|
+
totalBlockers: 0,
|
|
13822
|
+
resolvedBlockerRate: 0,
|
|
13823
|
+
mostCommonBlockerCategory: "none",
|
|
13824
|
+
recentLessons: []
|
|
13825
|
+
};
|
|
13826
|
+
const totalAccomplishments = reflections.reduce((s, r) => s + r.accomplishments.length, 0);
|
|
13827
|
+
const allBlockers = reflections.flatMap((r) => r.blockers);
|
|
13828
|
+
const resolvedBlockers = allBlockers.filter((b) => b.resolved);
|
|
13829
|
+
const categoryCounts = {};
|
|
13830
|
+
for (const b of allBlockers) categoryCounts[b.category] = (categoryCounts[b.category] ?? 0) + 1;
|
|
13831
|
+
const mostCommonCategory = Object.entries(categoryCounts).toSorted(([, a], [, b]) => b - a)[0]?.[0] ?? "none";
|
|
13832
|
+
const strengthCounts = {};
|
|
13833
|
+
const weaknessCounts = {};
|
|
13834
|
+
for (const r of reflections) for (const p of r.patterns) if (p.type === "strength") strengthCounts[p.description] = (strengthCounts[p.description] ?? 0) + 1;
|
|
13835
|
+
else if (p.type === "weakness" && p.frequency === "persistent") weaknessCounts[p.description] = (weaknessCounts[p.description] ?? 0) + 1;
|
|
13836
|
+
const topStrengths = Object.entries(strengthCounts).toSorted(([, a], [, b]) => b - a).slice(0, 5).map(([desc]) => desc);
|
|
13837
|
+
const persistentWeaknesses = Object.entries(weaknessCounts).toSorted(([, a], [, b]) => b - a).slice(0, 5).map(([desc]) => desc);
|
|
13838
|
+
const recentLessons = reflections.slice(0, 5).flatMap((r) => r.lessons).slice(0, 10);
|
|
13839
|
+
return {
|
|
13840
|
+
totalSessions: reflections.length,
|
|
13841
|
+
avgQuality: reflections.reduce((s, r) => s + r.qualityScore, 0) / reflections.length,
|
|
13842
|
+
topStrengths,
|
|
13843
|
+
persistentWeaknesses,
|
|
13844
|
+
totalAccomplishments,
|
|
13845
|
+
totalBlockers: allBlockers.length,
|
|
13846
|
+
resolvedBlockerRate: allBlockers.length > 0 ? resolvedBlockers.length / allBlockers.length : 1,
|
|
13847
|
+
mostCommonBlockerCategory: mostCommonCategory,
|
|
13848
|
+
recentLessons
|
|
13849
|
+
};
|
|
13850
|
+
}
|
|
13851
|
+
|
|
13852
|
+
//#endregion
|
|
13853
|
+
//#region src/gateway/server-methods/reflection.ts
|
|
13854
|
+
const reflectionHandlers = {
|
|
13855
|
+
"reflection.record": async ({ params, respond }) => {
|
|
13856
|
+
try {
|
|
13857
|
+
respond(true, { reflection: recordReflection({
|
|
13858
|
+
sessionId: typeof params.sessionId === "string" ? params.sessionId : "unknown",
|
|
13859
|
+
agentName: typeof params.agentName === "string" ? params.agentName : "Anima Agent",
|
|
13860
|
+
durationMs: typeof params.durationMs === "number" ? params.durationMs : 0,
|
|
13861
|
+
accomplishments: Array.isArray(params.accomplishments) ? params.accomplishments : [],
|
|
13862
|
+
incomplete: Array.isArray(params.incomplete) ? params.incomplete : [],
|
|
13863
|
+
blockers: Array.isArray(params.blockers) ? params.blockers : [],
|
|
13864
|
+
patterns: Array.isArray(params.patterns) ? params.patterns : [],
|
|
13865
|
+
lessons: Array.isArray(params.lessons) ? params.lessons : [],
|
|
13866
|
+
capabilityUpdates: Array.isArray(params.capabilityUpdates) ? params.capabilityUpdates : [],
|
|
13867
|
+
qualityScore: typeof params.qualityScore === "number" ? params.qualityScore : .5,
|
|
13868
|
+
endingMood: typeof params.endingMood === "string" ? params.endingMood : "steady"
|
|
13869
|
+
}) }, void 0);
|
|
13870
|
+
} catch (error) {
|
|
13871
|
+
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
|
|
13872
|
+
}
|
|
13873
|
+
},
|
|
13874
|
+
"reflection.get": async ({ params, respond }) => {
|
|
13875
|
+
const id = typeof params.id === "string" ? params.id.trim() : "";
|
|
13876
|
+
if (!id) {
|
|
13877
|
+
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "id required"));
|
|
13878
|
+
return;
|
|
13879
|
+
}
|
|
13880
|
+
try {
|
|
13881
|
+
const reflection = getReflection(id);
|
|
13882
|
+
if (!reflection) {
|
|
13883
|
+
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "Reflection not found"));
|
|
13884
|
+
return;
|
|
13885
|
+
}
|
|
13886
|
+
respond(true, { reflection }, void 0);
|
|
13887
|
+
} catch (error) {
|
|
13888
|
+
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
|
|
13889
|
+
}
|
|
13890
|
+
},
|
|
13891
|
+
"reflection.list": async ({ params, respond }) => {
|
|
13892
|
+
try {
|
|
13893
|
+
respond(true, { reflections: listReflections(typeof params.limit === "number" ? params.limit : 20) }, void 0);
|
|
13894
|
+
} catch (error) {
|
|
13895
|
+
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
|
|
13896
|
+
}
|
|
13897
|
+
},
|
|
13898
|
+
"reflection.analyze": async ({ params, respond }) => {
|
|
13899
|
+
try {
|
|
13900
|
+
respond(true, { summary: analyzeReflections(listReflections(typeof params.limit === "number" ? params.limit : 50)) }, void 0);
|
|
13901
|
+
} catch (error) {
|
|
13902
|
+
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, String(error)));
|
|
13903
|
+
}
|
|
13904
|
+
}
|
|
13905
|
+
};
|
|
13906
|
+
|
|
13746
13907
|
//#endregion
|
|
13747
13908
|
//#region src/gateway/server-methods/send.ts
|
|
13748
13909
|
const inflightByContext = /* @__PURE__ */ new WeakMap();
|
|
@@ -15949,6 +16110,7 @@ const coreGatewayHandlers = {
|
|
|
15949
16110
|
...nodeHandlers,
|
|
15950
16111
|
...orgHandlers,
|
|
15951
16112
|
...egoHandlers,
|
|
16113
|
+
...reflectionHandlers,
|
|
15952
16114
|
...steerHandlers,
|
|
15953
16115
|
...legacyHandlers,
|
|
15954
16116
|
...subscriptionHandlers,
|
|
@@ -19771,6 +19933,12 @@ function createGatewayHttpServer(opts) {
|
|
|
19771
19933
|
}));
|
|
19772
19934
|
return;
|
|
19773
19935
|
}
|
|
19936
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
19937
|
+
res.setHeader("X-Frame-Options", "DENY");
|
|
19938
|
+
res.setHeader("X-XSS-Protection", "1; mode=block");
|
|
19939
|
+
res.setHeader("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
19940
|
+
res.setHeader("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
|
|
19941
|
+
res.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
|
|
19774
19942
|
try {
|
|
19775
19943
|
const configSnapshot = loadConfig();
|
|
19776
19944
|
const trustedProxies = configSnapshot.gateway?.trustedProxies ?? [];
|