Commit Graph
698 Commits
Author SHA1 Message Date
nocobase[bot] aeeeb1eb20 chore: release 2026-10-09.2 [skip ci]
current app-template-default version: 1.0.0-beta.58
@nocobase/app-plugin-template-print-example@1.0.0-beta.4 @nocobase/app-server@2.0.0-beta.2 @nocobase/app-plugin-file@1.0.0-beta.21 @nocobase/app-plugin-mail-example@1.0.0-beta.3 @nocobase/app-plugin-mail@1.0.0-beta.9 @nocobase/app-plugin-notification-example@1.0.0-beta.6 @nocobase/app-plugin-projects@0.1.0-beta.2 @nocobase/app-plugin-scheduler@1.0.0-beta.15 @nocobase/app-plugin-cli-example@0.1.0-beta.5 @nocobase/app-plugin-template-print@0.0.2-beta.1 @nocobase/app-plugin-ai-employee@3.0.0-beta.2 @nocobase/app-plugin-agents@0.1.0-beta.2 @nocobase/app-cli@1.0.0-beta.15 @nocobase/app-plugin-file-example@1.0.0-beta.17 @nocobase/app-skills@0.1.0-beta.26 @nocobase/app-template-default@1.0.0-beta.58 @nocobase/app-template-examples@1.0.0-beta.40 @nocobase/app-template-hub@1.0.0-beta.48 @nocobase/create-plugin@0.1.0-beta.18 @nocobase/dev-config@0.1.0-beta.20 @nocobase/hub-cli@1.0.0-beta.2 @nocobase/markdown-mermaid@0.1.0-beta.1 @nocobase/agent-runner@0.1.0-beta.2 @nocobase/app-cli-client@0.1.0-beta.1 release-beta/2026-10-09.2
2026-10-09 12:32:36 +00:00
Junyi 1408643095 refactor: disable Workflow by default and unpublish its documentation (#10603)
* refactor: disable workflow in default application templates

* docs(scheduler): clarify optional workflow integration

* test(workflow): isolate CLI plugin registration

* test(examples): defer flaky waiting-task focus assertion

* test(workflow): pause capability test suites

* fix(templates): synchronize workflow test exclusions
2026-10-09 19:54:02 +08:00
Charles Wu d0d3f07e63 docs: remove development and plugins from top navigation (#10617) 2026-10-09 19:46:51 +08:00
Charles Wu 37a954b5ae docs: restructure authentication guides with practical examples (#10616) 2026-10-09 19:36:25 +08:00
YANG QIAandProject lead 0fd253898d feat(agents): answer with an online agent when no runner can take a chat (#10593)
* feat(app-plugin-agents): answer with an online agent when a runner agent cannot run

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(ci): align chat fixtures and allow cold route imports

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(app-plugin-agents): require an available model for online fallback

* fix(agents): align fallback copy and consolidate model regressions

* fix(agents): use claim eligibility throughout chat fallback

* fix(agents): suppress repeated online fallback failure notices

---------

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-09 19:24:59 +08:00
YANG QIA 41cc0b8886 fix(agents): let only a runner's owner change it (#10604)
* fix(agents): let only a runner's owner change it

* fix(agents): let managers change runners whose owner can no longer act
2026-10-09 19:24:54 +08:00
PiEgg 331d3d6fc4 fix(ci): isolate v3 docs publishing and skip unrelated docs-only checks (#10612) 2026-10-09 07:18:39 -04:00
YANG QIA 9321a2ac3d fix(agent-runner): initialize submodules while preparing a worktree and let Codex write its git directory (#10600) 2026-10-09 18:49:43 +08:00
nocobase-studio[bot]andPiEgg 487921cd54 fix(spa): refresh runtime configuration in development HTML (#10606)
Co-authored-by: PiEgg <marksz@teamsz.xyz>
2026-10-09 06:49:29 -04:00
Charles Wu 09ab9fbe06 docs: simplify capability overview and rewrite notification guide (#10605) 2026-10-09 18:47:39 +08:00
Drol d86a77c746 chore(v3): deprecate AI employee plugin in application templates (#10599)
* chore: deprecate AI employee plugin in application templates

* fix(v3): wait for enabled controls in workflow and mail flows
2026-10-09 06:29:53 -04:00
nocobase-studio[bot]andPiEgg a6758ecb55 PM-119: Complete v3 repository reference migration (#10597)
Co-authored-by: PiEgg <marksz@teamsz.xyz>
2026-10-09 04:40:25 -04:00
YANG QIAandProject lead 57c59a0c46 feat(agents): merge work per actor and keep team-only variables on team runners (#10591)
* fix(app-plugin-agents): merge work per actor and hand variables only to trusted runners

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(app-plugin-agents): deliver run variables after a final trust check, and share claim eligibility

* fix(app-plugin-agents): isolate variable access failures and restore undelivered claims

* fix(app-plugin-agents): renumber the secrets-refused migration after the runner tool slots one

* fix(app-plugin-agents): send variables with every run unless marked for team runners only

* fix(app-plugin-agents): keep new wait and variable metadata optional

* fix(app-plugin-agents): send wait reasons as codes with params and word them on the client

* test(agents): describe claim regressions by behavior and use neutral examples

* fix(agents): enforce team-only variables for jobs

* fix(agents): expose job secret refusal to custom sources

---------

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-09 16:39:38 +08:00
nocobase[bot] ecda01c41a chore: merge release 2026-10-09.1 into v3-develop [skip ci]
current app-template-default version: 1.0.0-beta.57
2026-10-09 08:35:52 +00:00
PiEgg a695d1987f chore(v3): use public npm and unify workflow naming (#10588) 2026-10-09 03:33:32 -04:00
PiEgg 563f1d704a chore(ci): prepare v3 branches in the main repository 2026-10-09 02:22:31 -04:00
Junyi 88bc9ebbfe feat(ui-library): add the approval-ui block (#586)
* feat(ui-library): add the approval-ui block

Presentational components for an approval process: progress, timeline,
route preview, parallel branches, receipts and an action bar with forms.
They take data already shaped and translated for display and depend on
no plugin. Includes a preview demo, its registry example and tests.

* docs(app-skills): list the approval-ui block in the UI Library catalog
2026-10-09 13:56:47 +08:00
Junyi b9f1157677 refactor(lifecycle): let entry hooks queue work to run after every entry hook (#585) 2026-10-09 13:49:17 +08:00
c7c14b2742 PM-76: Test registry imports in app and plugin contexts (#572)
* test(registry): cover app and plugin import resolution

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(registry): use package-local subpath imports

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

---------

Co-authored-by: 张中合 <zhonghe.zeke@gmail.com>
Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
Co-authored-by: Zeke Zhang <38434641+zhangzhonghe@users.noreply.github.com>
2026-10-09 01:19:53 -04:00
Zeke Zhang bde3b877e0 PM-75: Prepare client plugins for shadcn installation (#582) 2026-10-09 01:11:22 -04:00
YANG QIAandProject lead b8df35c1ad feat(agents): limit runner concurrency per coding tool (#575)
* feat(agents): limit runs per coding tool on a runner

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* feat(agent-runner): limit runs per coding tool with --slots

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* feat(agents): edit and show limits per coding tool on the runtimes page

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* chore: format and add the changeset for limits per coding tool

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(agents): make the fields for limits per coding tool optional in shared types

* fix(agents): align queue component with per-tool wait reason

* feat(agents): one tools table per runtime, saved with its settings

---------

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-09 11:42:00 +08:00
dc91aab7fd PM-74: Use package-local subpath imports in registry sources (#576)
* fix(registry): use package-local subpath imports

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* docs(registry): preserve package imports in plugin guidance

* fix(registry): validate installed components in packed plugins

* test(create-plugin): isolate offline dependency metadata

---------

Co-authored-by: 张中合 <zhonghe.zeke@gmail.com>
Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-08 23:17:41 -04:00
YANG QIAandProject lead 476f98882d PM-43: Send custom request headers and a per-conversation session id to model services (#568)
* feat(app-plugin-agents): send custom request headers and a per-conversation session id to model services

A model service can carry request headers of its own (a value may be secret: sealed like the API key and never answered) and name a session header, such as OpenCode Go's x-opencode-session, under which every model call of a conversation sends one stable id. Every request to a provider names the plugin first in its user agent.

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* fix(app-plugin-agents): send OpenCode's session id without a service setting

A model service no longer names a session header. A call to an OpenCode base URL (Zen or Go) carries x-opencode-session by itself, with one session id per conversation and a new one for each call outside any; the id hashes the conversation's subject and thread. The service form drops the session-header field.

* refactor(app-plugin-agents): keep only the OpenCode session header

Plain services no longer send request headers of their own: the headers and headersEncrypted columns, the service API's headers field, the form's header table and the sealing they needed are removed. A call to an OpenCode base URL (Zen or Go) carries x-opencode-session automatically, with one session id per conversation and a new one for each call outside any, and every request names the plugin first in its user agent.

---------

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-08 22:21:28 -04:00
PiEgg 1181a6acef chore(ci): remove Hub image publishing and automatic Pro follow-ups (#580) 2026-10-08 22:02:36 -04:00
chenos 71dbc34542 feat(lifecycle): add record lifecycles with ticket, expense and office flow examples (#519)
Add record lifecycle definitions, transactional transitions, durable effects, recovery, jobs integration, and React bindings. Include ticket, expense, and office flow examples in the Examples application, with concurrency and database compatibility fixes.
2026-10-08 20:55:03 -04:00
chenos e01f33c0d5 Merge pull request #579: move Mail plugins to OSS
Move Mail and Mail Example into OSS, preserve their release and migration history, and load the offline demo only in the Examples template.
2026-10-09 07:12:14 +08:00
chenos 52fb620416 Merge pull request #578: fix(db-mssql): preserve connection ownership of queued requests
Keep MSSQL request queues scoped to their physical connection and preserve FIFO execution during concurrent transactions.
2026-10-09 06:57:18 +08:00
chenos 860ef32830 refactor: move Mail plugins into OSS examples 2026-10-08 18:45:24 -04:00
chenos ac30c51786 fix(db-mssql): keep queued requests on their transaction connection 2026-10-08 18:19:26 -04:00
chenos 8a05e6658a feat(create-plugin): group generated tests by source directory and record the test layout (#551)
Group generated plugin tests by source directory, provide shared Node test configuration, and document the layout. Include TSX tests in Node projects with a regression test for test discovery.
2026-10-08 18:14:44 -04:00
YANG QIAandProject lead 10a17599f1 PM-34: fix(markdown): end bare URLs at CJK text and full-width punctuation (#566)
* fix(markdown): end bare URLs at CJK text and full-width punctuation

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

* chore(app-skills): regenerate the UI Library catalog for markdown-view

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>

---------

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-09 01:04:55 +08:00
YANG QIAandProject lead 220700e1e2 PM-54: fix(app-plugin-agents): size the usage chart's Y axis to its tick labels (#571)
The daily trend chart fixed its Y axis at 56px, which fits token counts but clips cost ticks such as US$20.00 at the chart's left edge. Let recharts measure the formatted labels instead.

Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply>
2026-10-08 22:08:20 +08:00
PiEgg bb8484b6d4 feat(client): support CDN asset URLs in application builds (#565) 2026-10-08 05:19:20 -04:00
nocobase[bot] 62a60342d3 chore: merge release 2026-10-08.1 into develop [skip ci]
current app-template-default version: 1.0.0-beta.56
2026-10-08 05:02:54 +00:00
nocobase[bot] f96fad6a32 chore: release 2026-10-08.1 [skip ci]
current app-template-default version: 1.0.0-beta.56
2026-10-08 04:33:57 +00:00
YANG QIA 32d8faadd8 fix(app-plugin-releases): match nothing without a NUL placeholder id (#562) 2026-10-08 12:32:37 +08:00
YANG QIA 6162033060 fix(tests): open popups after their triggers are wired (#561)
* fix(projects): keep an invitation's row menu open when the list renders again

The columns depended on the whole useMutation result, a new object each render, so every cell remounted.

* test: open popups the way a user does

A Base UI trigger is wired to its popup only once React runs the passive effects of the render that mounted it, so a bare fireEvent.click right after the trigger appears is dropped under load. Open popups with userEvent, fix the timing races this exposed, and cancel pending replies when the UI Library chat demo resets.

* chore: add a changeset for the new test dependency
2026-10-08 12:31:45 +08:00
YANG QIA 699315819a fix(db): drop an enum field again (#563) 2026-10-08 11:47:05 +08:00
YANG QIA ec4a25d5be fix(app-plugin-projects): match nothing for an empty id list without a NUL placeholder (#559) 2026-10-08 11:00:05 +08:00
YANG QIA 3883eec0d0 fix(app-cli): keep the application's displayName in dist/package.json (#560) 2026-10-08 10:14:31 +08:00
YANG QIA a6796d9a5f fix(db): drop only the columns a dropped relation field owns (#558)
A hasMany has no column, so dropping it issued DROP COLUMN for a column that never existed, which PostgreSQL rejects.
2026-10-08 10:01:44 +08:00
YANG QIA ee4da29923 fix(app-plugin-releases): keep row menus open when a list renders again (#557)
The DataTable calls a column's cell instead of mounting it as a component, so inline columns no longer remount every cell and close an open row menu.
2026-10-08 09:02:41 +08:00
YANG QIA ff1d976694 chore(scripts): report the CLI commands in the OpenAPI inspection (#556) 2026-10-08 07:38:29 +08:00
YANG QIA 68d4febbcc feat(plugins): add the agents, projects, knowledge and releases plugins (#554)
* Add the agents, projects, knowledge and releases plugins

Four plugins for agent-run applications, the UI Library's agents and projects items, and the generated UI Library catalog of the application Skill with its check.

* Wait on the sent attachment's link as it renders last in the chat test

* Keep the demo chat's reply timers off window, so they outlive a test's environment quietly
2026-10-08 07:10:52 +08:00
YANG QIA 9e481477a1 fix(dev-config): wait longer in component tests so they stop failing at random on CI (#555)
The React preset waits 5s instead of 1s, and the templates' theme tests wait for the popover's options.
2026-10-08 05:35:23 +08:00
YANG QIA bc1e83ffac feat(plugins): update the plugins, templates and UI Library for the new runtime (#553)
* Update the plugins, templates and UI Library for the new runtime

Device authorization, scoped API keys, service accounts, user invitations and preferences, secrets-backed credentials, the inbox and the cn package across the existing plugins, examples and the three templates, with the UI Library's auth, inbox, authorization and component items.

* Declare the UI Library site's favicon

* Use the NocoBase favicon on the UI Library site

* Fix generated-app shell tests and the Hub's user deletion test

Inline the authentication client in the templates' Vitest config so its guards share the test's react-router, and update the Hub test to the users plugin's new copy and spinner label.
2026-10-08 01:10:33 +08:00
YANG QIA 37c8d20aa6 feat(app): add the runtime, CLI client and agent runner for agent-run applications (#552)
Encrypted secrets, a command manifest derived from the API document, environment-variable manifests, sample data and on-demand Apps in the runtime, plus the new agent protocol, application CLI client, agent runner and Docker App Host packages.
2026-10-07 23:54:20 +08:00
Drol a5e19f7854 feat(examples): add an AI employee tasks example and a global AI employee entry (#550)
* fix(app-plugin-ai-employee): translate the nocobase-ai Registry item in the plugin namespace

The Registry item translated through its own locale files and a useAITranslate()
hook that picked a language by prefix and fell back to the English default, so a
key it never defined showed English in every language without anything noticing.
It now calls useTranslation('@nocobase/app-plugin-ai-employee') like the file
plugin's Registry item and the plugin's own pages, and its copy moves into the
plugin's client/locales, which the registered plugin loads.

Four keys the item used without defining them get English and Chinese text, and
a test fails when a key the Registry passes to t() is missing from either locale
file or a file translates outside the plugin namespace.

* feat(examples): add an AI employee tasks example and a global AI employee entry

@nocobase/app-plugin-ai-employee-example registers the AI employee iris and the
read-only tool example-ticket-history through AIResourceRegistrar, declares the
/ai-employee-example route with a fallback page, and publishes a tasks-page
Registry item that replaces it: support tickets whose AIEmployeeShortcut offers
an auto-sent analysis and a reply left in the composer, with the selected ticket
as work context, and a button that starts a queue triage through the global chat
controller.

The examples template installs the nocobase-ai item, wraps its signed-in layout
in a global AI employee entry (a floating trigger that opens the shared
conversation as a side panel and expands into a dialog), registers the example
plugin, installs its tasks page and links it from the homepage.

* test(templates): let the Examples layout carry its AI employee entry

The framework alignment check compares the Examples layout with Default byte for
byte, and the global AI employee entry wraps the signed-in shell. Like the
notification button in the header, it is an Examples-owned demonstration: the
check now removes exactly that wrapper, its import and its marker comment,
re-indents what it wraps, and still requires the shell itself to match Default.
2026-10-07 11:17:11 -04:00
Drol 1197085174 feat(app-plugin-ai-employee): release unused conversation checkpoints on a schedule (#549)
* feat(app-plugin-ai-employee): release unused conversation checkpoints on a schedule

A recurring job on the application's jobs service releases the agent
checkpoints of conversations nobody has used for a week, every day at
03:00 UTC by default. Releasing a conversation sets its thread to 0 and
deletes the checkpoints of every thread it has had, in one transaction per
batch, only while the conversation is still unused. A conversation whose
latest message asks for a tool call is never released.

The next run on a released conversation replays its latest stored messages
onto a fresh thread. This applies only to conversations kept in the
plugin's own tables, never to a resume or a tool decision, and never to a
thread-0 conversation that still has a checkpoint there or has no messages,
so existing runs behave as before.

The schedule is configured under ai.checkpointCleanup and validated by
config check.

* feat(app-plugin-ai-employee): default a conversation's thread to 1

A conversation starts on thread 1 when AIConversationsManager creates it,
but the aiConversations.thread column defaulted to 0, so a row inserted
without a thread looked like a conversation whose checkpoints the cleanup
had released. A new migration sets the default to 1.

Thread 0 now always means a released conversation, so the agent decides
whether to replay stored messages from the thread number alone, without
reading the checkpoint store.

* fix(app-plugin-ai-employee): read each cleanup batch's latest messages in two queries

The checkpoint cleaner looked up the latest message of every candidate
conversation with its own query. It now finds each conversation's latest
message id with one groupBy over the batch and reads those messages with one
more query.

The aggregate goes through the Repository rather than the query builder,
because it reads a bigint result back exactly on every dialect, and a
message id is a snowflake beyond the integers a JavaScript number holds.
2026-10-07 10:56:49 -04:00
chenos 6e30789a3e refactor(templates): move Playwright tests to tests/playwright/ and drop the local AI e2e test (#546)
* refactor(templates): move Playwright tests to tests/playwright/ and drop the local AI e2e test

Keep every test under tests/: Playwright's testDir is tests/playwright/,
Vitest excludes that directory, and tsconfig.node.json typechecks it. The
directory ships with the template like the rest of tests/. The optional
local AI server test is removed; test:e2e still passes with no tests.
The application Skills describe the new location, and the upgrade Skill
says how an existing application moves its e2e/ files.

* refactor(app-template-hub): exclude tests/playwright/ from Vitest like the other templates

The template alignment test requires the three templates to share one
vitest.config.ts. Hub has no Playwright, so the exclusion changes nothing
there today, and a Hub application that adds Playwright already has it.
2026-10-07 22:15:42 +08:00