@hazeljs/ops-agent 0.7.9 → 0.8.1
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/README.md +15 -19
- package/dist/adapters/jira.d.ts +22 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +139 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/jira.test.d.ts +5 -0
- package/dist/adapters/jira.test.d.ts.map +1 -0
- package/dist/adapters/jira.test.js +193 -0
- package/dist/adapters/jira.test.js.map +1 -0
- package/dist/adapters/slack.d.ts +18 -0
- package/dist/adapters/slack.d.ts.map +1 -0
- package/dist/adapters/slack.js +69 -0
- package/dist/adapters/slack.js.map +1 -0
- package/dist/adapters/slack.test.d.ts +5 -0
- package/dist/adapters/slack.test.d.ts.map +1 -0
- package/dist/adapters/slack.test.js +136 -0
- package/dist/adapters/slack.test.js.map +1 -0
- package/dist/create-ops-runtime.d.ts +27 -0
- package/dist/create-ops-runtime.d.ts.map +1 -0
- package/dist/create-ops-runtime.js +56 -0
- package/dist/create-ops-runtime.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/ops-agent.d.ts +44 -0
- package/dist/ops-agent.d.ts.map +1 -0
- package/dist/ops-agent.js +146 -0
- package/dist/ops-agent.js.map +1 -0
- package/dist/ops-agent.test.d.ts +5 -0
- package/dist/ops-agent.test.d.ts.map +1 -0
- package/dist/ops-agent.test.js +127 -0
- package/dist/ops-agent.test.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Slack adapter tests
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const slack_1 = require("./slack");
|
|
7
|
+
describe('createSlackTool', () => {
|
|
8
|
+
const originalEnv = process.env;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
jest.restoreAllMocks();
|
|
11
|
+
process.env = { ...originalEnv };
|
|
12
|
+
delete process.env.SLACK_BOT_TOKEN;
|
|
13
|
+
});
|
|
14
|
+
afterAll(() => {
|
|
15
|
+
process.env = originalEnv;
|
|
16
|
+
});
|
|
17
|
+
describe('placeholder mode (no token)', () => {
|
|
18
|
+
it('returns placeholder tool when token is not set', () => {
|
|
19
|
+
const tool = (0, slack_1.createSlackTool)();
|
|
20
|
+
expect(tool).toBeDefined();
|
|
21
|
+
expect(tool.postToChannel).toBeDefined();
|
|
22
|
+
});
|
|
23
|
+
it('postToChannel returns placeholder ts and channel', async () => {
|
|
24
|
+
const tool = (0, slack_1.createSlackTool)();
|
|
25
|
+
const result = await tool.postToChannel({
|
|
26
|
+
channel: '#incidents',
|
|
27
|
+
text: 'Test message',
|
|
28
|
+
});
|
|
29
|
+
expect(result.ts).toMatch(/^ts-\d+$/);
|
|
30
|
+
expect(result.channel).toBe('#incidents');
|
|
31
|
+
});
|
|
32
|
+
it('postToChannel preserves channel when replying in thread', async () => {
|
|
33
|
+
const tool = (0, slack_1.createSlackTool)();
|
|
34
|
+
const result = await tool.postToChannel({
|
|
35
|
+
channel: 'C123456',
|
|
36
|
+
text: 'Reply',
|
|
37
|
+
threadTs: '1234567890.123456',
|
|
38
|
+
});
|
|
39
|
+
expect(result.channel).toBe('C123456');
|
|
40
|
+
});
|
|
41
|
+
it('returns placeholder when config is empty', () => {
|
|
42
|
+
const tool = (0, slack_1.createSlackTool)({});
|
|
43
|
+
expect(tool).toBeDefined();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('real mode (with mocked fetch)', () => {
|
|
47
|
+
let fetchMock;
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
fetchMock = jest.spyOn(globalThis, 'fetch');
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
fetchMock.mockRestore();
|
|
53
|
+
});
|
|
54
|
+
it('postToChannel calls Slack API and returns ts/channel', async () => {
|
|
55
|
+
fetchMock.mockResolvedValueOnce({
|
|
56
|
+
ok: true,
|
|
57
|
+
json: async () => ({
|
|
58
|
+
ok: true,
|
|
59
|
+
ts: '1234567890.123456',
|
|
60
|
+
channel: 'C123456',
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
const tool = (0, slack_1.createSlackTool)({
|
|
64
|
+
token: 'xoxb-test-token',
|
|
65
|
+
});
|
|
66
|
+
const result = await tool.postToChannel({
|
|
67
|
+
channel: '#incidents',
|
|
68
|
+
text: 'Incident update',
|
|
69
|
+
});
|
|
70
|
+
expect(result.ts).toBe('1234567890.123456');
|
|
71
|
+
expect(result.channel).toBe('C123456');
|
|
72
|
+
expect(fetchMock).toHaveBeenCalledWith('https://slack.com/api/chat.postMessage', expect.objectContaining({
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: expect.objectContaining({
|
|
75
|
+
Authorization: 'Bearer xoxb-test-token',
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
}),
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
channel: '#incidents',
|
|
80
|
+
text: 'Incident update',
|
|
81
|
+
}),
|
|
82
|
+
}));
|
|
83
|
+
});
|
|
84
|
+
it('postToChannel includes thread_ts when provided', async () => {
|
|
85
|
+
fetchMock.mockResolvedValueOnce({
|
|
86
|
+
ok: true,
|
|
87
|
+
json: async () => ({ ok: true, ts: 'ts-1', channel: 'C123' }),
|
|
88
|
+
});
|
|
89
|
+
const tool = (0, slack_1.createSlackTool)({ token: 'xoxb-token' });
|
|
90
|
+
await tool.postToChannel({
|
|
91
|
+
channel: '#incidents',
|
|
92
|
+
text: 'Reply',
|
|
93
|
+
threadTs: '1234567890.123456',
|
|
94
|
+
});
|
|
95
|
+
expect(fetchMock).toHaveBeenCalledWith('https://slack.com/api/chat.postMessage', expect.objectContaining({
|
|
96
|
+
body: JSON.stringify({
|
|
97
|
+
channel: '#incidents',
|
|
98
|
+
text: 'Reply',
|
|
99
|
+
thread_ts: '1234567890.123456',
|
|
100
|
+
}),
|
|
101
|
+
}));
|
|
102
|
+
});
|
|
103
|
+
it('postToChannel throws when HTTP not ok', async () => {
|
|
104
|
+
fetchMock.mockResolvedValueOnce({
|
|
105
|
+
ok: false,
|
|
106
|
+
status: 500,
|
|
107
|
+
text: async () => 'Internal Server Error',
|
|
108
|
+
});
|
|
109
|
+
const tool = (0, slack_1.createSlackTool)({ token: 'xoxb-token' });
|
|
110
|
+
await expect(tool.postToChannel({ channel: '#incidents', text: 'Test' })).rejects.toThrow('Slack post failed: 500');
|
|
111
|
+
});
|
|
112
|
+
it('postToChannel throws when Slack API returns ok: false', async () => {
|
|
113
|
+
fetchMock.mockResolvedValueOnce({
|
|
114
|
+
ok: true,
|
|
115
|
+
json: async () => ({ ok: false, error: 'channel_not_found' }),
|
|
116
|
+
});
|
|
117
|
+
const tool = (0, slack_1.createSlackTool)({ token: 'xoxb-token' });
|
|
118
|
+
await expect(tool.postToChannel({ channel: '#nonexistent', text: 'Test' })).rejects.toThrow('Slack API error: channel_not_found');
|
|
119
|
+
});
|
|
120
|
+
it('uses env var when config not provided', async () => {
|
|
121
|
+
process.env.SLACK_BOT_TOKEN = 'xoxb-env-token';
|
|
122
|
+
fetchMock.mockResolvedValueOnce({
|
|
123
|
+
ok: true,
|
|
124
|
+
json: async () => ({ ok: true, ts: 'ts-1', channel: 'C1' }),
|
|
125
|
+
});
|
|
126
|
+
const tool = (0, slack_1.createSlackTool)();
|
|
127
|
+
await tool.postToChannel({ channel: '#test', text: 'Test' });
|
|
128
|
+
expect(fetchMock).toHaveBeenCalledWith('https://slack.com/api/chat.postMessage', expect.objectContaining({
|
|
129
|
+
headers: expect.objectContaining({
|
|
130
|
+
Authorization: 'Bearer xoxb-env-token',
|
|
131
|
+
}),
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=slack.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.test.js","sourceRoot":"","sources":["../../src/adapters/slack.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory to create a fully configured Ops Agent runtime.
|
|
3
|
+
* Wires together @hazeljs/ai, @hazeljs/agent, @hazeljs/rag.
|
|
4
|
+
*/
|
|
5
|
+
import { AgentRuntime } from '@hazeljs/agent';
|
|
6
|
+
import type { CreateOpsRuntimeOptions } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Create an AgentRuntime configured with the Ops Agent.
|
|
9
|
+
* Use this when you want the AI-powered ops assistant with Jira and Slack tools.
|
|
10
|
+
*
|
|
11
|
+
* Memory: If memoryManager is not provided, uses an in-memory BufferMemory by default.
|
|
12
|
+
* Pass a custom MemoryManager for persistent memory.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createOpsRuntime(options: CreateOpsRuntimeOptions): AgentRuntime;
|
|
15
|
+
/**
|
|
16
|
+
* Run the ops agent for a single request (convenience method).
|
|
17
|
+
*/
|
|
18
|
+
export declare function runOpsAgent(runtime: AgentRuntime, input: {
|
|
19
|
+
input: string;
|
|
20
|
+
sessionId?: string;
|
|
21
|
+
userId?: string;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
response: string;
|
|
24
|
+
steps: number;
|
|
25
|
+
duration: number;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=create-ops-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-ops-runtime.d.ts","sourceRoot":"","sources":["../src/create-ops-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,YAAY,CAyB/E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAchE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Factory to create a fully configured Ops Agent runtime.
|
|
4
|
+
* Wires together @hazeljs/ai, @hazeljs/agent, @hazeljs/rag.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createOpsRuntime = createOpsRuntime;
|
|
8
|
+
exports.runOpsAgent = runOpsAgent;
|
|
9
|
+
const agent_1 = require("@hazeljs/agent");
|
|
10
|
+
const ai_1 = require("@hazeljs/ai");
|
|
11
|
+
const rag_1 = require("@hazeljs/rag");
|
|
12
|
+
const ops_agent_1 = require("./ops-agent");
|
|
13
|
+
/**
|
|
14
|
+
* Create an AgentRuntime configured with the Ops Agent.
|
|
15
|
+
* Use this when you want the AI-powered ops assistant with Jira and Slack tools.
|
|
16
|
+
*
|
|
17
|
+
* Memory: If memoryManager is not provided, uses an in-memory BufferMemory by default.
|
|
18
|
+
* Pass a custom MemoryManager for persistent memory.
|
|
19
|
+
*/
|
|
20
|
+
function createOpsRuntime(options) {
|
|
21
|
+
const llmProvider = (0, ai_1.createLLMProviderFromIAI)(options.aiService, options.model ?? 'gpt-4');
|
|
22
|
+
const agent = new ops_agent_1.OpsAgent(options.tools);
|
|
23
|
+
const memoryManager = options.memoryManager ??
|
|
24
|
+
new rag_1.MemoryManager(new rag_1.BufferMemory({ maxSize: 50 }), {
|
|
25
|
+
maxConversationLength: 20,
|
|
26
|
+
entityExtraction: true,
|
|
27
|
+
importanceScoring: true,
|
|
28
|
+
});
|
|
29
|
+
const runtime = new agent_1.AgentRuntime({
|
|
30
|
+
llmProvider,
|
|
31
|
+
memoryManager: memoryManager,
|
|
32
|
+
ragService: options.ragService,
|
|
33
|
+
defaultMaxSteps: 12,
|
|
34
|
+
enableObservability: true,
|
|
35
|
+
});
|
|
36
|
+
runtime.registerAgent(ops_agent_1.OpsAgent);
|
|
37
|
+
runtime.registerAgentInstance('ops-agent', agent);
|
|
38
|
+
return runtime;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the ops agent for a single request (convenience method).
|
|
42
|
+
*/
|
|
43
|
+
async function runOpsAgent(runtime, input) {
|
|
44
|
+
const sessionId = input.sessionId ?? `ops-${Date.now()}`;
|
|
45
|
+
const result = await runtime.execute('ops-agent', input.input, {
|
|
46
|
+
sessionId,
|
|
47
|
+
userId: input.userId,
|
|
48
|
+
enableMemory: true,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
response: result.response ?? 'No response',
|
|
52
|
+
steps: result.steps.length,
|
|
53
|
+
duration: result.duration ?? 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=create-ops-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-ops-runtime.js","sourceRoot":"","sources":["../src/create-ops-runtime.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAeH,4CAyBC;AAKD,kCAqBC;AAhED,0CAA8C;AAC9C,oCAAuD;AACvD,sCAA2D;AAC3D,2CAAuC;AAGvC;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,WAAW,GAAG,IAAA,6BAAwB,EAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;IAE1F,MAAM,KAAK,GAAG,IAAI,oBAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,aAAa,GACjB,OAAO,CAAC,aAAa;QACrB,IAAI,mBAAa,CAAC,IAAI,kBAAY,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;YACnD,qBAAqB,EAAE,EAAE;YACzB,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,IAAI,oBAAY,CAAC;QAC/B,WAAW;QACX,aAAa,EAAE,aAAsB;QACrC,UAAU,EAAE,OAAO,CAAC,UAAmB;QACvC,eAAe,EAAE,EAAE;QACnB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,oBAAiB,CAAC,CAAC;IACzC,OAAO,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAElD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,OAAqB,EACrB,KAIC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE;QAC7D,SAAS;QACT,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,aAAa;QAC1C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hazeljs/ops-agent
|
|
3
|
+
* Ops agent for Jira, Slack, and DevOps workflows
|
|
4
|
+
*/
|
|
5
|
+
export { OpsAgent } from './ops-agent';
|
|
6
|
+
export { createOpsRuntime, runOpsAgent } from './create-ops-runtime';
|
|
7
|
+
export { createJiraTool } from './adapters/jira';
|
|
8
|
+
export { createSlackTool } from './adapters/slack';
|
|
9
|
+
export type { JiraToolLike, SlackToolLike, OpsAgentToolsConfig, CreateOpsRuntimeOptions, AIServiceAdapter, } from './types';
|
|
10
|
+
export type { JiraConfig } from './adapters/jira';
|
|
11
|
+
export type { SlackConfig } from './adapters/slack';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @hazeljs/ops-agent
|
|
4
|
+
* Ops agent for Jira, Slack, and DevOps workflows
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createSlackTool = exports.createJiraTool = exports.runOpsAgent = exports.createOpsRuntime = exports.OpsAgent = void 0;
|
|
8
|
+
var ops_agent_1 = require("./ops-agent");
|
|
9
|
+
Object.defineProperty(exports, "OpsAgent", { enumerable: true, get: function () { return ops_agent_1.OpsAgent; } });
|
|
10
|
+
var create_ops_runtime_1 = require("./create-ops-runtime");
|
|
11
|
+
Object.defineProperty(exports, "createOpsRuntime", { enumerable: true, get: function () { return create_ops_runtime_1.createOpsRuntime; } });
|
|
12
|
+
Object.defineProperty(exports, "runOpsAgent", { enumerable: true, get: function () { return create_ops_runtime_1.runOpsAgent; } });
|
|
13
|
+
var jira_1 = require("./adapters/jira");
|
|
14
|
+
Object.defineProperty(exports, "createJiraTool", { enumerable: true, get: function () { return jira_1.createJiraTool; } });
|
|
15
|
+
var slack_1 = require("./adapters/slack");
|
|
16
|
+
Object.defineProperty(exports, "createSlackTool", { enumerable: true, get: function () { return slack_1.createSlackTool; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,2DAAqE;AAA5D,sHAAA,gBAAgB,OAAA;AAAE,iHAAA,WAAW,OAAA;AACtC,wCAAiD;AAAxC,sGAAA,cAAc,OAAA;AACvB,0CAAmD;AAA1C,wGAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ops Agent - AI-powered DevOps assistant for Jira, Slack, and incident coordination.
|
|
3
|
+
* Uses @Agent and @Tool decorators from @hazeljs/agent.
|
|
4
|
+
*/
|
|
5
|
+
import type { OpsAgentToolsConfig } from './types';
|
|
6
|
+
export declare class OpsAgent {
|
|
7
|
+
private tools;
|
|
8
|
+
constructor(tools: OpsAgentToolsConfig);
|
|
9
|
+
createJiraTicket(input: {
|
|
10
|
+
project: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
issueType?: string;
|
|
14
|
+
labels?: string[];
|
|
15
|
+
}): Promise<{
|
|
16
|
+
key: string;
|
|
17
|
+
id: string;
|
|
18
|
+
url?: string;
|
|
19
|
+
}>;
|
|
20
|
+
addJiraComment(input: {
|
|
21
|
+
issueKey: string;
|
|
22
|
+
body: string;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
}>;
|
|
26
|
+
getJiraTicket(input: {
|
|
27
|
+
issueKey: string;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
key: string;
|
|
30
|
+
summary: string;
|
|
31
|
+
status?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
url?: string;
|
|
34
|
+
}>;
|
|
35
|
+
postToSlack(input: {
|
|
36
|
+
channel: string;
|
|
37
|
+
text: string;
|
|
38
|
+
threadTs?: string;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
ts: string;
|
|
41
|
+
channel: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ops-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-agent.d.ts","sourceRoot":"","sources":["../src/ops-agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,qBAea,QAAQ;IACP,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,mBAAmB;IA6BxC,gBAAgB,CAAC,KAAK,EAAE;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBhD,cAAc,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBlF,aAAa,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACxD,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAwBI,WAAW,CAAC,KAAK,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAG7C"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ops Agent - AI-powered DevOps assistant for Jira, Slack, and incident coordination.
|
|
4
|
+
* Uses @Agent and @Tool decorators from @hazeljs/agent.
|
|
5
|
+
*/
|
|
6
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
7
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
9
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
10
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
11
|
+
};
|
|
12
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.OpsAgent = void 0;
|
|
17
|
+
const agent_1 = require("@hazeljs/agent");
|
|
18
|
+
let OpsAgent = class OpsAgent {
|
|
19
|
+
constructor(tools) {
|
|
20
|
+
this.tools = tools;
|
|
21
|
+
}
|
|
22
|
+
async createJiraTicket(input) {
|
|
23
|
+
return this.tools.jira.createTicket(input);
|
|
24
|
+
}
|
|
25
|
+
async addJiraComment(input) {
|
|
26
|
+
return this.tools.jira.addComment(input);
|
|
27
|
+
}
|
|
28
|
+
async getJiraTicket(input) {
|
|
29
|
+
return this.tools.jira.getTicket(input);
|
|
30
|
+
}
|
|
31
|
+
async postToSlack(input) {
|
|
32
|
+
return this.tools.slack.postToChannel(input);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
exports.OpsAgent = OpsAgent;
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, agent_1.Tool)({
|
|
38
|
+
name: 'create_jira_ticket',
|
|
39
|
+
description: 'Create a new Jira issue (task, bug, or story)',
|
|
40
|
+
requiresApproval: true,
|
|
41
|
+
parameters: [
|
|
42
|
+
{
|
|
43
|
+
name: 'project',
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Jira project key (e.g. PROJ)',
|
|
46
|
+
required: true,
|
|
47
|
+
},
|
|
48
|
+
{ name: 'summary', type: 'string', description: 'Issue summary/title', required: true },
|
|
49
|
+
{
|
|
50
|
+
name: 'description',
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'Optional detailed description',
|
|
53
|
+
required: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'issueType',
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Issue type: Task, Bug, Story (default: Task)',
|
|
59
|
+
required: false,
|
|
60
|
+
},
|
|
61
|
+
{ name: 'labels', type: 'array', description: 'Optional labels', required: false },
|
|
62
|
+
],
|
|
63
|
+
}),
|
|
64
|
+
__metadata("design:type", Function),
|
|
65
|
+
__metadata("design:paramtypes", [Object]),
|
|
66
|
+
__metadata("design:returntype", Promise)
|
|
67
|
+
], OpsAgent.prototype, "createJiraTicket", null);
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, agent_1.Tool)({
|
|
70
|
+
name: 'add_jira_comment',
|
|
71
|
+
description: 'Add a comment to an existing Jira issue',
|
|
72
|
+
parameters: [
|
|
73
|
+
{
|
|
74
|
+
name: 'issueKey',
|
|
75
|
+
type: 'string',
|
|
76
|
+
description: 'Jira issue key (e.g. PROJ-123)',
|
|
77
|
+
required: true,
|
|
78
|
+
},
|
|
79
|
+
{ name: 'body', type: 'string', description: 'Comment text', required: true },
|
|
80
|
+
],
|
|
81
|
+
}),
|
|
82
|
+
__metadata("design:type", Function),
|
|
83
|
+
__metadata("design:paramtypes", [Object]),
|
|
84
|
+
__metadata("design:returntype", Promise)
|
|
85
|
+
], OpsAgent.prototype, "addJiraComment", null);
|
|
86
|
+
__decorate([
|
|
87
|
+
(0, agent_1.Tool)({
|
|
88
|
+
name: 'get_jira_ticket',
|
|
89
|
+
description: 'Get details of a Jira issue by key',
|
|
90
|
+
parameters: [
|
|
91
|
+
{
|
|
92
|
+
name: 'issueKey',
|
|
93
|
+
type: 'string',
|
|
94
|
+
description: 'Jira issue key (e.g. PROJ-123)',
|
|
95
|
+
required: true,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
}),
|
|
99
|
+
__metadata("design:type", Function),
|
|
100
|
+
__metadata("design:paramtypes", [Object]),
|
|
101
|
+
__metadata("design:returntype", Promise)
|
|
102
|
+
], OpsAgent.prototype, "getJiraTicket", null);
|
|
103
|
+
__decorate([
|
|
104
|
+
(0, agent_1.Tool)({
|
|
105
|
+
name: 'post_to_slack',
|
|
106
|
+
description: 'Post a message to a Slack channel (optionally in a thread)',
|
|
107
|
+
requiresApproval: true,
|
|
108
|
+
parameters: [
|
|
109
|
+
{
|
|
110
|
+
name: 'channel',
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Channel name or ID (e.g. #incidents or C123456)',
|
|
113
|
+
required: true,
|
|
114
|
+
},
|
|
115
|
+
{ name: 'text', type: 'string', description: 'Message text', required: true },
|
|
116
|
+
{
|
|
117
|
+
name: 'threadTs',
|
|
118
|
+
type: 'string',
|
|
119
|
+
description: 'Optional thread timestamp to reply in thread',
|
|
120
|
+
required: false,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
}),
|
|
124
|
+
__metadata("design:type", Function),
|
|
125
|
+
__metadata("design:paramtypes", [Object]),
|
|
126
|
+
__metadata("design:returntype", Promise)
|
|
127
|
+
], OpsAgent.prototype, "postToSlack", null);
|
|
128
|
+
exports.OpsAgent = OpsAgent = __decorate([
|
|
129
|
+
(0, agent_1.Agent)({
|
|
130
|
+
name: 'ops-agent',
|
|
131
|
+
description: 'DevOps/SRE assistant for Jira tickets, Slack notifications, and incident triage',
|
|
132
|
+
systemPrompt: `You are an expert DevOps and SRE assistant. You help engineers with:
|
|
133
|
+
- Creating and updating Jira tickets
|
|
134
|
+
- Posting messages to Slack channels
|
|
135
|
+
- Coordinating incident response and follow-ups
|
|
136
|
+
|
|
137
|
+
When creating tickets or posting to Slack, be concise and include relevant context.
|
|
138
|
+
Always confirm what you did (e.g. "Created JIRA-123" or "Posted to #incidents").
|
|
139
|
+
If credentials are not configured, you'll get placeholder responses - inform the user they need to set JIRA_HOST, JIRA_EMAIL, JIRA_API_TOKEN, and SLACK_BOT_TOKEN.`,
|
|
140
|
+
maxSteps: 12,
|
|
141
|
+
temperature: 0.2,
|
|
142
|
+
enableMemory: true,
|
|
143
|
+
}),
|
|
144
|
+
__metadata("design:paramtypes", [Object])
|
|
145
|
+
], OpsAgent);
|
|
146
|
+
//# sourceMappingURL=ops-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-agent.js","sourceRoot":"","sources":["../src/ops-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-agent.test.d.ts","sourceRoot":"","sources":["../src/ops-agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpsAgent tests
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ops_agent_1 = require("./ops-agent");
|
|
7
|
+
function createMockTools() {
|
|
8
|
+
return {
|
|
9
|
+
jira: {
|
|
10
|
+
createTicket: jest.fn().mockResolvedValue({
|
|
11
|
+
key: 'PROJ-123',
|
|
12
|
+
id: '123',
|
|
13
|
+
url: 'https://jira.example.com/browse/PROJ-123',
|
|
14
|
+
}),
|
|
15
|
+
addComment: jest.fn().mockResolvedValue({ id: 'comment-1' }),
|
|
16
|
+
getTicket: jest.fn().mockResolvedValue({
|
|
17
|
+
key: 'PROJ-123',
|
|
18
|
+
summary: 'Test issue',
|
|
19
|
+
status: 'In Progress',
|
|
20
|
+
description: 'Desc',
|
|
21
|
+
url: 'https://jira.example.com/browse/PROJ-123',
|
|
22
|
+
}),
|
|
23
|
+
},
|
|
24
|
+
slack: {
|
|
25
|
+
postToChannel: jest.fn().mockResolvedValue({
|
|
26
|
+
ts: '1234567890.123456',
|
|
27
|
+
channel: '#incidents',
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
describe('OpsAgent', () => {
|
|
33
|
+
let agent;
|
|
34
|
+
let tools;
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
tools = createMockTools();
|
|
37
|
+
agent = new ops_agent_1.OpsAgent(tools);
|
|
38
|
+
});
|
|
39
|
+
describe('createJiraTicket', () => {
|
|
40
|
+
it('delegates to jira.createTicket', async () => {
|
|
41
|
+
const result = await agent.createJiraTicket({
|
|
42
|
+
project: 'PROJ',
|
|
43
|
+
summary: 'DB issue',
|
|
44
|
+
description: 'Connection pool',
|
|
45
|
+
});
|
|
46
|
+
expect(tools.jira.createTicket).toHaveBeenCalledWith({
|
|
47
|
+
project: 'PROJ',
|
|
48
|
+
summary: 'DB issue',
|
|
49
|
+
description: 'Connection pool',
|
|
50
|
+
});
|
|
51
|
+
expect(result).toEqual({
|
|
52
|
+
key: 'PROJ-123',
|
|
53
|
+
id: '123',
|
|
54
|
+
url: 'https://jira.example.com/browse/PROJ-123',
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('passes optional fields', async () => {
|
|
58
|
+
await agent.createJiraTicket({
|
|
59
|
+
project: 'PROJ',
|
|
60
|
+
summary: 'Bug',
|
|
61
|
+
description: 'Desc',
|
|
62
|
+
issueType: 'Bug',
|
|
63
|
+
labels: ['incident', 'prod'],
|
|
64
|
+
});
|
|
65
|
+
expect(tools.jira.createTicket).toHaveBeenCalledWith({
|
|
66
|
+
project: 'PROJ',
|
|
67
|
+
summary: 'Bug',
|
|
68
|
+
description: 'Desc',
|
|
69
|
+
issueType: 'Bug',
|
|
70
|
+
labels: ['incident', 'prod'],
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('addJiraComment', () => {
|
|
75
|
+
it('delegates to jira.addComment', async () => {
|
|
76
|
+
const result = await agent.addJiraComment({
|
|
77
|
+
issueKey: 'PROJ-123',
|
|
78
|
+
body: 'Status update',
|
|
79
|
+
});
|
|
80
|
+
expect(tools.jira.addComment).toHaveBeenCalledWith({
|
|
81
|
+
issueKey: 'PROJ-123',
|
|
82
|
+
body: 'Status update',
|
|
83
|
+
});
|
|
84
|
+
expect(result).toEqual({ id: 'comment-1' });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('getJiraTicket', () => {
|
|
88
|
+
it('delegates to jira.getTicket', async () => {
|
|
89
|
+
const result = await agent.getJiraTicket({ issueKey: 'PROJ-123' });
|
|
90
|
+
expect(tools.jira.getTicket).toHaveBeenCalledWith({
|
|
91
|
+
issueKey: 'PROJ-123',
|
|
92
|
+
});
|
|
93
|
+
expect(result.key).toBe('PROJ-123');
|
|
94
|
+
expect(result.summary).toBe('Test issue');
|
|
95
|
+
expect(result.status).toBe('In Progress');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('postToSlack', () => {
|
|
99
|
+
it('delegates to slack.postToChannel', async () => {
|
|
100
|
+
const result = await agent.postToSlack({
|
|
101
|
+
channel: '#incidents',
|
|
102
|
+
text: 'Incident PROJ-123 created',
|
|
103
|
+
});
|
|
104
|
+
expect(tools.slack.postToChannel).toHaveBeenCalledWith({
|
|
105
|
+
channel: '#incidents',
|
|
106
|
+
text: 'Incident PROJ-123 created',
|
|
107
|
+
});
|
|
108
|
+
expect(result).toEqual({
|
|
109
|
+
ts: '1234567890.123456',
|
|
110
|
+
channel: '#incidents',
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
it('passes threadTs when provided', async () => {
|
|
114
|
+
await agent.postToSlack({
|
|
115
|
+
channel: '#incidents',
|
|
116
|
+
text: 'Reply',
|
|
117
|
+
threadTs: '1234567890.123456',
|
|
118
|
+
});
|
|
119
|
+
expect(tools.slack.postToChannel).toHaveBeenCalledWith({
|
|
120
|
+
channel: '#incidents',
|
|
121
|
+
text: 'Reply',
|
|
122
|
+
threadTs: '1234567890.123456',
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=ops-agent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-agent.test.js","sourceRoot":"","sources":["../src/ops-agent.test.ts"],"names":[],"mappings":"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"}
|