Skip to content

Commit 5e4fd7f

Browse files
committed
fixup! [Sig Events] Add significant events management skill and tools
1 parent 8b47bb4 commit 5e4fd7f

8 files changed

Lines changed: 166 additions & 114 deletions

File tree

x-pack/platform/packages/shared/kbn-streams-schema/src/sig_events/events/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const sigEventSchema = z.object({
2626
created_at: z.iso.datetime(),
2727
event_id: z.string(),
2828
discovery_id: z.string().optional(),
29-
discovery_slug: z.string().optional(),
29+
discovery_slug: z.string(),
3030
previous_event_id: z.string().optional(),
3131
verdict: sigEventVerdictSchema,
3232
verdict_id: z.string().optional(),
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Manage significant events for Streams.
1+
Search, create, and update significant events for Streams, with guidance to avoid duplicates and keep event lifecycle state accurate.

x-pack/platform/plugins/shared/streams/server/agent_builder/tools/event_create/handler.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ describe('createEventToolHandler', () => {
2929
});
3030

3131
expect(eventClient.bulkCreate).toHaveBeenCalledTimes(1);
32+
expect(eventClient.bulkCreate).toHaveBeenCalledWith([
33+
expect.objectContaining({
34+
discovery_slug: expect.stringMatching(/^agent-event-[a-f0-9]{8}$/),
35+
}),
36+
]);
3237
expect(result.acknowledged).toBe(true);
3338
expect(result.event_id).toBeTruthy();
3439
});

x-pack/platform/plugins/shared/streams/server/agent_builder/tools/event_create/handler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export async function createEventToolHandler({
3636
'@timestamp': now,
3737
created_at: now,
3838
event_id: eventId,
39+
discovery_slug: `agent-event-${eventId.slice(0, 8)}`,
3940
verdict: eventInput.verdict ?? 'promoted',
4041
stream_names: eventInput.stream_names,
4142
title: eventInput.title,

x-pack/platform/plugins/shared/streams/server/agent_builder/tools/event_create/tool.ts

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,27 @@
77

88
import { platformStreamsSigEventsTools, ToolType } from '@kbn/agent-builder-common';
99
import { ToolResultType } from '@kbn/agent-builder-common/tools/tool_result';
10-
import type {
11-
BuiltinToolDefinition,
12-
StaticToolRegistration,
13-
ToolAvailabilityResult,
14-
} from '@kbn/agent-builder-server';
10+
import type { BuiltinToolDefinition, StaticToolRegistration } from '@kbn/agent-builder-server';
1511
import type { Logger } from '@kbn/core/server';
12+
import { i18n } from '@kbn/i18n';
1613
import { sigEventImpactSchema, sigEventVerdictSchema } from '@kbn/streams-schema';
1714
import { z } from '@kbn/zod/v4';
1815
import dedent from 'dedent';
1916
import type { EbtTelemetryClient } from '../../../lib/telemetry/ebt';
2017
import type { GetScopedClients } from '../../../routes/types';
2118
import { assertSignificantEventsAccess } from '../../../routes/utils/assert_significant_events_access';
2219
import type { StreamsServer } from '../../../types';
20+
import { createSigEventsAvailability } from '../sig_events_availability';
2321
import { createEventToolHandler } from './handler';
2422

2523
export const STREAMS_CREATE_EVENT_TOOL_ID = platformStreamsSigEventsTools.createEvent;
2624

2725
const createEventSchema = z.object({
28-
verdict: sigEventVerdictSchema.optional().describe('Verdict for the new event.'),
26+
verdict: sigEventVerdictSchema.optional().describe(
27+
i18n.translate('xpack.streams.agentBuilder.tools.eventCreate.schema.verdict', {
28+
defaultMessage: 'Verdict for the new event.',
29+
})
30+
),
2931
title: z.string(),
3032
summary: z.string(),
3133
root_cause: z.string(),
@@ -52,47 +54,43 @@ export function createEventTool({
5254
id: STREAMS_CREATE_EVENT_TOOL_ID,
5355
type: ToolType.builtin,
5456
description: dedent`
55-
Create a significant event for one or more streams.
57+
${i18n.translate('xpack.streams.agentBuilder.tools.eventCreate.description', {
58+
defaultMessage: 'Create a significant event for one or more streams.',
59+
})}
5660
`,
5761
schema: createEventSchema,
5862
tags: ['streams', 'significant_events'],
5963
confirmation: {
6064
askUser: 'always',
6165
getConfirmation: async ({ toolParams }) => ({
62-
title: 'Create Significant Event',
63-
message: `Create significant event "${
64-
toolParams.title
65-
}" for stream(s): ${toolParams.stream_names.join(', ')}?`,
66-
confirm_text: 'Create',
67-
cancel_text: 'Cancel',
68-
}),
69-
},
70-
availability: {
71-
cacheMode: 'space',
72-
handler: async ({ uiSettings }): Promise<ToolAvailabilityResult> => {
73-
try {
74-
await assertSignificantEventsAccess({
75-
server,
76-
licensing: server.licensing,
77-
uiSettingsClient: uiSettings,
78-
});
79-
return { status: 'available' };
80-
} catch (error) {
81-
if (error instanceof Error) {
82-
logger.debug(error.stack ?? error.message);
83-
} else {
84-
logger.debug(String(error));
66+
title: i18n.translate('xpack.streams.agentBuilder.tools.eventCreate.confirmation.title', {
67+
defaultMessage: 'Create Significant Event',
68+
}),
69+
message: i18n.translate(
70+
'xpack.streams.agentBuilder.tools.eventCreate.confirmation.message',
71+
{
72+
defaultMessage: 'Create significant event "{title}"?',
73+
values: {
74+
title: toolParams.title,
75+
streams: toolParams.stream_names.join(', '),
76+
},
8577
}
86-
return {
87-
status: 'unavailable',
88-
reason:
89-
error instanceof Error
90-
? error.message
91-
: 'Significant events access is not available in the current context',
92-
};
93-
}
94-
},
78+
),
79+
confirm_text: i18n.translate(
80+
'xpack.streams.agentBuilder.tools.eventCreate.confirmation.confirm',
81+
{
82+
defaultMessage: 'Create',
83+
}
84+
),
85+
cancel_text: i18n.translate(
86+
'xpack.streams.agentBuilder.tools.eventCreate.confirmation.cancel',
87+
{
88+
defaultMessage: 'Cancel',
89+
}
90+
),
91+
}),
9592
},
93+
availability: createSigEventsAvailability({ server, logger }),
9694
handler: async (toolParams, context) => {
9795
const { request } = context;
9896
try {
@@ -122,7 +120,15 @@ export function createEventTool({
122120
results: [
123121
{
124122
type: ToolResultType.error,
125-
data: { message: `Failed to create significant event: ${message}` },
123+
data: {
124+
message: i18n.translate(
125+
'xpack.streams.agentBuilder.tools.eventCreate.errorMessage',
126+
{
127+
defaultMessage: 'Failed to create significant event: {message}',
128+
values: { message },
129+
}
130+
),
131+
},
126132
},
127133
],
128134
};

x-pack/platform/plugins/shared/streams/server/agent_builder/tools/event_search/tool.ts

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,44 @@
77

88
import { platformStreamsSigEventsTools, ToolType } from '@kbn/agent-builder-common';
99
import { ToolResultType } from '@kbn/agent-builder-common/tools/tool_result';
10-
import type {
11-
BuiltinToolDefinition,
12-
StaticToolRegistration,
13-
ToolAvailabilityResult,
14-
} from '@kbn/agent-builder-server';
10+
import type { BuiltinToolDefinition, StaticToolRegistration } from '@kbn/agent-builder-server';
1511
import type { Logger } from '@kbn/core/server';
12+
import { i18n } from '@kbn/i18n';
1613
import { z } from '@kbn/zod/v4';
1714
import dedent from 'dedent';
1815
import type { GetScopedClients } from '../../../routes/types';
1916
import { assertSignificantEventsAccess } from '../../../routes/utils/assert_significant_events_access';
2017
import type { StreamsServer } from '../../../types';
18+
import { createSigEventsAvailability } from '../sig_events_availability';
2119
import { searchEventsToolHandler } from './handler';
2220

2321
export const STREAMS_SEARCH_EVENTS_TOOL_ID = platformStreamsSigEventsTools.searchEvent;
2422

2523
const searchEventsSchema = z.object({
26-
query: z.string().optional().describe('Optional text search in event title.'),
27-
stream_name: z.string().optional().describe('Optional stream name to scope the search.'),
28-
verdict: z.array(z.string()).optional().describe('Optional event verdict filters.'),
24+
query: z
25+
.string()
26+
.optional()
27+
.describe(
28+
i18n.translate('xpack.streams.agentBuilder.tools.eventSearch.schema.query', {
29+
defaultMessage: 'Optional text search in event title.',
30+
})
31+
),
32+
stream_name: z
33+
.string()
34+
.optional()
35+
.describe(
36+
i18n.translate('xpack.streams.agentBuilder.tools.eventSearch.schema.streamName', {
37+
defaultMessage: 'Optional stream name to scope the search.',
38+
})
39+
),
40+
verdict: z
41+
.array(z.string())
42+
.optional()
43+
.describe(
44+
i18n.translate('xpack.streams.agentBuilder.tools.eventSearch.schema.verdict', {
45+
defaultMessage: 'Optional event verdict filters.',
46+
})
47+
),
2948
page: z.number().int().min(1).optional().default(1),
3049
per_page: z.number().int().min(1).max(100).optional().default(20),
3150
});
@@ -43,38 +62,18 @@ export function createSearchEventsTool({
4362
id: STREAMS_SEARCH_EVENTS_TOOL_ID,
4463
type: ToolType.builtin,
4564
description: dedent`
46-
Search significant events across all streams or a specific stream.
65+
${i18n.translate('xpack.streams.agentBuilder.tools.eventSearch.description.line1', {
66+
defaultMessage: 'Search significant events across all streams or a specific stream.',
67+
})}
4768
48-
Use this before creating or updating events to understand current event state.
69+
${i18n.translate('xpack.streams.agentBuilder.tools.eventSearch.description.line2', {
70+
defaultMessage:
71+
'Use this before creating or updating events to understand current event state.',
72+
})}
4973
`,
5074
schema: searchEventsSchema,
5175
tags: ['streams', 'significant_events'],
52-
availability: {
53-
cacheMode: 'space',
54-
handler: async ({ uiSettings }): Promise<ToolAvailabilityResult> => {
55-
try {
56-
await assertSignificantEventsAccess({
57-
server,
58-
licensing: server.licensing,
59-
uiSettingsClient: uiSettings,
60-
});
61-
return { status: 'available' };
62-
} catch (error) {
63-
if (error instanceof Error) {
64-
logger.debug(error.stack ?? error.message);
65-
} else {
66-
logger.debug(String(error));
67-
}
68-
return {
69-
status: 'unavailable',
70-
reason:
71-
error instanceof Error
72-
? error.message
73-
: 'Significant events access is not available in the current context',
74-
};
75-
}
76-
},
77-
},
76+
availability: createSigEventsAvailability({ server, logger }),
7877
handler: async (toolParams, context) => {
7978
const { request } = context;
8079

@@ -103,7 +102,13 @@ export function createSearchEventsTool({
103102
{
104103
type: ToolResultType.error,
105104
data: {
106-
message: `Failed to search significant events: ${message}`,
105+
message: i18n.translate(
106+
'xpack.streams.agentBuilder.tools.eventSearch.errorMessage',
107+
{
108+
defaultMessage: 'Failed to search significant events: {message}',
109+
values: { message },
110+
}
111+
),
107112
},
108113
},
109114
],

x-pack/platform/plugins/shared/streams/server/agent_builder/tools/event_verdict_update/tool.ts

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,32 @@
77

88
import { platformStreamsSigEventsTools, ToolType } from '@kbn/agent-builder-common';
99
import { ToolResultType } from '@kbn/agent-builder-common/tools/tool_result';
10-
import type {
11-
BuiltinToolDefinition,
12-
StaticToolRegistration,
13-
ToolAvailabilityResult,
14-
} from '@kbn/agent-builder-server';
10+
import type { BuiltinToolDefinition, StaticToolRegistration } from '@kbn/agent-builder-server';
1511
import type { Logger } from '@kbn/core/server';
12+
import { i18n } from '@kbn/i18n';
1613
import { z } from '@kbn/zod/v4';
1714
import dedent from 'dedent';
1815
import type { EbtTelemetryClient } from '../../../lib/telemetry/ebt';
1916
import type { GetScopedClients } from '../../../routes/types';
2017
import { assertSignificantEventsAccess } from '../../../routes/utils/assert_significant_events_access';
2118
import type { StreamsServer } from '../../../types';
19+
import { createSigEventsAvailability } from '../sig_events_availability';
2220
import { updateEventVerdictToolHandler } from './handler';
2321

2422
export const STREAMS_EVENT_VERDICT_UPDATE_TOOL_ID =
2523
platformStreamsSigEventsTools.updateEventVerdict;
2624

2725
const eventVerdictUpdateSchema = z.object({
28-
event_id: z.string().describe('Identifier of the significant event to update.'),
29-
verdict: z.enum(['promoted', 'acknowledged', 'demoted']).describe('Target verdict value to set.'),
26+
event_id: z.string().describe(
27+
i18n.translate('xpack.streams.agentBuilder.tools.eventVerdictUpdate.schema.eventId', {
28+
defaultMessage: 'Identifier of the significant event to update.',
29+
})
30+
),
31+
verdict: z.enum(['promoted', 'acknowledged', 'demoted']).describe(
32+
i18n.translate('xpack.streams.agentBuilder.tools.eventVerdictUpdate.schema.verdict', {
33+
defaultMessage: 'Target verdict value to set.',
34+
})
35+
),
3036
});
3137

3238
export function createEventVerdictUpdateTool({
@@ -44,36 +50,13 @@ export function createEventVerdictUpdateTool({
4450
id: STREAMS_EVENT_VERDICT_UPDATE_TOOL_ID,
4551
type: ToolType.builtin,
4652
description: dedent`
47-
Update the verdict of an existing significant event.
53+
${i18n.translate('xpack.streams.agentBuilder.tools.eventVerdictUpdate.description', {
54+
defaultMessage: 'Update the verdict of an existing significant event.',
55+
})}
4856
`,
4957
schema: eventVerdictUpdateSchema,
5058
tags: ['streams', 'significant_events'],
51-
availability: {
52-
cacheMode: 'space',
53-
handler: async ({ uiSettings }): Promise<ToolAvailabilityResult> => {
54-
try {
55-
await assertSignificantEventsAccess({
56-
server,
57-
licensing: server.licensing,
58-
uiSettingsClient: uiSettings,
59-
});
60-
return { status: 'available' };
61-
} catch (error) {
62-
if (error instanceof Error) {
63-
logger.debug(error.stack ?? error.message);
64-
} else {
65-
logger.debug(String(error));
66-
}
67-
return {
68-
status: 'unavailable',
69-
reason:
70-
error instanceof Error
71-
? error.message
72-
: 'Significant events access is not available in the current context',
73-
};
74-
}
75-
},
76-
},
59+
availability: createSigEventsAvailability({ server, logger }),
7760
handler: async (toolParams, context) => {
7861
const { request } = context;
7962
try {
@@ -106,7 +89,15 @@ export function createEventVerdictUpdateTool({
10689
results: [
10790
{
10891
type: ToolResultType.error,
109-
data: { message: `Failed to update significant event verdict: ${message}` },
92+
data: {
93+
message: i18n.translate(
94+
'xpack.streams.agentBuilder.tools.eventVerdictUpdate.errorMessage',
95+
{
96+
defaultMessage: 'Failed to update significant event verdict: {message}',
97+
values: { message },
98+
}
99+
),
100+
},
110101
},
111102
],
112103
};

0 commit comments

Comments
 (0)