@circuitwall/jarela 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +5 -5
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +4 -4
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +14 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +16 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +16 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/v1/access/[identity]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/access/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/display-filters/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/thread/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/agents/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/allowed-sites/[hostname]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/allowed-sites/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/artifacts/lifecycle/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/chats/route.js +26 -32
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/chats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/ignores/[remote_jid]/route.js +18 -7
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/ignores/route.js +18 -7
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/lookup/route.js +26 -32
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/lookup/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/pair/route.js +27 -33
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/pair/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/route.js +26 -32
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/routes/[route_id]/route.js +28 -12
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/routes/route.js +28 -12
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/status/route.js +26 -32
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/kinds/route.js +9 -2
- package/.next/standalone/.next/server/app/api/v1/bridges/kinds/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/bridges/route.js +19 -7
- package/.next/standalone/.next/server/app/api/v1/bridges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/dashboard/pricing/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/dashboard/pricing-task/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/documents/search/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/documents/settings/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/documents/sources/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/documents/sources/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/env-sync/allowlist/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/env-sync/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/events/route.js +26 -32
- package/.next/standalone/.next/server/app/api/v1/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/agents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/browser/activate/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/foreground/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/history/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/poll/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/progress/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/result/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/retry/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/browser/tabs/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/extension/fill/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/refine/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/turn/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/config/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/secrets/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/harnesses/[id]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/harnesses/default/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/harnesses/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/health/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/integrations/[name]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/callback/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/start/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/callback/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/start/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/integrations/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/lifecycle/adoption/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/maps/embed/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/mcp-servers/[name]/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/mcp-servers/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/memory/[namespace]/[key]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/memory/policy/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/memory/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/memory/search/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/models/[name]/compact-threads/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/models/[name]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/models/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/packages/defaults/[id]/route.js +28 -4
- package/.next/standalone/.next/server/app/api/v1/packages/reload/route.js +28 -4
- package/.next/standalone/.next/server/app/api/v1/packages/route.js +28 -4
- package/.next/standalone/.next/server/app/api/v1/page-capture/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/pending-actions/[id]/approve/route.js +27 -12
- package/.next/standalone/.next/server/app/api/v1/profile/location/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/profile/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/models/route.js +585 -58
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/providers/github-copilot/auth/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/providers/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/proxy-config/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/redaction/init/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/redaction/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/[id]/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/[id]/run/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/security/idle-timeout/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/security/pin/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/security/state/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/security/unlock/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/security/verify-pin/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/skills/[id]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/skills/repos/[id]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/skills/repos/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/skills/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/tasks/[agent_id]/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/tasks/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/activity/route.js +7 -0
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/context-pin/route.js +12 -6
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/route.js +125 -26
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +1 -2
- package/.next/standalone/.next/server/app/api/v1/threads/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/tools/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/update/apply/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/voice/transcribe/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/voice/tts/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/watchers/[id]/route.js +17 -5
- package/.next/standalone/.next/server/app/api/v1/watchers/[id]/run/route.js +1 -1
- package/.next/standalone/.next/server/app/api/v1/watchers/route.js +1 -1
- package/.next/standalone/.next/server/app/page.js +27323 -27034
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js +8 -0
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +5 -5
- package/.next/standalone/.next/server/chunks/1388.js +106 -36
- package/.next/standalone/.next/server/chunks/2068.js +47 -10
- package/.next/standalone/.next/server/chunks/210.js +6 -6
- package/.next/standalone/.next/server/chunks/2447.js +10 -5
- package/.next/standalone/.next/server/chunks/2653.js +80 -1
- package/.next/standalone/.next/server/chunks/3042.js +10 -8
- package/.next/standalone/.next/server/chunks/{4540.js → 309.js} +104 -38
- package/.next/standalone/.next/server/chunks/{2350.js → 3272.js} +104 -37
- package/.next/standalone/.next/server/chunks/3524.js +150 -67
- package/.next/standalone/.next/server/chunks/3566.js +1 -1
- package/.next/standalone/.next/server/chunks/4189.js +1 -1
- package/.next/standalone/.next/server/chunks/4596.js +28 -4
- package/.next/standalone/.next/server/chunks/46.js +91 -31
- package/.next/standalone/.next/server/chunks/466.js +53 -7
- package/.next/standalone/.next/server/chunks/4955.js +30 -3
- package/.next/standalone/.next/server/chunks/5585.js +28 -4
- package/.next/standalone/.next/server/chunks/5908.js +63 -42
- package/.next/standalone/.next/server/chunks/6142.js +10 -2
- package/.next/standalone/.next/server/chunks/8461.js +10 -8
- package/.next/standalone/.next/server/chunks/9032.js +5 -5
- package/.next/standalone/.next/server/chunks/9164.js +487 -177
- package/.next/standalone/.next/server/chunks/9304.js +51 -12
- package/.next/standalone/.next/server/chunks/{423.js → 9590.js} +84 -24
- package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
- package/.next/standalone/.next/server/middleware.js +89 -21
- package/.next/standalone/.next/server/pages/404.html +14 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/preview-props.json +3 -3
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{1395-e4a99912b8f83044.js → 1395-bfe1f3ef760c0f50.js} +54 -8
- package/.next/standalone/.next/static/chunks/app/{layout-9bc0b10127cb7d42.js → layout-7b24ad13faa3944b.js} +69 -2
- package/.next/standalone/.next/static/chunks/app/{page-213a623b37226452.js → page-2ef8d75d40eb4311.js} +10643 -10295
- package/.next/standalone/.next/static/css/c160ea862133acd2.css +5 -0
- package/.next/standalone/docs/adoption/changesets.json +2805 -0
- package/.next/standalone/package.json +1 -1
- package/CHANGELOG.md +52 -0
- package/api/client.models.test.ts +10 -0
- package/api/client.startup.test.ts +129 -0
- package/api/client.ts +51 -9
- package/api/thread-metadata.test.ts +72 -0
- package/api/types.ts +6 -3
- package/app/api/v1/providers/[provider]/models/route.test.ts +216 -6
- package/app/api/v1/providers/[provider]/models/route.ts +259 -40
- package/app/api/v1/threads/[thread_id]/route.ts +26 -23
- package/app/api/v1/threads/[thread_id]/run/route.ts +0 -1
- package/app/globals.css +119 -29
- package/app/layout.tsx +12 -0
- package/components/agents/AgentsPanel.tsx +5 -13
- package/components/chat/ChatView.tsx +9 -18
- package/components/chat/InputBar.tsx +1 -1
- package/components/chat/MessageBubble.tsx +13 -1
- package/components/chat/MessageList.test.tsx +45 -4
- package/components/chat/MessageList.tsx +123 -89
- package/components/chat/ToolList.tsx +88 -84
- package/components/chat/useThreadActivity.test.tsx +2 -2
- package/components/chat/useThreadActivity.ts +2 -2
- package/components/chat/useThreadData.ts +1 -30
- package/components/chat/useThreadMetadataPolling.test.tsx +128 -0
- package/components/chat/useThreadMetadataPolling.ts +50 -0
- package/components/chat/useUserProfileAndAgent.test.tsx +31 -0
- package/components/chat/useUserProfileAndAgent.ts +13 -2
- package/components/dashboard/DashboardPanel.tsx +1 -1
- package/components/dashboard/Series.tsx +34 -21
- package/components/dashboard/SummaryCards.tsx +1 -1
- package/components/integrations/NetworkSection.tsx +2 -2
- package/components/layout/AppShell.tsx +22 -7
- package/components/layout/MenuPanel.tsx +14 -24
- package/components/profile/ProfilePanel.tsx +2 -2
- package/components/settings/AppearancePanel.tsx +70 -3
- package/components/settings/SettingsPanel.tsx +2 -2
- package/components/tools/ToolsPanel.tsx +2 -7
- package/components/ui/AppearancePreferences.test.tsx +68 -0
- package/components/ui/BootScreen.test.tsx +44 -0
- package/components/ui/BootScreen.tsx +24 -11
- package/components/ui/NotificationStatus.test.tsx +2 -2
- package/components/ui/NotificationStatus.tsx +5 -5
- package/components/ui/SubTabBar.tsx +2 -3
- package/contexts/ThemeContext.tsx +84 -1
- package/hooks/useAgentSession.test.ts +12 -1
- package/hooks/useAgentSession.ts +6 -4
- package/hooks/useUrlSync.test.ts +13 -0
- package/hooks/useUrlSync.ts +0 -4
- package/lib/agents/citation-checker.test.ts +40 -2
- package/lib/agents/citation-checker.ts +56 -11
- package/lib/agents/context-boundary.ts +5 -6
- package/lib/agents/instruction-edits.test.ts +120 -0
- package/lib/agents/instruction-edits.ts +65 -42
- package/lib/agents/prepare/request.ts +0 -2
- package/lib/agents/prepare/system-prompt.test.ts +10 -0
- package/lib/agents/prepare/system-prompt.ts +8 -2
- package/lib/agents/proposals.test.ts +76 -0
- package/lib/agents/proposals.ts +13 -5
- package/lib/agents/run-thread.auto-boundary.test.ts +125 -5
- package/lib/agents/run-thread.ts +24 -9
- package/lib/agents/sqlite-checkpoint-saver.test.ts +91 -0
- package/lib/agents/warm-summary-background.ts +22 -2
- package/lib/agents/warm-topics.test.ts +155 -1
- package/lib/agents/warm-topics.ts +27 -7
- package/lib/bridges/dispatcher.ts +1 -0
- package/lib/bridges/message-role.test.ts +81 -0
- package/lib/bridges/message-role.ts +23 -10
- package/lib/bridges/types.ts +6 -0
- package/lib/bridges/whatsapp-link.test.ts +32 -0
- package/lib/bridges/whatsapp-link.ts +21 -0
- package/lib/bridges/whatsapp.inbound.test.ts +239 -0
- package/lib/bridges/whatsapp.sender.test.ts +80 -1
- package/lib/bridges/whatsapp.ts +76 -38
- package/lib/db/migrations.test.ts +61 -0
- package/lib/db/migrations.ts +13 -0
- package/lib/embeddings/performance.test.ts +114 -0
- package/lib/pricing/snapshot.test.ts +70 -0
- package/lib/pricing/snapshot.ts +10 -2
- package/lib/proxy/dispatcher.test.ts +119 -1
- package/lib/proxy/dispatcher.ts +22 -9
- package/lib/stores/agent-configs.ts +10 -5
- package/lib/stores/bridges.test.ts +81 -0
- package/lib/stores/bridges.ts +9 -8
- package/lib/stores/dashboard-metrics-cache.test.ts +99 -0
- package/lib/stores/dashboard-metrics.ts +30 -4
- package/lib/stores/message-embedding-jobs.test.ts +27 -0
- package/lib/stores/message-embedding-jobs.ts +5 -3
- package/lib/stores/message-usage.test.ts +21 -1
- package/lib/stores/pricing-cache.test.ts +31 -0
- package/lib/stores/pricing.ts +3 -0
- package/lib/stores/proxy-config.test.ts +120 -0
- package/lib/stores/proxy-config.ts +22 -4
- package/lib/stores/threads.ts +12 -8
- package/lib/tools/communications/calendar.test.ts +43 -2
- package/lib/tools/communications/calendar.ts +2 -0
- package/lib/tools/communications/gmail.test.ts +51 -1
- package/lib/tools/communications/gmail.ts +44 -2
- package/lib/tools/communications/outlook-calendar.ts +2 -0
- package/lib/tools/communications/outlook.test.ts +33 -2
- package/lib/tools/communications/outlook.ts +2 -0
- package/lib/tools/filesystem/edit-match.test.ts +133 -0
- package/lib/tools/filesystem/edit-match.ts +7 -2
- package/lib/tools/packages/default-packages.test.ts +21 -0
- package/lib/tools/packages/optional-package.test.ts +72 -0
- package/lib/tools/packages/optional-package.ts +33 -4
- package/lib/tools/support/result-refs.test.ts +131 -0
- package/lib/tools/support/result-refs.ts +41 -9
- package/lib/ui/navigate.test.ts +13 -0
- package/lib/ui/navigate.ts +10 -2
- package/lib/utils/source-link.test.ts +51 -0
- package/lib/utils/source-link.ts +45 -0
- package/package.json +1 -1
- package/.next/standalone/.next/static/css/312542a5725ba0d5.css +0 -5
- /package/.next/standalone/.next/static/{bMRK5y3ruT7c3WtBfCQOG → 544OFJV-q0RC6Gjgje4LT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{bMRK5y3ruT7c3WtBfCQOG → 544OFJV-q0RC6Gjgje4LT}/_ssgManifest.js +0 -0
|
@@ -331,12 +331,17 @@ function upsertAgentConfigTransaction(input) {
|
|
|
331
331
|
const db = (0,_lib_db__WEBPACK_IMPORTED_MODULE_0__/* .getDb */ .Lf)();
|
|
332
332
|
const existing = getAgentConfig(input.id);
|
|
333
333
|
const created_at = existing?.created_at ?? t;
|
|
334
|
-
const
|
|
334
|
+
const existingMbti = toMbti(existing?.adaptive_mbti);
|
|
335
|
+
const mbti = input.adaptive_mbti ?? existingMbti ?? "INTJ";
|
|
335
336
|
const preset = _lib_agents_adaptive_persona_presets__WEBPACK_IMPORTED_MODULE_2__/* .MBTI_PRESETS */ .e[mbti];
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
const
|
|
337
|
+
// Omitted sliders keep their tuned values; they only fall back to the
|
|
338
|
+
// preset when the type changes or the agent is new. Otherwise every
|
|
339
|
+
// partial update (approved proposals, tool edits) reset them.
|
|
340
|
+
const keepTuned = existing !== null && existing !== undefined && mbti === existingMbti;
|
|
341
|
+
const strength = input.adaptive_persona_strength ?? (keepTuned ? existing.adaptive_persona_strength : preset.strength);
|
|
342
|
+
const empathy = input.adaptive_empathy ?? (keepTuned ? existing.adaptive_empathy : preset.empathy);
|
|
343
|
+
const expressiveness = input.adaptive_expressiveness ?? (keepTuned ? existing.adaptive_expressiveness : preset.expressiveness);
|
|
344
|
+
const verbosity = input.adaptive_verbosity ?? (keepTuned ? existing.adaptive_verbosity : preset.verbosity);
|
|
340
345
|
if (input.is_default) db.prepare("UPDATE agent_configs SET is_default=0").run();
|
|
341
346
|
// harness_id: explicit `undefined` means "keep existing"; explicit `null`
|
|
342
347
|
// means "use the global default". Empty string is normalised to null too,
|
|
@@ -258,6 +258,18 @@ const themeBootstrap = `(() => {
|
|
|
258
258
|
var t = localStorage.getItem("jarela-theme");
|
|
259
259
|
if (t !== "light" && t !== "dark" && t !== "system") t = "system";
|
|
260
260
|
document.documentElement.setAttribute("data-theme", t);
|
|
261
|
+
var accent = localStorage.getItem("jarela-accent-color");
|
|
262
|
+
if (["blue", "teal", "violet", "rose"].includes(accent)) {
|
|
263
|
+
document.documentElement.setAttribute("data-accent-color", accent);
|
|
264
|
+
} else {
|
|
265
|
+
document.documentElement.removeAttribute("data-accent-color");
|
|
266
|
+
}
|
|
267
|
+
var surface = localStorage.getItem("jarela-surface-style");
|
|
268
|
+
if (surface === "calm" || surface === "ambient" || surface === "liquid") {
|
|
269
|
+
document.documentElement.setAttribute("data-surface-style", surface);
|
|
270
|
+
} else {
|
|
271
|
+
document.documentElement.removeAttribute("data-surface-style");
|
|
272
|
+
}
|
|
261
273
|
// Collapse any media-scoped theme-color metas Next emits to a single tag
|
|
262
274
|
// so the PWA window chrome matches the user's explicit choice (not just
|
|
263
275
|
// prefers-color-scheme). ThemeContext keeps this in sync on change.
|
|
@@ -575,9 +587,17 @@ Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_re
|
|
|
575
587
|
/* __next_internal_client_entry_do_not_use__ ThemeProvider,useTheme auto */
|
|
576
588
|
|
|
577
589
|
const STORAGE_KEY = "jarela-theme";
|
|
590
|
+
const ACCENT_STORAGE_KEY = "jarela-accent-color";
|
|
591
|
+
const SURFACE_STORAGE_KEY = "jarela-surface-style";
|
|
578
592
|
function isTheme(v) {
|
|
579
593
|
return v === "light" || v === "dark" || v === "system";
|
|
580
594
|
}
|
|
595
|
+
function isAccentColor(v) {
|
|
596
|
+
return v === "default" || v === "blue" || v === "teal" || v === "violet" || v === "rose";
|
|
597
|
+
}
|
|
598
|
+
function isSurfaceStyle(v) {
|
|
599
|
+
return v === "ambient" || v === "calm" || v === "liquid";
|
|
600
|
+
}
|
|
581
601
|
function readStored() {
|
|
582
602
|
if (true) return "system";
|
|
583
603
|
try {
|
|
@@ -587,6 +607,24 @@ function readStored() {
|
|
|
587
607
|
return "system";
|
|
588
608
|
}
|
|
589
609
|
}
|
|
610
|
+
function readStoredAccent() {
|
|
611
|
+
if (true) return "blue";
|
|
612
|
+
try {
|
|
613
|
+
const value = window.localStorage.getItem(ACCENT_STORAGE_KEY);
|
|
614
|
+
return isAccentColor(value) ? value : "default";
|
|
615
|
+
} catch {
|
|
616
|
+
return "default";
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
function readStoredSurface() {
|
|
620
|
+
if (true) return "ambient";
|
|
621
|
+
try {
|
|
622
|
+
const value = window.localStorage.getItem(SURFACE_STORAGE_KEY);
|
|
623
|
+
return isSurfaceStyle(value) ? value : "ambient";
|
|
624
|
+
} catch {
|
|
625
|
+
return "ambient";
|
|
626
|
+
}
|
|
627
|
+
}
|
|
590
628
|
const LIGHT_CHROME = "#ffffff";
|
|
591
629
|
const DARK_CHROME = "#09090b";
|
|
592
630
|
function resolveChrome(theme) {
|
|
@@ -608,15 +646,35 @@ function apply(theme) {
|
|
|
608
646
|
document.documentElement.setAttribute("data-theme", theme);
|
|
609
647
|
syncChrome(theme);
|
|
610
648
|
}
|
|
649
|
+
function applyAccentColor(accentColor) {
|
|
650
|
+
if (typeof document === "undefined") return;
|
|
651
|
+
if (accentColor === "default") {
|
|
652
|
+
document.documentElement.removeAttribute("data-accent-color");
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
document.documentElement.setAttribute("data-accent-color", accentColor);
|
|
656
|
+
}
|
|
657
|
+
function applySurfaceStyle(surfaceStyle) {
|
|
658
|
+
if (typeof document === "undefined") return;
|
|
659
|
+
document.documentElement.setAttribute("data-surface-style", surfaceStyle);
|
|
660
|
+
}
|
|
611
661
|
const ThemeContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(null);
|
|
612
662
|
function ThemeProvider({ children }) {
|
|
613
663
|
// Initial state stays "system" on the server to match the pre-paint script,
|
|
614
664
|
// which writes data-theme before React hydrates. The effect below syncs the
|
|
615
665
|
// React state to whatever the script (or localStorage) decided.
|
|
616
666
|
const [theme, setThemeState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)("system");
|
|
667
|
+
const [accentColor, setAccentColorState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)("blue");
|
|
668
|
+
const [surfaceStyle, setSurfaceStyleState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)("ambient");
|
|
617
669
|
process.env.__NEXT_PRIVATE_MINIMIZE_MACRO_FALSE && (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{
|
|
618
670
|
const stored = readStored();
|
|
671
|
+
const storedAccent = readStoredAccent();
|
|
672
|
+
const storedSurface = readStoredSurface();
|
|
619
673
|
setThemeState(stored);
|
|
674
|
+
setAccentColorState(storedAccent);
|
|
675
|
+
setSurfaceStyleState(storedSurface);
|
|
676
|
+
applyAccentColor(storedAccent);
|
|
677
|
+
applySurfaceStyle(storedSurface);
|
|
620
678
|
// When in "system" mode, mirror OS-level changes into the PWA chrome.
|
|
621
679
|
if (true) return;
|
|
622
680
|
const mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
@@ -634,10 +692,31 @@ function ThemeProvider({ children }) {
|
|
|
634
692
|
} catch {
|
|
635
693
|
/* ignore quota / private-mode errors */ }
|
|
636
694
|
}, []);
|
|
695
|
+
const setAccentColor = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((color)=>{
|
|
696
|
+
setAccentColorState(color);
|
|
697
|
+
applyAccentColor(color);
|
|
698
|
+
try {
|
|
699
|
+
if (color === "default") window.localStorage.removeItem(ACCENT_STORAGE_KEY);
|
|
700
|
+
else window.localStorage.setItem(ACCENT_STORAGE_KEY, color);
|
|
701
|
+
} catch {
|
|
702
|
+
/* ignore quota / private-mode errors */ }
|
|
703
|
+
}, []);
|
|
704
|
+
const setSurfaceStyle = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((style)=>{
|
|
705
|
+
setSurfaceStyleState(style);
|
|
706
|
+
applySurfaceStyle(style);
|
|
707
|
+
try {
|
|
708
|
+
window.localStorage.setItem(SURFACE_STORAGE_KEY, style);
|
|
709
|
+
} catch {
|
|
710
|
+
/* ignore quota / private-mode errors */ }
|
|
711
|
+
}, []);
|
|
637
712
|
return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ThemeContext.Provider, {
|
|
638
713
|
value: {
|
|
639
714
|
theme,
|
|
640
|
-
setTheme
|
|
715
|
+
setTheme,
|
|
716
|
+
accentColor,
|
|
717
|
+
setAccentColor,
|
|
718
|
+
surfaceStyle,
|
|
719
|
+
setSurfaceStyle
|
|
641
720
|
},
|
|
642
721
|
children: children
|
|
643
722
|
});
|
|
@@ -21,12 +21,12 @@ exports.modules = {
|
|
|
21
21
|
/* harmony export */ S0: () => (/* binding */ getRecentMessagesWindow),
|
|
22
22
|
/* harmony export */ T1: () => (/* binding */ setThreadContextPin),
|
|
23
23
|
/* harmony export */ TX: () => (/* binding */ getMessagesByAutomationCategory),
|
|
24
|
+
/* harmony export */ Tb: () => (/* binding */ countForegroundThreadMessages),
|
|
24
25
|
/* harmony export */ VL: () => (/* binding */ getMessages),
|
|
25
26
|
/* harmony export */ Xi: () => (/* binding */ appendMessageDraft),
|
|
26
27
|
/* harmony export */ Zb: () => (/* binding */ mergeMessageMetadata),
|
|
27
28
|
/* harmony export */ e8: () => (/* binding */ updateMessageContent),
|
|
28
29
|
/* harmony export */ fG: () => (/* binding */ getThread),
|
|
29
|
-
/* harmony export */ fW: () => (/* binding */ countThreadMessagesFromSeq),
|
|
30
30
|
/* harmony export */ k3: () => (/* binding */ getRecentlyUsedToolNames),
|
|
31
31
|
/* harmony export */ m9: () => (/* binding */ isValidThreadContextCursor),
|
|
32
32
|
/* harmony export */ mI: () => (/* binding */ touchThread),
|
|
@@ -141,8 +141,10 @@ function getThread(thread_id) {
|
|
|
141
141
|
function getThreadMessageBySeq(thread_id, seq) {
|
|
142
142
|
return (0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare(MSG_COLS_SQL + " WHERE thread_id=? AND rowid=?").get(thread_id, seq) ?? null;
|
|
143
143
|
}
|
|
144
|
-
|
|
145
|
-
|
|
144
|
+
// Rows that size compaction can prune: automation-channel rows are kept
|
|
145
|
+
// (see pruneThreadMessages), so they must not count toward its trigger.
|
|
146
|
+
function countForegroundThreadMessages(thread_id, fromSeq = 0) {
|
|
147
|
+
const row = (0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare("SELECT COUNT(*) AS n FROM messages WHERE thread_id=? AND rowid>=? AND " + foregroundCategoryGuardSql()).get(thread_id, fromSeq, ...FOREGROUND_EXCLUDED_CATEGORIES);
|
|
146
148
|
return row?.n ?? 0;
|
|
147
149
|
}
|
|
148
150
|
function isValidThreadContextCursor(thread_id, seq) {
|
|
@@ -582,11 +584,11 @@ function setThreadContextPin(thread_id, hot_since, hot_since_seq) {
|
|
|
582
584
|
}
|
|
583
585
|
(0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare("UPDATE threads SET hot_since=?, hot_since_seq=? WHERE thread_id=?").run(hot_since, hot_since === null ? null : hot_since_seq, thread_id);
|
|
584
586
|
}
|
|
585
|
-
//
|
|
586
|
-
// boundary (drag, or manual /compact)
|
|
587
|
-
//
|
|
588
|
-
// is a one-time write; the
|
|
589
|
-
//
|
|
587
|
+
// Armed by moveThreadContextBoundary whenever the user explicitly moves the
|
|
588
|
+
// boundary (drag, or manual /compact), and by the auto-detector's hot-turn
|
|
589
|
+
// cooldown when a compaction pass ends without a commit (a commit writes the
|
|
590
|
+
// lock in the same transaction). `untilMessageCount` is a one-time write; the
|
|
591
|
+
// read side (lib/agents/run-thread.ts) just compares against it.
|
|
590
592
|
function setAutoBoundaryLock(thread_id, untilMessageCount) {
|
|
591
593
|
(0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare("UPDATE threads SET auto_boundary_locked_until_msg_count=? WHERE thread_id=?").run(Math.max(0, untilMessageCount), thread_id);
|
|
592
594
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
exports.id =
|
|
3
|
-
exports.ids = [
|
|
2
|
+
exports.id = 309;
|
|
3
|
+
exports.ids = [309];
|
|
4
4
|
exports.modules = {
|
|
5
5
|
|
|
6
|
-
/***/
|
|
6
|
+
/***/ 70309:
|
|
7
7
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
8
8
|
|
|
9
9
|
|
|
@@ -203,6 +203,26 @@ function safeBridgeId(id) {
|
|
|
203
203
|
return baseDir();
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
;// ./lib/bridges/whatsapp-link.ts
|
|
207
|
+
/**
|
|
208
|
+
* WhatsApp click-to-chat link for a Baileys JID.
|
|
209
|
+
*
|
|
210
|
+
* WhatsApp has no permalink to a group or to a single message, so only 1:1
|
|
211
|
+
* chats with a phone-number JID get a link: `https://wa.me/<digits>` opens
|
|
212
|
+
* that chat in the WhatsApp app or WhatsApp Web. `@lid` ids hide the phone
|
|
213
|
+
* number, and groups, channels and broadcasts have no public chat URL.
|
|
214
|
+
*/ // E.164 numbers are at most 15 digits; the shortest real ones are 7–8.
|
|
215
|
+
const E164_DIGITS = /^[1-9]\d{6,14}$/;
|
|
216
|
+
function whatsappChatLink(jid) {
|
|
217
|
+
if (!jid) return null;
|
|
218
|
+
const at = jid.lastIndexOf("@");
|
|
219
|
+
if (at < 0) return null;
|
|
220
|
+
const host = jid.slice(at + 1);
|
|
221
|
+
if (host !== "s.whatsapp.net" && host !== "c.us") return null;
|
|
222
|
+
const digits = jid.slice(0, at).split(":")[0];
|
|
223
|
+
return E164_DIGITS.test(digits) ? `https://wa.me/${digits}` : null;
|
|
224
|
+
}
|
|
225
|
+
|
|
206
226
|
// EXTERNAL MODULE: ./lib/utils/error.ts
|
|
207
227
|
var error = __webpack_require__(22032);
|
|
208
228
|
;// ./lib/bridges/whatsapp.ts
|
|
@@ -235,6 +255,7 @@ var error = __webpack_require__(22032);
|
|
|
235
255
|
|
|
236
256
|
|
|
237
257
|
|
|
258
|
+
|
|
238
259
|
class WhatsAppBridgeAdapter {
|
|
239
260
|
static{
|
|
240
261
|
this.SENT_IDS_MAX = 500;
|
|
@@ -458,10 +479,10 @@ class WhatsAppBridgeAdapter {
|
|
|
458
479
|
// adapter should re-deliver to agents) and the legacy
|
|
459
480
|
// `replace`/`update` events that arrive via messages.update.
|
|
460
481
|
if (payload.type !== "notify" && payload.type !== "append") return;
|
|
461
|
-
// On a fresh adapter boot the
|
|
462
|
-
// persisted. Read
|
|
463
|
-
//
|
|
464
|
-
const
|
|
482
|
+
// On a fresh adapter boot the watermarks are whatever the last run
|
|
483
|
+
// persisted. Read them once per batch (one cheap SQLite call) so old
|
|
484
|
+
// appends are rejected without per-message queries.
|
|
485
|
+
const watermarks = payload.type === "append" ? (0,bridges/* getRouteLastSeenTsMap */.gH)(this.bridge_id) : null;
|
|
465
486
|
for (const raw of payload.messages ?? []){
|
|
466
487
|
const m = raw;
|
|
467
488
|
if (!m.key?.remoteJid) continue;
|
|
@@ -488,18 +509,20 @@ class WhatsAppBridgeAdapter {
|
|
|
488
509
|
// "real" the moment we see any message from it, even one whose
|
|
489
510
|
// body we end up unable to represent (e.g. reactions, polls).
|
|
490
511
|
const ts = typeof m.messageTimestamp === "number" ? m.messageTimestamp * 1000 : (m.messageTimestamp?.low ?? 0) * 1000 || Date.now();
|
|
491
|
-
// Watermark gate: on `append` batches, skip anything
|
|
492
|
-
//
|
|
493
|
-
//
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
|
|
497
|
-
if (
|
|
512
|
+
// Watermark gate: on `append` batches, skip anything at or below
|
|
513
|
+
// this chat's own persisted watermark. This prevents the server's
|
|
514
|
+
// reconnect replay from re-delivering messages we already routed in
|
|
515
|
+
// a previous process lifetime. `notify` events skip this check —
|
|
516
|
+
// they're live and may legitimately arrive out of order.
|
|
517
|
+
const watermark = watermarks?.get(remote_jid) ?? 0;
|
|
518
|
+
if (watermark > 0 && ts > 0 && ts <= watermark) {
|
|
498
519
|
continue;
|
|
499
520
|
}
|
|
500
|
-
//
|
|
501
|
-
//
|
|
502
|
-
|
|
521
|
+
// pushName names the *sender*: in groups that's a participant, and on
|
|
522
|
+
// fromMe messages it's the user's own name. Only a counterpart's
|
|
523
|
+
// pushName in a 1:1 chat is a valid label for the chat itself.
|
|
524
|
+
const chatPushName = is_group || m.key.fromMe ? null : m.pushName ?? null;
|
|
525
|
+
this.observeChat(remote_jid, chatPushName, ts);
|
|
503
526
|
// Unwrap protocol envelopes (view-once, ephemeral, etc.) so we can
|
|
504
527
|
// see the underlying payload uniformly, then turn it into a text
|
|
505
528
|
// body + ContentPart attachments the agent can consume.
|
|
@@ -517,7 +540,7 @@ class WhatsAppBridgeAdapter {
|
|
|
517
540
|
// chats it's undefined — the sender == remote_jid. Normalize so the
|
|
518
541
|
// dispatcher gets a routable user JID, not the legacy @c.us form.
|
|
519
542
|
const participant_jid = is_group && m.key.participant ? normalizeUserJid(m.key.participant) : null;
|
|
520
|
-
const chat_name = this.chats.get(remote_jid)?.name ??
|
|
543
|
+
const chat_name = this.chats.get(remote_jid)?.name ?? chatPushName;
|
|
521
544
|
const sender = resolveWhatsAppSender({
|
|
522
545
|
fromMe: m.key.fromMe === true,
|
|
523
546
|
isGroup: is_group,
|
|
@@ -575,7 +598,11 @@ class WhatsAppBridgeAdapter {
|
|
|
575
598
|
const ct = raw;
|
|
576
599
|
const chatJid = pickContactChatJid(ct);
|
|
577
600
|
if (!chatJid) continue;
|
|
578
|
-
const name =
|
|
601
|
+
const name = [
|
|
602
|
+
ct.name,
|
|
603
|
+
ct.verifiedName,
|
|
604
|
+
ct.notify
|
|
605
|
+
].find((n)=>n?.trim()) ?? null;
|
|
579
606
|
this.observeChat(chatJid, name, null);
|
|
580
607
|
}
|
|
581
608
|
});
|
|
@@ -600,7 +627,11 @@ class WhatsAppBridgeAdapter {
|
|
|
600
627
|
for (const ct of list){
|
|
601
628
|
const chatJid = pickContactChatJid(ct);
|
|
602
629
|
if (!chatJid) continue;
|
|
603
|
-
this.observeChat(chatJid,
|
|
630
|
+
this.observeChat(chatJid, [
|
|
631
|
+
ct.name,
|
|
632
|
+
ct.verifiedName,
|
|
633
|
+
ct.notify
|
|
634
|
+
].find((n)=>n?.trim()) ?? null, null);
|
|
604
635
|
}
|
|
605
636
|
});
|
|
606
637
|
// Group profile/settings updates (subject/description/permissions/etc.).
|
|
@@ -709,6 +740,9 @@ class WhatsAppBridgeAdapter {
|
|
|
709
740
|
error: null
|
|
710
741
|
});
|
|
711
742
|
}
|
|
743
|
+
chatLink(remote_jid) {
|
|
744
|
+
return whatsappChatLink(remote_jid);
|
|
745
|
+
}
|
|
712
746
|
async sendText(remote_jid, text) {
|
|
713
747
|
// Hard guard: refuse to send to any chat whose route is in silent_mode.
|
|
714
748
|
// The dispatcher already short-circuits before calling sendText, but
|
|
@@ -965,7 +999,10 @@ class WhatsAppBridgeAdapter {
|
|
|
965
999
|
});
|
|
966
1000
|
attachments.push(ref);
|
|
967
1001
|
const sizeKb = Math.max(1, Math.round(buf.length / 1024));
|
|
968
|
-
|
|
1002
|
+
// Sender-supplied document names can carry newlines or brackets;
|
|
1003
|
+
// describe the attachment by the store's sanitized name.
|
|
1004
|
+
const shownName = oneLine("filename" in ref && ref.filename || filename);
|
|
1005
|
+
text = (text ? text + "\n" : "") + `[Attached ${label}: ${shownName} (${mime}, ${sizeKb} KB); retained as a Jarela file reference.]`;
|
|
969
1006
|
} catch (err) {
|
|
970
1007
|
const m = (0,error/* errorMessage */.g)(err);
|
|
971
1008
|
console.warn(`[bridge ${this.bridge_id}] failed to spill ${label} from ${remote_jid}: ${m}`);
|
|
@@ -1020,8 +1057,8 @@ class WhatsAppBridgeAdapter {
|
|
|
1020
1057
|
`lat=${degreesLatitude ?? "?"}`,
|
|
1021
1058
|
`lng=${degreesLongitude ?? "?"}`
|
|
1022
1059
|
];
|
|
1023
|
-
if (name) parts.push(`name
|
|
1024
|
-
if (address) parts.push(`address
|
|
1060
|
+
if (name) parts.push(`name=${JSON.stringify(oneLine(name))}`);
|
|
1061
|
+
if (address) parts.push(`address=${JSON.stringify(oneLine(address))}`);
|
|
1025
1062
|
text = (text ? text + "\n" : "") + `[location: ${parts.join(" ")}]`;
|
|
1026
1063
|
}
|
|
1027
1064
|
if (inner.liveLocationMessage) {
|
|
@@ -1029,12 +1066,12 @@ class WhatsAppBridgeAdapter {
|
|
|
1029
1066
|
text = (text ? text + "\n" : "") + `[live-location: lat=${degreesLatitude ?? "?"} lng=${degreesLongitude ?? "?"}]`;
|
|
1030
1067
|
}
|
|
1031
1068
|
if (inner.contactMessage) {
|
|
1032
|
-
const name = inner.contactMessage.displayName ?? "unknown";
|
|
1033
|
-
const vcard = inner.contactMessage.vcard ?? "";
|
|
1069
|
+
const name = oneLine(inner.contactMessage.displayName ?? "") || "unknown";
|
|
1070
|
+
const vcard = stripVcardBinary(inner.contactMessage.vcard ?? "");
|
|
1034
1071
|
text = (text ? text + "\n" : "") + `[contact: ${name}]\n${vcard}`;
|
|
1035
1072
|
}
|
|
1036
1073
|
if (inner.contactsArrayMessage) {
|
|
1037
|
-
const names = (inner.contactsArrayMessage.contacts ?? []).map((c)=>c?.displayName ?? "unknown").join(", ");
|
|
1074
|
+
const names = (inner.contactsArrayMessage.contacts ?? []).map((c)=>oneLine(c?.displayName ?? "") || "unknown").join(", ");
|
|
1038
1075
|
text = (text ? text + "\n" : "") + `[contacts: ${names}]`;
|
|
1039
1076
|
}
|
|
1040
1077
|
return {
|
|
@@ -1046,8 +1083,9 @@ class WhatsAppBridgeAdapter {
|
|
|
1046
1083
|
if (!remote_jid) return;
|
|
1047
1084
|
const existing = this.chats.get(remote_jid);
|
|
1048
1085
|
// Prefer the most recently-observed name (group subjects rename; users
|
|
1049
|
-
// change push names). Don't overwrite a known name with
|
|
1050
|
-
|
|
1086
|
+
// change push names). Don't overwrite a known name with a missing or
|
|
1087
|
+
// blank one.
|
|
1088
|
+
const nextName = name?.trim() || existing?.name || null;
|
|
1051
1089
|
const nextTs = ts && (!existing?.last_message_at || ts > existing.last_message_at) ? ts : existing?.last_message_at ?? null;
|
|
1052
1090
|
this.chats.set(remote_jid, {
|
|
1053
1091
|
remote_jid,
|
|
@@ -1064,6 +1102,27 @@ class WhatsAppBridgeAdapter {
|
|
|
1064
1102
|
return this.currentStatus;
|
|
1065
1103
|
}
|
|
1066
1104
|
}
|
|
1105
|
+
function oneLine(value) {
|
|
1106
|
+
return value.replace(/[\s\u0085\u2028\u2029]+/g, " ").trim();
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Phones embed contact photos and logos as base64 vCard properties, often
|
|
1110
|
+
* tens of KB of noise in the agent's context. Drop those properties,
|
|
1111
|
+
* including their folded continuation lines (RFC 6350 §3.2), and keep the
|
|
1112
|
+
* readable fields.
|
|
1113
|
+
*/ function stripVcardBinary(vcard) {
|
|
1114
|
+
const out = [];
|
|
1115
|
+
let skipping = false;
|
|
1116
|
+
for (const line of vcard.split(/\r\n|\r|\n/)){
|
|
1117
|
+
if (/^[ \t]/.test(line)) {
|
|
1118
|
+
if (!skipping) out.push(line);
|
|
1119
|
+
continue;
|
|
1120
|
+
}
|
|
1121
|
+
skipping = /^(?:[\w-]+\.)?(?:PHOTO|LOGO|SOUND|KEY)[;:]/i.test(line);
|
|
1122
|
+
if (!skipping) out.push(line);
|
|
1123
|
+
}
|
|
1124
|
+
return out.join("\n").trim();
|
|
1125
|
+
}
|
|
1067
1126
|
// Minimal pino-compatible silent logger. Baileys uses `logger.child()`
|
|
1068
1127
|
// chaining internally, so we return ourselves for every child call.
|
|
1069
1128
|
function makeSilentLogger() {
|
|
@@ -1177,6 +1236,9 @@ function sanitizeMediaType(raw, kind, fallback) {
|
|
|
1177
1236
|
return primary;
|
|
1178
1237
|
}
|
|
1179
1238
|
function resolveWhatsAppSender(input) {
|
|
1239
|
+
// Platforms send blank display names ("" or whitespace) for contacts that
|
|
1240
|
+
// never set one; treat those as missing so the fallbacks still apply.
|
|
1241
|
+
const named = (...names)=>names.find((n)=>!!n && n.trim().length > 0)?.trim();
|
|
1180
1242
|
if (input.fromMe) {
|
|
1181
1243
|
return {
|
|
1182
1244
|
senderJid: input.selfJid ?? "me",
|
|
@@ -1187,12 +1249,12 @@ function resolveWhatsAppSender(input) {
|
|
|
1187
1249
|
const senderJid = input.participantJid ?? input.remoteJid;
|
|
1188
1250
|
return {
|
|
1189
1251
|
senderJid,
|
|
1190
|
-
senderName: input.participantName
|
|
1252
|
+
senderName: named(input.participantName, input.pushName) ?? senderJid
|
|
1191
1253
|
};
|
|
1192
1254
|
}
|
|
1193
1255
|
return {
|
|
1194
1256
|
senderJid: input.remoteJid,
|
|
1195
|
-
senderName: input.pushName
|
|
1257
|
+
senderName: named(input.pushName, input.chatName) ?? input.remoteJid
|
|
1196
1258
|
};
|
|
1197
1259
|
}
|
|
1198
1260
|
/**
|
|
@@ -1319,8 +1381,8 @@ function listBridgeModules() {
|
|
|
1319
1381
|
/* harmony export */ X9: () => (/* binding */ listBridges),
|
|
1320
1382
|
/* harmony export */ aM: () => (/* binding */ getRoute),
|
|
1321
1383
|
/* harmony export */ e1: () => (/* binding */ getBridge),
|
|
1384
|
+
/* harmony export */ gH: () => (/* binding */ getRouteLastSeenTsMap),
|
|
1322
1385
|
/* harmony export */ kZ: () => (/* binding */ listIgnores),
|
|
1323
|
-
/* harmony export */ mp: () => (/* binding */ getMaxRouteLastSeenTs),
|
|
1324
1386
|
/* harmony export */ nE: () => (/* binding */ removeIgnore),
|
|
1325
1387
|
/* harmony export */ pi: () => (/* binding */ isIgnored),
|
|
1326
1388
|
/* harmony export */ po: () => (/* binding */ updateBridge),
|
|
@@ -1453,12 +1515,16 @@ function bumpRouteLastSeenTs(bridgeId, remoteJid, ts) {
|
|
|
1453
1515
|
if (!Number.isFinite(ts) || ts <= 0) return;
|
|
1454
1516
|
(0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare("UPDATE bridge_routes SET last_seen_ts=? WHERE bridge_id=? AND remote_jid=? AND (last_seen_ts IS NULL OR last_seen_ts < ?)").run(ts, bridgeId, remoteJid, ts);
|
|
1455
1517
|
}
|
|
1456
|
-
//
|
|
1457
|
-
//
|
|
1458
|
-
//
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1518
|
+
// Per-chat watermarks for every explicitly routed chat on a bridge, loaded
|
|
1519
|
+
// once per upsert batch. Each chat is gated only by its own progress: a
|
|
1520
|
+
// bridge-wide maximum would drop chat B's offline backlog as soon as a newer
|
|
1521
|
+
// message from chat A had been delivered.
|
|
1522
|
+
function getRouteLastSeenTsMap(bridgeId) {
|
|
1523
|
+
const rows = (0,_lib_db__WEBPACK_IMPORTED_MODULE_1__/* .getDb */ .Lf)().prepare("SELECT remote_jid, last_seen_ts FROM bridge_routes WHERE bridge_id=? AND last_seen_ts IS NOT NULL").all(bridgeId);
|
|
1524
|
+
return new Map(rows.map((r)=>[
|
|
1525
|
+
r.remote_jid,
|
|
1526
|
+
r.last_seen_ts
|
|
1527
|
+
]));
|
|
1462
1528
|
}
|
|
1463
1529
|
// ---------------------------------------------------------------------------
|
|
1464
1530
|
// Ignore-list CRUD (per-bridge chat blocklist)
|
|
@@ -1504,4 +1570,4 @@ function removeIgnore(bridgeId, remoteJid) {
|
|
|
1504
1570
|
|
|
1505
1571
|
};
|
|
1506
1572
|
;
|
|
1507
|
-
//# sourceMappingURL=
|
|
1573
|
+
//# sourceMappingURL=309.js.map
|