@roj-ai/sdk 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/agent-status/agent-status.test.d.ts +2 -0
- package/dist/plugins/agent-status/agent-status.test.d.ts.map +1 -0
- package/dist/plugins/agent-status/agent-status.test.js +136 -0
- package/dist/plugins/agent-status/agent-status.test.js.map +1 -0
- package/dist/plugins/agent-status/plugin.d.ts +27 -0
- package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
- package/dist/plugins/agent-status/plugin.js +46 -0
- package/dist/plugins/agent-status/plugin.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +2 -1
- package/src/plugins/agent-status/agent-status.test.ts +164 -0
- package/src/plugins/agent-status/plugin.ts +49 -0
package/dist/index.d.ts
CHANGED
|
@@ -60,7 +60,8 @@ export { ChatMessageId } from './plugins/user-chat/schema.js';
|
|
|
60
60
|
export type { AskUserInputType, AskUserInputTypeSchema, AskUserOption } from './plugins/user-chat/schema.js';
|
|
61
61
|
export type { BuiltinEvent } from './builtin-events.js';
|
|
62
62
|
export type { AgentChatMessage, AskUserChatMessage, ChatMessage, UserChatMessage } from './plugins/user-chat/index.js';
|
|
63
|
-
export { agentStatusPlugin } from './plugins/agent-status/plugin.js';
|
|
63
|
+
export { agentStatusPlugin, agentStoppedNotificationSchema } from './plugins/agent-status/plugin.js';
|
|
64
|
+
export type { AgentStoppedNotification } from './plugins/agent-status/plugin.js';
|
|
64
65
|
export { agentsPlugin } from './plugins/agents/plugin.js';
|
|
65
66
|
export type { AgentsPluginConfig } from './plugins/agents/plugin.js';
|
|
66
67
|
export { contextCompactPlugin } from './plugins/context-compact/plugin.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -40,7 +40,7 @@ export { getAgentMailbox, selectMailboxState } from './plugins/mailbox/query.js'
|
|
|
40
40
|
export { MessageId } from './plugins/mailbox/schema.js';
|
|
41
41
|
export { ChatMessageId } from './plugins/user-chat/schema.js';
|
|
42
42
|
// Plugins
|
|
43
|
-
export { agentStatusPlugin } from './plugins/agent-status/plugin.js';
|
|
43
|
+
export { agentStatusPlugin, agentStoppedNotificationSchema } from './plugins/agent-status/plugin.js';
|
|
44
44
|
export { agentsPlugin } from './plugins/agents/plugin.js';
|
|
45
45
|
export { contextCompactPlugin } from './plugins/context-compact/plugin.js';
|
|
46
46
|
export { limitsGuardPlugin, selectAgentCounters, sumSessionSpend } from './plugins/limits-guard/plugin.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAGxD,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAGpE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1F,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAIjE,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAGjG,UAAU;AACV,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,8CAA8C;AAC9C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGtG,2FAA2F;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAIpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAEtI,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAItF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAO7D,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-status.test.d.ts","sourceRoot":"","sources":["../../../src/plugins/agent-status/agent-status.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { AgentId } from '../../core/agents/schema.js';
|
|
3
|
+
import { MockLLMProvider } from '../../core/llm/mock.js';
|
|
4
|
+
import { ToolCallId } from '../../core/tools/schema.js';
|
|
5
|
+
import { limitsGuardPlugin } from '../../plugins/limits-guard/plugin.js';
|
|
6
|
+
import { createMultiAgentPreset, createTestPreset, TestHarness } from '../../testing/index.js';
|
|
7
|
+
import { agentStatusPlugin } from './plugin.js';
|
|
8
|
+
const agentStatusNotifications = (session) => session.getNotifications()
|
|
9
|
+
.filter((n) => n.pluginName === 'agent-status' && n.type === 'agentStatus')
|
|
10
|
+
.map((n) => n.payload);
|
|
11
|
+
const agentStoppedNotifications = (session) => session.getNotifications()
|
|
12
|
+
.filter((n) => n.pluginName === 'agent-status' && n.type === 'agentStopped')
|
|
13
|
+
.map((n) => n.payload);
|
|
14
|
+
async function waitForAgentStatus(session, agentId, status, timeoutMs = 5000) {
|
|
15
|
+
const deadline = Date.now() + timeoutMs;
|
|
16
|
+
while (Date.now() < deadline) {
|
|
17
|
+
const agentState = session.state.agents.get(agentId);
|
|
18
|
+
if (agentState?.status === status)
|
|
19
|
+
return;
|
|
20
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`waitForAgentStatus timed out after ${timeoutMs}ms (wanted ${status}) for agent ${agentId}`);
|
|
23
|
+
}
|
|
24
|
+
describe('agent-status plugin', () => {
|
|
25
|
+
describe('agentStatus (existing behavior)', () => {
|
|
26
|
+
it('emits thinking on start and idle on completion', async () => {
|
|
27
|
+
const harness = new TestHarness({
|
|
28
|
+
presets: [createTestPreset()],
|
|
29
|
+
systemPlugins: [agentStatusPlugin],
|
|
30
|
+
llmProvider: MockLLMProvider.withFixedResponse({ content: 'Done', toolCalls: [] }),
|
|
31
|
+
});
|
|
32
|
+
const session = await harness.createSession('test');
|
|
33
|
+
const entryAgentId = session.getEntryAgentId();
|
|
34
|
+
await session.sendAndWaitForIdle('Hello');
|
|
35
|
+
const statuses = agentStatusNotifications(session).map((p) => p.status);
|
|
36
|
+
expect(statuses).toContain('thinking');
|
|
37
|
+
expect(statuses).toContain('idle');
|
|
38
|
+
// No abnormal-terminal notification for a normal completion.
|
|
39
|
+
expect(agentStoppedNotifications(session)).toHaveLength(0);
|
|
40
|
+
await harness.shutdown();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('agentStopped on pause', () => {
|
|
44
|
+
it('manual pause → agentStopped kind:paused reason:manual with message', async () => {
|
|
45
|
+
let orchestratorCalls = 0;
|
|
46
|
+
const harness = new TestHarness({
|
|
47
|
+
presets: [createMultiAgentPreset([{ name: 'worker', system: 'Worker agent.', tools: [], agents: [] }], { orchestratorSystem: 'Orchestrator agent.' })],
|
|
48
|
+
systemPlugins: [agentStatusPlugin],
|
|
49
|
+
mockHandler: (request) => {
|
|
50
|
+
if (request.systemPrompt.includes('Orchestrator')) {
|
|
51
|
+
orchestratorCalls++;
|
|
52
|
+
if (orchestratorCalls === 1) {
|
|
53
|
+
return {
|
|
54
|
+
content: null,
|
|
55
|
+
toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
|
|
56
|
+
finishReason: 'stop',
|
|
57
|
+
metrics: MockLLMProvider.defaultMetrics(),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
|
|
61
|
+
}
|
|
62
|
+
return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const session = await harness.createSession('test');
|
|
66
|
+
await session.sendAndWaitForIdle('Start');
|
|
67
|
+
// Manual pause via Session.pauseAgent — the real manual-pause API that
|
|
68
|
+
// runs onPause hooks (agents.pause only emits the event, no hooks).
|
|
69
|
+
const innerSession = session.session;
|
|
70
|
+
const result = await innerSession.pauseAgent(AgentId('worker_1'), 'Pausing for review');
|
|
71
|
+
expect(result.ok).toBe(true);
|
|
72
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === 'worker_1');
|
|
73
|
+
expect(stopped).toHaveLength(1);
|
|
74
|
+
expect(stopped[0].kind).toBe('paused');
|
|
75
|
+
expect(stopped[0].reason).toBe('manual');
|
|
76
|
+
expect(stopped[0].message).toBe('Pausing for review');
|
|
77
|
+
expect(stopped[0].definitionName).toBe('worker');
|
|
78
|
+
expect(typeof stopped[0].timestamp).toBe('number');
|
|
79
|
+
// idle agentStatus still emitted alongside.
|
|
80
|
+
expect(agentStatusNotifications(session).some((p) => p.agentId === 'worker_1' && p.status === 'idle')).toBe(true);
|
|
81
|
+
await harness.shutdown();
|
|
82
|
+
});
|
|
83
|
+
it('limits-guard hard limit → agentStopped kind:paused with reason and message', async () => {
|
|
84
|
+
let inferenceCount = 0;
|
|
85
|
+
const harness = new TestHarness({
|
|
86
|
+
presets: [createTestPreset({
|
|
87
|
+
orchestratorSystem: 'Test agent.',
|
|
88
|
+
orchestratorPlugins: [limitsGuardPlugin.configureAgent({ limits: { maxTurns: 2 } })],
|
|
89
|
+
})],
|
|
90
|
+
systemPlugins: [agentStatusPlugin, limitsGuardPlugin],
|
|
91
|
+
mockHandler: () => {
|
|
92
|
+
inferenceCount++;
|
|
93
|
+
return {
|
|
94
|
+
content: null,
|
|
95
|
+
toolCalls: [{ id: ToolCallId(`tc${inferenceCount}`), name: 'tell_user', input: { message: `Turn ${inferenceCount}` } }],
|
|
96
|
+
finishReason: 'stop',
|
|
97
|
+
metrics: MockLLMProvider.defaultMetrics(),
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
const session = await harness.createSession('test');
|
|
102
|
+
const entryAgentId = session.getEntryAgentId();
|
|
103
|
+
await session.sendMessage('Start');
|
|
104
|
+
await waitForAgentStatus(session, entryAgentId, 'paused');
|
|
105
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId));
|
|
106
|
+
expect(stopped.length).toBeGreaterThanOrEqual(1);
|
|
107
|
+
expect(stopped[0].kind).toBe('paused');
|
|
108
|
+
// limits-guard pauses via beforeInference {action:'pause'} → reason 'handler',
|
|
109
|
+
// with the human-readable budget detail in `message`.
|
|
110
|
+
expect(stopped[0].reason).toBe('handler');
|
|
111
|
+
expect(stopped[0].message).toBeTruthy();
|
|
112
|
+
await harness.shutdown();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('agentStopped on error', () => {
|
|
116
|
+
it('non-retryable LLM error → agentStopped kind:errored with message', async () => {
|
|
117
|
+
const harness = new TestHarness({
|
|
118
|
+
presets: [createTestPreset()],
|
|
119
|
+
systemPlugins: [agentStatusPlugin],
|
|
120
|
+
llmProvider: MockLLMProvider.withError({ type: 'invalid_request', message: 'Bad request' }),
|
|
121
|
+
});
|
|
122
|
+
const session = await harness.createSession('test');
|
|
123
|
+
const entryAgentId = session.getEntryAgentId();
|
|
124
|
+
await session.sendMessage('Trigger error');
|
|
125
|
+
await waitForAgentStatus(session, entryAgentId, 'errored');
|
|
126
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId));
|
|
127
|
+
expect(stopped).toHaveLength(1);
|
|
128
|
+
expect(stopped[0].kind).toBe('errored');
|
|
129
|
+
expect(stopped[0].reason).toBeUndefined();
|
|
130
|
+
expect(stopped[0].message).toBe('Bad request');
|
|
131
|
+
expect(stopped[0].definitionName).toBeDefined();
|
|
132
|
+
await harness.shutdown();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=agent-status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-status.test.js","sourceRoot":"","sources":["../../../src/plugins/agent-status/agent-status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,33 @@
|
|
|
14
14
|
* `idle` fires on `onComplete`, `onError`, and `onPause` — covers every terminal
|
|
15
15
|
* state of an agent turn, including hard-limit pauses (limits-guard) and manual
|
|
16
16
|
* `Session.pauseAgent` calls that would otherwise leave the indicator hung.
|
|
17
|
+
*
|
|
18
|
+
* Alongside the `idle` status, abnormal terminal states (pause / error) also emit
|
|
19
|
+
* a dedicated `agentStopped` notification carrying the pause reason / error detail,
|
|
20
|
+
* so consumers (e.g. a Cloudflare worker) can alert on a budget pause or crash —
|
|
21
|
+
* which the coarse `idle` status alone can't distinguish from a normal completion.
|
|
22
|
+
*/
|
|
23
|
+
import z from 'zod/v4';
|
|
24
|
+
/**
|
|
25
|
+
* Payload for the `agentStopped` notification — emitted when an agent reaches an
|
|
26
|
+
* abnormal terminal state (paused or errored), as opposed to a normal idle.
|
|
17
27
|
*/
|
|
28
|
+
export declare const agentStoppedNotificationSchema: z.ZodObject<{
|
|
29
|
+
sessionId: z.core.$ZodBranded<z.ZodString, "SessionId", "out">;
|
|
30
|
+
agentId: z.core.$ZodBranded<z.ZodString, "AgentId", "out">;
|
|
31
|
+
definitionName: z.ZodOptional<z.ZodString>;
|
|
32
|
+
kind: z.ZodEnum<{
|
|
33
|
+
errored: "errored";
|
|
34
|
+
paused: "paused";
|
|
35
|
+
}>;
|
|
36
|
+
reason: z.ZodOptional<z.ZodEnum<{
|
|
37
|
+
limit: "limit";
|
|
38
|
+
handler: "handler";
|
|
39
|
+
manual: "manual";
|
|
40
|
+
}>>;
|
|
41
|
+
message: z.ZodOptional<z.ZodString>;
|
|
42
|
+
timestamp: z.ZodNumber;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
export type AgentStoppedNotification = z.infer<typeof agentStoppedNotificationSchema>;
|
|
18
45
|
export declare const agentStatusPlugin: import("../../core/plugins/index.js").PluginDefinition<"agent-status", void, void, {}, {}>;
|
|
19
46
|
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/agent-status/plugin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/agent-status/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,CAAC,MAAM,QAAQ,CAAA;AAKtB;;;GAGG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;iBAUzC,CAAA;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAA;AAErF,eAAO,MAAM,iBAAiB,wFAsGrB,CAAA"}
|
|
@@ -14,11 +14,31 @@
|
|
|
14
14
|
* `idle` fires on `onComplete`, `onError`, and `onPause` — covers every terminal
|
|
15
15
|
* state of an agent turn, including hard-limit pauses (limits-guard) and manual
|
|
16
16
|
* `Session.pauseAgent` calls that would otherwise leave the indicator hung.
|
|
17
|
+
*
|
|
18
|
+
* Alongside the `idle` status, abnormal terminal states (pause / error) also emit
|
|
19
|
+
* a dedicated `agentStopped` notification carrying the pause reason / error detail,
|
|
20
|
+
* so consumers (e.g. a Cloudflare worker) can alert on a budget pause or crash —
|
|
21
|
+
* which the coarse `idle` status alone can't distinguish from a normal completion.
|
|
17
22
|
*/
|
|
18
23
|
import z from 'zod/v4';
|
|
19
24
|
import { agentIdSchema, protocolAgentStatusSchema } from '../../core/agents/schema.js';
|
|
20
25
|
import { definePlugin } from '../../core/plugins/index.js';
|
|
21
26
|
import { sessionIdSchema } from '../../core/sessions/schema.js';
|
|
27
|
+
/**
|
|
28
|
+
* Payload for the `agentStopped` notification — emitted when an agent reaches an
|
|
29
|
+
* abnormal terminal state (paused or errored), as opposed to a normal idle.
|
|
30
|
+
*/
|
|
31
|
+
export const agentStoppedNotificationSchema = z.object({
|
|
32
|
+
sessionId: sessionIdSchema,
|
|
33
|
+
agentId: agentIdSchema,
|
|
34
|
+
definitionName: z.string().optional(),
|
|
35
|
+
kind: z.enum(['paused', 'errored']),
|
|
36
|
+
/** Present when kind === 'paused' — why the agent was paused. */
|
|
37
|
+
reason: z.enum(['limit', 'handler', 'manual']).optional(),
|
|
38
|
+
/** Human-readable detail (budget message / error message). */
|
|
39
|
+
message: z.string().optional(),
|
|
40
|
+
timestamp: z.number(),
|
|
41
|
+
});
|
|
22
42
|
export const agentStatusPlugin = definePlugin('agent-status')
|
|
23
43
|
.notification('agentStatus', {
|
|
24
44
|
schema: z.object({
|
|
@@ -28,6 +48,9 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
28
48
|
definitionName: z.string().optional(),
|
|
29
49
|
timestamp: z.number(),
|
|
30
50
|
}),
|
|
51
|
+
})
|
|
52
|
+
.notification('agentStopped', {
|
|
53
|
+
schema: agentStoppedNotificationSchema,
|
|
31
54
|
})
|
|
32
55
|
.hook('onStart', async (ctx) => {
|
|
33
56
|
ctx.notify('agentStatus', {
|
|
@@ -80,6 +103,15 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
80
103
|
definitionName: ctx.agentState.definitionName,
|
|
81
104
|
timestamp: Date.now(),
|
|
82
105
|
});
|
|
106
|
+
// Additive abnormal-terminal signal for alerting (e.g. worker crash alert).
|
|
107
|
+
ctx.notify('agentStopped', {
|
|
108
|
+
sessionId: ctx.sessionId,
|
|
109
|
+
agentId: ctx.agentId,
|
|
110
|
+
definitionName: ctx.agentState.definitionName,
|
|
111
|
+
kind: 'errored',
|
|
112
|
+
message: ctx.error,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
});
|
|
83
115
|
return null;
|
|
84
116
|
})
|
|
85
117
|
.hook('onPause', async (ctx) => {
|
|
@@ -93,6 +125,20 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
93
125
|
definitionName: ctx.agentState.definitionName,
|
|
94
126
|
timestamp: Date.now(),
|
|
95
127
|
});
|
|
128
|
+
// Additive abnormal-terminal signal carrying the structured pause reason and
|
|
129
|
+
// message. Read from agentState (set by the agent_paused reducer) rather than
|
|
130
|
+
// the loosely-typed `ctx.reason`, which actually carries the message string.
|
|
131
|
+
// A budget breach surfaces as reason:'handler' with the budget detail in
|
|
132
|
+
// `message` (limits-guard pauses via beforeInference `{action:'pause'}`).
|
|
133
|
+
ctx.notify('agentStopped', {
|
|
134
|
+
sessionId: ctx.sessionId,
|
|
135
|
+
agentId: ctx.agentId,
|
|
136
|
+
definitionName: ctx.agentState.definitionName,
|
|
137
|
+
kind: 'paused',
|
|
138
|
+
reason: ctx.agentState.pauseReason,
|
|
139
|
+
message: ctx.agentState.pauseMessage,
|
|
140
|
+
timestamp: Date.now(),
|
|
141
|
+
});
|
|
96
142
|
return null;
|
|
97
143
|
})
|
|
98
144
|
.build();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/agent-status/plugin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/agent-status/plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roj-ai/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
"type-check": "tsc --noEmit"
|
|
136
136
|
},
|
|
137
137
|
"dependencies": {
|
|
138
|
-
"@roj-ai/transport": "^0.1.
|
|
138
|
+
"@roj-ai/transport": "^0.1.22",
|
|
139
139
|
"@hono/zod-validator": "0.7.6",
|
|
140
140
|
"hono": "4.12.5",
|
|
141
141
|
"ignore": "7.0.5",
|
package/src/index.ts
CHANGED
|
@@ -82,7 +82,8 @@ export type { BuiltinEvent } from './builtin-events.js'
|
|
|
82
82
|
export type { AgentChatMessage, AskUserChatMessage, ChatMessage, UserChatMessage } from '~/plugins/user-chat/index.js'
|
|
83
83
|
|
|
84
84
|
// Plugins
|
|
85
|
-
export { agentStatusPlugin } from '~/plugins/agent-status/plugin.js'
|
|
85
|
+
export { agentStatusPlugin, agentStoppedNotificationSchema } from '~/plugins/agent-status/plugin.js'
|
|
86
|
+
export type { AgentStoppedNotification } from '~/plugins/agent-status/plugin.js'
|
|
86
87
|
export { agentsPlugin } from '~/plugins/agents/plugin.js'
|
|
87
88
|
export type { AgentsPluginConfig } from '~/plugins/agents/plugin.js'
|
|
88
89
|
export { contextCompactPlugin } from '~/plugins/context-compact/plugin.js'
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test'
|
|
2
|
+
import { AgentId } from '~/core/agents/schema.js'
|
|
3
|
+
import { MockLLMProvider } from '~/core/llm/mock.js'
|
|
4
|
+
import type { PluginNotification } from '~/core/plugins/plugin-builder.js'
|
|
5
|
+
import { ToolCallId } from '~/core/tools/schema.js'
|
|
6
|
+
import { limitsGuardPlugin } from '~/plugins/limits-guard/plugin.js'
|
|
7
|
+
import { createMultiAgentPreset, createTestPreset, type TestSession, TestHarness } from '~/testing/index.js'
|
|
8
|
+
import { type AgentStoppedNotification, agentStatusPlugin } from './plugin.js'
|
|
9
|
+
|
|
10
|
+
type StatusPayload = { sessionId: string; agentId: string; status: string; definitionName?: string; timestamp: number }
|
|
11
|
+
|
|
12
|
+
const agentStatusNotifications = (session: TestSession): StatusPayload[] =>
|
|
13
|
+
session.getNotifications()
|
|
14
|
+
.filter((n: PluginNotification) => n.pluginName === 'agent-status' && n.type === 'agentStatus')
|
|
15
|
+
.map((n) => n.payload as StatusPayload)
|
|
16
|
+
|
|
17
|
+
const agentStoppedNotifications = (session: TestSession): AgentStoppedNotification[] =>
|
|
18
|
+
session.getNotifications()
|
|
19
|
+
.filter((n: PluginNotification) => n.pluginName === 'agent-status' && n.type === 'agentStopped')
|
|
20
|
+
.map((n) => n.payload as AgentStoppedNotification)
|
|
21
|
+
|
|
22
|
+
async function waitForAgentStatus(session: TestSession, agentId: AgentId, status: string, timeoutMs = 5000): Promise<void> {
|
|
23
|
+
const deadline = Date.now() + timeoutMs
|
|
24
|
+
while (Date.now() < deadline) {
|
|
25
|
+
const agentState = session.state.agents.get(agentId)
|
|
26
|
+
if (agentState?.status === status) return
|
|
27
|
+
await new Promise((r) => setTimeout(r, 10))
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`waitForAgentStatus timed out after ${timeoutMs}ms (wanted ${status}) for agent ${agentId}`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('agent-status plugin', () => {
|
|
33
|
+
describe('agentStatus (existing behavior)', () => {
|
|
34
|
+
it('emits thinking on start and idle on completion', async () => {
|
|
35
|
+
const harness = new TestHarness({
|
|
36
|
+
presets: [createTestPreset()],
|
|
37
|
+
systemPlugins: [agentStatusPlugin],
|
|
38
|
+
llmProvider: MockLLMProvider.withFixedResponse({ content: 'Done', toolCalls: [] }),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const session = await harness.createSession('test')
|
|
42
|
+
const entryAgentId = session.getEntryAgentId()!
|
|
43
|
+
await session.sendAndWaitForIdle('Hello')
|
|
44
|
+
|
|
45
|
+
const statuses = agentStatusNotifications(session).map((p) => p.status)
|
|
46
|
+
expect(statuses).toContain('thinking')
|
|
47
|
+
expect(statuses).toContain('idle')
|
|
48
|
+
|
|
49
|
+
// No abnormal-terminal notification for a normal completion.
|
|
50
|
+
expect(agentStoppedNotifications(session)).toHaveLength(0)
|
|
51
|
+
|
|
52
|
+
await harness.shutdown()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
describe('agentStopped on pause', () => {
|
|
57
|
+
it('manual pause → agentStopped kind:paused reason:manual with message', async () => {
|
|
58
|
+
let orchestratorCalls = 0
|
|
59
|
+
const harness = new TestHarness({
|
|
60
|
+
presets: [createMultiAgentPreset(
|
|
61
|
+
[{ name: 'worker', system: 'Worker agent.', tools: [], agents: [] }],
|
|
62
|
+
{ orchestratorSystem: 'Orchestrator agent.' },
|
|
63
|
+
)],
|
|
64
|
+
systemPlugins: [agentStatusPlugin],
|
|
65
|
+
mockHandler: (request) => {
|
|
66
|
+
if (request.systemPrompt.includes('Orchestrator')) {
|
|
67
|
+
orchestratorCalls++
|
|
68
|
+
if (orchestratorCalls === 1) {
|
|
69
|
+
return {
|
|
70
|
+
content: null,
|
|
71
|
+
toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
|
|
72
|
+
finishReason: 'stop',
|
|
73
|
+
metrics: MockLLMProvider.defaultMetrics(),
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
|
|
77
|
+
}
|
|
78
|
+
return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
|
|
79
|
+
},
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const session = await harness.createSession('test')
|
|
83
|
+
await session.sendAndWaitForIdle('Start')
|
|
84
|
+
|
|
85
|
+
// Manual pause via Session.pauseAgent — the real manual-pause API that
|
|
86
|
+
// runs onPause hooks (agents.pause only emits the event, no hooks).
|
|
87
|
+
const innerSession = (session as unknown as { session: { pauseAgent: (id: AgentId, message?: string) => Promise<{ ok: boolean }> } }).session
|
|
88
|
+
const result = await innerSession.pauseAgent(AgentId('worker_1'), 'Pausing for review')
|
|
89
|
+
expect(result.ok).toBe(true)
|
|
90
|
+
|
|
91
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === 'worker_1')
|
|
92
|
+
expect(stopped).toHaveLength(1)
|
|
93
|
+
expect(stopped[0].kind).toBe('paused')
|
|
94
|
+
expect(stopped[0].reason).toBe('manual')
|
|
95
|
+
expect(stopped[0].message).toBe('Pausing for review')
|
|
96
|
+
expect(stopped[0].definitionName).toBe('worker')
|
|
97
|
+
expect(typeof stopped[0].timestamp).toBe('number')
|
|
98
|
+
|
|
99
|
+
// idle agentStatus still emitted alongside.
|
|
100
|
+
expect(agentStatusNotifications(session).some((p) => p.agentId === 'worker_1' && p.status === 'idle')).toBe(true)
|
|
101
|
+
|
|
102
|
+
await harness.shutdown()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it('limits-guard hard limit → agentStopped kind:paused with reason and message', async () => {
|
|
106
|
+
let inferenceCount = 0
|
|
107
|
+
const harness = new TestHarness({
|
|
108
|
+
presets: [createTestPreset({
|
|
109
|
+
orchestratorSystem: 'Test agent.',
|
|
110
|
+
orchestratorPlugins: [limitsGuardPlugin.configureAgent({ limits: { maxTurns: 2 } })],
|
|
111
|
+
})],
|
|
112
|
+
systemPlugins: [agentStatusPlugin, limitsGuardPlugin],
|
|
113
|
+
mockHandler: () => {
|
|
114
|
+
inferenceCount++
|
|
115
|
+
return {
|
|
116
|
+
content: null,
|
|
117
|
+
toolCalls: [{ id: ToolCallId(`tc${inferenceCount}`), name: 'tell_user', input: { message: `Turn ${inferenceCount}` } }],
|
|
118
|
+
finishReason: 'stop',
|
|
119
|
+
metrics: MockLLMProvider.defaultMetrics(),
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
const session = await harness.createSession('test')
|
|
125
|
+
const entryAgentId = session.getEntryAgentId()!
|
|
126
|
+
await session.sendMessage('Start')
|
|
127
|
+
await waitForAgentStatus(session, entryAgentId, 'paused')
|
|
128
|
+
|
|
129
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId))
|
|
130
|
+
expect(stopped.length).toBeGreaterThanOrEqual(1)
|
|
131
|
+
expect(stopped[0].kind).toBe('paused')
|
|
132
|
+
// limits-guard pauses via beforeInference {action:'pause'} → reason 'handler',
|
|
133
|
+
// with the human-readable budget detail in `message`.
|
|
134
|
+
expect(stopped[0].reason).toBe('handler')
|
|
135
|
+
expect(stopped[0].message).toBeTruthy()
|
|
136
|
+
|
|
137
|
+
await harness.shutdown()
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
describe('agentStopped on error', () => {
|
|
142
|
+
it('non-retryable LLM error → agentStopped kind:errored with message', async () => {
|
|
143
|
+
const harness = new TestHarness({
|
|
144
|
+
presets: [createTestPreset()],
|
|
145
|
+
systemPlugins: [agentStatusPlugin],
|
|
146
|
+
llmProvider: MockLLMProvider.withError({ type: 'invalid_request', message: 'Bad request' }),
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
const session = await harness.createSession('test')
|
|
150
|
+
const entryAgentId = session.getEntryAgentId()!
|
|
151
|
+
await session.sendMessage('Trigger error')
|
|
152
|
+
await waitForAgentStatus(session, entryAgentId, 'errored')
|
|
153
|
+
|
|
154
|
+
const stopped = agentStoppedNotifications(session).filter((n) => n.agentId === String(entryAgentId))
|
|
155
|
+
expect(stopped).toHaveLength(1)
|
|
156
|
+
expect(stopped[0].kind).toBe('errored')
|
|
157
|
+
expect(stopped[0].reason).toBeUndefined()
|
|
158
|
+
expect(stopped[0].message).toBe('Bad request')
|
|
159
|
+
expect(stopped[0].definitionName).toBeDefined()
|
|
160
|
+
|
|
161
|
+
await harness.shutdown()
|
|
162
|
+
})
|
|
163
|
+
})
|
|
164
|
+
})
|
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
* `idle` fires on `onComplete`, `onError`, and `onPause` — covers every terminal
|
|
15
15
|
* state of an agent turn, including hard-limit pauses (limits-guard) and manual
|
|
16
16
|
* `Session.pauseAgent` calls that would otherwise leave the indicator hung.
|
|
17
|
+
*
|
|
18
|
+
* Alongside the `idle` status, abnormal terminal states (pause / error) also emit
|
|
19
|
+
* a dedicated `agentStopped` notification carrying the pause reason / error detail,
|
|
20
|
+
* so consumers (e.g. a Cloudflare worker) can alert on a budget pause or crash —
|
|
21
|
+
* which the coarse `idle` status alone can't distinguish from a normal completion.
|
|
17
22
|
*/
|
|
18
23
|
|
|
19
24
|
import z from 'zod/v4'
|
|
@@ -21,6 +26,24 @@ import { agentIdSchema, protocolAgentStatusSchema } from '~/core/agents/schema.j
|
|
|
21
26
|
import { definePlugin } from '~/core/plugins/index.js'
|
|
22
27
|
import { sessionIdSchema } from '~/core/sessions/schema.js'
|
|
23
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Payload for the `agentStopped` notification — emitted when an agent reaches an
|
|
31
|
+
* abnormal terminal state (paused or errored), as opposed to a normal idle.
|
|
32
|
+
*/
|
|
33
|
+
export const agentStoppedNotificationSchema = z.object({
|
|
34
|
+
sessionId: sessionIdSchema,
|
|
35
|
+
agentId: agentIdSchema,
|
|
36
|
+
definitionName: z.string().optional(),
|
|
37
|
+
kind: z.enum(['paused', 'errored']),
|
|
38
|
+
/** Present when kind === 'paused' — why the agent was paused. */
|
|
39
|
+
reason: z.enum(['limit', 'handler', 'manual']).optional(),
|
|
40
|
+
/** Human-readable detail (budget message / error message). */
|
|
41
|
+
message: z.string().optional(),
|
|
42
|
+
timestamp: z.number(),
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
export type AgentStoppedNotification = z.infer<typeof agentStoppedNotificationSchema>
|
|
46
|
+
|
|
24
47
|
export const agentStatusPlugin = definePlugin('agent-status')
|
|
25
48
|
.notification('agentStatus', {
|
|
26
49
|
schema: z.object({
|
|
@@ -31,6 +54,9 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
31
54
|
timestamp: z.number(),
|
|
32
55
|
}),
|
|
33
56
|
})
|
|
57
|
+
.notification('agentStopped', {
|
|
58
|
+
schema: agentStoppedNotificationSchema,
|
|
59
|
+
})
|
|
34
60
|
.hook('onStart', async (ctx) => {
|
|
35
61
|
ctx.notify('agentStatus', {
|
|
36
62
|
sessionId: ctx.sessionId,
|
|
@@ -82,6 +108,15 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
82
108
|
definitionName: ctx.agentState.definitionName,
|
|
83
109
|
timestamp: Date.now(),
|
|
84
110
|
})
|
|
111
|
+
// Additive abnormal-terminal signal for alerting (e.g. worker crash alert).
|
|
112
|
+
ctx.notify('agentStopped', {
|
|
113
|
+
sessionId: ctx.sessionId,
|
|
114
|
+
agentId: ctx.agentId,
|
|
115
|
+
definitionName: ctx.agentState.definitionName,
|
|
116
|
+
kind: 'errored',
|
|
117
|
+
message: ctx.error,
|
|
118
|
+
timestamp: Date.now(),
|
|
119
|
+
})
|
|
85
120
|
return null
|
|
86
121
|
})
|
|
87
122
|
.hook('onPause', async (ctx) => {
|
|
@@ -95,6 +130,20 @@ export const agentStatusPlugin = definePlugin('agent-status')
|
|
|
95
130
|
definitionName: ctx.agentState.definitionName,
|
|
96
131
|
timestamp: Date.now(),
|
|
97
132
|
})
|
|
133
|
+
// Additive abnormal-terminal signal carrying the structured pause reason and
|
|
134
|
+
// message. Read from agentState (set by the agent_paused reducer) rather than
|
|
135
|
+
// the loosely-typed `ctx.reason`, which actually carries the message string.
|
|
136
|
+
// A budget breach surfaces as reason:'handler' with the budget detail in
|
|
137
|
+
// `message` (limits-guard pauses via beforeInference `{action:'pause'}`).
|
|
138
|
+
ctx.notify('agentStopped', {
|
|
139
|
+
sessionId: ctx.sessionId,
|
|
140
|
+
agentId: ctx.agentId,
|
|
141
|
+
definitionName: ctx.agentState.definitionName,
|
|
142
|
+
kind: 'paused',
|
|
143
|
+
reason: ctx.agentState.pauseReason,
|
|
144
|
+
message: ctx.agentState.pauseMessage,
|
|
145
|
+
timestamp: Date.now(),
|
|
146
|
+
})
|
|
98
147
|
return null
|
|
99
148
|
})
|
|
100
149
|
.build()
|