@circuitwall/jarela 2.2.0 → 2.3.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 +4 -3
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +8 -0
- package/.next/standalone/.next/server/app/_global-error/page.js +68 -68
- 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.js +76 -76
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- 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 +93 -93
- package/.next/standalone/.next/server/app/api/v1/access/route.js +169 -169
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js +82 -56
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/display-filters/route.js +122 -122
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/route.js +100 -100
- package/.next/standalone/.next/server/app/api/v1/agents/[id]/thread/route.js +753 -753
- package/.next/standalone/.next/server/app/api/v1/agents/route.js +65 -65
- package/.next/standalone/.next/server/app/api/v1/allowed-sites/[hostname]/route.js +364 -364
- package/.next/standalone/.next/server/app/api/v1/allowed-sites/route.js +802 -802
- package/.next/standalone/.next/server/app/api/v1/artifacts/lifecycle/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/attachments/files/route.js +49 -49
- package/.next/standalone/.next/server/app/api/v1/attachments/images/route.js +910 -910
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/chats/route.js +589 -16
- 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 +23 -23
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/ignores/route.js +30 -30
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/lookup/route.js +703 -130
- 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 +708 -135
- 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 +802 -229
- 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 +739 -739
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/routes/route.js +1035 -1035
- package/.next/standalone/.next/server/app/api/v1/bridges/[id]/status/route.js +679 -106
- 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 +804 -804
- package/.next/standalone/.next/server/app/api/v1/bridges/route.js +700 -700
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/builtin-tools/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/config/route.js +85 -85
- package/.next/standalone/.next/server/app/api/v1/credentials/[id]/route.js +709 -709
- package/.next/standalone/.next/server/app/api/v1/credentials/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/credentials/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/credentials/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/dashboard/currency/route.js +10 -10
- package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js +784 -784
- package/.next/standalone/.next/server/app/api/v1/dashboard/pricing/route.js +23 -23
- package/.next/standalone/.next/server/app/api/v1/dashboard/pricing-task/route.js +86 -86
- package/.next/standalone/.next/server/app/api/v1/dashboard/pricing-task/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/delegations/codex/[job_id]/route.js +57 -57
- package/.next/standalone/.next/server/app/api/v1/delegations/codex/[job_id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/documents/search/route.js +523 -523
- package/.next/standalone/.next/server/app/api/v1/documents/settings/route.js +44 -44
- package/.next/standalone/.next/server/app/api/v1/documents/sources/[id]/reindex/route.js +65 -65
- package/.next/standalone/.next/server/app/api/v1/documents/sources/[id]/reindex/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/documents/sources/[id]/route.js +122 -122
- package/.next/standalone/.next/server/app/api/v1/documents/sources/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/documents/sources/route.js +37 -37
- package/.next/standalone/.next/server/app/api/v1/documents/sources/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/env/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/env-sync/allowlist/route.js +368 -368
- package/.next/standalone/.next/server/app/api/v1/env-sync/route.js +44 -44
- package/.next/standalone/.next/server/app/api/v1/events/route.js +751 -178
- package/.next/standalone/.next/server/app/api/v1/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/events/test/route.js +77 -77
- package/.next/standalone/.next/server/app/api/v1/extension/agents/route.js +763 -763
- package/.next/standalone/.next/server/app/api/v1/extension/agents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/browser/activate/route.js +44 -44
- package/.next/standalone/.next/server/app/api/v1/extension/browser/foreground/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/extension/browser/history/route.js +65 -65
- package/.next/standalone/.next/server/app/api/v1/extension/browser/poll/route.js +34 -34
- package/.next/standalone/.next/server/app/api/v1/extension/browser/progress/route.js +204 -204
- package/.next/standalone/.next/server/app/api/v1/extension/browser/result/route.js +133 -133
- package/.next/standalone/.next/server/app/api/v1/extension/browser/retry/route.js +106 -106
- package/.next/standalone/.next/server/app/api/v1/extension/browser/status/route.js +114 -114
- package/.next/standalone/.next/server/app/api/v1/extension/browser/tabs/route.js +134 -134
- package/.next/standalone/.next/server/app/api/v1/extension/fill/route.js +690 -690
- package/.next/standalone/.next/server/app/api/v1/extension/fill/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/refine/route.js +93 -93
- package/.next/standalone/.next/server/app/api/v1/extension/refine/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extension/turn/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/extension/turn/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/route.js +185 -185
- package/.next/standalone/.next/server/app/api/v1/extensions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/config/route.js +171 -171
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/route.js +396 -396
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/secrets/route.js +212 -212
- package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/secrets/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/files/[name]/route.js +235 -235
- package/.next/standalone/.next/server/app/api/v1/fs/browse/route.js +26 -26
- package/.next/standalone/.next/server/app/api/v1/harnesses/[id]/route.js +221 -221
- package/.next/standalone/.next/server/app/api/v1/harnesses/default/route.js +58 -58
- package/.next/standalone/.next/server/app/api/v1/harnesses/route.js +72 -72
- package/.next/standalone/.next/server/app/api/v1/health/probes/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/health/probes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/health/route.js +772 -772
- package/.next/standalone/.next/server/app/api/v1/integrations/[name]/route.js +133 -133
- package/.next/standalone/.next/server/app/api/v1/integrations/[name]/test/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/integrations/[name]/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/callback/route.js +363 -363
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/start/route.js +233 -233
- package/.next/standalone/.next/server/app/api/v1/integrations/gmail/oauth/status/route.js +682 -682
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/callback/route.js +879 -879
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/start/route.js +108 -108
- package/.next/standalone/.next/server/app/api/v1/integrations/outlook/oauth/status/route.js +952 -952
- package/.next/standalone/.next/server/app/api/v1/integrations/route.js +216 -216
- package/.next/standalone/.next/server/app/api/v1/lifecycle/adoption/route.js +864 -847
- package/.next/standalone/.next/server/app/api/v1/lifecycle/adoption/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/local-file/route.js +26 -26
- package/.next/standalone/.next/server/app/api/v1/logs/route.js +70 -70
- package/.next/standalone/.next/server/app/api/v1/maps/embed/route.js +72 -72
- package/.next/standalone/.next/server/app/api/v1/mcp-servers/[name]/route.js +979 -979
- package/.next/standalone/.next/server/app/api/v1/mcp-servers/registry/route.js +196 -196
- package/.next/standalone/.next/server/app/api/v1/mcp-servers/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/memory/[namespace]/[key]/route.js +381 -381
- package/.next/standalone/.next/server/app/api/v1/memory/policy/route.js +79 -79
- package/.next/standalone/.next/server/app/api/v1/memory/route.js +51 -51
- package/.next/standalone/.next/server/app/api/v1/memory/search/route.js +131 -131
- package/.next/standalone/.next/server/app/api/v1/models/[name]/compact-threads/route.js +374 -369
- package/.next/standalone/.next/server/app/api/v1/models/[name]/compact-threads/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/models/[name]/route.js +204 -163
- package/.next/standalone/.next/server/app/api/v1/models/route.js +548 -546
- package/.next/standalone/.next/server/app/api/v1/packages/catalog/route.js +445 -445
- package/.next/standalone/.next/server/app/api/v1/packages/defaults/[id]/route.js +120 -120
- package/.next/standalone/.next/server/app/api/v1/packages/defaults/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/install/[id]/route.js +234 -234
- package/.next/standalone/.next/server/app/api/v1/packages/install/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/install/route.js +407 -407
- package/.next/standalone/.next/server/app/api/v1/packages/install/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/[name]/enabled/route.js +37 -37
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/[name]/enabled/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/[name]/route.js +107 -107
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/[name]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/route.js +228 -228
- package/.next/standalone/.next/server/app/api/v1/packages/manifests/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/reload/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/packages/reload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/packages/route.js +148 -148
- package/.next/standalone/.next/server/app/api/v1/packages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/page-capture/route.js +787 -787
- package/.next/standalone/.next/server/app/api/v1/page-capture/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/pending-actions/[id]/approve/route.js +507 -507
- package/.next/standalone/.next/server/app/api/v1/pending-actions/[id]/approve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/pending-actions/[id]/deny/route.js +181 -181
- package/.next/standalone/.next/server/app/api/v1/pending-actions/[id]/deny/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/pending-actions/route.js +258 -258
- package/.next/standalone/.next/server/app/api/v1/pending-actions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/profile/location/route.js +30 -30
- package/.next/standalone/.next/server/app/api/v1/profile/route.js +164 -164
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/models/route.js +71 -68
- package/.next/standalone/.next/server/app/api/v1/providers/[provider]/probe/route.js +9 -9
- package/.next/standalone/.next/server/app/api/v1/providers/github-copilot/auth/route.js +164 -164
- package/.next/standalone/.next/server/app/api/v1/providers/route.js +94 -94
- package/.next/standalone/.next/server/app/api/v1/proxy-config/route.js +450 -450
- package/.next/standalone/.next/server/app/api/v1/redaction/init/route.js +37 -37
- package/.next/standalone/.next/server/app/api/v1/redaction/route.js +58 -58
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/[id]/route.js +600 -600
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/[id]/run/route.js +44 -44
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/[id]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/scheduled-tasks/route.js +732 -732
- package/.next/standalone/.next/server/app/api/v1/security/idle-timeout/route.js +359 -359
- package/.next/standalone/.next/server/app/api/v1/security/pin/route.js +197 -197
- package/.next/standalone/.next/server/app/api/v1/security/state/route.js +51 -51
- package/.next/standalone/.next/server/app/api/v1/security/unlock/route.js +176 -176
- package/.next/standalone/.next/server/app/api/v1/security/verify-pin/route.js +190 -190
- package/.next/standalone/.next/server/app/api/v1/setup/test-key/route.js +26 -26
- package/.next/standalone/.next/server/app/api/v1/skills/[id]/route.js +770 -770
- package/.next/standalone/.next/server/app/api/v1/skills/repos/[id]/route.js +115 -115
- package/.next/standalone/.next/server/app/api/v1/skills/repos/route.js +327 -327
- package/.next/standalone/.next/server/app/api/v1/skills/route.js +870 -870
- package/.next/standalone/.next/server/app/api/v1/system/abort/route.js +838 -808
- package/.next/standalone/.next/server/app/api/v1/system/restart/route.js +177 -177
- package/.next/standalone/.next/server/app/api/v1/system/restart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/tailscale/route.js +164 -164
- package/.next/standalone/.next/server/app/api/v1/tasks/[agent_id]/route.js +115 -115
- package/.next/standalone/.next/server/app/api/v1/tasks/route.js +23 -23
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/activity/route.js +1429 -0
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/activity/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/activity/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/context-pin/route.js +635 -634
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/context-pin/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/route.js +53 -439
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +172 -172
- package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/threads/route.js +908 -908
- package/.next/standalone/.next/server/app/api/v1/tools/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/tools/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/update/apply/route.js +17 -17
- package/.next/standalone/.next/server/app/api/v1/update/apply/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/update/route.js +570 -570
- package/.next/standalone/.next/server/app/api/v1/voice/transcribe/route.js +224 -224
- package/.next/standalone/.next/server/app/api/v1/voice/tts/route.js +975 -975
- package/.next/standalone/.next/server/app/api/v1/watchers/[id]/route.js +23 -23
- package/.next/standalone/.next/server/app/api/v1/watchers/[id]/run/route.js +72 -72
- package/.next/standalone/.next/server/app/api/v1/watchers/[id]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/watchers/reaction-scripts/route.js +128 -128
- package/.next/standalone/.next/server/app/api/v1/watchers/route.js +164 -164
- package/.next/standalone/.next/server/app/api/v1/watchers/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/icon.svg/route.js +62 -62
- package/.next/standalone/.next/server/app/manifest.webmanifest/route.js +436 -436
- package/.next/standalone/.next/server/app/page.js +1170 -719
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js +91 -91
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -3
- package/.next/standalone/.next/server/chunks/{424.js → 1388.js} +345 -991
- package/.next/standalone/.next/server/chunks/1433.js +1 -1
- package/.next/standalone/.next/server/chunks/1638.js +1 -2
- package/.next/standalone/.next/server/chunks/1738.js +1 -1
- package/.next/standalone/.next/server/chunks/210.js +6 -6
- package/.next/standalone/.next/server/chunks/2151.js +31 -1
- package/.next/standalone/.next/server/chunks/2207.js +1 -0
- package/.next/standalone/.next/server/chunks/2471.js +45 -45
- package/.next/standalone/.next/server/chunks/2504.js +1 -1
- package/.next/standalone/.next/server/chunks/2695.js +17 -17
- package/.next/standalone/.next/server/chunks/3042.js +14 -8
- package/.next/standalone/.next/server/chunks/3399.js +10695 -10695
- package/.next/standalone/.next/server/chunks/3524.js +5 -33
- package/.next/standalone/.next/server/chunks/3566.js +1 -1
- package/.next/standalone/.next/server/chunks/4189.js +946 -0
- package/.next/standalone/.next/server/chunks/{9590.js → 423.js} +116 -49
- package/.next/standalone/.next/server/chunks/4433.js +146 -146
- package/.next/standalone/.next/server/chunks/4508.js +3 -3
- package/.next/standalone/.next/server/chunks/4588.js +1 -0
- package/.next/standalone/.next/server/chunks/46.js +116 -46
- package/.next/standalone/.next/server/chunks/466.js +100 -13
- package/.next/standalone/.next/server/chunks/4868.js +206 -206
- package/.next/standalone/.next/server/chunks/4992.js +13 -0
- package/.next/standalone/.next/server/chunks/5120.js +963 -0
- package/.next/standalone/.next/server/chunks/5701.js +1 -1
- package/.next/standalone/.next/server/chunks/5900.js +1 -1
- package/.next/standalone/.next/server/chunks/6210.js +1 -0
- package/.next/standalone/.next/server/chunks/6213.js +1 -1
- package/.next/standalone/.next/server/chunks/6649.js +3 -3
- package/.next/standalone/.next/server/chunks/6703.js +3 -3
- package/.next/standalone/.next/server/chunks/7445.js +1 -0
- package/.next/standalone/.next/server/chunks/8067.js +12 -0
- package/.next/standalone/.next/server/chunks/8461.js +14 -9
- package/.next/standalone/.next/server/chunks/8558.js +1 -1
- package/.next/standalone/.next/server/chunks/8724.js +1 -1
- package/.next/standalone/.next/server/chunks/8849.js +91 -91
- package/.next/standalone/.next/server/chunks/9032.js +6 -5
- package/.next/standalone/.next/server/chunks/{2563.js → 9164.js} +33106 -31420
- package/.next/standalone/.next/server/chunks/9237.js +396 -396
- package/.next/standalone/.next/server/chunks/{9640.js → 9304.js} +1628 -573
- package/.next/standalone/.next/server/chunks/9406.js +1 -1
- package/.next/standalone/.next/server/chunks/9824.js +98 -98
- package/.next/standalone/.next/server/chunks/9826.js +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
- package/.next/standalone/.next/server/middleware.js +519 -442
- package/.next/standalone/.next/server/pages/404.html +2 -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-f201e3e2e1f57715.js → 1395-e4a99912b8f83044.js} +101 -14
- package/.next/standalone/.next/static/chunks/{4576-13f7546a145a3624.js → 7045-8bc2f14e430ca661.js} +58 -2
- package/.next/standalone/.next/static/chunks/app/_global-error/{page-36cb8b428b38b26a.js → page-6fc5f8e744c81802.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/v1/access/[identity]/{route-36cb8b428b38b26a.js → route-6fc5f8e744c81802.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/v1/access/{route-36cb8b428b38b26a.js → route-6fc5f8e744c81802.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/compact/{route-36cb8b428b38b26a.js → route-6fc5f8e744c81802.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/display-filters/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/thread/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/allowed-sites/[hostname]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/allowed-sites/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/artifacts/lifecycle/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/attachments/files/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/attachments/images/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/chats/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/ignores/[remote_jid]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/ignores/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/lookup/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/pair/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/routes/[route_id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/routes/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/status/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/kinds/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/builtin-tools/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/config/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/credentials/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/credentials/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/currency/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/metrics/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/pricing/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/pricing-task/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/delegations/codex/[job_id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/search/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/settings/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/[id]/reindex/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/env/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/env-sync/allowlist/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/env-sync/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/events/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/events/test/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/agents/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/activate/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/foreground/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/history/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/poll/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/progress/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/result/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/retry/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/status/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/tabs/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/fill/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/refine/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/turn/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/config/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/secrets/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/files/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/fs/browse/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/default/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/health/probes/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/health/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/[name]/test/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/callback/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/start/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/status/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/callback/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/start/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/status/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/lifecycle/adoption/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/local-file/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/logs/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/maps/embed/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/registry/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/[namespace]/[key]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/policy/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/search/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/models/[name]/compact-threads/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/models/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/models/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/catalog/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/defaults/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/install/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/install/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/[name]/enabled/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/[name]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/reload/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/page-capture/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/[id]/approve/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/[id]/deny/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/profile/location/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/profile/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/[provider]/models/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/[provider]/probe/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/github-copilot/auth/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/proxy-config/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/redaction/init/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/redaction/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/[id]/run/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/security/idle-timeout/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/security/pin/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/security/state/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/security/unlock/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/security/verify-pin/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/setup/test-key/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/repos/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/repos/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/system/abort/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/system/restart/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/tailscale/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/tasks/[agent_id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/tasks/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/activity/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/context-pin/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/run/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/tools/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/update/apply/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/update/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/voice/transcribe/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/voice/tts/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/[id]/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/[id]/run/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/reaction-scripts/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/manifest.webmanifest/route-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/app/{page-c6e972a7fd13dae8.js → page-213a623b37226452.js} +1012 -604
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6fc5f8e744c81802.js +17 -0
- package/.next/standalone/.next/static/css/{d80058f0b9b41c09.css → 312542a5725ba0d5.css} +2 -2
- package/.next/standalone/docs/adoption/changesets.json +309 -0
- package/.next/standalone/lib/skills/builtins/memory-organization/SKILL.md +16 -0
- package/.next/standalone/package.json +3 -3
- package/CHANGELOG.md +33 -0
- package/api/client.models.test.ts +31 -0
- package/api/client.ts +25 -1
- package/api/types.ts +37 -0
- package/app/api/v1/lifecycle/adoption/route.ts +14 -2
- package/app/api/v1/models/[name]/compact-threads/route.ts +14 -11
- package/app/api/v1/models/[name]/route.test.ts +89 -0
- package/app/api/v1/models/[name]/route.ts +54 -3
- package/app/api/v1/models/route.ts +4 -2
- package/app/api/v1/providers/[provider]/models/route.test.ts +53 -0
- package/app/api/v1/providers/[provider]/models/route.ts +27 -16
- package/app/api/v1/threads/[thread_id]/activity/route.ts +19 -0
- package/app/api/v1/threads/[thread_id]/context-pin/route.test.ts +1 -0
- package/app/api/v1/threads/[thread_id]/context-pin/route.ts +2 -1
- package/app/api/v1/threads/[thread_id]/route.ts +5 -1
- package/components/agents/agent-editor/AdvancedSection.tsx +8 -2
- package/components/agents/agent-editor/ModelSection.tsx +6 -3
- package/components/chat/ChatView.tsx +52 -11
- package/components/chat/ContextBoundary.test.tsx +68 -1
- package/components/chat/ContextBoundary.tsx +92 -13
- package/components/chat/MessageList.test.tsx +31 -0
- package/components/chat/MessageList.tsx +49 -28
- package/components/chat/ToolList.test.tsx +92 -16
- package/components/chat/ToolList.tsx +59 -4
- package/components/chat/chat-helpers.test.tsx +24 -1
- package/components/chat/chat-helpers.ts +47 -4
- package/components/chat/useThreadActivity.test.tsx +113 -0
- package/components/chat/useThreadActivity.ts +94 -0
- package/components/chat/useThreadData.ts +16 -16
- package/components/chat/workflow-step-retry.ts +25 -0
- package/components/models/ModelEditor.tsx +1 -1
- package/components/models/ModelsPanel.tsx +34 -8
- package/components/models/model-editor/GitHubCopilotAuth.tsx +1 -1
- package/components/models/model-editor/save-helpers.ts +2 -2
- package/components/models/model-editor/useModelEditorForm.ts +1 -1
- package/components/models/model-editor/useModelSaveHandlers.ts +1 -1
- package/components/setup/wizard/StepCredentials.tsx +1 -1
- package/components/setup/wizard/StepModel.tsx +3 -8
- package/components/ui/BootScreen.tsx +17 -0
- package/components/ui/WorkflowChecklist.tsx +71 -33
- package/hooks/useModels.ts +17 -1
- package/hooks/useSSE.ts +28 -3
- package/lib/agents/compaction-pipeline.test.ts +202 -0
- package/lib/agents/compaction-pipeline.ts +483 -0
- package/lib/agents/conversation-summary.ts +37 -21
- package/lib/agents/effective-model.test.ts +45 -0
- package/lib/agents/effective-model.ts +11 -5
- package/lib/agents/llm.ts +2 -2
- package/lib/agents/prepare/history-window.test.ts +18 -0
- package/lib/agents/prepare/history-window.ts +11 -2
- package/lib/agents/prepare/request.ts +4 -0
- package/lib/agents/prepare/system-prompt.test.ts +39 -0
- package/lib/agents/prepare/system-prompt.ts +8 -3
- package/lib/agents/prompt-registry.test.ts +5 -140
- package/lib/agents/prompt-registry.ts +45 -1
- package/lib/agents/prompt-variants.ts +146 -0
- package/lib/agents/run-registry.test.ts +22 -0
- package/lib/agents/run-registry.ts +29 -0
- package/lib/agents/run-thread.retry.test.ts +67 -1
- package/lib/agents/run-thread.ts +96 -6
- package/lib/agents/thread-activity.test.ts +31 -0
- package/lib/agents/thread-activity.ts +27 -0
- package/lib/agents/thread-compaction-state.test.ts +82 -0
- package/lib/agents/thread-compaction-state.ts +121 -0
- package/lib/agents/thread-compaction.test.ts +83 -4
- package/lib/agents/thread-compaction.ts +34 -11
- package/lib/agents/warm-summary-background.test.ts +220 -7
- package/lib/agents/warm-summary-background.ts +329 -149
- package/lib/agents/warm-topics.test.ts +37 -0
- package/lib/agents/warm-topics.ts +297 -0
- package/lib/agents/workflow-step-retry.test.ts +96 -0
- package/lib/agents/workflow-step-retry.ts +216 -0
- package/lib/api/browser-control.ts +0 -3
- package/lib/db/migrations.ts +15 -0
- package/lib/env/config.ts +2 -0
- package/lib/env/schema.ts +12 -0
- package/lib/health/probes.test.ts +8 -11
- package/lib/health/probes.ts +5 -31
- package/lib/lifecycle/changeset-build.test.ts +93 -0
- package/lib/lifecycle/changeset-build.ts +210 -0
- package/lib/lifecycle/changesets.test.ts +101 -0
- package/lib/lifecycle/changesets.ts +166 -0
- package/lib/lifecycle/surface-collect.test.ts +88 -0
- package/lib/lifecycle/surface-collect.ts +64 -0
- package/lib/lifecycle/surface-snapshot.test.ts +104 -0
- package/lib/lifecycle/surface-snapshot.ts +210 -0
- package/lib/memory/record.ts +0 -2
- package/lib/models/editor-payload.ts +1 -1
- package/lib/providers/external.ts +0 -2
- package/lib/providers/github-copilot-auth.ts +2 -3
- package/lib/providers/github-copilot.test.ts +27 -0
- package/lib/providers/github-copilot.ts +21 -44
- package/lib/skills/builtins/memory-organization/SKILL.md +16 -0
- package/lib/stores/integrations.test.ts +7 -0
- package/lib/stores/integrations.ts +4 -4
- package/lib/stores/model-config.test.ts +88 -0
- package/lib/stores/model-config.ts +90 -8
- package/lib/stores/threads.test.ts +9 -0
- package/lib/stores/threads.ts +21 -11
- package/lib/stores/version-adoption.test.ts +96 -0
- package/lib/stores/version-adoption.ts +239 -26
- package/lib/stores/workflow-progress.ts +3 -0
- package/lib/tools/communications/ms-todo.ts +0 -7
- package/lib/tools/general/memory.ts +1 -1
- package/lib/tools/general/workflow-progress.ts +2 -0
- package/lib/tools/runtime/catalog.ts +1 -25
- package/lib/triggers/registry.ts +0 -4
- package/package.json +3 -3
- package/scripts/install-to-system.ps1 +39 -11
- package/scripts/install-to-system.sh +37 -3
- package/.next/standalone/.next/server/chunks/3979.js +0 -581
- package/.next/standalone/.next/server/chunks/5936.js +0 -594
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/display-filters/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/[id]/thread/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/agents/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/allowed-sites/[hostname]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/allowed-sites/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/artifacts/lifecycle/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/attachments/files/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/attachments/images/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/chats/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/ignores/[remote_jid]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/ignores/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/lookup/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/pair/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/routes/[route_id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/routes/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/[id]/status/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/kinds/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/bridges/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/builtin-tools/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/config/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/credentials/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/credentials/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/currency/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/metrics/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/pricing/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/dashboard/pricing-task/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/delegations/codex/[job_id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/search/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/settings/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/[id]/reindex/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/documents/sources/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/env/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/env-sync/allowlist/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/env-sync/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/events/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/events/test/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/agents/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/activate/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/foreground/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/history/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/poll/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/progress/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/result/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/retry/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/status/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/browser/tabs/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/fill/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/refine/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extension/turn/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/config/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/extensions/tools/[name]/secrets/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/files/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/fs/browse/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/default/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/harnesses/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/health/probes/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/health/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/[name]/test/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/callback/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/start/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/gmail/oauth/status/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/callback/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/start/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/outlook/oauth/status/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/integrations/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/lifecycle/adoption/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/local-file/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/logs/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/maps/embed/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/registry/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/mcp-servers/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/[namespace]/[key]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/policy/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/memory/search/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/models/[name]/compact-threads/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/models/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/models/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/catalog/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/defaults/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/install/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/install/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/[name]/enabled/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/[name]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/manifests/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/reload/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/packages/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/page-capture/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/[id]/approve/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/[id]/deny/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/pending-actions/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/profile/location/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/profile/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/[provider]/models/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/[provider]/probe/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/github-copilot/auth/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/providers/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/proxy-config/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/redaction/init/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/redaction/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/[id]/run/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/scheduled-tasks/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/security/idle-timeout/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/security/pin/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/security/state/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/security/unlock/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/security/verify-pin/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/setup/test-key/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/repos/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/repos/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/skills/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/system/abort/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/system/restart/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/tailscale/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/tasks/[agent_id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/tasks/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/context-pin/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/[thread_id]/run/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/threads/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/tools/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/update/apply/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/update/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/voice/transcribe/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/voice/tts/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/[id]/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/[id]/run/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/reaction-scripts/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/api/v1/watchers/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/app/manifest.webmanifest/route-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-36cb8b428b38b26a.js +0 -17
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-36cb8b428b38b26a.js +0 -17
- /package/.next/standalone/.next/static/{e2NV1wk6mWg3SIeELXevg → bMRK5y3ruT7c3WtBfCQOG}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{e2NV1wk6mWg3SIeELXevg → bMRK5y3ruT7c3WtBfCQOG}/_ssgManifest.js +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { getProvider } from "@/lib/providers";
|
|
2
2
|
import type { ModelProvider, ProviderParams } from "@/lib/providers/types";
|
|
3
|
-
import { summarizeTranscript, transcriptText, extractTopicSegments, validateTopicSegments, type SummaryTopicSegment } from "@/lib/agents/conversation-summary";
|
|
3
|
+
import { summarizeTranscript, transcriptText, extractTopicSegments, validateTopicSegments, parseStoredTopics, type SummaryTopicSegment } from "@/lib/agents/conversation-summary";
|
|
4
|
+
import { canMergeIntoTopics, finalizeFreshTopics, mergeWarmTopics, renderTopicRecaps, slugifyForMemoryKey } from "@/lib/agents/warm-topics";
|
|
5
|
+
import { formatTranscriptRow, runCompactionPipeline, type CompactionSource, type PipelineSourceRow } from "@/lib/agents/compaction-pipeline";
|
|
4
6
|
import { takeRecentWarmMessages, warmSummaryMessageLimit, wrapWarmSummary, AUTOMATION_CHANNEL_ORDER } from "@/lib/agents/prepare/history-window";
|
|
5
7
|
import { getAgentConfig, getAgentTierProportions } from "@/lib/stores/agent-configs";
|
|
6
|
-
import {
|
|
8
|
+
import { getModelParams, resolveRunnableModelConfig } from "@/lib/stores/model-config";
|
|
7
9
|
import { putMemory } from "@/lib/stores/memory";
|
|
8
10
|
import {
|
|
9
11
|
commitThreadWarmContext,
|
|
@@ -13,15 +15,42 @@ import {
|
|
|
13
15
|
getThread,
|
|
14
16
|
getThreadMessageBySeq,
|
|
15
17
|
getThreadChannelSummary,
|
|
18
|
+
listThreadChannelSummaries,
|
|
16
19
|
} from "@/lib/stores/threads";
|
|
20
|
+
import { getOrCreateGlobal } from "@/lib/utils/global-state";
|
|
21
|
+
import {
|
|
22
|
+
getCompactionAttempt,
|
|
23
|
+
isCompactionRunning,
|
|
24
|
+
runTrackedCompaction,
|
|
25
|
+
type CompactionAttempt,
|
|
26
|
+
} from "@/lib/agents/thread-compaction-state";
|
|
27
|
+
|
|
28
|
+
/** Automation-channel recaps committed at the thread's current boundary. */
|
|
29
|
+
export function currentChannelSummaries(
|
|
30
|
+
threadId: string,
|
|
31
|
+
hotSinceSeq: number | null | undefined,
|
|
32
|
+
): Array<{ channel: string; summary: string; computed_at: string; topics: SummaryTopicSegment[] | null }> {
|
|
33
|
+
if (hotSinceSeq == null) return [];
|
|
34
|
+
const order: readonly string[] = AUTOMATION_CHANNEL_ORDER;
|
|
35
|
+
return listThreadChannelSummaries(threadId)
|
|
36
|
+
.filter((row) => row.summary_before_seq === hotSinceSeq && row.summary.trim().length > 0)
|
|
37
|
+
.sort((a, b) => order.indexOf(a.channel) - order.indexOf(b.channel))
|
|
38
|
+
.map((row) => ({
|
|
39
|
+
channel: row.channel,
|
|
40
|
+
summary: row.summary,
|
|
41
|
+
computed_at: row.computed_at,
|
|
42
|
+
topics: parseStoredTopics(row.topics),
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
17
45
|
|
|
18
46
|
const MAX_TOPIC_PREVIEW_CHARS = 24_000;
|
|
19
47
|
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
48
|
+
// Automatic ("auto"), summary-refresh ("refresh") and manual /compact
|
|
49
|
+
// ("manual") attempts are tracked per thread in thread-compaction-state, so
|
|
50
|
+
// every route bundle reports the same compaction and each one has a deadline.
|
|
51
|
+
// An auto boundary is proposed but not committed until its recap is stored,
|
|
52
|
+
// so the turn that proposes it still runs on the old boundary.
|
|
53
|
+
//
|
|
25
54
|
// A boundary request that arrived while a prior one for the same thread was
|
|
26
55
|
// still in flight. Last-write-wins: kickBoundaryCompaction used to silently
|
|
27
56
|
// drop any request that arrived while one was already running (dragging
|
|
@@ -31,19 +60,23 @@ const pendingBoundaries = new Map<string, number>();
|
|
|
31
60
|
// later request was ignored. Queuing the latest one and re-running it once
|
|
32
61
|
// the in-flight commit settles makes the boundary always converge on what
|
|
33
62
|
// the caller most recently asked for.
|
|
34
|
-
const queuedBoundaries = new Map<string, {
|
|
63
|
+
const queuedBoundaries = getOrCreateGlobal("__jarela_queued_compaction_boundaries", () => new Map<string, {
|
|
35
64
|
boundarySeq: number;
|
|
36
65
|
options: Pick<WarmContextCompactionOptions, "autoBoundaryLockedUntilMessageCount">;
|
|
37
|
-
}>();
|
|
66
|
+
}>());
|
|
67
|
+
|
|
68
|
+
function backgroundCompactionRunning(threadId: string): boolean {
|
|
69
|
+
return isCompactionRunning(threadId, "auto") || isCompactionRunning(threadId, "refresh");
|
|
70
|
+
}
|
|
38
71
|
|
|
39
72
|
export function kickWarmSummaryRefresh(threadId: string): void {
|
|
40
|
-
if (!threadId ||
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
73
|
+
if (!threadId || backgroundCompactionRunning(threadId)) return;
|
|
74
|
+
const thread = getThread(threadId);
|
|
75
|
+
void runTrackedCompaction(threadId, "refresh", thread?.hot_since_seq ?? null, async (attempt) => {
|
|
76
|
+
await Promise.resolve();
|
|
77
|
+
await refreshWarmSummary(threadId, attempt);
|
|
78
|
+
}).catch((err) => console.warn(`[warm-summary] refresh failed thread=${threadId}: ${String(err)}`))
|
|
79
|
+
.finally(() => drainQueuedBoundary(threadId));
|
|
47
80
|
}
|
|
48
81
|
|
|
49
82
|
/**
|
|
@@ -59,26 +92,27 @@ export function pendingCompactionBoundary(threadId: string): string | null {
|
|
|
59
92
|
|
|
60
93
|
export function pendingCompactionBoundarySeq(threadId: string): number | null {
|
|
61
94
|
return queuedBoundaries.get(threadId)?.boundarySeq
|
|
62
|
-
??
|
|
63
|
-
??
|
|
95
|
+
?? getCompactionAttempt(threadId, "auto")?.boundarySeq
|
|
96
|
+
?? getCompactionAttempt(threadId, "manual")?.boundarySeq
|
|
64
97
|
?? null;
|
|
65
98
|
}
|
|
66
99
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
100
|
+
/** A manual /compact holds the thread (the UI queues sends); auto ones don't. */
|
|
101
|
+
export function isManualCompactionRunning(threadId: string): boolean {
|
|
102
|
+
return isCompactionRunning(threadId, "manual");
|
|
103
|
+
}
|
|
70
104
|
|
|
71
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Run a manual /compact as the thread's single manual attempt. Pass the
|
|
107
|
+
* attempt to compactThreadWarmContext so a result that arrives after the
|
|
108
|
+
* deadline is discarded rather than committed.
|
|
109
|
+
*/
|
|
110
|
+
export function trackManualCompaction<T>(
|
|
72
111
|
threadId: string,
|
|
73
112
|
boundarySeq: number,
|
|
74
|
-
run: () => Promise<T>,
|
|
113
|
+
run: (attempt: CompactionAttempt) => Promise<T>,
|
|
75
114
|
): Promise<T> {
|
|
76
|
-
|
|
77
|
-
try {
|
|
78
|
-
return await run();
|
|
79
|
-
} finally {
|
|
80
|
-
if (manualBoundaries.get(threadId) === boundarySeq) manualBoundaries.delete(threadId);
|
|
81
|
-
}
|
|
115
|
+
return runTrackedCompaction(threadId, "manual", boundarySeq, run);
|
|
82
116
|
}
|
|
83
117
|
|
|
84
118
|
/**
|
|
@@ -99,13 +133,29 @@ export function kickBoundaryCompaction(
|
|
|
99
133
|
options: Pick<WarmContextCompactionOptions, "autoBoundaryLockedUntilMessageCount"> = {},
|
|
100
134
|
): void {
|
|
101
135
|
if (!threadId || !Number.isSafeInteger(boundarySeq) || boundarySeq <= 0) return;
|
|
102
|
-
if (
|
|
136
|
+
if (backgroundCompactionRunning(threadId)) {
|
|
103
137
|
queuedBoundaries.set(threadId, { boundarySeq, options });
|
|
104
138
|
return;
|
|
105
139
|
}
|
|
106
140
|
runBoundaryCompaction(threadId, boundarySeq, options);
|
|
107
141
|
}
|
|
108
142
|
|
|
143
|
+
// Called whenever a background attempt settles. A queued boundary that a
|
|
144
|
+
// summary refresh was blocking used to be stranded here forever, which kept
|
|
145
|
+
// the thread reporting a pending compaction until restart.
|
|
146
|
+
function drainQueuedBoundary(threadId: string): void {
|
|
147
|
+
if (backgroundCompactionRunning(threadId)) return;
|
|
148
|
+
const queued = queuedBoundaries.get(threadId);
|
|
149
|
+
if (!queued) return;
|
|
150
|
+
queuedBoundaries.delete(threadId);
|
|
151
|
+
// Skip a no-op re-run if the boundary that just committed already
|
|
152
|
+
// matches what was queued — the queued request was superseded by
|
|
153
|
+
// the very commit it was waiting behind.
|
|
154
|
+
const settled = getThread(threadId);
|
|
155
|
+
const alreadySettled = queued.boundarySeq === (settled?.hot_since_seq ?? null);
|
|
156
|
+
if (!alreadySettled) runBoundaryCompaction(threadId, queued.boundarySeq, queued.options);
|
|
157
|
+
}
|
|
158
|
+
|
|
109
159
|
function runBoundaryCompaction(
|
|
110
160
|
threadId: string,
|
|
111
161
|
boundarySeq: number,
|
|
@@ -113,38 +163,26 @@ function runBoundaryCompaction(
|
|
|
113
163
|
): void {
|
|
114
164
|
const baseThread = getThread(threadId);
|
|
115
165
|
const basePinSeq = baseThread?.hot_since_seq ?? null;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
pendingBoundaries.delete(threadId);
|
|
123
|
-
activeRefreshes.delete(threadId);
|
|
124
|
-
const queued = queuedBoundaries.get(threadId);
|
|
125
|
-
if (!queued) return;
|
|
126
|
-
queuedBoundaries.delete(threadId);
|
|
127
|
-
// Skip a no-op re-run if the boundary that just committed already
|
|
128
|
-
// matches what was queued — the queued request was superseded by
|
|
129
|
-
// the very commit it was waiting behind.
|
|
130
|
-
const settled = getThread(threadId);
|
|
131
|
-
const alreadySettled = queued.boundarySeq === (settled?.hot_since_seq ?? null);
|
|
132
|
-
if (!alreadySettled) runBoundaryCompaction(threadId, queued.boundarySeq, queued.options);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
166
|
+
void runTrackedCompaction(threadId, "auto", boundarySeq, async (attempt) => {
|
|
167
|
+
await Promise.resolve();
|
|
168
|
+
await commitBoundaryCompaction(threadId, boundarySeq, basePinSeq, options, attempt);
|
|
169
|
+
})
|
|
170
|
+
.catch((err) => console.warn(`[context-boundary:auto] compaction failed thread=${threadId}: ${String(err)}`))
|
|
171
|
+
.finally(() => drainQueuedBoundary(threadId));
|
|
135
172
|
}
|
|
136
|
-
|
|
137
173
|
async function commitBoundaryCompaction(
|
|
138
174
|
threadId: string,
|
|
139
175
|
boundarySeq: number,
|
|
140
176
|
basePinSeq: number | null,
|
|
141
177
|
options: Pick<WarmContextCompactionOptions, "autoBoundaryLockedUntilMessageCount">,
|
|
178
|
+
attempt?: CompactionAttempt,
|
|
142
179
|
): Promise<void> {
|
|
143
180
|
const committed = await compactThreadWarmContext(threadId, boundarySeq, {
|
|
144
181
|
expectedHotSinceSeq: basePinSeq,
|
|
145
182
|
alignTopicBoundary: true,
|
|
146
183
|
allowEmptySummary: true,
|
|
147
184
|
...options,
|
|
185
|
+
attempt,
|
|
148
186
|
});
|
|
149
187
|
if (!committed) return;
|
|
150
188
|
console.info(
|
|
@@ -168,8 +206,7 @@ export async function findTopicBoundary(threadId: string, boundarySeq: number):
|
|
|
168
206
|
if (!thread) return null;
|
|
169
207
|
const agent = getAgentConfig(thread.agent_id);
|
|
170
208
|
if (!agent) return null;
|
|
171
|
-
const
|
|
172
|
-
const modelCfg = modelName ? getModelConfig(modelName) : null;
|
|
209
|
+
const modelCfg = resolveRunnableModelConfig(agent.model_config_name);
|
|
173
210
|
if (!modelCfg?.provider || !modelCfg.model_id) return null;
|
|
174
211
|
|
|
175
212
|
const rows = getRecentMessagesWindow(threadId, 0, undefined, "foreground")
|
|
@@ -224,13 +261,14 @@ export async function findTopicBoundary(threadId: string, boundarySeq: number):
|
|
|
224
261
|
}
|
|
225
262
|
}
|
|
226
263
|
|
|
227
|
-
export async function refreshWarmSummary(threadId: string): Promise<void> {
|
|
264
|
+
export async function refreshWarmSummary(threadId: string, attempt?: CompactionAttempt): Promise<void> {
|
|
228
265
|
const thread = getThread(threadId);
|
|
229
266
|
if (!thread?.hot_since_seq) return;
|
|
230
267
|
await compactThreadWarmContext(threadId, thread.hot_since_seq, {
|
|
231
268
|
expectedHotSinceSeq: thread.hot_since_seq,
|
|
232
269
|
alignTopicBoundary: false,
|
|
233
270
|
allowEmptySummary: true,
|
|
271
|
+
attempt,
|
|
234
272
|
});
|
|
235
273
|
}
|
|
236
274
|
|
|
@@ -242,6 +280,9 @@ interface BuiltSummary {
|
|
|
242
280
|
// Per-topic segmentation of the same range (see SummaryTopicSegment). Empty
|
|
243
281
|
// when the summarizer didn't return a `jarela-topics` fence.
|
|
244
282
|
topics: SummaryTopicSegment[];
|
|
283
|
+
// Topics produced by this pass only; their extracted facts get uplifted.
|
|
284
|
+
// Stored topics merged in earlier were uplifted when they were fresh.
|
|
285
|
+
freshTopics: SummaryTopicSegment[];
|
|
245
286
|
}
|
|
246
287
|
|
|
247
288
|
export interface CommittedWarmContext {
|
|
@@ -251,6 +292,8 @@ export interface CommittedWarmContext {
|
|
|
251
292
|
sourceMessages: number;
|
|
252
293
|
sourceChars: number;
|
|
253
294
|
topics: SummaryTopicSegment[];
|
|
295
|
+
/** Per automation channel (ADR-0044), committed at the same boundary. */
|
|
296
|
+
channels: Array<{ channel: string; summary: string; sourceMessages: number }>;
|
|
254
297
|
}
|
|
255
298
|
|
|
256
299
|
export interface WarmContextCompactionOptions {
|
|
@@ -259,6 +302,9 @@ export interface WarmContextCompactionOptions {
|
|
|
259
302
|
alignTopicBoundary?: boolean;
|
|
260
303
|
allowEmptySummary?: boolean;
|
|
261
304
|
autoBoundaryLockedUntilMessageCount?: number;
|
|
305
|
+
/** The tracked attempt this compaction runs under; once it is no longer
|
|
306
|
+
* current (deadline passed or replaced) the result is not committed. */
|
|
307
|
+
attempt?: Pick<CompactionAttempt, "isCurrent">;
|
|
262
308
|
providerOverride?: {
|
|
263
309
|
provider: Pick<ModelProvider, "chat">;
|
|
264
310
|
modelId: string;
|
|
@@ -290,13 +336,24 @@ export async function compactThreadWarmContext(
|
|
|
290
336
|
if (!boundaryRow) return null;
|
|
291
337
|
const boundary = boundaryRow.created_at;
|
|
292
338
|
const built = await buildSummaryBefore(threadId, boundary, boundarySeq, options.providerOverride);
|
|
293
|
-
if (!built
|
|
339
|
+
if (!built) return null;
|
|
340
|
+
if (options.attempt && !options.attempt.isCurrent()) return null;
|
|
294
341
|
|
|
295
342
|
const channelSummaries = await Promise.all(AUTOMATION_CHANNEL_ORDER.map(async (channel) => {
|
|
296
343
|
const channelSummary = await buildAutomationChannelSummaryBefore(threadId, channel, boundarySeq, options.providerOverride);
|
|
297
344
|
if (!channelSummary) throw new Error(`Could not build ${channel} warm summary`);
|
|
298
|
-
return {
|
|
345
|
+
return {
|
|
346
|
+
channel,
|
|
347
|
+
summary: channelSummary.summary,
|
|
348
|
+
sourceMessages: channelSummary.sourceMessages,
|
|
349
|
+
topics: channelSummary.topics ? JSON.stringify(channelSummary.topics) : null,
|
|
350
|
+
};
|
|
299
351
|
}));
|
|
352
|
+
// A thread whose only activity is automation (e.g. a bridge-only agent) has
|
|
353
|
+
// an empty chat summary but real channel recaps — that is still a result.
|
|
354
|
+
const anySummary = !!built.summary || channelSummaries.some((c) => !!c.summary);
|
|
355
|
+
if (!anySummary && !options.allowEmptySummary) return null;
|
|
356
|
+
if (options.attempt && !options.attempt.isCurrent()) return null;
|
|
300
357
|
|
|
301
358
|
const committed = commitThreadWarmContext(threadId, {
|
|
302
359
|
hotSince: boundary,
|
|
@@ -312,11 +369,13 @@ export async function compactThreadWarmContext(
|
|
|
312
369
|
? options.expectedWarmSummary
|
|
313
370
|
: (baseThread.warm_summary ?? null),
|
|
314
371
|
autoBoundaryLockedUntilMessageCount: options.autoBoundaryLockedUntilMessageCount,
|
|
315
|
-
channelSummaries,
|
|
372
|
+
channelSummaries: channelSummaries.map(({ channel, summary, topics }) => ({ channel, summary, topics })),
|
|
316
373
|
});
|
|
317
374
|
if (!committed) return null;
|
|
318
|
-
upliftTopicFacts(built.
|
|
319
|
-
|
|
375
|
+
upliftTopicFacts(built.freshTopics);
|
|
376
|
+
const { freshTopics: _fresh, ...context } = built;
|
|
377
|
+
const channels = channelSummaries.map(({ channel, summary, sourceMessages }) => ({ channel, summary, sourceMessages }));
|
|
378
|
+
return { boundary, boundarySeq, ...context, channels };
|
|
320
379
|
}
|
|
321
380
|
|
|
322
381
|
/**
|
|
@@ -339,8 +398,7 @@ async function buildSummaryBefore(
|
|
|
339
398
|
const agent = getAgentConfig(thread.agent_id);
|
|
340
399
|
if (!agent) return null;
|
|
341
400
|
|
|
342
|
-
const
|
|
343
|
-
const modelCfg = modelName ? getModelConfig(modelName) : null;
|
|
401
|
+
const modelCfg = resolveRunnableModelConfig(agent.model_config_name);
|
|
344
402
|
if (!modelCfg?.provider || !modelCfg.model_id) return null;
|
|
345
403
|
|
|
346
404
|
const baseParams = providerOverride?.params ?? getModelParams(modelCfg);
|
|
@@ -353,40 +411,55 @@ async function buildSummaryBefore(
|
|
|
353
411
|
? providerParams.context_window_tokens
|
|
354
412
|
: 32768;
|
|
355
413
|
const summaryInputChars = Math.max(4000, Math.min(120000, Math.round(contextTokens * 3)));
|
|
356
|
-
const
|
|
357
|
-
const
|
|
358
|
-
const
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
414
|
+
const provider = providerOverride?.provider ?? getProvider(modelCfg.provider);
|
|
415
|
+
const modelId = providerOverride?.modelId ?? modelCfg.model_id;
|
|
416
|
+
const summaryParams = providerParams.max_tokens
|
|
417
|
+
? providerParams
|
|
418
|
+
: { ...providerParams, max_tokens: 1024 };
|
|
419
|
+
|
|
420
|
+
const outcome = await runTopicCompaction({
|
|
421
|
+
threadId,
|
|
422
|
+
source: "chat",
|
|
423
|
+
rows,
|
|
424
|
+
storedTopics: parseStoredTopics(thread.warm_summary_topics),
|
|
425
|
+
storedBeforeSeq: thread.warm_summary_before_seq,
|
|
426
|
+
boundarySeq,
|
|
427
|
+
warmSummaryLimit: agent.warm_summary_limit,
|
|
428
|
+
summaryInputChars,
|
|
429
|
+
provider,
|
|
430
|
+
modelId,
|
|
431
|
+
params: summaryParams,
|
|
432
|
+
});
|
|
433
|
+
if (outcome.status === "empty") {
|
|
434
|
+
return { summary: "", sourceMessages: outcome.sourceMessages, sourceChars: outcome.sourceChars, topics: [], freshTopics: [] };
|
|
368
435
|
}
|
|
436
|
+
if (outcome.status === "topics") {
|
|
437
|
+
return {
|
|
438
|
+
summary: wrapTopicSummary(outcome.topics),
|
|
439
|
+
sourceMessages: outcome.sourceMessages,
|
|
440
|
+
sourceChars: outcome.sourceChars,
|
|
441
|
+
topics: outcome.topics,
|
|
442
|
+
freshTopics: outcome.freshTopics,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
console.warn(`[warm-summary] thread=${threadId} compaction pipeline failed validation; using single-call summary`);
|
|
446
|
+
|
|
447
|
+
const eligibleRows = takeRecentWarmMessages(rows.filter((m) => m.seq < boundarySeq), agent.warm_summary_limit);
|
|
448
|
+
const { selectedRows, transcript } = selectTranscriptRows(eligibleRows, summaryInputChars);
|
|
369
449
|
const selectedSourceChars = selectedRows.reduce((total, row) => total + transcriptText(row.content).length, 0);
|
|
370
450
|
if (selectedSourceChars < 24 || selectedRows.length < 2) {
|
|
371
|
-
return { summary: "", sourceMessages: selectedRows.length, sourceChars: selectedSourceChars, topics: [] };
|
|
451
|
+
return { summary: "", sourceMessages: selectedRows.length, sourceChars: selectedSourceChars, topics: [], freshTopics: [] };
|
|
372
452
|
}
|
|
373
453
|
|
|
374
|
-
const transcript = selectedTranscript.join("\n\n").trim();
|
|
375
454
|
if (!transcript) return null;
|
|
376
455
|
|
|
377
|
-
const provider = providerOverride?.provider ?? getProvider(modelCfg.provider);
|
|
378
|
-
const modelId = providerOverride?.modelId ?? modelCfg.model_id;
|
|
379
|
-
const summaryParams = providerParams.max_tokens
|
|
380
|
-
? providerParams
|
|
381
|
-
: { ...providerParams, max_tokens: 1024 };
|
|
382
|
-
|
|
383
456
|
const raw = (await summarizeTranscript(provider, modelId, summaryParams, transcript)).trim();
|
|
384
457
|
if (!raw) return null;
|
|
385
458
|
const { body, topics } = extractTopicSegments(raw);
|
|
386
|
-
const validatedTopics = validateTopicSegments(topics, rows, selectedRows, {
|
|
459
|
+
const validatedTopics = finalizeFreshTopics(validateTopicSegments(topics, rows, selectedRows, {
|
|
387
460
|
boundarySeq,
|
|
388
461
|
allowPartialStart: true,
|
|
389
|
-
});
|
|
462
|
+
}), selectedRows);
|
|
390
463
|
const summarizedSeqs = new Set(validatedTopics.flatMap((topic) =>
|
|
391
464
|
selectedRows
|
|
392
465
|
.filter((row) => row.seq >= topic.start_seq! && row.seq <= topic.end_seq!)
|
|
@@ -395,31 +468,119 @@ async function buildSummaryBefore(
|
|
|
395
468
|
const summarizedRows = validatedTopics.length > 0
|
|
396
469
|
? selectedRows.filter((row) => summarizedSeqs.has(row.seq))
|
|
397
470
|
: selectedRows;
|
|
398
|
-
|
|
399
|
-
? renderTopicRecaps(validatedTopics)
|
|
400
|
-
: body;
|
|
401
|
-
if (!summary) return null;
|
|
471
|
+
if (validatedTopics.length === 0 && !body) return null;
|
|
402
472
|
const sourceMessages = summarizedRows.length;
|
|
403
473
|
const sourceChars = summarizedRows.reduce((total, row) => total + transcriptText(row.content).length, 0);
|
|
404
474
|
|
|
405
475
|
return {
|
|
406
|
-
summary:
|
|
407
|
-
"--- Warm context summary ---",
|
|
408
|
-
"Compressed recap of recent messages immediately before the hot window:",
|
|
409
|
-
summary,
|
|
410
|
-
].join("\n"),
|
|
476
|
+
summary: validatedTopics.length > 0 ? wrapTopicSummary(validatedTopics) : wrapTopicSummary(null, body),
|
|
411
477
|
sourceMessages,
|
|
412
478
|
sourceChars,
|
|
413
479
|
topics: validatedTopics,
|
|
480
|
+
freshTopics: validatedTopics,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
type TopicCompactionOutcome =
|
|
485
|
+
| { status: "empty"; sourceMessages: number; sourceChars: number }
|
|
486
|
+
| { status: "topics"; topics: SummaryTopicSegment[]; freshTopics: SummaryTopicSegment[]; sourceMessages: number; sourceChars: number }
|
|
487
|
+
| { status: "failed" };
|
|
488
|
+
|
|
489
|
+
interface TopicCompactionInput<T extends PipelineSourceRow> {
|
|
490
|
+
threadId: string;
|
|
491
|
+
source: CompactionSource;
|
|
492
|
+
/** Every row of this message stream, ascending by seq. */
|
|
493
|
+
rows: readonly T[];
|
|
494
|
+
storedTopics: SummaryTopicSegment[] | null;
|
|
495
|
+
storedBeforeSeq: number | null | undefined;
|
|
496
|
+
boundarySeq: number;
|
|
497
|
+
warmSummaryLimit: number | null | undefined;
|
|
498
|
+
summaryInputChars: number;
|
|
499
|
+
provider: Pick<ModelProvider, "chat">;
|
|
500
|
+
modelId: string;
|
|
501
|
+
params: ProviderParams;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Shared by chat and every automation channel: run the compaction pipeline
|
|
506
|
+
* (lib/agents/compaction-pipeline.ts) over one message stream. Incremental
|
|
507
|
+
* when the stored topics can be extended — only rows that aged out of hot
|
|
508
|
+
* since the last pass are folded in; otherwise the recent warm window is
|
|
509
|
+
* regrouped from scratch. "failed" tells the caller to use its single-call
|
|
510
|
+
* fallback.
|
|
511
|
+
*/
|
|
512
|
+
async function runTopicCompaction<T extends PipelineSourceRow>(input: TopicCompactionInput<T>): Promise<TopicCompactionOutcome> {
|
|
513
|
+
const { threadId, source, rows, storedTopics, storedBeforeSeq, boundarySeq } = input;
|
|
514
|
+
const messageLimit = warmSummaryMessageLimit(input.warmSummaryLimit);
|
|
515
|
+
const incremental = messageLimit > 0 && canMergeIntoTopics(storedTopics, storedBeforeSeq, boundarySeq);
|
|
516
|
+
const priorTopics = incremental ? storedTopics! : [];
|
|
517
|
+
const candidates = incremental
|
|
518
|
+
? rows.filter((m) => m.seq >= storedBeforeSeq! && m.seq < boundarySeq)
|
|
519
|
+
: takeRecentWarmMessages(rows.filter((m) => m.seq < boundarySeq), input.warmSummaryLimit);
|
|
520
|
+
const { selectedRows } = selectTranscriptRows(candidates, input.summaryInputChars);
|
|
521
|
+
if (incremental && selectedRows.length === 0) {
|
|
522
|
+
const kept = mergeWarmTopics(priorTopics, [], messageLimit);
|
|
523
|
+
return { status: "topics", topics: kept.topics, freshTopics: [], sourceMessages: kept.sourceMessages, sourceChars: kept.sourceChars };
|
|
524
|
+
}
|
|
525
|
+
const selectedChars = selectedRows.reduce((total, row) => total + transcriptText(row.content).length, 0);
|
|
526
|
+
if (!incremental && (selectedChars < 24 || selectedRows.length < 2)) {
|
|
527
|
+
return { status: "empty", sourceMessages: selectedRows.length, sourceChars: selectedChars };
|
|
528
|
+
}
|
|
529
|
+
const firstSeq = selectedRows[0]?.seq ?? boundarySeq;
|
|
530
|
+
const label = `[warm-summary] thread=${threadId} source=${source} ${incremental ? "merge" : "rebuild"}`;
|
|
531
|
+
const pipeline = await runCompactionPipeline({
|
|
532
|
+
provider: input.provider,
|
|
533
|
+
modelId: input.modelId,
|
|
534
|
+
params: input.params,
|
|
535
|
+
rows: selectedRows,
|
|
536
|
+
priorTopics,
|
|
537
|
+
messageLimit: messageLimit > 0 ? messageLimit : selectedRows.length,
|
|
538
|
+
partialStart: !incremental && rows.some((m) => m.seq < firstSeq),
|
|
539
|
+
source,
|
|
540
|
+
log: (message) => console.info(`${label} ${message}`),
|
|
541
|
+
}).catch((err: unknown) => {
|
|
542
|
+
console.warn(`${label} compaction pipeline threw:`, err);
|
|
543
|
+
return null;
|
|
544
|
+
});
|
|
545
|
+
if (!pipeline) return { status: "failed" };
|
|
546
|
+
return {
|
|
547
|
+
status: "topics",
|
|
548
|
+
topics: pipeline.topics,
|
|
549
|
+
freshTopics: pipeline.freshTopics,
|
|
550
|
+
sourceMessages: pipeline.sourceMessages,
|
|
551
|
+
sourceChars: pipeline.sourceChars,
|
|
414
552
|
};
|
|
415
553
|
}
|
|
416
554
|
|
|
417
|
-
function
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
555
|
+
function selectTranscriptRows<T extends { seq: number; created_at: string; role: string; content: string }>(
|
|
556
|
+
rows: readonly T[],
|
|
557
|
+
budgetChars: number,
|
|
558
|
+
): { selectedRows: T[]; transcript: string } {
|
|
559
|
+
// Newest first, so a budget overflow drops the oldest messages.
|
|
560
|
+
const selectedRows: T[] = [];
|
|
561
|
+
const parts: string[] = [];
|
|
562
|
+
let chars = 0;
|
|
563
|
+
for (let index = rows.length - 1; index >= 0; index -= 1) {
|
|
564
|
+
const row = rows[index];
|
|
565
|
+
const formatted = formatTranscriptRow(row);
|
|
566
|
+
const added = formatted.length + (parts.length > 0 ? 2 : 0);
|
|
567
|
+
if (chars + added > budgetChars) break;
|
|
568
|
+
selectedRows.unshift(row);
|
|
569
|
+
parts.unshift(formatted);
|
|
570
|
+
chars += added;
|
|
571
|
+
}
|
|
572
|
+
return { selectedRows, transcript: parts.join("\n\n").trim() };
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function wrapTopicSummary(topics: readonly SummaryTopicSegment[] | null, body = ""): string {
|
|
576
|
+
return [
|
|
577
|
+
"--- Warm context summary ---",
|
|
578
|
+
"Compressed recap of recent messages immediately before the hot window:",
|
|
579
|
+
topics ? renderTopicRecaps(topics) : body,
|
|
580
|
+
].join("\n");
|
|
421
581
|
}
|
|
422
582
|
|
|
583
|
+
|
|
423
584
|
// Batched uplift (once per compaction pass, covering every topic segment
|
|
424
585
|
// together — not fired per-segment as each is identified). Direct writes,
|
|
425
586
|
// same as the agent-facing memory_upsert tool: background compaction has
|
|
@@ -430,7 +591,9 @@ export function upliftTopicFacts(topics: readonly SummaryTopicSegment[]): void {
|
|
|
430
591
|
const seenKeys = new Set<string>();
|
|
431
592
|
for (const topic of topics) {
|
|
432
593
|
for (const fact of topic.facts) {
|
|
433
|
-
|
|
594
|
+
// The agent already saved this one during the turn; don't overwrite it.
|
|
595
|
+
if (fact.origin === "agent") continue;
|
|
596
|
+
const key = fact.key?.startsWith("facts/") ? fact.key.slice("facts/".length) : slugifyForMemoryKey(fact.subject);
|
|
434
597
|
if (!key || seenKeys.has(key)) continue;
|
|
435
598
|
seenKeys.add(key);
|
|
436
599
|
putMemory("facts", key, {
|
|
@@ -451,34 +614,45 @@ export function upliftTopicFacts(topics: readonly SummaryTopicSegment[]): void {
|
|
|
451
614
|
}
|
|
452
615
|
}
|
|
453
616
|
|
|
454
|
-
function slugifyForMemoryKey(subject: string): string {
|
|
455
|
-
return subject
|
|
456
|
-
.toLowerCase()
|
|
457
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
458
|
-
.replace(/^-+|-+$/g, "")
|
|
459
|
-
.slice(0, 80);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
617
|
export interface BuiltChannelSummary {
|
|
463
618
|
/** "" when there was too little automation activity to summarise. */
|
|
464
619
|
summary: string;
|
|
465
620
|
sourceMessages: number;
|
|
466
621
|
sourceChars: number;
|
|
622
|
+
/** Stored topics when the compaction pipeline produced them; null for the single-call fallback. */
|
|
623
|
+
topics: SummaryTopicSegment[] | null;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
const AUTOMATION_COMPACTION_SOURCES: readonly CompactionSource[] = ["scheduled_task", "watcher", "bridge"];
|
|
627
|
+
|
|
628
|
+
function automationCompactionSource(channel: string): CompactionSource {
|
|
629
|
+
return (AUTOMATION_COMPACTION_SOURCES as readonly string[]).includes(channel) ? channel as CompactionSource : "scheduled_task";
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// ADR-0044 channels never uplift facts to memory, so the only facts a channel
|
|
633
|
+
// topic keeps are memory the agent itself saved there (verified in code).
|
|
634
|
+
function keepSavedFactsOnly(topics: readonly SummaryTopicSegment[]): SummaryTopicSegment[] {
|
|
635
|
+
return topics.map((topic) => ({ ...topic, facts: topic.facts.filter((fact) => fact.origin === "agent") }));
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
function wrapChannelSummary(channel: string, body: string): string {
|
|
639
|
+
return [
|
|
640
|
+
`--- ${channel} activity summary ---`,
|
|
641
|
+
"Compressed recap of automation activity outside the hot window:",
|
|
642
|
+
body,
|
|
643
|
+
].join("\n");
|
|
467
644
|
}
|
|
468
645
|
|
|
469
646
|
// ADR-0044 — the automation-channel counterpart to buildSummaryBefore. Chat
|
|
470
|
-
// keeps using buildSummaryBefore/compactThreadWarmContext
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
//
|
|
647
|
+
// keeps using buildSummaryBefore/compactThreadWarmContext (the legacy
|
|
648
|
+
// threads.warm_summary* columns ARE the "chat" channel's summary, per the
|
|
649
|
+
// ADR's fallback design); this covers scheduled_task/watcher/bridge, each
|
|
650
|
+
// cached in its own thread_channel_summaries row.
|
|
474
651
|
//
|
|
475
|
-
//
|
|
476
|
-
//
|
|
477
|
-
//
|
|
478
|
-
//
|
|
479
|
-
// far less likely to carry durable personal facts worth extracting. Every
|
|
480
|
-
// call re-summarises the full channel history below the boundary from
|
|
481
|
-
// scratch; acceptable given the expected message counts.
|
|
652
|
+
// Same compaction pipeline as chat (group -> recap -> merge, incremental into
|
|
653
|
+
// the channel's stored topics), with source-specific prompt wording. Unlike
|
|
654
|
+
// chat there is no topic-fact uplift: automation logs rarely carry durable
|
|
655
|
+
// personal facts, so channel topics only keep memory the agent saved itself.
|
|
482
656
|
async function buildAutomationChannelSummaryBefore(
|
|
483
657
|
threadId: string,
|
|
484
658
|
channel: string,
|
|
@@ -491,8 +665,7 @@ async function buildAutomationChannelSummaryBefore(
|
|
|
491
665
|
const agent = getAgentConfig(thread.agent_id);
|
|
492
666
|
if (!agent) return null;
|
|
493
667
|
|
|
494
|
-
const
|
|
495
|
-
const modelCfg = modelName ? getModelConfig(modelName) : null;
|
|
668
|
+
const modelCfg = resolveRunnableModelConfig(agent.model_config_name);
|
|
496
669
|
if (!modelCfg?.provider || !modelCfg.model_id) return null;
|
|
497
670
|
|
|
498
671
|
const baseParams = providerOverride?.params ?? getModelParams(modelCfg);
|
|
@@ -500,43 +673,52 @@ async function buildAutomationChannelSummaryBefore(
|
|
|
500
673
|
const providerParams = tier ? { ...baseParams, context_tier_proportions: tier } : baseParams;
|
|
501
674
|
|
|
502
675
|
const rows = getMessagesByAutomationCategory(threadId, channel);
|
|
503
|
-
const eligibleRows = rows.filter((m) => m.seq < boundarySeq);
|
|
504
|
-
const warmRows = takeRecentWarmMessages(
|
|
505
|
-
eligibleRows,
|
|
506
|
-
agent.warm_summary_limit,
|
|
507
|
-
);
|
|
508
|
-
|
|
509
676
|
const contextTokens = typeof providerParams.context_window_tokens === "number"
|
|
510
677
|
? providerParams.context_window_tokens
|
|
511
678
|
: 32768;
|
|
512
679
|
const summaryInputChars = Math.max(4000, Math.min(120000, Math.round(contextTokens * 3)));
|
|
680
|
+
const provider = providerOverride?.provider ?? getProvider(modelCfg.provider);
|
|
681
|
+
const modelId = providerOverride?.modelId ?? modelCfg.model_id;
|
|
682
|
+
const summaryParams = providerParams.max_tokens
|
|
683
|
+
? providerParams
|
|
684
|
+
: { ...providerParams, max_tokens: 1024 };
|
|
513
685
|
|
|
514
|
-
const
|
|
515
|
-
const
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
686
|
+
const stored = getThreadChannelSummary(threadId, channel);
|
|
687
|
+
const outcome = await runTopicCompaction({
|
|
688
|
+
threadId,
|
|
689
|
+
source: automationCompactionSource(channel),
|
|
690
|
+
rows,
|
|
691
|
+
storedTopics: parseStoredTopics(stored?.topics ?? null),
|
|
692
|
+
storedBeforeSeq: stored?.summary_before_seq,
|
|
693
|
+
boundarySeq,
|
|
694
|
+
warmSummaryLimit: agent.warm_summary_limit,
|
|
695
|
+
summaryInputChars,
|
|
696
|
+
provider,
|
|
697
|
+
modelId,
|
|
698
|
+
params: summaryParams,
|
|
699
|
+
});
|
|
700
|
+
if (outcome.status === "empty") {
|
|
701
|
+
return { summary: "", sourceMessages: outcome.sourceMessages, sourceChars: outcome.sourceChars, topics: null };
|
|
702
|
+
}
|
|
703
|
+
if (outcome.status === "topics") {
|
|
704
|
+
const topics = keepSavedFactsOnly(outcome.topics);
|
|
705
|
+
return {
|
|
706
|
+
summary: topics.length > 0 ? wrapChannelSummary(channel, renderTopicRecaps(topics)) : "",
|
|
707
|
+
sourceMessages: outcome.sourceMessages,
|
|
708
|
+
sourceChars: outcome.sourceChars,
|
|
709
|
+
topics,
|
|
710
|
+
};
|
|
525
711
|
}
|
|
712
|
+
console.warn(`[warm-summary] thread=${threadId} ${channel} compaction pipeline failed validation; using single-call summary`);
|
|
713
|
+
|
|
714
|
+
const eligibleRows = takeRecentWarmMessages(rows.filter((m) => m.seq < boundarySeq), agent.warm_summary_limit);
|
|
715
|
+
const { selectedRows, transcript } = selectTranscriptRows(eligibleRows, summaryInputChars);
|
|
526
716
|
const sourceChars = selectedRows.reduce((total, row) => total + transcriptText(row.content).length, 0);
|
|
527
717
|
if (sourceChars < 24 || selectedRows.length < 2) {
|
|
528
|
-
return { summary: "", sourceMessages: selectedRows.length, sourceChars };
|
|
718
|
+
return { summary: "", sourceMessages: selectedRows.length, sourceChars, topics: null };
|
|
529
719
|
}
|
|
530
|
-
|
|
531
|
-
const transcript = selectedTranscript.join("\n\n").trim();
|
|
532
720
|
if (!transcript) return null;
|
|
533
721
|
|
|
534
|
-
const provider = providerOverride?.provider ?? getProvider(modelCfg.provider);
|
|
535
|
-
const modelId = providerOverride?.modelId ?? modelCfg.model_id;
|
|
536
|
-
const summaryParams = providerParams.max_tokens
|
|
537
|
-
? providerParams
|
|
538
|
-
: { ...providerParams, max_tokens: 1024 };
|
|
539
|
-
|
|
540
722
|
const raw = (await summarizeTranscript(provider, modelId, summaryParams, transcript)).trim();
|
|
541
723
|
if (!raw) return null;
|
|
542
724
|
const { body, topics } = extractTopicSegments(raw);
|
|
@@ -545,7 +727,7 @@ async function buildAutomationChannelSummaryBefore(
|
|
|
545
727
|
allowPartialStart: true,
|
|
546
728
|
});
|
|
547
729
|
const summary = validatedTopics.length > 0
|
|
548
|
-
? renderTopicRecaps(validatedTopics)
|
|
730
|
+
? renderTopicRecaps(validatedTopics.map((topic) => ({ ...topic, facts: [] })))
|
|
549
731
|
: body;
|
|
550
732
|
if (!summary) return null;
|
|
551
733
|
const summarizedSeqs = new Set(validatedTopics.flatMap((topic) =>
|
|
@@ -559,13 +741,10 @@ async function buildAutomationChannelSummaryBefore(
|
|
|
559
741
|
const summarizedChars = summarizedRows.reduce((total, row) => total + transcriptText(row.content).length, 0);
|
|
560
742
|
|
|
561
743
|
return {
|
|
562
|
-
summary:
|
|
563
|
-
`--- ${channel} activity summary ---`,
|
|
564
|
-
"Compressed recap of automation activity outside the hot window:",
|
|
565
|
-
summary,
|
|
566
|
-
].join("\n"),
|
|
744
|
+
summary: wrapChannelSummary(channel, summary),
|
|
567
745
|
sourceMessages: summarizedRows.length,
|
|
568
746
|
sourceChars: summarizedChars,
|
|
747
|
+
topics: null,
|
|
569
748
|
};
|
|
570
749
|
}
|
|
571
750
|
|
|
@@ -589,6 +768,7 @@ export async function compactAutomationChannelWarmContext(
|
|
|
589
768
|
summary: built.summary,
|
|
590
769
|
summaryBefore: boundary,
|
|
591
770
|
summaryBeforeSeq: boundarySeq,
|
|
771
|
+
topics: built.topics ? JSON.stringify(built.topics) : null,
|
|
592
772
|
});
|
|
593
773
|
return built;
|
|
594
774
|
}
|