Search: node settings are indexed, with credentials masked on the server

/search gains a `setting` category, `<node>.<setting>` under its flow with the
node type and the value in a new `detail` field, so Ctrl-K finds which node
uses a broker or a timeout and opens the node. `setting_text` is the one place
that decides what may be said: a reference to a stored secret shows its name
(to superusers only, as the secrets list does), a plain value in an `x-secret`
field or under a key like password, token or api_key is masked and never
indexed, nested credentials in headers or query are masked, long values are
clipped. The global search ranks what contains the query as typed ahead of
loose spellings before it caps a group, which long setting values would
otherwise have crowded out.
This commit is contained in:
2026-10-28 11:07:27 +01:00
parent 2e0ba32124
commit 29f4d93c2a
7 changed files with 274 additions and 20 deletions
+6 -1
View File
@@ -4112,7 +4112,7 @@ export const SearchEntrySchema = {
properties: {
category: {
type: 'string',
enum: ['flow', 'node', 'input', 'output', 'dashboard', 'widget', 'device', 'secret', 'module', 'worker', 'alert'],
enum: ['flow', 'node', 'input', 'output', 'setting', 'dashboard', 'widget', 'device', 'secret', 'module', 'worker', 'alert'],
title: 'Category'
},
name: {
@@ -4133,6 +4133,11 @@ export const SearchEntrySchema = {
type: 'string',
title: 'Kind',
default: ''
},
detail: {
type: 'string',
title: 'Detail',
default: ''
}
},
type: 'object',
+3 -2
View File
@@ -1350,14 +1350,15 @@ export type RunRequest = {
* called, which is all the matching needs.
*/
export type SearchEntry = {
category: 'flow' | 'node' | 'input' | 'output' | 'dashboard' | 'widget' | 'device' | 'secret' | 'module' | 'worker' | 'alert';
category: 'flow' | 'node' | 'input' | 'output' | 'setting' | 'dashboard' | 'widget' | 'device' | 'secret' | 'module' | 'worker' | 'alert';
name: string;
title?: string;
parent?: string;
kind?: string;
detail?: string;
};
export type category = 'flow' | 'node' | 'input' | 'output' | 'dashboard' | 'widget' | 'device' | 'secret' | 'module' | 'worker' | 'alert';
export type category = 'flow' | 'node' | 'input' | 'output' | 'setting' | 'dashboard' | 'widget' | 'device' | 'secret' | 'module' | 'worker' | 'alert';
export type SecretNames = {
data: Array<(string)>;