Skip to content

v1.41.0

Choose a tag to compare

@agentconnect-release agentconnect-release released this 20 Aug 06:06
· 2329 commits to release since this release

Summary

  • Improved Webchat — Continue chat-platform sessions from the Console. Browse files, manage Git changes, and follow pull requests alongside the conversation.
  • Multi-repository Workspaces — Give self-hosted agents access to additional repositories and work across them within a session.
  • Daemon Groups Preview — Group machines to run agents with failover, available behind the daemon-groups feature flag.
  • Channel-scoped Memory — Keep channel-specific context separate while retaining shared agent knowledge.
  • DeepSeek Harness — Run agents with DeepSeek Harness through the runtime picker.

Upgrade note: Model gateway base URLs now come from daemon configuration. Key-server responses no longer control the endpoint; configure the shared or runtime-specific model base URL on the daemon.

⚠ BREAKING CHANGES

  • protocol: retire baseUrl from the IssueKey response; responses parse tolerantly (#1251)
  • daemon: the key is issued, the base URL is deployed (#1249)
  • daemon: one gateway, one pair per runtime — and a key server that owns the whole pair (#1246)

Features

  • cluster: authenticate a cloud daemon with its Kubernetes identity (#930) (5bab7f9)
  • cluster: complete the runtime-image drain handshake (#875) (59f40f6)
  • cluster: let daemons dial sandbox shims (#924) (cc46031)
  • compose: add Caddy HTTPS to the bundled Logto stack (#910) (49fbedc)
  • compose: ship the connector gateway in the default stack (#1135) (7e8e0ca)
  • console: link a session's own pull request, and keep the dock's panels fresh (#1294) (417caf5)
  • console: PR actions — one Auto-fix turn and Merge-when-ready auto-merge (#884) (f0b1a02)
  • control-plane: a daemon with agents on it can join a group (#1130) (18bc170)
  • control-plane: authenticate an in-cluster daemon with its Kubernetes identity (#907) (30a2f5a)
  • control-plane: authenticate usage ingest by projected cluster identity (#1168) (051179f)
  • control-plane: duty_group ledger for k8s daemons (#937) (2f56680)
  • control-plane: duty-group recompute sweep and the incumbent grant policy (#942) (e723aee)
  • control-plane: limit non-admin organization creation (#916) (5664b56)
  • control-plane: make the usage collector's ServiceAccount name deployment-configurable (#1247) (b52f4b1)
  • control-plane: one usage report interface for two authenticated ingresses (#1162) (63a9263)
  • control-plane: only the newest live generation of a member set claims vacated duty groups (#1022) (29ce6f2), closes #1016
  • control-plane: org-scoped member sets — the mechanism (daemon-groups.md §6 PR 2) (#1114) (d4ade72), closes #1003 #1000
  • control-plane: place a new org's built-in agent on the pool when the install runs one (#1271) (6da7327)
  • control-plane: pool capacity gauges — the vacant-duty alarm (k8s-daemon-pool.md §12) (#1102) (a7d3e3d)
  • control-plane: provision an org's cluster envelope with the org (#901) (94b73ff)
  • control-plane: recompute duty groups when their inputs change (#949) (d55fe2f)
  • cp,web: name a short Slack app grant as an actionable access issue (#769) (fe0cbd1)
  • cp: become the key authority for cluster execution envelopes (#881) (0a78db2)
  • cp: make the provider-identity serving lease an operator knob (#799) (519d766)
  • cp: provision AgentConnectOrg resources for cluster execution (#876) (6b1ffc6)
  • cp: surface session-access refresh-behind failures (#797) (29e74e8), closes #792 #775
  • cp: verdict-split serving leases for session-access resource facts (#794) (38aa5cc), closes #792 #775
  • cp: warm session-access resource facts from session activity (#798) (602a377), closes #792 #775 #794
  • cp: warm the Logto identity projection at first authenticated touch (#793) (1f5e06b)
  • daemon: a WorkspaceFs seam and session worktrees on the sandbox volume (#1225) (b1dd56c)
  • daemon: accept AC_CODEX_CONFIG as the pod's codex session-config floor (#1252) (c96a595)
  • daemon: add a --cloud mode switch for cluster-backed runtimes (#821) (a3a25de), closes #810
  • daemon: add a thin Kubernetes client for the sandbox API (#823) (64cc04f), closes #811 #816
  • daemon: add DeepSeek Harness as a curated ACP runtime (#1142) (345d162)
  • daemon: add model gateway credentials (#974) (625be97)
  • daemon: add the cluster spawn driver for per-agent sandbox runtimes (#828) (a9d2548), closes #823 #816
  • daemon: add the in-sandbox shim and its bind-on-callback handshake (#826) (01b9fb5), closes #813
  • daemon: apply the codex session-config floor at spawn, not only in the pod (#1262) (ea9c448), closes #1252
  • daemon: browse a secondary root's files and git on a cluster agent (#1240) (abb8424), closes #1229 #1236
  • daemon: carry the pull summary and commit date through the git contract (#831) (fe8a2e2), closes #815
  • daemon: check session worktrees out on a named branch (#897) (000ef97)
  • daemon: drain duty groups on SIGTERM with acknowledged releases and a draining bit (#1021) (fb5406d), closes #1016
  • daemon: enforce the git inventory inside the sandbox (#834) (cd97d50), closes #815
  • daemon: exact review checkout for a pull request on a secondary repository (#1223) (e5c73ad)
  • daemon: freeze the workspace git contract and implement both runners (#830) (588d0ac), closes #815 #815
  • daemon: hold duty leases and serve only the agents they cover (#948) (7ce3f16)
  • daemon: infer the parent reply when a needsReply delegation turn ends without its report (#984) (68f658b), closes #800 #905 #800 #905
  • daemon: let Kubernetes supervise restart while refusing self-upgrade (#825) (7fcf377), closes #818
  • daemon: let webchat agent posts continue a multi-agent conversation (#549 parity) (#906) (0381147)
  • daemon: make an upstream credential rejection explainable in direct-connect (#829) (f13005b), closes #817
  • daemon: make duty enforcement reachable from the environment (#980) (0f1098a)
  • daemon: make usage reporting a deployment choice, on by default (#1198) (1bf98ec)
  • daemon: materialize secondary workspace roots and hand them to shared-isolation sessions (#1220) (c012632)
  • daemon: migrate the BFF git surface and the pull helper onto the runner (#832) (d63ab7f)
  • daemon: one gateway, one pair per runtime — and a key server that owns the whole pair (#1246) (cb391b8)
  • daemon: per-session worktrees for secondary roots and the retire-sweep-remove lifecycle (#1221) (a8ccccd)
  • daemon: persist cloud transcripts in PostgreSQL (#925) (6c07a03)
  • daemon: pool orphan reconciler for leaked sandbox objects (#1074) (e08e45d), closes #1062
  • daemon: prepare a git-repo workspace on the sandbox pod's own volume (#862) (347b8ac), closes #855 #857
  • daemon: propagate cancellation into the sandbox and key the clone lock by filesystem (#836) (24ed1f1), closes #815
  • daemon: publish a real pool-member readiness signal (#1056) (1fc243b), closes #1043
  • daemon: recover upgrades before registration (#802) (e080d71)
  • daemon: remove the evaluation-only collaboration capability toggle (#761) (4204549)
  • daemon: rename the mode to --k8s and actually run the K8sDriver (#841) (2b8ccec), closes #840
  • daemon: route materialization and credential sockets through the shim (#827) (b839a2b), closes #814
  • daemon: route workspace-manager git through the runner seam (#835) (00b6912), closes #815
  • daemon: secondary workspace roots and cross-repository review on the sandbox volume (#1236) (737d34f), closes #1225 #1225
  • daemon: serve the console workspace files from the pod they live on (#902) (d5dced1), closes #895 #924 #912 #933
  • daemon: serve the daemon's unix sockets inside a sandbox pod (#855) (21e0540)
  • daemon: ship DeepSeek Harness in the runtime sandbox image (#1172) (f89cb28)
  • daemon: ship the tool-server bridge in the runtime image so cluster agents get their tools (#1288) (31cbd15)
  • daemon: staged cluster launch metrics and operability counters (#838) (2bd175b), closes #819 #819 #819
  • daemon: suspend an idle agent's pod, and delete a removed agent's volume (#883) (21a4b51)
  • daemon: the key is issued, the base URL is deployed (#1249) (fe1fad4)
  • daemon: the per-repository gh wrapper inside the sandbox runtime image (#1244) (88431ad)
  • deploy: cluster manifests for the k8s daemon (#848) (0dc4c98), closes #841 #845 #846 #847
  • docker: daemon pod image and its release pipeline (#845) (5e938b1), closes #842
  • docker: runtime sandbox image and its release pipeline (#839) (2da5346), closes #820 #820 #820
  • docker: ship OpenCode in the runtime sandbox image (#852) (d7fb78e)
  • dream: generate the staged index, and stop asking the model for one (#1269) (34b85cd), closes #1256
  • dream: write the proposal through the shared memory tools (#1298) (aaf1246)
  • duty: follow the duty holder with MCP and external-memory definitions (#989) (8e0107d), closes #979
  • duty: install a granted agent the member does not have (#972) (d8020d3), closes #948
  • duty: make the pool heal itself by making placement a target (#991) (3a63671), closes #987 #955 #987 #972
  • duty: route agent updates and the reconnect roster to the duty holder (#978) (04797ed), closes #972 #973 #965
  • duty: self-fence held duties when the CP link outlives the lease horizon (#976) (8cec9c3), closes #948 #973 #948
  • evals: firmer, individually binding referee VOTE wording (webchat Werewolf) (#986) (4af3727)
  • evals: size-appropriate werewolf role balance + private non-voter re-prompt (webchat) (#997) (6e3b0bd), closes #800-inferred
  • github: report an interrupted review as a handover, with a retry call to action (#1170) (ea15f7c)
  • keep a cluster agent's managed memory on its sandbox volume (#1081) (11eaf6a), closes #1078
  • memory: channel memory scope — console scope toggle (#788) (a214e71), closes #653 #786
  • memory: channel memory scope — per-channel folders (backend) (#786) (abac27e), closes #653
  • memory: channel memory viewer — selector + per-channel reads (#789) (8269ff5), closes #653 #786 #788
  • memory: distillation writes through the shared memory tools (#1265) (04825e4)
  • memory: headers, [[links]], and a generated index (#1254) (99b88a5), closes #41
  • memory: let a binding pin an explicit store and its own limits (#1295) (a5f8b57)
  • memory: make [[links]] a real graph, and adopt the maintenance policies (#1255) (1681f07), closes #1254
  • memory: one shared format prompt, and descriptions on distilled memories (#1257) (2cf7563)
  • memory: the dream writes the same memory format as everyone else (#1260) (a262556), closes #1256
  • observability: log why a webchat stream did not come back (#1268) (185d05c)
  • operator-chart: fence the operator SA and sandbox pods with admission policies (#874) (2caf3b5)
  • operator-chart: vendor the pinned agent-sandbox stack behind installCRD (#878) (1ac2ea7)
  • operator: AgentConnectOrg CRD + operator skeleton with shared k8s client (#867) (40fa601)
  • operator: block helm uninstall while AgentConnectOrg resources remain (#877) (a316f73)
  • operator: derive the org envelope namespace from the CR name (#892) (f506d8d)
  • operator: give the daemon state PVC an install-level storage class and size (#890) (ee1a19c)
  • operator: give the envelope daemon a projected identity instead of a Secret (#909) (7727540)
  • operator: implement envelope, status, deletion, and rollout reconcile logic (#869) (2e82c0f)
  • operator: render the master SandboxTemplates from chart values (#913) (25785a6)
  • operator: separate a missing credential Secret from pod startup delay (#871) (a218b3e)
  • operator: trace the operator through the shared OpenTelemetry bootstrap (#879) (1e58366)
  • protocol,control-plane: duty lease exchange riding the heartbeat (#939) (39ab394)
  • protocol,cp,daemon: a repo scope for workspace browsing and git (#1229) (ca3e6e6)
  • protocol,cp: project the agent's additional repositories into the agent spec (#1219) (79141ee)
  • protocol: declare the agentconnect.key-server/v1 credential contract (#963) (6c947f1)
  • protocol: require and validate the frame organization on every org-scoped frame and reply (#955 M4) (#1089) (0740b2b), closes #1066
  • protocol: retire baseUrl from the IssueKey response; responses parse tolerantly (#1251) (1237c95), closes #1249
  • relay: emit traces the way the control plane does (#766) (36ab74e)
  • shim: accept provider base URL / API key from the sandbox pod env (#846) (6a25e89)
  • skills: add AgentConnect setup tutorial (#762) (0f4309d)
  • tasks: show a session's background tasks in the dock (#854) (d468bac)
  • the duty activation rendezvous (#951) (635615f)
  • usage: a workload credential for the org usage aggregate (#1195) (420ca37)
  • usage: carry a session cost as an exact decimal, edge to aggregate (#1180) (2055de5)
  • usage: one org aggregate over an explicit window, scoped by metering source (#1191) (af49ae5)
  • wake a cluster agent's sandbox from the console instead of explaining (#1077) (65fdfa2), closes #1070 #955 #1070
  • web,control-plane: the cloud pool as one entry, and the rows its replaced Pods left behind (#945) (52d6502)
  • web: add @mention picker to webchat composers (#764) (1b95a9d), closes #730
  • web: add credits via Stripe Checkout on the billing page (#1213) (f4fba8a)
  • web: add the dock's Files tab and the left-pane file viewer (#824) (2866e0b)
  • web: billing page behind a deployment switch (#1177) (032b872), closes #1187
  • webchat: continue integration-origin sessions from the console composer (#932) (f6a4169), closes #180
  • webchat: let a conversation be continued by the session's visibility, not only its owner (#1270) (fb3243d), closes #43 #932
  • web: cluster execution settings and envelope status (#886) (1572be7), closes #876 #881
  • web: give the webchat transcript its own scroll pane (#1216) (d1e85d0)
  • web: name the pool after whoever owns it (#1193) (397801b)
  • web: per-feature experiment switches, starting with daemon groups (#1131) (08d57ab)
  • web: pick the repository to browse in the Workspace tab (#1233) (3b66a46)
  • web: pin the webchat session title and action bar to the top (#1261) (d262db7)
  • web: place an agent on a daemon group (#1115) (7fb68b2)
  • web: PR panel — session pull-request read surface (#880) (db84964), closes repo#pull
  • web: put the daemon pool behind an experiment switch (#1175) (150b46b)
  • web: replace the session rail with a resizable tabbed dock (#808) (ec316f1)
  • web: restyle session work steps as collapsible one-line rows (#898) (cbb24b2)
  • web: say that additional repositories are checked out alongside the workspace (#1222) (4655f1e)
  • web: show usage debits in the billing history (#1259) (3e34cc9)
  • web: the self-hosted pool gets its own page, not a Pod's (#1196) (9beec2b)
  • workspace: read git diffs and history from the dock (#833) (6ca0b18)
  • workspace: stage, commit and push from the dock, with drafted messages (#849) (dc4ec44)

Bug Fixes

  • clear a pool member's stale staged-move fence on a move back onto the pool (#1098) (694f893), closes #1093 #1093 #1093
  • collab: retry a cross-daemon peer wake through the pool install window (#1060) (a5f7ae7), closes #987
  • console: name session branches after people, and make the Git/PR tabs match the worktree (#912) (190ec23), closes #897
  • console: prefer current visible daemon names (#1094) (98473b9)
  • console: preserve daemon display names for agents (#1092) (e1c305d)
  • control-plane: accept a hook completion from the member serving the agent (#1061) (12bfe18), closes #1047 #1051
  • control-plane: adopt an envelope's existing daemon record on first token auth (#908) (1f212f4)
  • control-plane: authorize hook and review reports through the placement resolver (#1047) (01715f8)
  • control-plane: bind a skill source's repo identity server-side (#1002) (7b8bc50), closes #935
  • control-plane: configure the sandbox tier apart from the daemon tier (#899) (905a892)
  • control-plane: hash org/user ids into the connector profile name (#1136) (2802372)
  • control-plane: host a session continuation on any daemon that serves its content (#1266) (19c1cf9)
  • control-plane: joining a group leaves pinned agents alone (#1148) (8a58b3f), closes #1130
  • control-plane: let an agent enabling an org MCP provider move daemons (#1199) (ac29e3a), closes #1192
  • control-plane: make the hook redelivery sweep cover the window it claims (#1071) (a65e09d)
  • control-plane: map Logto's identity-already-in-use 422 to a 409 (#1207) (f5334b0)
  • control-plane: re-apply AgentConnectOrg specs on a timer so drift converges (#918) (01ab576)
  • control-plane: re-serve a still-leased grant when a session-access check cannot run (#1181) (d3a82be)
  • control-plane: read a session's transcript from any daemon holding its store (#1019) (9c151a4), closes #1018
  • control-plane: refuse http-transport installs a platform can never reach (#990) (27c60d5), closes #957
  • control-plane: release an organization's agent claims when the organization is deleted (#1277) (96a5e54)
  • control-plane: reserve admin and billing as org slugs (#1206) (04376ac)
  • control-plane: resolve the collab snapshot's channel half through placement (#1296) (31e4e39)
  • control-plane: resolve the serving member on every pool-agent write, report and replay (#1055) (2e34ca4), closes #1026 #1027 #1029 #1054
  • control-plane: resolve webchat multi-agent and delegated MCP placement (#1057) (72d30cf), closes #1028
  • control-plane: scope agent lifecycle frames to the agent org (#965) (daabaaf)
  • control-plane: session content follows the serving daemon (#1018) (4e9e190)
  • control-plane: settle in-flight duty recomputes instead of leaking them across tests (#1084) (6e85d46)
  • control-plane: shred an org whose transit key never existed (#1215) (e0a2db7)
  • control-plane: terminate an accepted socket that errors instead of crashing (#1104) (cb3f2ad)
  • daemon: a needsReply report resumes the parent session-only, never as a conversation post (#966) (#985) (3229e98), closes #800 #926 #926
  • daemon: allocate shim binding generations from the shared store (#1017) (712e98c)
  • daemon: allow contained skill root aliases (#796) (f54198a)
  • daemon: audit and write workspace git config through the runner (#837) (833c277), closes #815
  • daemon: bound the shim dial's opening handshake while it is still starting up (#1275) (0ba5f71)
  • daemon: buffer shim frames on sockets accepted before the channel FSM attaches (#940) (d0be9bb)
  • daemon: clean up Kubernetes runtime plane hygiene (#970) (89dc6bc)
  • daemon: collapse a burst of check re-requests into one review (#1276) (38ddc1b)
  • daemon: compensate the cron and dream fires a duty handover swallows (#1053) (aa1101e), closes #1031
  • daemon: deliver agent-initiated webchat turns to the live view (#753) (#807) (71b3d86)
  • daemon: deliver continuation-turn replies to the origin platform (dual sinks) (#944) (7033761), closes #932
  • daemon: fence pool-store transcripts on the owning org (#1075) (c399170)
  • daemon: fire an orchestration deadline only where the main's duty is held (#1042) (c9d8746), closes #1036
  • daemon: give a scratch workspace with App credentials the gitcred capability (#1245) (1c4dcc7)
  • daemon: give every daemon-run fetch the credential helper, not just push (#1299) (18b95a9)
  • daemon: keep GitHub reviews current (#865) (c3891e7)
  • daemon: keep the agent's unrun inbox on a duty handoff (#1064) (136b44d)
  • daemon: key the memory-capture gate by agent, not the ACP id alone (#1054) (6bc4d5d), closes #1037
  • daemon: key the runtime model catalog cache by its owning member (#1058) (ae98133), closes #1039
  • daemon: lead the standing collaboration guidance with a tool-precedence rule (#800) (#801) (fbb9b67), closes #791
  • daemon: let a cluster agent's workspace be edited (#895) (12a0e43)
  • daemon: materialize the session gitconfig into the sandbox pod at launch (#1241) (3b48c22), closes #858
  • daemon: own the hook-completion outbox per member (#1044) (fa90175), closes #1035
  • daemon: own the session-metadata outbox per member (#1068) (fcf3f94)
  • daemon: pair the injected codex key with its api-key auth request (#1264) (9d67006)
  • daemon: partition a CP-addressed session read by the frame's org (#1250) (ccdca66), closes #1019
  • daemon: post an agent wake's inbound message to the live webchat view (#926) (9b2c836), closes #807
  • daemon: preempt a running review when a newer revision lands (#1234) (19f4f66)
  • daemon: project the pod codex base URL into CODEX_CONFIG in the sandbox shim (#1226) (3f9d776)
  • daemon: reconnect cloud authentication (#947) (8fcb05e)
  • daemon: record a cluster marker only when the volume provably matches (#866) (f2e8982), closes #862 #862
  • daemon: recover only the interrupted work this member owns (#1046) (4bf5b00), closes #1045
  • daemon: redact Feishu SDK error logs (#795) (0c9c2a3)
  • daemon: render provider thumbnails for oversized transcript images (#803) (3850b1f)
  • daemon: replay the shared inbox backlog on every duty gain (#1049) (c572d9c), closes #1034
  • daemon: report an interrupted hook fire on a duty handoff instead of retaining its row (#1173) (98d4ab8), closes #1050
  • daemon: report each runtime probe as it lands, stop starving package launchers (#1153) (3e3d7e1)
  • daemon: report the sandbox probe verdict at startup (#956) (#1099) (d78ded8)
  • daemon: resolve the console's git root where the workspace actually is (#933) (fb564f7), closes #902 #902
  • daemon: resolve the gh wrapper's target repo from the command's own endpoint and URL (#1214) (b839109)
  • daemon: scope pairwise a2a transcript reads to the session's own agent (#967) (#969) (3140a4f), closes #941
  • daemon: scope sandbox launches to the duty holder and re-derive them on takeover (#1045) (7d3b144), closes #1030
  • daemon: scope the loop-guard trip to the member and make its counters atomic (#1069) (b652a9f)
  • daemon: scope the session TTL/GC sweeps to the duty holder and lease purge receipts per member (#1065) (fe98133), closes #1023 #1023 #1032
  • daemon: send the ACP cwd in the pod's coordinates, not the daemon's (#853) (400f780), closes #815
  • daemon: share cloud transcript database across orgs (#928) (d624089)
  • daemon: skip replies to deleted Slack roots (#859) (368acf8)
  • daemon: start the shim loss window when the sandbox pod is up (#1011) (c6ed4d0)
  • daemon: surface external tool failures (#887) (6fa4f84)
  • daemon: survive an oversized frame on the shim accept paths (#1100) (872e2a8), closes #1096
  • daemon: sync sandbox image on resume (#1005) (75e7a6e)
  • daemon: the mcp-bridge exits with its harness instead of stranding itself (#1200) (5d95d1d), closes #936
  • daemon: treat a raced-away memory path as absent, not ENOENT (#1111) (1a1f5de)
  • daemon: use Postgres as the cloud store (#958) (d711301)
  • deploy: give the k8s daemon a durable state volume (#882) (eee027a)
  • deploy: pin rc.47 and fix what deploying to a real cluster found (#851) (9ee170e), closes #847
  • duty: apply a refused replacement's removals instead of keeping the old composition (#977) (7d1c01d), closes #976 #948 #976
  • duty: derive a duty group for every agent, not only for edge-bearing ones (#983) (e15ffa0)
  • duty: scope the routing confirmation to the grant it proves (#992) (9d695c8), closes #991 #976 #939 #991
  • evals: publish a referee message when it is delivered, not when it is decided (#1176) (6df9651)
  • github: allow draft pull request reviews (#900) (0efa6ff)
  • github: allow internal app pull request reviews (#922) (7bd0c6f)
  • github: trigger external reviews on workflow approval (#917) (d1aaa8f)
  • isolate poisoned session metadata snapshots (#988) (90cfb05)
  • k8s-client: stamp Lease times as MicroTime so leader election works (#873) (4aae97c), closes Date#toISOString
  • knowledge: authorize organization reads through the serving member (#1004) (ab45d40), closes #996 #999
  • knowledge: scope the organization-suggestion replay to the org that owns it (#996) (c6b4644), closes #968
  • memory: normalize frontmatter in the shared write path (#1287) (67fbe77)
  • memory: settle index ownership at dream adoption (#1256) (7a6626b)
  • operator-chart: stop the envelope fence denying every cluster-scoped write (#889) (5d54fed)
  • operator: let the org daemon reach its own control namespace (#894) (ea75085)
  • operator: read warm-pool summaries from the real SandboxWarmPool status (#872) (3baadc6)
  • operator: report CredentialSecretMissing while the daemon pod is stuck at init (#891) (f1e8dcb)
  • relay: hold GitHub authorization and run reports across a CP reconnect (#1067) (e50ddac)
  • relay: rendezvous a webchat turn through a live same-org daemon when the recorded one is gone (#1242) (6ed24b1), closes #1239
  • relay: take the activation rendezvous for platform interactions too (#1048) (e76c3f7)
  • release: build the control plane's workspace deps before bundling setup (#896) (99b9f62)
  • release: track protocol as a web image input (#787) (bd605b8), closes #726
  • release: track the shared observability package in every release input set (#784) (bab06e1)
  • setup: delete the Logto Cloud demo connectors blocking managed social targets (#763) (3ff8a8d)
  • shared-bot: route direct conversations to one owner (#919) (de8bb71)
  • slack: designate one workspace-check credential per realm (#777) (e4ff590)
  • slack: fail a manual token install whose workspace grant is short on bot scopes (#780) (14f407c), closes #768 #768
  • slack: fail an install whose workspace grant is short on bot scopes (#768) (0e5bd3f)
  • the per-member assumptions collected in #1041 (#1063) (6ea4ed2)
  • usage: a cumulative checkpoint only ever moves forward (#1183) (6287c08)
  • webchat: record the author's stable principal as the transcript sender, not their display name (#1272) (9313114), closes #912
  • web: collapse cloud daemon placement option (#959) (6f35748)
  • web: follow the console design for daemon groups (#1122) (2eeb66f)
  • web: group placement reads as a group, not as "pool" (#1158) (19493bd)
  • web: hide node count and version on the managed cloud pool card (#1209) (ef093e0)
  • web: improve mobile chat readability (#1112) (beffcaa)
  • web: let a pool agent's webchat session resume after a rollout (#1263) (ae7e3fd), closes #987
  • web: let a session scope speak about the session's own worktree (#1300) (483aa5e)
  • web: let the edit modal place an agent on the pool (#993) (1b34f39)
  • web: point console error text at the defined --status-error token (#767) (5c64a58)
  • web: prevent add menus from being clipped (#1178) (f7d05fd)
  • web: re-send an unacked webchat turn on reconnect instead of resuming nothing (#1267) (c2514c0)
  • web: read Cloud placement capabilities from a serving pool member (#1189) (bb6d006)
  • web: retry runtime config after startup failure (#870) (6a565ec)
  • web: route CP requests through auth recovery (#929) (04798e8)
  • web: shimmer the live work line and stop blanking it on leading … (#953) (fec9e63)
  • web: show an agent's org MCP servers when its placement resolves no daemon (#1291) (11c97cf)
  • web: stop merged-conversation parents renting the sibling slot (#773) (4d3eaa8), closes #770 #770
  • web: stop offering a futile retry for a permanently unverifiable conversation (#771) (bd3ca83), closes #769
  • web: support browsers without randomUUID (#893) (eeb945f)
  • web: the Runs on picker is the design's option list (#1128) (22da273)
  • web: unify cloud daemon picker (#961) (becbce7)

Internal

  • control-plane: delete CLUSTER_EXECUTION_ENABLED, POOL_NAMESPACE is the switch (#1014) (17cc9ea)
  • control-plane: drop the dead cluster-identity daemon reads (#1108) (797014c), closes #964 #1086 #1106
  • control-plane: drop the envelope tables (#1086) (5b13aad), closes #964
  • control-plane: drop the per-org cluster-identity daemon resolver (#1106) (bd5341e), closes #964 #1086
  • control-plane: drop the pod-less cluster-identity unique index (#1109) (12933e1), closes #964 #1086 #1106 #1108
  • control-plane: fence the daemon WS surface on the frame org (#1066) (bceb64c), closes #996 #955
  • control-plane: fold the pool into the unified member-set model (#1003) (8f68243), closes #955
  • control-plane: name the preset placement knobs after the pool, not the cloud (#1273) (28b456f)
  • control-plane: one post-lease agent re-read instead of four copies (#1072) (64e0555), closes #1055
  • control-plane: remove the daemon key-delivery path (#914) (ce46221), closes 907-#909
  • control-plane: rename CLUSTER_CLOUD_DAEMON_NAMESPACE to POOL_NAMESPACE (#1012) (8f6e8d7), closes #1008 #955
  • control-plane: replace POOL_NAMESPACE with DAEMON_POOL_ENABLED (#1015) (4a2f6e7)
  • daemon: async LocalStore — retire the blocking PostgreSQL bridge (#1182) (d0d6df5)
  • daemon: break the memory <-> memory-plugin package cycle (#1147) (76f0501)
  • daemon: converge the cluster driver into a facade (#1171) (7a6ebac)
  • daemon: cut the CommandHandlers delegate shells (#1175) (#1185) (48e60ff)
  • daemon: cut the connection + observed-channel delegate shells (#1188) (e240100)
  • daemon: cut the duty coordinator's delegate shells (#1184) (110941c)
  • daemon: cut the GitHub review delegate shells from Daemon (#1190) (01304f2)
  • daemon: cut the session-metadata outbox and evaluation delegate shells (#1197) (9fba4af)
  • daemon: cut the webchat delegate shells (#1186) (34c9548)
  • daemon: delete the legacy shim dial-out path (#1232) (baea8ec)
  • daemon: dispatch chat commands through a per-kind handler registry (#1281) (755e645)
  • daemon: drop the k8s driver's compat re-exports (#1280) (91c6dab)
  • daemon: extract ChannelBinder from the cluster driver (#1167) (50761d3)
  • daemon: extract command execution into commands/handlers.ts (#1152) (01c2705)
  • daemon: extract CpClientDeps construction into cp/cp-client-deps.ts (#1203) (71302d4)
  • daemon: extract GitHub hook dispatch and review orchestration (#1157) (2174dba)
  • daemon: extract LaunchRegistry from the k8s driver (#1159) (ab92301)
  • daemon: extract sandbox identity constants out of the k8s driver (#1137) (7935b90)
  • daemon: extract SandboxLease from the K8s driver (#1156) (dbc1c26)
  • daemon: extract standing-context assembly into a pure module (#1125) (d26540a)
  • daemon: extract the agent-collaboration subdomain into src/collab/ (#1208) (f804284)
  • daemon: extract the duty coordinator from Daemon (#1169) (390321a)
  • daemon: extract the gap-replay decision into a pure planReplay (#1138) (70069c6)
  • daemon: extract the launch assembly into src/launch/assemble.ts (#1211) (cded536)
  • daemon: extract the memory L0 type contract into memory/types.ts (#1145) (279591c)
  • daemon: extract the observed-channels sync engine from Daemon (#1146) (aa4b401)
  • daemon: extract the permission/elicitation coordinator into src/permissions/ (#1205) (622121b)
  • daemon: extract the platform connection reconciler from Daemon (#1149) (47025e4)
  • daemon: extract the pure activation policy into @agentconnect.md/activation-policy (#931) (dc3671c)
  • daemon: extract the pure turn plan out of dispatchOne (#1237) (c3b5aff)
  • daemon: extract the runtime-session opener from SessionManager.handle() (#1166) (5ed9e50)
  • daemon: extract the select projections into commands/select-projection.ts (#1151) (e284a79)
  • daemon: extract the session-metadata outbox from the Daemon class (#1126) (d03e34d)
  • daemon: extract the thread-history backfill collaborator from handle() (#1155) (1275e27)
  • daemon: extract the webchat transport surface into src/webchat/ (#1140) (e4e8c87)
  • daemon: extract transcript ingest from SessionManager.handle() (#1179) (99260fd)
  • daemon: extract turn memory recall behind a RecallObserver (#1160) (9e74027)
  • daemon: give shim connection types a home and dedupe helpers (#1124) (5da264a)
  • daemon: give the JSON-Schema tool vocabulary a neutral home (#1284) (b223e12)
  • daemon: give the memory tools a domain home, invert memory -> mcp (#1202) (6701960)
  • daemon: invert the probe host dependency behind AcpProbeClient (#1154) (a32bf40)
  • daemon: lift the k8s plane's closure state into two classes (#1201) (3451d69)
  • daemon: make git credential pointers a function of where git runs (#858) (1c2211e), closes #857 #856
  • daemon: merge the split launch-planning layer into src/launch/ (#1144) (c99de25)
  • daemon: move claude-runtime into a neutral runtime-defs leaf (#1129) (feca957)
  • daemon: move createRemoteRuntime into k8s/remote-runtime.ts (#1139) (a643811)
  • daemon: move the Dream subdomain into src/dream/ (#1127) (65733e6)
  • daemon: move the duty drain/converge cluster into DutyCoordinator (#1174) (3ac4a44)
  • daemon: move the memory subdomain into src/memory/ (#1143) (d2edee9)
  • daemon: move three misfiled modules out of agents/ (#1141) (d46b148)
  • daemon: neutral section splitter and platform-local slack thread urls (#1231) (328cd61)
  • daemon: neutralize the send queue and the interaction-actor type (#1227) (0d6f938)
  • daemon: one rule table for store retention, plus the pool's orphan proof (#1085) (ac38648)
  • daemon: own the model-session credential lifecycle in a ModelSessionHostPool (#1282) (8f0e4d4), closes 1246/#1249
  • daemon: own the runtime facts/probe cluster in a RuntimeFactsRegistry (#1285) (779f3c2), closes #1153
  • daemon: P0 extractions — daemon.ts helpers, evaluation hooks, shim↔k8s cycle (#1120) (77c5bb3)
  • daemon: purify GitHub queue-admission and review-batch coalescing (#1161) (ce67976)
  • daemon: put an ACP spawn driver seam under AcpHost (#822) (4c20f81), closes #812
  • daemon: re-home the github hook coords, webchat chunking, and fleet upgrade (#1210) (978a529)
  • daemon: reorganize Daemon.start() into named boot phases (#1289) (5da4060)
  • daemon: reorganize dispatchOne into named turn phases (#1243) (cbbe1e8)
  • daemon: route the primary workspace through a WorkspaceRoot (#1218) (86c93c5)
  • daemon: run the orphan reconciler as a one-shot CronJob (#1079) (e9ed417), closes #1062
  • daemon: split cpConfigApply into per-frame-kind handlers (#1163) (4d04d33)
  • daemon: split mcp/ops.ts tool dispatch into a per-domain handler registry (#1230) (5df75df)
  • daemon: split memory/provider.ts into per-provider files (#1204) (25ee29d)
  • daemon: split the CP control dispatch into a per-domain handler registry (#1283) (fb63260), closes #1230
  • daemon: split the Pending bag into plan + chrome/reply/approval/signals (#1290) (4484166)
  • daemon: unify mcp tool argument validation on zod (#1235) (a7600f0)
  • daemon: unify the cold-session re-checks into a named fence (#1238) (50bbbba)
  • deploy: delete deploy/k8s (#888) (271b701)
  • dream: stage into a real memory store, not a bare output dir (#1293) (193220b)
  • drop the retired per-org operator's leftovers (#1118) (cb80508), closes #964
  • duty: retire the dutyEnforcement soak flag (#995) (f73a007), closes #982
  • give the Node services one OpenTelemetry setup (#783) (f6697a0)
  • ignore local Codex configuration (#844) (c7b0e54)
  • operator: make the AgentConnectOrg CRD a file the chart includes (#911) (56236e5)
  • operator: remove the Helm chart while it is iterated on the deployment side (#915) (218b2a4)
  • relay: fold the shared-bot arbitrate ladder onto @agentconnect.md/activation-policy (#946) (c2f3363)
  • remove the per-org operator and envelope provisioner (#964) (70758b2)
  • rename the cloud-daemon identifiers to the pool vocabulary (#1008) (4f9b2ad)
  • webchat: fold webchat activation decisions onto @agentconnect.md/activation-policy (#943) (7e7931e), closes #931 #906
  • web: collapse the session rail's Related tree to three levels (#770) (341e0b7)
  • web: key transcript turns by stable identity, not array index (#1248) (d424acb)
  • web: lift the webchat header out of the scroller as fixed chrome (#1274) (9aa80d7)
  • web: make SessionStep.turnId a guaranteed invariant (#1258) (bd82283)
  • web: rename experiment flags to feature flags (#1187) (90068fa)

Full Changelog: v1.40.0...v1.41.0