Commit Graph

610 Commits

Author SHA1 Message Date
Peter Steinberger
c46cc1e2d4 refactor(channels): unify inbound replay protection (#109117)
* refactor(channels): unify inbound replay-guard orchestration on shared factory

* fix(plugin-sdk): bind replay-guard settlement to claim handles

* fix(plugin-sdk): claim-handle settlement (rest)

* fix(discord): align skipped queue cleanup

* style(feishu): simplify bot menu claim settlement

* refactor(plugin-sdk): extract replay dedupe contracts
2026-07-16 08:46:34 -07:00
Peter Steinberger
44314c9451 refactor(channels): table-drive setup and control-plane helpers (#109028)
* refactor(channels): table-drive setup credentials, config schemas, doctor detectors, status issues

* refactor(channels): control-plane tables (rest)

* fix(plugin-sdk): refresh surface budgets after rebase

* style(plugin-sdk): format credential helpers

* fix(channels): preserve generic schema refinement types

* fix(channels): preserve schema input and output inference

* fix(clickclack): forward credential patch fields

* test(plugin-sdk): use redacted credential fixtures

* fix(plugin-sdk): refresh API baseline after inference fix

* fix(channels): keep multi-account envelope optional

* fix(channels): preserve policy validation invariants

* fix(extensions): remove stale awaits from file checks

* style(qqbot): format synchronous file check

* fix(config): refresh bundled channel metadata

* fix(qqbot): reject unsupported pairing policy
2026-07-16 07:17:01 -07:00
sunlit-deng
c4e696d1ba fix(vydra): ignore blank environment API key (#108757)
* fix(vydra): ignore blank environment API key

* refactor(tts): centralize speech API key resolution

* chore(plugin-sdk): refresh speech API baseline

* chore(plugin-sdk): pin speech resolver surface

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 04:33:25 -07:00
Peter Steinberger
66604df9b6 refactor(channels): share retry helpers and remove dead state probes (#108903)
* refactor(channels): generalize channel retry runner and retry-after parsing; drop dead configured-state probes

* fix(channels): align retry and metadata contracts
2026-07-16 04:03:15 -07:00
Peter Steinberger
5c027fba14 chore(plugin-sdk): refresh merged API baseline (#108913) 2026-07-16 03:50:51 -07:00
Eden
d572c5cb2d fix(line): run post-ack webhook processing on its own admitted work root (#107734)
* fix(line): run post-ack webhook processing on its own admitted work root

LINE acks the webhook and dispatches event processing fire-and-forget on
the same async chain. The HTTP request admission that chain inherited is
released as soon as the route handler returns, and a released admission
refuses subordinate queue work - so every LINE inbound agent turn fails
with "GatewayDrainingError: Gateway is draining; new tasks are not
accepted" even though the gateway is healthy. DMs, group mentions, and
postbacks are all affected; the user-visible symptom is the bot replying
"Sorry, I encountered an error processing your message." to everything.

Add runDetachedWebhookWork to the plugin-sdk webhook-request-guards
surface (a thin wrapper over the gateway independent-root continuation,
the same shape core uses in gateway/server/hooks.ts) and route all three
LINE ack-first dispatch sites through it: the gateway monitor handler
(the live path), and the createLineNodeWebhookHandler / Express
middleware handlers (public webhook building blocks an embedder can
register under the gateway). #65375 unified these three into one ack-first
pattern; keeping the detach consistent avoids re-introducing the same
latent defect in the two that are not on the live gateway path today.

The continuation is reserved synchronously while the request is still
admitted, so the detached processing stays accepted and a real restart
drain can wait for it instead of stranding it mid-turn.

Tests pin every layer: the guards suite proves detached post-ack work is
admitted after the request admission is released (and that the inherited
chain without the helper is refused); the monitor lifecycle suite and the
webhook-node suite assert each dispatch site goes through the detached
root. Red/green verified: reverting any dispatch fails its test.

* fix(plugin-sdk): account for runDetachedWebhookWork in public surface budget

* fix(channels): track detached webhook processing

Co-authored-by: 許元豪 <146086744+edenfunf@users.noreply.github.com>

* docs: refresh generated docs map

* chore(plugin-sdk): refresh API baseline

* fix(webhooks): preserve post-ack ordering

* test(plugin-sdk): satisfy detached work lint

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:39:02 -07:00
Peter Steinberger
05c2701e3d refactor(plugin-sdk): share widget HTML validation helpers (#108807)
* refactor(plugin-sdk): add widget HTML helpers

* refactor(plugins): share widget HTML validation
2026-07-16 03:13:29 -07:00
Peter Steinberger
30ae21fca7 fix: prevent SQLite lock stalls and schema drift (#108663)
* fix: harden SQLite state storage

* build: allow strict SQLite migration SQL

* test: align SQLite and model-default assertions
2026-07-16 01:45:06 -07:00
Peter Steinberger
dde90a345a refactor(plugin-sdk): narrow wildcard barrels to explicit used exports (#108440)
* refactor(plugin-sdk): narrow wildcard barrels to explicit used exports

* refactor(tools): delete dead tool-planning module exposed by barrel narrowing

* fix(plugin-sdk): restore deprecation tag on OpenClawSchemaType alias

* test(agents): drop test for deleted runtime proxy module

* refactor(tools): trim descriptor types to cache consumers

* refactor(deadcode): harvest exports orphaned by barrel narrowing

* refactor(deadcode): harvest exports orphaned by barrel narrowing (rest)

* fix(agents): restore sdk imports and test markers via public predicate

* fix(plugin-sdk): named type re-exports in plugin-entry; trim types barrel precisely

* chore(plugin-sdk): account unmasked deprecated provider types in budgets

* fix(plugins): name star-only type rows for dts bundling

* fix(plugins): restore host-hook surface; unexport internal api compositions

* fix(plugins): named type imports for api composition; restore needed source exports

* fix(plugins): knip-visible type imports for registry surfaces

* test: adapt tests to privatized media and command internals

* fix(qa-lab): re-export snapshot conversation type

* style: format sessions sdk imports

* fix(plugins): restore smoke entry export; pin budgets to exact actuals

* fix(plugins): canonical smoke-entry import; drop orphaned root shims

* fix(plugins): allowlist manifest probe, repoint qa web import, drop dead browser barrels

* fix(plugin-sdk): pin codex auth marker and scaffold provider type

* fix(qa-lab): keep web-facing model-selection shim within boundary rules

* fix(plugin-sdk): preserve merged contracts through narrowed barrels

* chore(plugin-sdk): pin post-rebase surface budgets
2026-07-16 00:45:23 -07:00
Peter Steinberger
da59d6ade9 feat(onboarding): detect local inference providers (#108605)
* feat(onboarding): detect local inference providers

* fix(onboarding): satisfy inference choice lint

* chore(i18n): refresh onboarding locales

* chore: leave changelog to release automation

* chore(plugin-sdk): refresh API baseline

* fix(onboarding): preserve source config during local activation
2026-07-15 22:46:16 -07:00
keshavbotagent
9f5609382b fix(telegram): preserve tool progress under preambles (#108394)
* fix(telegram): keep tool rows below progress preambles
* fix(telegram): preserve text tool progress under preambles
* fix(telegram): preserve memory progress under preambles

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-16 10:48:53 +05:30
Peter Steinberger
9317aadaa2 feat(slack): add opt-in scoped presence events (#108510)
* feat(slack): add opt-in presence events

* style(slack): satisfy presence lint rules

* chore: keep release changelog centralized

* fix(slack): satisfy presence integration gates

* fix(slack): preserve eligible presence targets
2026-07-15 17:43:26 -07:00
Dallin Romney
2d9b78fff7 refactor(qa): canonicalize live scenario coverage (#108464) 2026-07-15 16:50:41 -07:00
Peter Steinberger
32a84d093f refactor(agents): split agent command orchestration (#108424)
* refactor(agents): split agent command orchestration

* test(agents): tighten cleanup ownership proof

* refactor(agents): keep command helper types private

* test(cli): track refactored secret resolution callsite

* fix(agents): preserve post-run session ownership

* fix(agents): preserve media recovery across command split
2026-07-15 13:42:05 -07:00
Peter Steinberger
d37e873420 refactor(plugins): split plugin type contracts (#108416)
* refactor(plugins): split plugin type contracts

* refactor(plugins): split provider type contracts

* refactor(plugins): extract plugin definition contract
2026-07-15 12:51:39 -07:00
Peter Steinberger
4e78d91c0f refactor(sessions): split session accessor by ownership (#108247) 2026-07-15 06:47:29 -07:00
Peter Steinberger
ddc9ec3f36 feat(discord): opt-in Discord Activities widget support (#107442)
Adds a Discord Activities integration so an agent can show a self-contained
HTML widget to Discord users, opened as a sandboxed Activity inside the client.
Off by default: routes, the discord_widget tool, and the launch handler register
only when channels.discord.activities is configured. OAuth identifies the user
and gates on the account allowlist; widget lookup is capability- or
instance-validated; token exchange is rate-limited; widget HTML runs in a
no-network sandboxed iframe.
2026-07-15 04:07:46 -07:00
Peter Steinberger
61bd901da9 docs(plugin-sdk): refresh generated API hashes (#108221) 2026-07-15 02:54:55 -07:00
Peter Steinberger
6eda184f27 refactor: simplify native session executable resolution (#108169) 2026-07-15 01:49:45 -07:00
Peter Steinberger
53cc2977ac chore(plugin-sdk): align baseline after auth refactor 2026-07-15 08:30:41 +01:00
Peter Steinberger
15cc637004 chore(plugin-sdk): refresh API baseline 2026-07-15 08:30:41 +01:00
Peter Steinberger
0754d23615 fix: group native sessions by host (#108062)
* fix(control-ui): group native sessions by host

* test: satisfy native session checks

* chore: remove release-owned changelog entry
2026-07-14 23:51:00 -07:00
Peter Steinberger
b9a837ec8d refactor(agents): split agent session responsibilities (#107948) 2026-07-14 22:25:08 -07:00
Peter Steinberger
290836cafd refactor(config): split config I/O responsibilities (#107983)
* refactor(config): split config I/O

* fix(config): align split modules with guardrails

* fix(config): remove dead write metadata helper

* style(config): format write safety imports

* fix(config): preserve comment-loss warning on split writes
2026-07-14 22:11:22 -07:00
Peter Steinberger
ed12937cbd refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases (#107906)
* refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases

* chore(plugin-sdk): refresh API baseline hash for the facade deletions

* fix(channels): drop dead AccessFacts field writes stranded by the facade deletion

* chore(plugin-sdk): refresh API baseline hash after rebase
2026-07-14 19:43:18 -07:00
Peter Steinberger
57d926b4fd fix: connect resumed native terminals reliably (#107688)
* fix: render resumed paired-node terminals

* fix(control-ui): connect native catalog terminals reliably

* chore: keep release notes in PR body

* fix(control-ui): require terminal reconnect cancellation

* fix(gateway): cancel timed-out terminal opens safely

* fix(control-ui): recover stalled terminal opens

* chore(ui): refresh i18n fallback baseline

* fix: preserve login shell path for resumed terminals

* refactor(plugin-sdk): avoid extra resolver export

* fix(gateway): normalize terminal open failures

* test(control-ui): split terminal readiness coverage

* docs: explain catalog terminal PATH restoration

* fix(control-ui): complete terminal readiness release gates

* fix(ci): remove unused shell resolver exports

* chore(plugin-sdk): refresh API baseline after rebase
2026-07-14 19:18:19 -07:00
Peter Steinberger
5579f009fb refactor(channels): converge internal group-policy drift onto the scope tree (#107865)
* refactor(channels): converge internal group-policy drift onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for scope-key exports

* fix(config): avoid shadowing the scopeKey export in the case-insensitive lookup
2026-07-14 18:30:04 -07:00
Peter Steinberger
2dfaa852e9 fix: cloud session delete works after worker destroy (#107848) 2026-07-14 16:58:12 -07:00
Peter Steinberger
0b03d17ef2 refactor(agents): split session manager internals (#107822)
* refactor(agents): split session manager internals

* refactor(agents): keep session helpers private

* fix(agents): preserve opaque SQLite session rows
2026-07-14 16:25:10 -07:00
Peter Steinberger
0571e0ecff fix(proxy): share canonical no-proxy matching 2026-07-14 11:23:32 -07:00
Alix-007
111f7cde35 fix(telegram): bound stalled diagnostic response reads (#106035)
* fix(telegram): bound stalled diagnostic response reads

* test(telegram): type timeout cancellation mock

* style(telegram): apply oxfmt to diagnostic response timeout files

* fix(telegram): share diagnostic body deadlines

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* chore: leave release notes release-owned

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 08:27:59 -07:00
Peter Steinberger
f59a0352b3 feat(discord): route online presence arrivals to agents (#107451)
* feat(discord): add online presence agent events

* fix(discord): harden presence event payloads

* fix(discord): satisfy presence lint contracts

* fix(heartbeat): run notification event wakes

* fix(discord): use wake heartbeat contract

* fix(discord): harden presence snapshot delivery

* chore: remove release-owned changelog entry

* fix(discord): remove unused presence type export

* fix(discord): keep presence config below loc limit

* fix(discord): reserve presence cooldown atomically
2026-07-14 07:22:11 -07:00
Peter Steinberger
9d79d85f46 feat(workboard): refresh Control UI from live changes (#99051)
* feat(workboard): refresh control ui from live changes

* refactor(workboard): tighten live invalidation path

* chore(workboard): preserve locale catalog state

* refactor(gateway): keep broadcaster runtime object

* refactor(plugin-sdk): own gateway event types

* test(workboard): bind reconciliation mocks

* test(release): declare recovery helpers

* fix(workboard): cancel direct loads on teardown
2026-07-14 05:17:23 -07:00
Peter Steinberger
4d50965f56 ci: refresh plugin SDK API baseline (#107436) 2026-07-14 04:56:51 -07:00
Ayaan Zaidi
7d99de8e32 refactor(mcp): split session runtime modules for the LOC ratchet
Mechanical: manager, combined facade, install path, lifecycle, config
loading, and resolver types move to focused modules; the runtime facade
re-exports its prior surface so importers are unchanged. Deletes dead
tools-barrel re-exports flagged by check-dependencies. No behavior
change.
2026-07-14 17:09:53 +05:30
Ayaan Zaidi
98a1535fa3 fix(mcp): regenerate plugin SDK baseline after rebase 2026-07-14 17:09:53 +05:30
snowzlmbot
e8ad0466ff fix: render assistant transcript headers safely (#99404)
* fix: render assistant transcript headers safely

Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>

* fix(markdown): nest crossing annotation spans

* fix(markdown): protect final transport projections

* refactor(markdown): split transcript render ownership

* test(ui): cover assistant transcript render flag

* refactor(markdown): keep transcript helpers private

* docs(changelog): note assistant transcript headers

* chore(plugin-sdk): refresh transcript annotation baseline

* fix(markdown): harden final transcript projections

* docs(changelog): defer transcript note to release

* refactor(markdown): centralize HTML tokenization

* fix(markdown): satisfy lint gates

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>
2026-07-14 02:25:37 -07:00
Peter Steinberger
b940339c32 fix: use plain agent progress labels (#107260)
* fix(channels): simplify agent progress labels

* chore: keep changelog release-owned

* chore: refresh bundled channel metadata
2026-07-14 01:00:24 -07:00
Peter Steinberger
84500db379 refactor(plugin-sdk): isolate HTML entity runtime 2026-07-14 00:16:37 -07:00
Peter Steinberger
b58a75d726 refactor(html): share entity decoding 2026-07-14 00:00:05 -07:00
Peter Steinberger
d8d2f83cc1 feat(terminal): open Codex/Claude catalog sessions in a terminal on their owning host
Catalog session rows (sidebar context menu + click), the built-in viewer
header, and a new "Open Codex/Claude sessions in" preference can launch the
native CLI (codex resume / claude --resume) in the operator terminal on the
machine that owns the session.

- Gateway-local sessions spawn through the existing terminal launch policy
  (sandbox/enabled gates preserved) with the resume command in the session cwd.
- Paired-node sessions run through a new seq-ordered node PTY relay: a
  duplex node-host command streams PTY output via node.invoke.progress and
  receives keystrokes/resize via a new node.invoke.input event, behind the
  unchanged terminal.* client protocol (TerminalSessionManager gains a backend
  abstraction; node relay reuses the streaming-invoke controller).
- Owner boundary: each plugin owns its resume command and builds argv from a
  validated thread id; the gateway routes node opens through the node command
  allowlist and plugin invoke policy (no advertisement-only trust), and nodes
  re-verify session eligibility before spawning.
- UI setting catalogOpenTarget + canOpenTerminal capability gate every entry
  point; capability requires the owning host to actually have the CLI.

Node PATH is normalized before command-availability probes, Windows .cmd/.bat
shims spawn via ComSpec, and catalog terminal opens reattach persisted tabs
before opening the new tab.
2026-07-13 22:20:50 -07:00
Peter Steinberger
25bc6df8cd refactor(speech-core): remove redundant API back-edge 2026-07-13 22:11:48 -07:00
Vincent Koc
7a279741ed fix(plugin-sdk): refresh API baseline hash (#107140) 2026-07-14 12:53:33 +08:00
Peter Steinberger
0ecbbe2382 fix(workboard): keep dispatch inside caller workspace authority (#107087)
* fix(workboard): inherit caller workspace authority

* docs(plugin-sdk): refresh API baseline

* fix(workboard): pin restricted worker authority

* fix(workboard): avoid host git for restricted dispatch

* refactor(worktrees): extract owner matching

* refactor(workboard): reuse sdk workspace helpers

* fix(workboard): narrow cleanup owner

* refactor(workboard): clarify claim value handling

* fix(workboard): inherit caller workspace authority

* test(worktrees): use managed temp directories

* chore: keep release notes in PR body

* fix(workboard): keep internal authority helpers private
2026-07-13 21:36:26 -07:00
Peter Steinberger
8d465d71b5 fix(channels): progress drafts only for long tasks, with the model's own preamble as the status headline (#106026)
* fix(channels): time-gate progress drafts and defer narration until visible

Progress drafts started immediately on the second work event, so the 5s
initial delay never filtered small fast tasks and Discord showed narrated
status for turns that finish in seconds. The gate is now purely time-based
(explicit startNow paths like approvals/patches are unchanged), and the
progress narrator no longer spends utility-model completions before the
channel draft is visible - notes buffer so the first visible narration has
full context.

Surface: src/channels/streaming.ts gate, src/auto-reply/reply/progress-narrator.ts,
Discord draft-preview wiring; test updates across discord/matrix/msteams/slack.

Refs #105872

* feat(channels): model-preamble status headline for progress drafts

In progress mode the draft's status line is now the model's own typed pre-tool
preamble whenever it is fresh (always on, no new config); utility-model
narration fills the slot only when the model has been quiet for ~20s or emits
no preamble. Preambles never start the draft early - the time gate still owns
the small-vs-big decision - and narration generation is suppressed while a
fresh preamble exists, saving utility calls. Discord and Telegram render the
headline; the opt-in streaming.progress.commentary lane and its receipt
counters are unchanged.

Refs #105872

* refactor(channels): split status-text and telegram preview helpers to honor the LOC ratchet

The LOC ratchet forbids raising baseline entries, so the headline feature's
growth is paid for with clean splits: reasoning/commentary text normalization
moves to src/channels/progress-draft-status-text.ts, Telegram progress preview
rendering to extensions/telegram/src/progress-draft-preview.ts, and small
ownership moves (formatCompactionModelRef, resolveFollowupAbortSignal, shared
CLI preamble gate, Discord preamble item-event handling) shrink the runners
back under their pins. Baseline entries lowered to exact new counts; the
compositor entry is removed (424 lines, under the 500 ceiling).

Refs #105872

* test(auto-reply): add resolveFollowupAbortSignal to the queue mock factory

The explicit ./queue.js vi.mock factory must export every binding prod touches;
the relocated resolveFollowupAbortSignal was missing and failed the whole
followup-runner suite.

Refs #105872

* fix(channels): sanitize preamble headlines and retry skipped narration

Review findings: preamble headlines now strip inline delivery directives and
reject silent-control tokens (NO_REPLY) before rendering, sharing the
commentary sanitizer; rejected input keeps the previous valid headline. The
narrator schedules cancellation-aware retries when a run is skipped for draft
invisibility or preamble freshness, so single long tool calls still narrate
and the ~20s utility filler fires without needing another event. Silent
preambles no longer stamp freshness or add narration notes.

Refs #105872

* fix(channels): bound narrator visibility polling and gate Telegram headline mode on accepted preambles

Visibility retries stop after 30 one-second attempts (turn completion has no
narrator disposal signal) and re-arm on new activity; Telegram derives its
headline-rendering state from the compositor's sanitized headline instead of
raw payload text, so directive-only or NO_REPLY preambles keep structured
tool-line rendering. Docs scope the preamble headline to Discord and Telegram.

Refs #105872

* fix(telegram): read headline state from the compositor at render time

The progressHeadlineActive mirror flag was set after pushPreambleHeadline had
already rendered, so the first valid preamble arriving after the draft opened
rendered through the structured-line path and the headline never appeared
until the next event. The renderer and formatLine now read the compositor's
sanitized hasStatusHeadline directly and the mirror flag is deleted; adds an
ordering regression test. LOC baseline lowered to the exact new count.

Refs #105872

* fix(channels): let the opt-in commentary lane own preambles and scope narration docs to Discord

With streaming.progress.commentary enabled, the status headline would replace
the documented interleaved 💬 lines for any turn with a preamble (the exact
event the lane consumes). The compositor headline now declines when the
commentary lane is enabled, preserving that lane's shipped shape, and docs
state the utility-model filler is Discord-only today (Telegram's headline is
preamble-only; it has no narrator wiring).

Refs #105872

* fix(msteams): cancel the pending progress gate at finalize

With the purely time-based gate, every fast Teams progress turn leaves a
pending 5s start timer; the SDK resets its stream id on close, so a late
timer fired renderInformativeUpdate against the closed stream and posted a
stale working card below the final answer. finalize() now cancels the gate
and the informative renderer refuses to run once final text is queued.

Refs #105872

* docs(channels): record the headline-vs-commentary ownership decision inline

Refs #105872

* style: oxfmt the late review-fix rounds

Four files from the final review-fix commits were never oxfmt-formatted and
failed the shared CI formatting step; baseline lowered for the one-line
telegram shrink.

Refs #105872

* fix(channels): harden progress draft lifecycle

* fix(channels): refresh repeated preamble items

* fix(plugin-sdk): expose progress lifecycle options

* style(auto-reply): simplify narrator reset

* docs(channels): refresh progress draft docs map

* fix(auto-reply): clear queued narrator request context

* fix(discord): cancel delayed progress gate at final

* docs: refresh plugin sdk api baseline
2026-07-13 20:55:44 -07:00
Peter Steinberger
b9c4815403 refactor(config): add canonical group-policy scope-tree resolver and migrate the first six channels (#106846)
* feat(config): add canonical group-policy scope-tree resolver

* chore(plugin-sdk): refresh API baseline hash for scope-tree exports

* refactor(channels): migrate googlechat, imessage, and whatsapp group policy onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for groups scope-tree builder

* refactor(channels): migrate line, qqbot, and mattermost group policy onto the scope tree

* chore(plugin-sdk): refresh API baseline hash for case-insensitive scope key helper

* chore(plugin-sdk): refresh API baseline hash after rebase onto current main

* chore(plugin-sdk): refresh API baseline hash after rebase

* chore(plugin-sdk): refresh API baseline hash after rebase

* chore(plugin-sdk): refresh API baseline hash after rebase
2026-07-13 18:24:52 -07:00
Peter Steinberger
b206c50f34 refactor(channels): consolidate the flat streaming fallback into the deprecation module (#106939)
* refactor(channels): consolidate the flat streaming fallback into the deprecation module

* chore(plugin-sdk): refresh API baseline hash for compat module move

* chore: re-attach CI to the rescoped head

* chore(plugin-sdk): refresh API baseline hash after rebase

* chore(plugin-sdk): refresh API baseline hash after rebase
2026-07-13 18:20:07 -07:00
Vincent Koc
c1664a329d fix(ci): refresh agent session API baseline (#106944) 2026-07-14 08:53:36 +08:00
Vincent Koc
8963a89432 fix(ci): restore prompt context dependency checks (#106934)
* fix(ci): privatize prompt context result types

* fix(ci): refresh plugin SDK API baseline
2026-07-14 08:34:14 +08:00
Peter Steinberger
f693ac1b65 refactor(config): share canonical deep merge 2026-07-13 17:06:26 -07:00