@fased/fased 0.1.40 → 0.1.41

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 (86) hide show
  1. package/dist/brand.js +1 -1
  2. package/dist/build-info.json +3 -3
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/cli/update-cli/update-command.js +15 -0
  5. package/dist/commands/onboard-non-interactive/local/gateway-config.js +1 -1
  6. package/dist/gateway/server-plugins.js +8 -3
  7. package/dist/gateway/server.impl.js +2 -2
  8. package/dist/plugin-sdk/{accounts-C5BjfxoO.js → accounts-COY-15zJ.js} +1 -1
  9. package/dist/plugin-sdk/{allow-list-DqLmAAjC.js → allow-list-Cgjx0Mc-.js} +1 -1
  10. package/dist/plugin-sdk/{audio-preflight-CSRhaknd.js → audio-preflight-Chxqjwxe.js} +1 -1
  11. package/dist/plugin-sdk/{audio-preflight-DlkuhmkH.js → audio-preflight-aupYKWfa.js} +1 -1
  12. package/dist/plugin-sdk/channel-plugin-common.js +2 -2
  13. package/dist/plugin-sdk/{chunk-items-B1CvDQbk.js → chunk-items-BDhRe_xU.js} +1 -1
  14. package/dist/plugin-sdk/command-status.js +1 -1
  15. package/dist/plugin-sdk/{config-HEgnpfBH.js → config-BULEb5QB.js} +7 -7
  16. package/dist/plugin-sdk/{config-BxVjLTIv.js → config-C0qggNKQ.js} +7 -7
  17. package/dist/plugin-sdk/{config-g1MG9Bet.js → config-DgD5T-Ui.js} +7 -7
  18. package/dist/plugin-sdk/discord.js +6 -6
  19. package/dist/plugin-sdk/{guilds-BivaIhOn.js → guilds-iTYlgBat.js} +1 -1
  20. package/dist/plugin-sdk/index.js +1 -1
  21. package/dist/plugin-sdk/{login-CfRfRNc7.js → login-YveoqEvH.js} +2 -2
  22. package/dist/plugin-sdk/{monitor-CIQ75vj5.js → monitor-38DGeIwS.js} +3 -3
  23. package/dist/plugin-sdk/{monitor-uao4bwTm.js → monitor-CYCSEVee.js} +3 -3
  24. package/dist/plugin-sdk/{monitor-CA4i9Vhf.js → monitor-Ceu-Wayc.js} +3 -3
  25. package/dist/plugin-sdk/{monitor-4qlGtlZm.js → monitor-DCyBaUCs.js} +3 -3
  26. package/dist/plugin-sdk/{openresponses-http-Do-lt3tH.js → openresponses-http-CCfimy89.js} +1 -1
  27. package/dist/plugin-sdk/{openresponses-http-Y766bB2w.js → openresponses-http-DAL_9jE-.js} +1 -1
  28. package/dist/plugin-sdk/{pi-embedded-runner-Cl-dGLKY.js → pi-embedded-runner-Dum71Tdo.js} +14 -9
  29. package/dist/plugin-sdk/{pi-model-discovery-runtime-DxoFm4Vd.js → pi-model-discovery-runtime-C5ssE6EW.js} +1 -1
  30. package/dist/plugin-sdk/{pi-model-discovery-runtime-LB-5lX5L.js → pi-model-discovery-runtime-CQOauapl.js} +1 -1
  31. package/dist/plugin-sdk/{pi-model-discovery-runtime-CfDDK1n5.js → pi-model-discovery-runtime-w4DRRv53.js} +2 -2
  32. package/dist/plugin-sdk/{resolve-channels-BptLzpDb.js → resolve-channels-gIpOj1wt.js} +3 -3
  33. package/dist/plugin-sdk/{resolve-users-C0YLyf20.js → resolve-users-CTKaESmf.js} +3 -3
  34. package/dist/plugin-sdk/{resolve-utils-Bq0vrn3x.js → resolve-utils-r6ef8mj8.js} +1 -1
  35. package/dist/plugin-sdk/{retry-CxA2fayk.js → retry-CB29XXbz.js} +2 -2
  36. package/dist/plugin-sdk/{slack-BnH97t7_.js → slack-B0dLDyHM.js} +3 -3
  37. package/dist/plugin-sdk/{slack-DvaEXxo5.js → slack-Dv4zCw-x.js} +3 -3
  38. package/dist/plugin-sdk/src/brand.d.ts +2 -2
  39. package/dist/plugin-sdk/src/plugins/loader.d.ts +3 -1
  40. package/dist/plugin-sdk/{status-DKwtdFcx.js → status-B2vb7zNW.js} +14 -9
  41. package/dist/plugin-sdk/{sticker-cache-Dmrdawoj.js → sticker-cache-C1vOWkzA.js} +2 -2
  42. package/dist/plugin-sdk/{sticker-cache-C6yLVx3S.js → sticker-cache-CJDzqowL.js} +2 -2
  43. package/dist/plugin-sdk/{telegram-actions-JyjH4UpU.js → telegram-actions-BoiC9J7L.js} +2 -2
  44. package/dist/plugin-sdk/{telegram-actions-DnvgAPkX.js → telegram-actions-CwAsKaNz.js} +2 -2
  45. package/dist/plugin-sdk/{web-DsLHqCkb.js → web-BjV7ROeA.js} +1 -1
  46. package/dist/plugin-sdk/{web-4BVlmvJD.js → web-DjTSgU98.js} +1 -1
  47. package/dist/plugin-sdk/whatsapp.js +4 -4
  48. package/dist/plugins/loader.js +70 -3
  49. package/dist/wizard/onboarding.gateway-config.js +1 -1
  50. package/extensions/acpx/package.json +1 -1
  51. package/extensions/bluebubbles/package.json +1 -1
  52. package/extensions/copilot-proxy/package.json +1 -1
  53. package/extensions/diagnostics-otel/package.json +1 -1
  54. package/extensions/fased-federation/package.json +1 -1
  55. package/extensions/google-gemini-cli-auth/package.json +1 -1
  56. package/extensions/imessage/package.json +1 -1
  57. package/extensions/irc/package.json +1 -1
  58. package/extensions/line/package.json +1 -1
  59. package/extensions/llm-task/package.json +1 -1
  60. package/extensions/lobster/package.json +1 -1
  61. package/extensions/matrix/CHANGELOG.md +6 -0
  62. package/extensions/matrix/package.json +1 -1
  63. package/extensions/mattermost/package.json +1 -1
  64. package/extensions/memory-core/package.json +2 -2
  65. package/extensions/memory-lancedb/package.json +1 -1
  66. package/extensions/minimax-portal-auth/package.json +1 -1
  67. package/extensions/msteams/CHANGELOG.md +6 -0
  68. package/extensions/msteams/package.json +1 -1
  69. package/extensions/nextcloud-talk/package.json +1 -1
  70. package/extensions/nostr/CHANGELOG.md +6 -0
  71. package/extensions/nostr/package.json +1 -1
  72. package/extensions/open-prose/package.json +1 -1
  73. package/extensions/sat-mining/package.json +1 -1
  74. package/extensions/sat-mining/src/strategy-skill.ts +1 -1
  75. package/extensions/signal/package.json +1 -1
  76. package/extensions/synology-chat/package.json +1 -1
  77. package/extensions/tlon/package.json +1 -1
  78. package/extensions/twitch/CHANGELOG.md +6 -0
  79. package/extensions/twitch/package.json +1 -1
  80. package/extensions/voice-call/CHANGELOG.md +6 -0
  81. package/extensions/voice-call/package.json +1 -1
  82. package/extensions/zalo/CHANGELOG.md +6 -0
  83. package/extensions/zalo/package.json +1 -1
  84. package/extensions/zalouser/CHANGELOG.md +6 -0
  85. package/extensions/zalouser/package.json +1 -1
  86. package/package.json +3 -1
@@ -71,7 +71,7 @@ import { inspect, isDeepStrictEqual, promisify } from "node:util";
71
71
  import * as fs$2 from "node:fs/promises";
72
72
  import fs$1, { appendFile, mkdir, mkdtemp, rm } from "node:fs/promises";
73
73
  import { execFile, spawn, spawnSync } from "node:child_process";
74
- import { fileURLToPath } from "node:url";
74
+ import { fileURLToPath, pathToFileURL } from "node:url";
75
75
  import crypto, { X509Certificate, createDecipheriv, createHash, createHmac, createPrivateKey, randomBytes, randomUUID, scryptSync, timingSafeEqual } from "node:crypto";
76
76
  import process$1 from "node:process";
77
77
  import { createServer } from "node:http";
@@ -20339,7 +20339,7 @@ function createOutboundSendDepsFromCliSource(deps) {
20339
20339
  function createDefaultDeps() {
20340
20340
  return {
20341
20341
  sendMessageWhatsApp: async (...args) => {
20342
- const { sendMessageWhatsApp } = await import("./web-DsLHqCkb.js");
20342
+ const { sendMessageWhatsApp } = await import("./web-BjV7ROeA.js");
20343
20343
  return await sendMessageWhatsApp(...args);
20344
20344
  },
20345
20345
  sendMessageTelegram: async (...args) => {
@@ -84721,7 +84721,7 @@ const signalMessageActions = {
84721
84721
  //#region src/channels/plugins/actions/telegram.ts
84722
84722
  const providerId = "telegram";
84723
84723
  async function loadTelegramActionHandler() {
84724
- const { handleTelegramAction } = await import("./telegram-actions-DnvgAPkX.js");
84724
+ const { handleTelegramAction } = await import("./telegram-actions-CwAsKaNz.js");
84725
84725
  return handleTelegramAction;
84726
84726
  }
84727
84727
  function readTelegramSendParams(params) {
@@ -87178,7 +87178,7 @@ function buildPairingReply(params) {
87178
87178
 
87179
87179
  //#endregion
87180
87180
  //#region src/brand.ts
87181
- const FASED_PRODUCT_VERSION = "0.1.40";
87181
+ const FASED_PRODUCT_VERSION = "0.1.41";
87182
87182
  const FASED_DISPLAY_VERSION = `v${FASED_PRODUCT_VERSION}`;
87183
87183
 
87184
87184
  //#endregion
@@ -91089,7 +91089,7 @@ const sendPollDiscordLazy = async (...args) => {
91089
91089
  return sendPollDiscord(...args);
91090
91090
  };
91091
91091
  const monitorDiscordProviderLazy = async (...args) => {
91092
- const { monitorDiscordProvider } = await import("./monitor-4qlGtlZm.js");
91092
+ const { monitorDiscordProvider } = await import("./monitor-DCyBaUCs.js");
91093
91093
  return monitorDiscordProvider(...args);
91094
91094
  };
91095
91095
  const listSlackDirectoryGroupsLiveLazy = async (...args) => {
@@ -91117,7 +91117,7 @@ const sendMessageSlackLazy = async (...args) => {
91117
91117
  return sendMessageSlack(...args);
91118
91118
  };
91119
91119
  const monitorSlackProviderLazy = async (...args) => {
91120
- const { monitorSlackProvider } = await import("./slack-BnH97t7_.js");
91120
+ const { monitorSlackProvider } = await import("./slack-B0dLDyHM.js");
91121
91121
  return monitorSlackProvider(...args);
91122
91122
  };
91123
91123
  const handleSlackActionLazy = async (...args) => {
@@ -91137,7 +91137,7 @@ const sendPollTelegramLazy = async (...args) => {
91137
91137
  return sendPollTelegram(...args);
91138
91138
  };
91139
91139
  const monitorTelegramProviderLazy = async (...args) => {
91140
- const { monitorTelegramProvider } = await import("./monitor-CIQ75vj5.js");
91140
+ const { monitorTelegramProvider } = await import("./monitor-38DGeIwS.js");
91141
91141
  return monitorTelegramProvider(...args);
91142
91142
  };
91143
91143
  let webOutboundPromise = null;
@@ -91158,7 +91158,7 @@ function loadWebLoginQr() {
91158
91158
  return webLoginQrPromise;
91159
91159
  }
91160
91160
  function loadWebChannel() {
91161
- webChannelPromise ??= import("./web-DsLHqCkb.js");
91161
+ webChannelPromise ??= import("./web-BjV7ROeA.js");
91162
91162
  return webChannelPromise;
91163
91163
  }
91164
91164
  function loadWhatsAppActions() {
@@ -91861,8 +91861,13 @@ function loadFasedAgentPlugins(options = {}) {
91861
91861
  logger
91862
91862
  });
91863
91863
  let mod = null;
91864
+ const moduleLoadStartedAt = Date.now();
91864
91865
  try {
91865
- mod = getJiti()(safeSource);
91866
+ mod = options.preloadedModules?.get(safeSource) ?? null;
91867
+ if (!mod) {
91868
+ mod = getJiti()(safeSource);
91869
+ logger.debug?.(`[plugins] ${record.id} Jiti load ${Date.now() - moduleLoadStartedAt}ms`);
91870
+ }
91866
91871
  } catch (err) {
91867
91872
  recordPluginError({
91868
91873
  logger,
@@ -1,4 +1,4 @@
1
- import { n as normalizeProviderId, o as ensureAuthProfileStore } from "./config-BxVjLTIv.js";
1
+ import { n as normalizeProviderId, o as ensureAuthProfileStore } from "./config-C0qggNKQ.js";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import * as PiCodingAgent from "@mariozechner/pi-coding-agent";
@@ -1,4 +1,4 @@
1
- import { r as normalizeProviderId, s as ensureAuthProfileStore } from "./config-g1MG9Bet.js";
1
+ import { r as normalizeProviderId, s as ensureAuthProfileStore } from "./config-DgD5T-Ui.js";
2
2
  import path from "node:path";
3
3
  import fs from "node:fs";
4
4
  import * as PiCodingAgent from "@mariozechner/pi-coding-agent";
@@ -1,5 +1,5 @@
1
- import { r as normalizeProviderId, s as ensureAuthProfileStore } from "./config-HEgnpfBH.js";
2
- import "./retry-CxA2fayk.js";
1
+ import { r as normalizeProviderId, s as ensureAuthProfileStore } from "./config-BULEb5QB.js";
2
+ import "./retry-CB29XXbz.js";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs";
5
5
  import * as PiCodingAgent from "@mariozechner/pi-coding-agent";
@@ -1,6 +1,6 @@
1
- import "./retry-CxA2fayk.js";
2
- import { n as fetchDiscord, r as normalizeDiscordToken, t as normalizeDiscordSlug } from "./allow-list-DqLmAAjC.js";
3
- import { t as listGuilds } from "./guilds-BivaIhOn.js";
1
+ import "./retry-CB29XXbz.js";
2
+ import { n as fetchDiscord, r as normalizeDiscordToken, t as normalizeDiscordSlug } from "./allow-list-Cgjx0Mc-.js";
3
+ import { t as listGuilds } from "./guilds-iTYlgBat.js";
4
4
 
5
5
  //#region src/discord/resolve-channels.ts
6
6
  function parseDiscordChannelInput(raw) {
@@ -1,6 +1,6 @@
1
- import "./retry-CxA2fayk.js";
2
- import { n as fetchDiscord, r as normalizeDiscordToken, t as normalizeDiscordSlug } from "./allow-list-DqLmAAjC.js";
3
- import { t as listGuilds } from "./guilds-BivaIhOn.js";
1
+ import "./retry-CB29XXbz.js";
2
+ import { n as fetchDiscord, r as normalizeDiscordToken, t as normalizeDiscordSlug } from "./allow-list-Cgjx0Mc-.js";
3
+ import { t as listGuilds } from "./guilds-iTYlgBat.js";
4
4
 
5
5
  //#region src/discord/resolve-users.ts
6
6
  function parseDiscordUserInput(raw) {
@@ -1,4 +1,4 @@
1
- import { Ut as wrapExternalContent } from "./status-DKwtdFcx.js";
1
+ import { Ut as wrapExternalContent } from "./status-B2vb7zNW.js";
2
2
 
3
3
  //#region src/channels/allowlist-match.ts
4
4
  function formatAllowlistMatchMeta(match) {
@@ -3,7 +3,7 @@ import chalk, { Chalk } from "chalk";
3
3
  import fs from "node:fs";
4
4
  import { Logger } from "tslog";
5
5
  import os from "node:os";
6
- import json5 from "json5";
6
+ import JSON5 from "json5";
7
7
 
8
8
  //#region src/infra/tmp-fased-dir.ts
9
9
  const POSIX_FASED_TMP_DIR = "/tmp/fased";
@@ -283,7 +283,7 @@ function readLoggingConfig() {
283
283
  try {
284
284
  if (!fs.existsSync(configPath)) return;
285
285
  const raw = fs.readFileSync(configPath, "utf-8");
286
- const logging = json5.parse(raw)?.logging;
286
+ const logging = JSON5.parse(raw)?.logging;
287
287
  if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
288
288
  return logging;
289
289
  } catch {
@@ -1,4 +1,4 @@
1
- import { A as clearHistoryEntriesIfEnabled, Ct as enqueueSystemEvent, E as DEFAULT_GROUP_HISTORY_LIMIT, F as recordInboundSession, Gt as hasControlCommand, H as createInboundDebouncer, I as removeAckReactionAfterReply, J as createReplyDispatcherWithTyping, Jt as buildMentionRegexes, K as resolveEnvelopeFormatOptions, L as shouldAckReaction, N as recordPendingHistoryEntryIfEnabled, O as buildPendingHistoryContextFromMap, Sr as warnMissingProviderGroupPolicyFallbackOnce, Tt as resolveChannelConfigWrites, U as resolveInboundDebounceMs, W as formatInboundEnvelope, Yt as matchesMentionWithExplicit, _r as resolveControlCommandGate, b as logInboundDrop, bn as installRequestBodyLimitGuard, br as resolveDefaultGroupPolicy, cr as pruneMapToMaxSize, d as issuePairingChallenge, dt as normalizeAllowList, f as createTypingCallbacks, fr as readStoreAllowFromForDmPolicy, ft as normalizeAllowListLower, gr as resolveCommandAuthorizedFromAuthorizers, ht as resolveSlackUserAllowed, m as resolveMentionGatingWithBypass, mt as resolveSlackAllowListMatch, pt as normalizeSlackSlug, q as dispatchInboundMessage, sr as createDedupeCache, ut as allowListMatches, x as logTypingFailure, xr as resolveOpenProviderRuntimeGroupPolicy, y as logAckFailure } from "./pi-embedded-runner-Cl-dGLKY.js";
1
+ import { A as clearHistoryEntriesIfEnabled, Ct as enqueueSystemEvent, E as DEFAULT_GROUP_HISTORY_LIMIT, F as recordInboundSession, Gt as hasControlCommand, H as createInboundDebouncer, I as removeAckReactionAfterReply, J as createReplyDispatcherWithTyping, Jt as buildMentionRegexes, K as resolveEnvelopeFormatOptions, L as shouldAckReaction, N as recordPendingHistoryEntryIfEnabled, O as buildPendingHistoryContextFromMap, Sr as warnMissingProviderGroupPolicyFallbackOnce, Tt as resolveChannelConfigWrites, U as resolveInboundDebounceMs, W as formatInboundEnvelope, Yt as matchesMentionWithExplicit, _r as resolveControlCommandGate, b as logInboundDrop, bn as installRequestBodyLimitGuard, br as resolveDefaultGroupPolicy, cr as pruneMapToMaxSize, d as issuePairingChallenge, dt as normalizeAllowList, f as createTypingCallbacks, fr as readStoreAllowFromForDmPolicy, ft as normalizeAllowListLower, gr as resolveCommandAuthorizedFromAuthorizers, ht as resolveSlackUserAllowed, m as resolveMentionGatingWithBypass, mt as resolveSlackAllowListMatch, pt as normalizeSlackSlug, q as dispatchInboundMessage, sr as createDedupeCache, ut as allowListMatches, x as logTypingFailure, xr as resolveOpenProviderRuntimeGroupPolicy, y as logAckFailure } from "./pi-embedded-runner-Dum71Tdo.js";
2
2
  import { K as resolveSessionKey, S as readSessionUpdatedAt, w as updateLastRoute } from "./runtime-BPyuAmka.js";
3
3
  import { r as createNonExitingRuntime } from "./subsystem-DBPNbQDQ.js";
4
4
  import { i as logVerbose, l as warn, p as getChildLogger, s as shouldLogVerbose, t as danger } from "./globals-B_jjtAje.js";
@@ -53,7 +53,7 @@ import "./tables-CJE8kB35.js";
53
53
  import { t as sendMessageSlack } from "./send-DfkPKz_0.js";
54
54
  import { r as resolveSlackWebClientOptions } from "./client-DWTXscox.js";
55
55
  import { a as listSlackPins, c as reactSlackMessage, d as removeSlackReaction, f as sendSlackMessage, i as listSlackEmojis, l as readSlackMessages, n as editSlackMessage, o as listSlackReactions, p as unpinSlackMessage, r as getSlackMemberInfo, s as pinSlackMessage, t as deleteSlackMessage, u as removeOwnSlackReactions } from "./actions-BrU_JMqM.js";
56
- import { n as buildUntrustedChannelMetadata, t as chunkItems } from "./chunk-items-B1CvDQbk.js";
56
+ import { n as buildUntrustedChannelMetadata, t as chunkItems } from "./chunk-items-BDhRe_xU.js";
57
57
  import { t as createDraftStreamLoop } from "./draft-stream-loop-2KC6-8CG.js";
58
58
  import { t as resolveSlackUserAllowlist } from "./resolve-users-sv9og6yh.js";
59
59
  import { i as resolveSlackThreadTs, n as deliverReplies, t as createSlackReplyDeliveryPlan } from "./replies-fvzN5wnU.js";
@@ -3232,7 +3232,7 @@ async function registerSlackMonitorSlashCommands(params) {
3232
3232
  const [{ resolveAgentRoute }, { finalizeInboundContext }, { dispatchReplyWithDispatcher }] = await Promise.all([
3233
3233
  import("./resolve-route-CNhTJG_2.js").then((n) => n.r),
3234
3234
  import("./inbound-context-Daf9i2Me.js").then((n) => n.n),
3235
- import("./pi-embedded-runner-Cl-dGLKY.js").then((n) => n.V)
3235
+ import("./pi-embedded-runner-Dum71Tdo.js").then((n) => n.V)
3236
3236
  ]);
3237
3237
  const [{ resolveConversationLabel }, { createReplyPrefixOptions }, { recordSessionMetaFromInbound, resolveStorePath }] = await Promise.all([
3238
3238
  import("./conversation-label-BoVqak2R.js").then((n) => n.t),
@@ -15,9 +15,9 @@ import { i as resolveSlackBotToken, r as resolveSlackAppToken, t as resolveSlack
15
15
  import "./accounts-BwkH5bTD.js";
16
16
  import "./tokens-BK5rrwBB.js";
17
17
  import { v as applyChannelMatchMeta, x as resolveChannelEntryMatchWithFallback, y as buildChannelKeyCandidates } from "./allow-list-CBtbuDI8.js";
18
- import { a as patchAllowlistUsersInConfigEntries, c as buildUntrustedChannelMetadata, i as mergeAllowlist, l as isDangerousNameMatchingEnabled, n as buildAllowlistResolutionSummary, o as summarizeMapping, s as chunkItems, t as addAllowlistUserEntriesFromConfigEntry, u as formatAllowlistMatchMeta } from "./resolve-utils-Bq0vrn3x.js";
18
+ import { a as patchAllowlistUsersInConfigEntries, c as buildUntrustedChannelMetadata, i as mergeAllowlist, l as isDangerousNameMatchingEnabled, n as buildAllowlistResolutionSummary, o as summarizeMapping, s as chunkItems, t as addAllowlistUserEntriesFromConfigEntry, u as formatAllowlistMatchMeta } from "./resolve-utils-r6ef8mj8.js";
19
19
  import { l as resolveStorePath } from "./paths-DTurNPnO.js";
20
- import { Bt as normalizeSlackSlug, D as resolveOpenProviderRuntimeGroupPolicy, Dt as buildMentionRegexes, E as resolveDefaultGroupPolicy, F as resolveCommandAuthorizedFromAuthorizers, G as formatInboundEnvelope, Ht as resolveSlackUserAllowed, I as resolveControlCommandGate, J as createReplyDispatcherWithTyping, K as resolveEnvelopeFormatOptions, L as removeAckReactionAfterReply, Lt as allowListMatches, M as clearHistoryEntriesIfEnabled, N as recordPendingHistoryEntryIfEnabled, O as warnMissingProviderGroupPolicyFallbackOnce, Ot as matchesMentionWithExplicit, P as recordInboundSession, R as shouldAckReaction, Rt as normalizeAllowList, U as createInboundDebouncer, Vt as resolveSlackAllowListMatch, W as resolveInboundDebounceMs, X as pruneMapToMaxSize, Xt as enqueueSystemEvent, Y as createDedupeCache, b as logInboundDrop, cn as installRequestBodyLimitGuard, d as issuePairingChallenge, f as createTypingCallbacks, g as readStoreAllowFromForDmPolicy, j as buildPendingHistoryContextFromMap, k as DEFAULT_GROUP_HISTORY_LIMIT, m as resolveMentionGatingWithBypass, q as dispatchInboundMessage, st as resolveChannelConfigWrites, wt as hasControlCommand, x as logTypingFailure, y as logAckFailure, zt as normalizeAllowListLower } from "./status-DKwtdFcx.js";
20
+ import { Bt as normalizeSlackSlug, D as resolveOpenProviderRuntimeGroupPolicy, Dt as buildMentionRegexes, E as resolveDefaultGroupPolicy, F as resolveCommandAuthorizedFromAuthorizers, G as formatInboundEnvelope, Ht as resolveSlackUserAllowed, I as resolveControlCommandGate, J as createReplyDispatcherWithTyping, K as resolveEnvelopeFormatOptions, L as removeAckReactionAfterReply, Lt as allowListMatches, M as clearHistoryEntriesIfEnabled, N as recordPendingHistoryEntryIfEnabled, O as warnMissingProviderGroupPolicyFallbackOnce, Ot as matchesMentionWithExplicit, P as recordInboundSession, R as shouldAckReaction, Rt as normalizeAllowList, U as createInboundDebouncer, Vt as resolveSlackAllowListMatch, W as resolveInboundDebounceMs, X as pruneMapToMaxSize, Xt as enqueueSystemEvent, Y as createDedupeCache, b as logInboundDrop, cn as installRequestBodyLimitGuard, d as issuePairingChallenge, f as createTypingCallbacks, g as readStoreAllowFromForDmPolicy, j as buildPendingHistoryContextFromMap, k as DEFAULT_GROUP_HISTORY_LIMIT, m as resolveMentionGatingWithBypass, q as dispatchInboundMessage, st as resolveChannelConfigWrites, wt as hasControlCommand, x as logTypingFailure, y as logAckFailure, zt as normalizeAllowListLower } from "./status-B2vb7zNW.js";
21
21
  import "./runtime-dependency-B-1u41Ph.js";
22
22
  import { o as normalizeHostname } from "./ssrf-Cce6LubA.js";
23
23
  import "./skill-commands-hyZA0LE3.js";
@@ -3231,7 +3231,7 @@ async function registerSlackMonitorSlashCommands(params) {
3231
3231
  const [{ resolveAgentRoute }, { finalizeInboundContext }, { dispatchReplyWithDispatcher }] = await Promise.all([
3232
3232
  import("./resolve-route-DO0WR4nB.js").then((n) => n.r),
3233
3233
  import("./inbound-context-CeJDjLk-.js").then((n) => n.n),
3234
- import("./status-DKwtdFcx.js").then((n) => n.H)
3234
+ import("./status-B2vb7zNW.js").then((n) => n.H)
3235
3235
  ]);
3236
3236
  const [{ resolveConversationLabel }, { createReplyPrefixOptions }, { recordSessionMetaFromInbound, resolveStorePath }] = await Promise.all([
3237
3237
  import("./conversation-label-CDH4rKMG.js").then((n) => n.t),
@@ -1,6 +1,6 @@
1
1
  export declare const FASED_BRAND_NAME = "Fased";
2
2
  export declare const FASED_AGENT_NAME = "Fased Agent";
3
3
  export declare const FASED_CONTROL_NAME = "Fased Control";
4
- export declare const FASED_PRODUCT_VERSION = "0.1.40";
5
- export declare const FASED_DISPLAY_VERSION = "v0.1.40";
4
+ export declare const FASED_PRODUCT_VERSION = "0.1.41";
5
+ export declare const FASED_DISPLAY_VERSION = "v0.1.41";
6
6
  export declare function formatFasedDisplayLine(): string;
@@ -1,7 +1,7 @@
1
1
  import type { FasedAgentConfig } from "../config/config.js";
2
2
  import type { GatewayRequestHandler } from "../gateway/server-methods/types.js";
3
3
  import { type PluginRegistry } from "./registry.js";
4
- import type { PluginLogger } from "./types.js";
4
+ import type { FasedAgentPluginModule, PluginLogger } from "./types.js";
5
5
  export type PluginLoadResult = PluginRegistry;
6
6
  export type PluginLoadOptions = {
7
7
  config?: FasedAgentConfig;
@@ -10,6 +10,7 @@ export type PluginLoadOptions = {
10
10
  coreGatewayHandlers?: Record<string, GatewayRequestHandler>;
11
11
  cache?: boolean;
12
12
  mode?: "full" | "validate";
13
+ preloadedModules?: Map<string, FasedAgentPluginModule>;
13
14
  };
14
15
  export declare function clearPluginLoaderCache(): void;
15
16
  declare function repairOfficialChannelRuntimeDependencies(params: {
@@ -19,6 +20,7 @@ declare function repairOfficialChannelRuntimeDependencies(params: {
19
20
  coreRoot?: string;
20
21
  }): void;
21
22
  declare function resolvePluginSdkAliases(): Record<string, string>;
23
+ export declare function preloadNativePluginModules(options?: PluginLoadOptions): Promise<Map<string, FasedAgentPluginModule>>;
22
24
  export declare const __testing: {
23
25
  repairOfficialChannelRuntimeDependencies: typeof repairOfficialChannelRuntimeDependencies;
24
26
  resolvePluginSdkAliasFile: (params: {
@@ -72,7 +72,7 @@ import JSON5 from "json5";
72
72
  import { execFile, spawn, spawnSync } from "node:child_process";
73
73
  import * as fs$2 from "node:fs/promises";
74
74
  import fs$1, { appendFile, mkdir } from "node:fs/promises";
75
- import { fileURLToPath } from "node:url";
75
+ import { fileURLToPath, pathToFileURL } from "node:url";
76
76
  import process$1 from "node:process";
77
77
  import { createServer } from "node:http";
78
78
  import AjvPkg from "ajv";
@@ -17691,7 +17691,7 @@ function createOutboundSendDepsFromCliSource(deps) {
17691
17691
  function createDefaultDeps() {
17692
17692
  return {
17693
17693
  sendMessageWhatsApp: async (...args) => {
17694
- const { sendMessageWhatsApp } = await import("./web-4BVlmvJD.js");
17694
+ const { sendMessageWhatsApp } = await import("./web-DjTSgU98.js");
17695
17695
  return await sendMessageWhatsApp(...args);
17696
17696
  },
17697
17697
  sendMessageTelegram: async (...args) => {
@@ -93666,7 +93666,7 @@ function extractToolSend(args, expectedAction = "sendMessage") {
93666
93666
  //#region src/channels/plugins/actions/telegram.ts
93667
93667
  const providerId = "telegram";
93668
93668
  async function loadTelegramActionHandler() {
93669
- const { handleTelegramAction } = await import("./telegram-actions-JyjH4UpU.js");
93669
+ const { handleTelegramAction } = await import("./telegram-actions-BoiC9J7L.js");
93670
93670
  return handleTelegramAction;
93671
93671
  }
93672
93672
  function readTelegramSendParams(params) {
@@ -96182,7 +96182,7 @@ function buildPairingReply(params) {
96182
96182
 
96183
96183
  //#endregion
96184
96184
  //#region src/brand.ts
96185
- const FASED_PRODUCT_VERSION = "0.1.40";
96185
+ const FASED_PRODUCT_VERSION = "0.1.41";
96186
96186
  const FASED_DISPLAY_VERSION = `v${FASED_PRODUCT_VERSION}`;
96187
96187
 
96188
96188
  //#endregion
@@ -100289,7 +100289,7 @@ const sendPollDiscordLazy = async (...args) => {
100289
100289
  return sendPollDiscord(...args);
100290
100290
  };
100291
100291
  const monitorDiscordProviderLazy = async (...args) => {
100292
- const { monitorDiscordProvider } = await import("./monitor-uao4bwTm.js");
100292
+ const { monitorDiscordProvider } = await import("./monitor-CYCSEVee.js");
100293
100293
  return monitorDiscordProvider(...args);
100294
100294
  };
100295
100295
  const listSlackDirectoryGroupsLiveLazy = async (...args) => {
@@ -100317,7 +100317,7 @@ const sendMessageSlackLazy = async (...args) => {
100317
100317
  return sendMessageSlack(...args);
100318
100318
  };
100319
100319
  const monitorSlackProviderLazy = async (...args) => {
100320
- const { monitorSlackProvider } = await import("./slack-DvaEXxo5.js");
100320
+ const { monitorSlackProvider } = await import("./slack-Dv4zCw-x.js");
100321
100321
  return monitorSlackProvider(...args);
100322
100322
  };
100323
100323
  const handleSlackActionLazy = async (...args) => {
@@ -100337,7 +100337,7 @@ const sendPollTelegramLazy = async (...args) => {
100337
100337
  return sendPollTelegram(...args);
100338
100338
  };
100339
100339
  const monitorTelegramProviderLazy = async (...args) => {
100340
- const { monitorTelegramProvider } = await import("./monitor-CA4i9Vhf.js");
100340
+ const { monitorTelegramProvider } = await import("./monitor-Ceu-Wayc.js");
100341
100341
  return monitorTelegramProvider(...args);
100342
100342
  };
100343
100343
  let webOutboundPromise = null;
@@ -100358,7 +100358,7 @@ function loadWebLoginQr() {
100358
100358
  return webLoginQrPromise;
100359
100359
  }
100360
100360
  function loadWebChannel() {
100361
- webChannelPromise ??= import("./web-4BVlmvJD.js");
100361
+ webChannelPromise ??= import("./web-DjTSgU98.js");
100362
100362
  return webChannelPromise;
100363
100363
  }
100364
100364
  function loadWhatsAppActions() {
@@ -101061,8 +101061,13 @@ function loadFasedAgentPlugins(options = {}) {
101061
101061
  logger
101062
101062
  });
101063
101063
  let mod = null;
101064
+ const moduleLoadStartedAt = Date.now();
101064
101065
  try {
101065
- mod = getJiti()(safeSource);
101066
+ mod = options.preloadedModules?.get(safeSource) ?? null;
101067
+ if (!mod) {
101068
+ mod = getJiti()(safeSource);
101069
+ logger.debug?.(`[plugins] ${record.id} Jiti load ${Date.now() - moduleLoadStartedAt}ms`);
101070
+ }
101066
101071
  } catch (err) {
101067
101072
  recordPluginError({
101068
101073
  logger,
@@ -2,7 +2,7 @@ import { Rt as resolveApiKeyForProvider, Tt as resolveDefaultModelForAgent } fro
2
2
  import { t as STATE_DIR } from "./paths-GdhK5mV_.js";
3
3
  import { i as logVerbose } from "./globals-BtKmaIS3.js";
4
4
  import { a as saveJsonFile, i as loadJsonFile } from "./github-copilot-token-Djqpy66R.js";
5
- import { c as findModelInCatalog, dt as resolveAutoImageModel, l as loadModelCatalog, u as modelSupportsVision } from "./status-DKwtdFcx.js";
5
+ import { c as findModelInCatalog, dt as resolveAutoImageModel, l as loadModelCatalog, u as modelSupportsVision } from "./status-B2vb7zNW.js";
6
6
  import path from "node:path";
7
7
  import fs from "node:fs/promises";
8
8
 
@@ -147,7 +147,7 @@ async function describeStickerImage(params) {
147
147
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
148
148
  try {
149
149
  const buffer = await fs.readFile(imagePath);
150
- const { describeImageWithModel } = await import("./status-DKwtdFcx.js").then((n) => n.Ct);
150
+ const { describeImageWithModel } = await import("./status-B2vb7zNW.js").then((n) => n.Ct);
151
151
  return (await describeImageWithModel({
152
152
  buffer,
153
153
  fileName: "sticker.webp",
@@ -1,4 +1,4 @@
1
- import { c as loadModelCatalog, kt as resolveAutoImageModel, l as modelSupportsVision, s as findModelInCatalog } from "./pi-embedded-runner-Cl-dGLKY.js";
1
+ import { c as loadModelCatalog, kt as resolveAutoImageModel, l as modelSupportsVision, s as findModelInCatalog } from "./pi-embedded-runner-Dum71Tdo.js";
2
2
  import { i as logVerbose } from "./globals-B_jjtAje.js";
3
3
  import { t as STATE_DIR } from "./paths-BEmvSyOV.js";
4
4
  import { Gt as resolveDefaultModelForAgent, in as resolveApiKeyForProvider } from "./config-DtqAN2L3.js";
@@ -147,7 +147,7 @@ async function describeStickerImage(params) {
147
147
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
148
148
  try {
149
149
  const buffer = await fs.readFile(imagePath);
150
- const { describeImageWithModel } = await import("./pi-embedded-runner-Cl-dGLKY.js").then((n) => n.Ht);
150
+ const { describeImageWithModel } = await import("./pi-embedded-runner-Dum71Tdo.js").then((n) => n.Ht);
151
151
  return (await describeImageWithModel({
152
152
  buffer,
153
153
  fileName: "sticker.webp",
@@ -14,7 +14,7 @@ import "./accounts-BwkH5bTD.js";
14
14
  import "./tokens-BK5rrwBB.js";
15
15
  import "./allow-list-CBtbuDI8.js";
16
16
  import "./paths-DTurNPnO.js";
17
- import { en as resolveTelegramReactionLevel, tn as resolveTelegramInlineButtonsScope } from "./status-DKwtdFcx.js";
17
+ import { en as resolveTelegramReactionLevel, tn as resolveTelegramInlineButtonsScope } from "./status-B2vb7zNW.js";
18
18
  import "./runtime-dependency-B-1u41Ph.js";
19
19
  import "./ssrf-Cce6LubA.js";
20
20
  import "./skill-commands-hyZA0LE3.js";
@@ -48,7 +48,7 @@ import "./tables-BD7H5ug-.js";
48
48
  import { a as reactMessageTelegram, i as editMessageTelegram, n as createForumTopicTelegram, o as sendMessageTelegram, r as deleteMessageTelegram, s as sendStickerTelegram } from "./send-B09HRfHN.js";
49
49
  import "./retry-policy-BLYEgIwP.js";
50
50
  import "./proxy-CV9uL4Wi.js";
51
- import { a as searchStickers, r as getCacheStats } from "./sticker-cache-Dmrdawoj.js";
51
+ import { a as searchStickers, r as getCacheStats } from "./sticker-cache-C1vOWkzA.js";
52
52
 
53
53
  //#region src/agents/tools/telegram-actions.ts
54
54
  const TELEGRAM_BUTTON_STYLES = [
@@ -1,4 +1,4 @@
1
- import { $n as resolveTelegramInlineButtonsScope, Qn as resolveTelegramReactionLevel } from "./pi-embedded-runner-Cl-dGLKY.js";
1
+ import { $n as resolveTelegramInlineButtonsScope, Qn as resolveTelegramReactionLevel } from "./pi-embedded-runner-Dum71Tdo.js";
2
2
  import { Ot as resolveTelegramToken, wt as createTelegramActionGate } from "./runtime-BPyuAmka.js";
3
3
  import "./subsystem-DBPNbQDQ.js";
4
4
  import "./globals-B_jjtAje.js";
@@ -48,7 +48,7 @@ import "./tables-CJE8kB35.js";
48
48
  import { a as reactMessageTelegram, i as editMessageTelegram, n as createForumTopicTelegram, o as sendMessageTelegram, r as deleteMessageTelegram, s as sendStickerTelegram } from "./send-BzFdvD_i.js";
49
49
  import "./retry-policy-sM01QZT2.js";
50
50
  import "./proxy-CKQOQYAl.js";
51
- import { a as searchStickers, r as getCacheStats } from "./sticker-cache-C6yLVx3S.js";
51
+ import { a as searchStickers, r as getCacheStats } from "./sticker-cache-CJDzqowL.js";
52
52
 
53
53
  //#region src/agents/tools/telegram-actions.ts
54
54
  const TELEGRAM_BUTTON_STYLES = [
@@ -1,4 +1,4 @@
1
- import { C as buildPairingReply, Ct as enqueueSystemEvent, D as buildHistoryContextFromEntries, E as DEFAULT_GROUP_HISTORY_LIMIT, Gt as hasControlCommand, H as createInboundDebouncer, Jt as buildMentionRegexes, K as resolveEnvelopeFormatOptions, Kt as shouldComputeCommandAuthorized, N as recordPendingHistoryEntryIfEnabled, Nt as registerUnhandledRejectionHandler, R as shouldAckReactionForWhatsApp, Sr as warnMissingProviderGroupPolicyFallbackOnce, T as sleepWithAbort, U as resolveInboundDebounceMs, W as formatInboundEnvelope, X as getReplyFromConfig, Xt as normalizeMentionText, br as resolveDefaultGroupPolicy, ct as normalizeGroupActivation, fr as readStoreAllowFromForDmPolicy, lt as parseActivationCommand, mr as resolveDmGroupAccessWithLists, p as resolveMentionGating, pr as resolveDmGroupAccessWithCommandGate, sr as createDedupeCache, w as computeBackoff, xr as resolveOpenProviderRuntimeGroupPolicy, xt as formatDurationPrecise, z as dispatchReplyWithBufferedBlockDispatcher } from "./pi-embedded-runner-Cl-dGLKY.js";
1
+ import { C as buildPairingReply, Ct as enqueueSystemEvent, D as buildHistoryContextFromEntries, E as DEFAULT_GROUP_HISTORY_LIMIT, Gt as hasControlCommand, H as createInboundDebouncer, Jt as buildMentionRegexes, K as resolveEnvelopeFormatOptions, Kt as shouldComputeCommandAuthorized, N as recordPendingHistoryEntryIfEnabled, Nt as registerUnhandledRejectionHandler, R as shouldAckReactionForWhatsApp, Sr as warnMissingProviderGroupPolicyFallbackOnce, T as sleepWithAbort, U as resolveInboundDebounceMs, W as formatInboundEnvelope, X as getReplyFromConfig, Xt as normalizeMentionText, br as resolveDefaultGroupPolicy, ct as normalizeGroupActivation, fr as readStoreAllowFromForDmPolicy, lt as parseActivationCommand, mr as resolveDmGroupAccessWithLists, p as resolveMentionGating, pr as resolveDmGroupAccessWithCommandGate, sr as createDedupeCache, w as computeBackoff, xr as resolveOpenProviderRuntimeGroupPolicy, xt as formatDurationPrecise, z as dispatchReplyWithBufferedBlockDispatcher } from "./pi-embedded-runner-Dum71Tdo.js";
2
2
  import { C as recordSessionMetaFromInbound, Ht as resolveGroupSessionKey, Rt as resolveChannelGroupPolicy, S as readSessionUpdatedAt, w as updateLastRoute, x as loadSessionStore, zt as resolveChannelGroupRequireMention } from "./runtime-BPyuAmka.js";
3
3
  import { i as defaultRuntime, t as createSubsystemLogger } from "./subsystem-DBPNbQDQ.js";
4
4
  import { i as logVerbose, p as getChildLogger, s as shouldLogVerbose } from "./globals-B_jjtAje.js";
@@ -15,7 +15,7 @@ import { a as logWebSelfId, c as pickWebChannel, i as getWebAuthAgeMs, m as webA
15
15
  import "./tokens-BK5rrwBB.js";
16
16
  import "./allow-list-CBtbuDI8.js";
17
17
  import { l as resolveStorePath } from "./paths-DTurNPnO.js";
18
- import { A as buildHistoryContextFromEntries, B as dispatchReplyWithBufferedBlockDispatcher, C as computeBackoff, D as resolveOpenProviderRuntimeGroupPolicy, Dt as buildMentionRegexes, E as resolveDefaultGroupPolicy, Ft as normalizeGroupActivation, G as formatInboundEnvelope, It as parseActivationCommand, Jt as formatDurationPrecise, K as resolveEnvelopeFormatOptions, N as recordPendingHistoryEntryIfEnabled, O as warnMissingProviderGroupPolicyFallbackOnce, S as buildPairingReply, Tt as shouldComputeCommandAuthorized, U as createInboundDebouncer, W as resolveInboundDebounceMs, Xt as enqueueSystemEvent, Y as createDedupeCache, Z as getReplyFromConfig, _ as resolveDmGroupAccessWithCommandGate, g as readStoreAllowFromForDmPolicy, jt as registerUnhandledRejectionHandler, k as DEFAULT_GROUP_HISTORY_LIMIT, kt as normalizeMentionText, p as resolveMentionGating, v as resolveDmGroupAccessWithLists, w as sleepWithAbort, wt as hasControlCommand, z as shouldAckReactionForWhatsApp } from "./status-DKwtdFcx.js";
18
+ import { A as buildHistoryContextFromEntries, B as dispatchReplyWithBufferedBlockDispatcher, C as computeBackoff, D as resolveOpenProviderRuntimeGroupPolicy, Dt as buildMentionRegexes, E as resolveDefaultGroupPolicy, Ft as normalizeGroupActivation, G as formatInboundEnvelope, It as parseActivationCommand, Jt as formatDurationPrecise, K as resolveEnvelopeFormatOptions, N as recordPendingHistoryEntryIfEnabled, O as warnMissingProviderGroupPolicyFallbackOnce, S as buildPairingReply, Tt as shouldComputeCommandAuthorized, U as createInboundDebouncer, W as resolveInboundDebounceMs, Xt as enqueueSystemEvent, Y as createDedupeCache, Z as getReplyFromConfig, _ as resolveDmGroupAccessWithCommandGate, g as readStoreAllowFromForDmPolicy, jt as registerUnhandledRejectionHandler, k as DEFAULT_GROUP_HISTORY_LIMIT, kt as normalizeMentionText, p as resolveMentionGating, v as resolveDmGroupAccessWithLists, w as sleepWithAbort, wt as hasControlCommand, z as shouldAckReactionForWhatsApp } from "./status-B2vb7zNW.js";
19
19
  import "./runtime-dependency-B-1u41Ph.js";
20
20
  import "./ssrf-Cce6LubA.js";
21
21
  import "./skill-commands-hyZA0LE3.js";
@@ -1,5 +1,5 @@
1
- import { C as isRecord, D as createSubsystemLogger, F as resolveStateDir, I as expandHomePrefix, L as resolveRequiredHomeDir, P as resolveOAuthDir, R as CHAT_CHANNEL_ORDER, S as formatTerminalLink, T as pathExists, _ as normalizeAgentId, a as resolveImplicitCopilotProvider, c as resolveFasedAgentDir, f as formatCliCommand, g as DEFAULT_AGENT_ID, h as isTruthyEnvValue, i as normalizeProviders, l as resolveProcessScopedMap, n as WhatsAppConfigSchema, o as resolveImplicitProviders, p as resolveDefaultAgentId, t as loadConfig, v as DEFAULT_ACCOUNT_ID, w as normalizeE164, x as escapeRegExp, y as normalizeAccountId, z as normalizeChatChannelId } from "./config-g1MG9Bet.js";
2
- import { d as createAccountListHelpers, f as resolveAccountEntry, i as resolveWhatsAppAuthDir, n as resolveDefaultWhatsAppAccountId, r as resolveWhatsAppAccount, t as listWhatsAppAccountIds } from "./accounts-C5BjfxoO.js";
1
+ import { C as isRecord, D as createSubsystemLogger, F as resolveStateDir, I as expandHomePrefix, L as resolveRequiredHomeDir, P as resolveOAuthDir, R as CHAT_CHANNEL_ORDER, S as formatTerminalLink, T as pathExists, _ as normalizeAgentId, a as resolveImplicitCopilotProvider, c as resolveFasedAgentDir, f as formatCliCommand, g as DEFAULT_AGENT_ID, h as isTruthyEnvValue, i as normalizeProviders, l as resolveProcessScopedMap, n as WhatsAppConfigSchema, o as resolveImplicitProviders, p as resolveDefaultAgentId, t as loadConfig, v as DEFAULT_ACCOUNT_ID, w as normalizeE164, x as escapeRegExp, y as normalizeAccountId, z as normalizeChatChannelId } from "./config-DgD5T-Ui.js";
2
+ import { d as createAccountListHelpers, f as resolveAccountEntry, i as resolveWhatsAppAuthDir, n as resolveDefaultWhatsAppAccountId, r as resolveWhatsAppAccount, t as listWhatsAppAccountIds } from "./accounts-COY-15zJ.js";
3
3
  import { createRequire } from "node:module";
4
4
  import path from "node:path";
5
5
  import fs from "node:fs";
@@ -1667,7 +1667,7 @@ async function loadContextCache() {
1667
1667
  await ensureFasedModelsJson(cfg);
1668
1668
  } catch {}
1669
1669
  try {
1670
- const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-runtime-LB-5lX5L.js");
1670
+ const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-runtime-CQOauapl.js");
1671
1671
  const agentDir = resolveFasedAgentDir();
1672
1672
  const modelRegistry = discoverModels(discoverAuthStorage(agentDir), agentDir);
1673
1673
  applyDiscoveredContextWindows({
@@ -2554,7 +2554,7 @@ const whatsappOnboardingAdapter = {
2554
2554
  message: linked ? "WhatsApp already linked. Re-link now?" : "Link WhatsApp now (QR)?",
2555
2555
  initialValue: !linked
2556
2556
  })) try {
2557
- const { loginWeb } = await import("./login-CfRfRNc7.js");
2557
+ const { loginWeb } = await import("./login-YveoqEvH.js");
2558
2558
  await loginWeb(false, void 0, runtime, accountId);
2559
2559
  } catch (err) {
2560
2560
  runtime.error(`WhatsApp login failed: ${String(err)}`);
@@ -12,7 +12,7 @@ import { createPluginRegistry } from "./registry.js";
12
12
  import { setActivePluginRegistry } from "./runtime.js";
13
13
  import { initializeGlobalHookRunner } from "./hook-runner-global.js";
14
14
  import { createPluginRuntime } from "./runtime/index.js";
15
- import { fileURLToPath } from "node:url";
15
+ import { fileURLToPath, pathToFileURL } from "node:url";
16
16
  import fs from "node:fs";
17
17
  import path from "node:path";
18
18
  import { createJiti } from "jiti";
@@ -179,6 +179,68 @@ function resolvePluginSdkAliases() {
179
179
  }
180
180
  return aliases;
181
181
  }
182
+ function isNativePluginEntry(source) {
183
+ return [
184
+ ".js",
185
+ ".mjs",
186
+ ".cjs"
187
+ ].includes(path.extname(source).toLowerCase());
188
+ }
189
+ async function preloadNativePluginModules(options = {}) {
190
+ const cfg = applyTestPluginDefaults(options.config ?? {}, process.env);
191
+ const logger = options.logger ?? defaultLogger();
192
+ const normalized = normalizePluginsConfig(cfg.plugins);
193
+ const discovery = discoverFasedAgentPlugins({
194
+ workspaceDir: options.workspaceDir,
195
+ extraPaths: normalized.loadPaths
196
+ });
197
+ const manifestRegistry = loadPluginManifestRegistry({
198
+ config: cfg,
199
+ workspaceDir: options.workspaceDir,
200
+ cache: options.cache,
201
+ candidates: discovery.candidates,
202
+ diagnostics: discovery.diagnostics
203
+ });
204
+ const manifestByRoot = new Map(manifestRegistry.plugins.map((record) => [record.rootDir, record]));
205
+ const modules = new Map();
206
+ for (const candidate of discovery.candidates) {
207
+ const manifestRecord = manifestByRoot.get(candidate.rootDir);
208
+ if (!manifestRecord || !isNativePluginEntry(candidate.source)) {
209
+ continue;
210
+ }
211
+ const enableState = resolveEffectiveEnableState({
212
+ id: manifestRecord.id,
213
+ origin: candidate.origin,
214
+ config: normalized,
215
+ rootConfig: cfg
216
+ });
217
+ if (!enableState.enabled) {
218
+ continue;
219
+ }
220
+ const pluginRoot = safeRealpathOrResolve(candidate.rootDir);
221
+ const opened = openBoundaryFileSync({
222
+ absolutePath: candidate.source,
223
+ rootPath: pluginRoot,
224
+ boundaryLabel: "plugin root",
225
+ skipLexicalRootCheck: true
226
+ });
227
+ if (!opened.ok) {
228
+ continue;
229
+ }
230
+ const safeSource = opened.path;
231
+ fs.closeSync(opened.fd);
232
+ const startedAt = Date.now();
233
+ try {
234
+ const moduleUrl = pathToFileURL(safeSource).href;
235
+ const loaded = await import(moduleUrl);
236
+ modules.set(safeSource, loaded);
237
+ logger.info(`[plugins] ${manifestRecord.id} native preload ${Date.now() - startedAt}ms`);
238
+ } catch (error) {
239
+ logger.warn(`[plugins] ${manifestRecord.id} native preload failed after ${Date.now() - startedAt}ms; falling back to Jiti: ${String(error)}`);
240
+ }
241
+ }
242
+ return modules;
243
+ }
182
244
  const __testing = {
183
245
  repairOfficialChannelRuntimeDependencies,
184
246
  resolvePluginSdkAliasFile,
@@ -589,8 +651,13 @@ function loadFasedAgentPlugins(options = {}) {
589
651
  logger
590
652
  });
591
653
  let mod = null;
654
+ const moduleLoadStartedAt = Date.now();
592
655
  try {
593
- mod = getJiti()(safeSource);
656
+ mod = options.preloadedModules?.get(safeSource) ?? null;
657
+ if (!mod) {
658
+ mod = getJiti()(safeSource);
659
+ logger.debug?.(`[plugins] ${record.id} Jiti load ${Date.now() - moduleLoadStartedAt}ms`);
660
+ }
594
661
  } catch (err) {
595
662
  recordPluginError({
596
663
  logger,
@@ -748,4 +815,4 @@ function safeRealpathOrResolve(value) {
748
815
  }
749
816
 
750
817
  //#endregion
751
- export { loadFasedAgentPlugins };
818
+ export { loadFasedAgentPlugins, preloadNativePluginModules };
@@ -194,7 +194,7 @@ async function configureGatewayForOnboarding(opts) {
194
194
  trustedProxies: strictHosting && tailscaleMode === "serve" ? Array.from(new Set([...nextConfig.gateway?.trustedProxies ?? [], ...HOSTED_TAILSCALE_TRUSTED_PROXIES])) : nextConfig.gateway?.trustedProxies,
195
195
  controlUi: strictHosting && tailscaleMode === "serve" ? {
196
196
  ...nextConfig.gateway?.controlUi,
197
- allowInsecureAuth: true
197
+ allowInsecureAuth: false
198
198
  } : nextConfig.gateway?.controlUi,
199
199
  ...bind === "custom" && customBindHost ? { customBindHost } : {},
200
200
  tailscale: {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/acpx",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "description": "FasedAgent ACP runtime backend via acpx",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/bluebubbles",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "description": "FasedAgent BlueBubbles channel plugin",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/copilot-proxy",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "private": true,
5
5
  "description": "FasedAgent Copilot Proxy provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/diagnostics-otel",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "description": "FasedAgent diagnostics OpenTelemetry exporter",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/fased-federation",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "private": true,
5
5
  "description": "Fased federation adapter package scaffold (A2A + admission helpers)",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/google-gemini-cli-auth",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "private": true,
5
5
  "description": "FasedAgent Gemini CLI OAuth provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/imessage",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "private": true,
5
5
  "description": "FasedAgent iMessage channel plugin",
6
6
  "type": "module",