Commit Graph
749 Commits
Author SHA1 Message Date
Hyu 8fa5df6c77 feat(slack): support standard events and interactive callbacks 2026-10-11 00:17:27 +08:00
Hyu 49d2af9379 fix(monitoring): display processing errors on the assistant side 2026-10-11 00:17:02 +08:00
Hyu 4a700ac0f3 feat(slack): add guided app setup and Socket Mode support 2026-10-10 23:37:30 +08:00
Hyu 1c70218383 feat: reset bot session context while retaining monitoring history 2026-10-10 22:35:27 +08:00
Hyu 38aa06e149 feat(monitoring): add shared SSE in-flight monitor with draggable dock 2026-10-10 21:30:03 +08:00
Hyu d2ec53ec91 feat(dingtalk): support group subscriptions and card interaction events 2026-10-10 21:29:49 +08:00
Hyu 0a18440faf fix(dingtalk): improve card replies and attachment delivery 2026-10-10 20:31:56 +08:00
Dongchuan FuandRockChinQ 339dd56722 fix(web): hide duplicate connection mode control (#2621)
* fix(web): hide duplicate connection mode control

* fix(web): restore event processor guide target

---------

Co-authored-by: RockChinQ <[email protected]>
2026-10-10 18:52:52 +08:00
Hyu 4f43da0fb3 fix(wecombot): improve event routing and sandbox attachment delivery 2026-10-10 18:41:57 +08:00
Hyu a2b7f6b7bb fix: stabilize native streaming and improve bot controls 2026-10-10 18:02:42 +08:00
Hyu e8da99be63 fix(wecomcs): handle service events and prevent duplicate replies 2026-10-10 16:25:36 +08:00
Hyu 36a167cd16 fix(bots): clarify message pagination and hide single-page controls 2026-10-09 23:51:42 +08:00
Hyu 846d1f14e6 fix(bots): restore sessions across processor types 2026-10-09 23:49:35 +08:00
Hyu 6ecd0f68cf fix(bots): inline disabled routes with enable switches 2026-10-09 21:24:42 +08:00
Hyu 96280b3bcc fix(events): restrict pipeline routes and load agent prompts 2026-10-09 21:22:34 +08:00
Hyu ce3a9020af fix(web): unify load error states and retry actions 2026-10-09 21:00:27 +08:00
Hyu 396b09ecce fix(acceptance): repair official account replies and processor navigation 2026-10-09 20:13:51 +08:00
Hyu fea35e8b3f fix(acceptance): improve execution monitoring and processor navigation 2026-10-09 18:54:32 +08:00
Hyu c5c3ec0b2c feat(models): add workspace starred model and processor defaults 2026-10-09 18:34:29 +08:00
Hyu 4c70977a1d fix(acceptance): refine processor setup and dashboard monitoring 2026-10-09 18:19:08 +08:00
Hyu e22bea7f1e fix(acceptance): improve bot setup and execution log presentation 2026-10-09 17:03:15 +08:00
Hyu 113bb0b773 fix(web): refresh assistant model state and refine model actions 2026-10-09 00:46:51 +08:00
Hyu fe324fac81 fix(web): improve assistant setup and model login guidance 2026-10-09 00:29:39 +08:00
Hyu ec3a396f1d feat(web): install event processor plugins from selector 2026-10-08 21:21:15 +08:00
Hyu 6c6718d72b feat(web): persist assistant size and draggable position 2026-10-08 15:39:30 +08:00
Hyu b718c7b5dd fix(web): reduce form rerenders and stabilize assistant model labels 2026-10-08 15:21:59 +08:00
RockChinQ 3f698bd1c9 fix(assistant): preserve auto-follow during delayed scroll events 2026-10-08 13:26:27 +08:00
RockChinQ f96f663a80 feat(assistant): add streaming background sessions and refresh workspace UI 2026-10-08 13:24:46 +08:00
Hyu 40a3a941a3 fix(monitoring): unify execution records and stabilize streaming cleanup 2026-10-08 03:02:37 +08:00
Hyu 5f0ef7e48e fix(monitoring): complete translations and align frontend checks 2026-10-07 22:48:49 +08:00
Hyu 9f76037e64 feat(monitoring): unify execution views and trace tool calls 2026-10-07 22:36:10 +08:00
RockChinQ 8549369d48 fix(ci): format pipeline extensions and plugin icon hook (#2623) 2026-10-02 02:18:07 +08:00
Hyu af9011f237 fix(web): load installed plugin icons through the authenticated route
Multi-Workspace deployments fail the public plugin icon route closed (404), so plain <img src> icons broke everywhere locally and for the runner picker in production. A shared cached hook fetches the authenticated icon for installed plugins and leaves marketplace surfaces on the cloud URL.
2026-10-02 01:34:52 +08:00
RockChinQ 5f3eb34baf feat(market): show certification badges in Core marketplace (#2615) 2026-09-30 18:52:00 +08:00
Hyu 6515ba3b94 fix(api): serve the passkey and password routes for the authenticated Account
Passkeys and passwords belong to the Account, but those routes required a Workspace -- which the WebUI never sends for them -- and then resolved the caller by looking the login name up as an email address. Every Account whose login name is not its email answered 404, so the passkey panel could neither add nor list a key.

The routes now authenticate with the account token and address the Account the caller authenticated as, matching the self-service second-factor routes in the same file. /space/bind-authorize-url carried the same Workspace requirement.

The login page also surfaced a TypeError instead of the passkey login failure message when an assertion was rejected.
2026-09-28 23:53:14 +08:00
Hyu e14e277424 fix(api): scope TOTP oversight to the caller's workspace
The second-factor listing was instance-wide and the three mutating endpoints never checked that the target Account belongs to the caller's Workspace, so an owner or admin could see and reset another tenant's account. The listing now resolves the Workspace members and the mutations answer 404 for a foreign account, which does not disclose that it exists.

Also fixes the TOTP write path on Postgres: six write points passed timezone-aware datetimes into timestamp-without-time-zone columns, which asyncpg rejects, so every enroll, confirm, revoke and recovery-code consumption raised a 500 there. SQLite tolerated the same values.

The panel derives its oversight view from the API authorization instead of the length of the account list, which would have hidden it in a single-member Workspace.
2026-09-28 22:38:30 +08:00
Hyu 06ca7a93a9 feat(web): consolidate operation log settings into a collection dialog
Rename the traceability surface to "operation log", move its entry from the sidebar into the settings dialog, and collect the capture level and the retention policy in one dialog. The retention fields are shown inline instead of behind a disclosure; edits stay a draft until Save, and Reset restores the persisted policy. Copy updated across the eight locales.
2026-09-28 22:38:24 +08:00
Hyu c18db122e1 fix(web): keep the beta banner clear of the app shell
- render the banner through the Alert API so its grid keeps one full-width text column instead of wrapping inside the empty icon column

- point the cloud link at space.langbot.app/cloud?environment=dedicated and the self-hosted link at the GitHub repository

- keep the last known state and retry the probe (1/2/4/8s plus a re-check on window focus) so a restarting backend cannot hide the banner for the session

- publish --beta-banner-height so the fixed sidebar container, the sidebar wrapper and the wizard shell start below the banner
2026-09-28 19:38:09 +08:00
RockChinQ e778445982 feat: add beta environment banner
Add beta environment warning banner for Cloud beta deployments with i18n support (zh/en/ja)
2026-09-28 13:17:03 +08:00
TyperBody 7eeb0393a6 feat(operation-trace): collapsible retention policy and assistant trace tool
- Collapse the retention policy section by default, showing a one-line summary when collapsed.
- Add the owner/admin-only list_operation_logs assistant tool backed by audit.view.
- Enforce per-tool permissions on both tool listing and invocation.
- Add a substring search filter (search) to query_logs and the tool so callers can
  ask narrow questions (plugin name, account, verb) instead of dumping the full history.
- Project records to a compact shape so a page stays under the assistant result budget.
- Localize the new assistant tool label and retention summary across all locales.
2026-09-28 01:56:00 +08:00
TyperBody 9ecb469d13 feat(operation-trace): lead with the change, fix pipeline extension tracing
The panel answered "who, when, what" poorly: the actual before → after diff
was hidden behind a click, the actor was a muted line, and a whole row went to
the route while duration and hash sat in a permanent right column. The data
already arrives with the page, so the panel now reads top-down in the order an
operator actually looks:

* who and when first, then the action and resource, then the diff spelled out
  inline (long values collapse to their size so a pipeline config does not
  render as two near-identical blobs), with route / method / status / duration
  / evidence hash moved into the expanded diagnostics line;
* the whole card is the expand toggle with a rotating chevron, which removes
  the ambiguity of a small text link whose expanded state looked identical;
* records are bucketed into today / yesterday / dated groups so a long history
  reads as a timeline;
* a "changes only" toggle (reusing the level filter) answers "who changed
  something" in one click -- in the live log 489 of 499 rows are pure views,
  so this is the difference between a haystack and the ten rows that matter.

Tracing fixes found while reading the live log:

* PUT /pipelines/<uuid>/extensions was classified as a plugin config change
  because the generic ('/extensions') rule ran first; it now maps to a
  pipeline-specific action;
* that handler recorded no diff at all, so "modified extension config" could
  never say what changed. It now captures the previous bindings and reports the
  before → after.

Cache: the integrity result is now keyed by (Workspace, listing filters) so
each view reuses its own verification, and a delete invalidates all views for
the Workspace. Fourteen tests cover the projection, the verifier, the cache
lifecycle and the failure modes.
2026-09-28 01:03:02 +08:00
TyperBody a8daa99884 fix(operation-trace): repair pageOf key placement, numbered pager, right column
- pageOf was inserted under the wrong namespace (the locale files already had a
  hideDetails in toolCalls), so the UI rendered the raw key. Removed it and
  replaced the dropdown with a numbered pager (first/last always visible, a
  one-page window around the current page, gaps as an ellipsis).
- Restore the right-hand column (duration + record hash) that the previous
  declutter removed; the digest is still opt-in, but the hash stays visible.
- Hide the status code on success: a 200 is the default, so only >=400 shows.
2026-09-27 02:39:09 +08:00
TyperBody 67bc80e3bc feat(operation-trace): declutter the log list and add page navigation
The list was noisy and hard to read: a constant "verified" badge and the
"L1/L2" level badge on every row carried no information, the same "view X"
line repeated until it buried real changes, and each row rendered its full
payload diff inline.

- Drop the per-row level badge and the "verified" badge; keep only an
  exception badge, so a healthy row shows nothing extra.
- Collapse consecutive identical rows into one line with an "xN" count.
- Make the change digest opt-in per row (one expanded at a time) and show a
  "<n> changes" toggle instead of dumping the diff.
- Show the registered route under each row so "Resource / System" is no
  longer ambiguous about what actually happened.
- Replace the arrows-only pager with a page selector ("Page x / y") plus the
  arrows, for logs with hundreds of records.

Verified: tsc, eslint, prettier and check-i18n all pass.
2026-09-27 02:32:12 +08:00
TyperBody 9964f284e1 refactor(operation-trace): isolate subsystem, fix install identity, merge migrations
- Move the operation-traceability service and its HTTP routes into a standalone
  pkg/operation_trace package; the Core controller package no longer depends on it
  (routes stay auto-discovered by the controller package scan).
- Gate the hot path on one module-level boolean exposed as ap.operation_trace_active:
  while no Workspace has tracing enabled the route wrapper performs zero trace work
  and zero database round trips. The gate opens when a Workspace enables tracing and
  is primed once at startup for already-enabled Workspaces.
- Record the installed extension identity for GitHub / marketplace / local / upload
  installs (owner/repo, author/name, filename) so the trace no longer shows a
  nameless "a plugin was installed" event and the card names the extension.
- Merge migrations 0032 + 0033 into a single 0032_operation_traceability revision
  carrying the full table shape and an index set that matches the ORM.

Tests: unit 5165 passed / integration 358 passed; ruff check + format clean.
2026-09-27 00:11:57 +08:00
TyperBody 475420956c feat(operation-trace): record which resource was touched and what changed
Granularity follow-up: a record used to say only "installed an extension".

- Add resolve_resource_identity(): derive the acted-on resource from trusted route
  params or the install-style payload (plugin_author/plugin_name), so every
  resource family names its target. Unknown keys are ignored and sensitive keys
  are skipped, keeping the audit trail bounded and secret-free.
- The route wrapper applies it to every traced request; the identity only fills
  in when a handler did not publish a more precise one.
- Publish field-level before/after diffs for plugin config, skill, knowledge
  base, MCP server, pipeline, provider and model updates, reusing
  changed_fields()/build_summary() so secret-looking keys stay redacted and a
  masked round-trip never shows up as a phantom change.
2026-09-26 03:46:20 +08:00
TyperBody 6981b6643f feat(operation-trace): workspace-wide integrity counters, drill-down and resource identity
- Count hash mismatches / broken links over the whole filtered history instead
  of only the returned page, so the badges no longer reset to zero on page 2.
- Classify failing record ids during the same scan and expose them through an
  integrity=all|issues|hash_mismatch|chain_broken listing filter.
- Report scanned_count / scan_truncated so an approximate (row-capped) summary
  is never mistaken for a clean one.
- Resolve the acted-on resource identity from route params or the request body,
  giving every resource family a "which plugin/skill/knowledge base" trace.
- Render resource types and the two counters through i18n, keeping all eight
  locale files key- and line-aligned.
2026-09-26 03:23:24 +08:00
TyperBody abca2e7bff fix(operation-trace): repair export URL, drop dead action, prune unused keys
- Export download failed because the URL builder appended the path to a
  "/" base, producing a protocol-relative "//api/..." URL that the browser
  read as host "api"; the request never reached the backend. Resolve the
  base to the current origin, mirroring the other URL builders.
- Remove the orphan ``clear_prune`` action: the branch has no prune/clear
  route and no route rule maps to it, so it could never be produced. Its
  i18n key is removed too.
- Remove ``tamperedCount``, now unreferenced after the verification badge
  was split into integrity/chain counters. The operationTrace catalogue is
  now free of unproduced keys.
- Correct the settings controller docstring: only governance, operation
  logs, filters and export routes exist; there is no on-demand delete.

Verified: no producer for clear_prune, classify() can no longer emit it,
operationTrace orphan scan returns none, tsc/check-i18n/prettier/py_compile
all pass.
2026-09-26 02:43:48 +08:00
TyperBody a5ff69f024 fix(operation-trace): polish panel toolbar and record-header layout
- Group the toolbar actions into a single right-aligned cluster so
  "Download logs" and "Refresh" sit together instead of being spread apart
  by the toolbar's space-between layout.
- Align the record header's filter row with the rest of the panel: replace
  the ``ml-auto`` push (which left the filters misaligned once they wrapped
  onto a second line) with ``justify-between``.
2026-09-26 02:32:36 +08:00
TyperBody 48d92ad612 fix(operation-trace): correct capture scope, broaden coverage, polish panel
- Capture scope: treat the ``audit`` bucket (viewing the log / tracing
  settings) as a read-level observation instead of recording it from the
  mutation level. At "mutations only" the log no longer fills with GET page
  views; views are recorded only at the read level.
- Coverage: classify plugin lifecycle (install / upgrade / config / page),
  skills, knowledge bases and MCP servers, with dedicated actions and
  resource types, so those operations are traced instead of falling into the
  generic resource bucket. Route rules now support multi-fragment AND
  matching and per-verb read/write actions.
- Panel: move "Download logs" next to "Refresh" in the toolbar.
- Verification: count hash mismatches and broken links separately instead of
  collapsing both into one "tampered" signal.
- i18n: add the new action labels plus the split verification labels in all
  eight locales.
2026-09-26 02:26:48 +08:00
TyperBody 78baabde96 fix(operation-trace): speed up audit reads and align i18n locales
Performance of the operation traceability surface:

- Cache the retention / row-budget / dedupe policy per Workspace and
  invalidate it on governance change, so the hot write path no longer
  issues three metadata round trips per recorded operation.
- Resolve the governance payload with one metadata query instead of four.
- Turn the dedupe probe into an existence check (LIMIT 1) instead of a
  full COUNT over the dedupe window.
- Defer the row-budget COUNT to every N inserts; prune still enforces the
  exact budget, and the maintenance loop keeps it bounded.
- Panel: fetch only the records page when paging or filtering instead of
  re-requesting governance and the filter catalogue every time.
- Export: include the effective filters (and limit) in the artifact so a
  downloaded CSV is self-describing.

Fixes and cleanup:

- Drop the unused OperationLogPruneReport import that broke `tsc`.
- i18n: remove the 9 redundant blank lines unique to en-US and format the
  six non-compliant locale files with the project Prettier config; all
  eight locales keep identical key sets, key order and placeholders.
2026-09-26 02:11:42 +08:00