hanseol-dev 5.0.2-dev.0 → 5.0.2-dev.2

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.
Files changed (88) hide show
  1. package/dist/agents/browser/browser-profile-manager.d.ts +16 -0
  2. package/dist/agents/browser/browser-profile-manager.d.ts.map +1 -0
  3. package/dist/agents/browser/browser-profile-manager.js +149 -0
  4. package/dist/agents/browser/browser-profile-manager.js.map +1 -0
  5. package/dist/agents/browser/browser-sub-agent.d.ts +22 -0
  6. package/dist/agents/browser/browser-sub-agent.d.ts.map +1 -0
  7. package/dist/agents/browser/browser-sub-agent.js +165 -0
  8. package/dist/agents/browser/browser-sub-agent.js.map +1 -0
  9. package/dist/agents/browser/confluence-agent.d.ts +3 -0
  10. package/dist/agents/browser/confluence-agent.d.ts.map +1 -0
  11. package/dist/agents/browser/confluence-agent.js +35 -0
  12. package/dist/agents/browser/confluence-agent.js.map +1 -0
  13. package/dist/agents/browser/index.d.ts +4 -0
  14. package/dist/agents/browser/index.d.ts.map +1 -0
  15. package/dist/agents/browser/index.js +4 -0
  16. package/dist/agents/browser/index.js.map +1 -0
  17. package/dist/agents/browser/jira-agent.d.ts +3 -0
  18. package/dist/agents/browser/jira-agent.d.ts.map +1 -0
  19. package/dist/agents/browser/jira-agent.js +35 -0
  20. package/dist/agents/browser/jira-agent.js.map +1 -0
  21. package/dist/agents/browser/prompts.d.ts +4 -0
  22. package/dist/agents/browser/prompts.d.ts.map +1 -0
  23. package/dist/agents/browser/prompts.js +241 -0
  24. package/dist/agents/browser/prompts.js.map +1 -0
  25. package/dist/agents/browser/search-agent.d.ts +3 -0
  26. package/dist/agents/browser/search-agent.d.ts.map +1 -0
  27. package/dist/agents/browser/search-agent.js +31 -0
  28. package/dist/agents/browser/search-agent.js.map +1 -0
  29. package/dist/agents/common/complete-tool.d.ts +3 -0
  30. package/dist/agents/common/complete-tool.d.ts.map +1 -0
  31. package/dist/agents/common/complete-tool.js +18 -0
  32. package/dist/agents/common/complete-tool.js.map +1 -0
  33. package/dist/agents/common/index.d.ts +3 -0
  34. package/dist/agents/common/index.d.ts.map +1 -0
  35. package/dist/agents/common/index.js +3 -0
  36. package/dist/agents/common/index.js.map +1 -0
  37. package/dist/agents/common/sub-agent.d.ts +21 -0
  38. package/dist/agents/common/sub-agent.d.ts.map +1 -0
  39. package/dist/agents/common/sub-agent.js +127 -0
  40. package/dist/agents/common/sub-agent.js.map +1 -0
  41. package/dist/agents/index.d.ts +3 -2
  42. package/dist/agents/index.d.ts.map +1 -1
  43. package/dist/agents/index.js +3 -2
  44. package/dist/agents/index.js.map +1 -1
  45. package/dist/agents/office/excel-agent.d.ts.map +1 -1
  46. package/dist/agents/office/excel-agent.js +5 -5
  47. package/dist/agents/office/excel-agent.js.map +1 -1
  48. package/dist/agents/office/index.d.ts +2 -2
  49. package/dist/agents/office/index.d.ts.map +1 -1
  50. package/dist/agents/office/index.js +2 -2
  51. package/dist/agents/office/index.js.map +1 -1
  52. package/dist/agents/office/powerpoint-agent.d.ts.map +1 -1
  53. package/dist/agents/office/powerpoint-agent.js +5 -5
  54. package/dist/agents/office/powerpoint-agent.js.map +1 -1
  55. package/dist/agents/office/prompts.d.ts +3 -3
  56. package/dist/agents/office/prompts.d.ts.map +1 -1
  57. package/dist/agents/office/prompts.js +287 -143
  58. package/dist/agents/office/prompts.js.map +1 -1
  59. package/dist/agents/office/word-agent.d.ts.map +1 -1
  60. package/dist/agents/office/word-agent.js +5 -5
  61. package/dist/agents/office/word-agent.js.map +1 -1
  62. package/dist/constants.d.ts +1 -1
  63. package/dist/constants.js +1 -1
  64. package/dist/prompts/agents/planning.d.ts.map +1 -1
  65. package/dist/prompts/agents/planning.js +60 -29
  66. package/dist/prompts/agents/planning.js.map +1 -1
  67. package/dist/prompts/shared/tool-usage.d.ts.map +1 -1
  68. package/dist/prompts/shared/tool-usage.js +9 -4
  69. package/dist/prompts/shared/tool-usage.js.map +1 -1
  70. package/dist/prompts/system/plan-execute.d.ts.map +1 -1
  71. package/dist/prompts/system/plan-execute.js +30 -9
  72. package/dist/prompts/system/plan-execute.js.map +1 -1
  73. package/dist/tools/browser/browser-client.d.ts +3 -0
  74. package/dist/tools/browser/browser-client.d.ts.map +1 -1
  75. package/dist/tools/browser/browser-client.js +22 -6
  76. package/dist/tools/browser/browser-client.js.map +1 -1
  77. package/dist/tools/browser/browser-tools.d.ts +1 -0
  78. package/dist/tools/browser/browser-tools.d.ts.map +1 -1
  79. package/dist/tools/browser/browser-tools.js +15 -0
  80. package/dist/tools/browser/browser-tools.js.map +1 -1
  81. package/dist/tools/llm/simple/planning-tools.js +1 -1
  82. package/dist/tools/llm/simple/planning-tools.js.map +1 -1
  83. package/dist/tools/registry.d.ts.map +1 -1
  84. package/dist/tools/registry.js +4 -0
  85. package/dist/tools/registry.js.map +1 -1
  86. package/dist/types/index.d.ts +6 -0
  87. package/dist/types/index.d.ts.map +1 -1
  88. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ import { BrowserClient } from '../../tools/browser/browser-client.js';
2
+ export interface LoginIndicators {
3
+ urlPatterns: string[];
4
+ titlePatterns: string[];
5
+ }
6
+ export declare const ATLASSIAN_LOGIN_INDICATORS: LoginIndicators;
7
+ export declare function getProfileDir(): string;
8
+ export declare function getSubAgentCdpPort(): number;
9
+ export declare function getSubAgentBrowserClient(): BrowserClient;
10
+ export declare function launchSubAgentBrowser(headless?: boolean): Promise<boolean>;
11
+ export declare function closeSubAgentBrowser(): Promise<void>;
12
+ export declare function ensureAuthenticated(baseUrl: string, indicators: LoginIndicators): Promise<{
13
+ success: boolean;
14
+ error?: string;
15
+ }>;
16
+ //# sourceMappingURL=browser-profile-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-profile-manager.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/browser-profile-manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAOtE,MAAM,WAAW,eAAe;IAE9B,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,0BAA0B,EAAE,eAGxC,CAAC;AAKF,wBAAgB,aAAa,IAAI,MAAM,CAwCtC;AAKD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAQD,wBAAgB,wBAAwB,IAAI,aAAa,CAKxD;AAKD,wBAAsB,qBAAqB,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CActF;AAKD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1D;AAUD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiF/C"}
@@ -0,0 +1,149 @@
1
+ import * as path from 'path';
2
+ import * as fs from 'fs';
3
+ import { spawnSync } from 'child_process';
4
+ import { LOCAL_HOME_DIR } from '../../constants.js';
5
+ import { BrowserClient } from '../../tools/browser/browser-client.js';
6
+ import { getPlatform, getPowerShellPath } from '../../utils/platform-utils.js';
7
+ import { logger } from '../../utils/logger.js';
8
+ const PROFILE_DIR_NAME = 'browser-profile';
9
+ const SUB_AGENT_CDP_PORT = 9223;
10
+ export const ATLASSIAN_LOGIN_INDICATORS = {
11
+ urlPatterns: ['/login', '/authenticate', '/sso/', '/saml/'],
12
+ titlePatterns: ['Log in', 'Sign in', '로그인', 'SSO'],
13
+ };
14
+ export function getProfileDir() {
15
+ const platform = getPlatform();
16
+ if (platform === 'wsl') {
17
+ try {
18
+ const psPath = getPowerShellPath();
19
+ const psScript = "$d = Join-Path $env:LOCALAPPDATA 'hanseol-browser-profile'; if(-not(Test-Path $d)){New-Item -ItemType Directory -Path $d -Force | Out-Null}; Write-Output $d";
20
+ const result = spawnSync(psPath, ['-NoProfile', '-Command', psScript], {
21
+ encoding: 'utf-8',
22
+ timeout: 10000,
23
+ });
24
+ const profileDir = (result.stdout || '').trim();
25
+ if (profileDir && profileDir.includes('\\')) {
26
+ return profileDir;
27
+ }
28
+ }
29
+ catch { }
30
+ try {
31
+ const result = spawnSync('wslvar', ['LOCALAPPDATA'], { encoding: 'utf-8', timeout: 5000 });
32
+ const localAppData = (result.stdout || '').trim();
33
+ if (localAppData) {
34
+ return `${localAppData}\\hanseol-browser-profile`;
35
+ }
36
+ }
37
+ catch { }
38
+ return 'C:\\Users\\Default\\AppData\\Local\\hanseol-browser-profile';
39
+ }
40
+ if (platform === 'native-windows') {
41
+ const dir = path.join(process.env['LOCALAPPDATA'] || LOCAL_HOME_DIR, PROFILE_DIR_NAME);
42
+ if (!fs.existsSync(dir)) {
43
+ fs.mkdirSync(dir, { recursive: true });
44
+ }
45
+ return dir;
46
+ }
47
+ const dir = path.join(LOCAL_HOME_DIR, PROFILE_DIR_NAME);
48
+ if (!fs.existsSync(dir)) {
49
+ fs.mkdirSync(dir, { recursive: true });
50
+ }
51
+ return dir;
52
+ }
53
+ export function getSubAgentCdpPort() {
54
+ return SUB_AGENT_CDP_PORT;
55
+ }
56
+ let subAgentClient = null;
57
+ export function getSubAgentBrowserClient() {
58
+ if (!subAgentClient) {
59
+ subAgentClient = new BrowserClient();
60
+ }
61
+ return subAgentClient;
62
+ }
63
+ export async function launchSubAgentBrowser(headless = true) {
64
+ const client = getSubAgentBrowserClient();
65
+ if (await client.isRunning()) {
66
+ return true;
67
+ }
68
+ const result = await client.launch({
69
+ headless,
70
+ userDataDir: getProfileDir(),
71
+ cdpPort: SUB_AGENT_CDP_PORT,
72
+ });
73
+ return result.success;
74
+ }
75
+ export async function closeSubAgentBrowser() {
76
+ const client = getSubAgentBrowserClient();
77
+ if (await client.isRunning()) {
78
+ await client.close();
79
+ }
80
+ }
81
+ export async function ensureAuthenticated(baseUrl, indicators) {
82
+ const client = getSubAgentBrowserClient();
83
+ if (!(await client.isRunning())) {
84
+ const launched = await launchSubAgentBrowser(true);
85
+ if (!launched) {
86
+ return { success: false, error: 'Failed to launch browser' };
87
+ }
88
+ }
89
+ const navResult = await client.navigate(baseUrl);
90
+ if (!navResult.success) {
91
+ return { success: false, error: `Navigation failed: ${navResult.error}` };
92
+ }
93
+ await new Promise(resolve => setTimeout(resolve, 2000));
94
+ const pageInfo = await client.getPageInfo();
95
+ const currentUrl = pageInfo.url || '';
96
+ const currentTitle = pageInfo.title || '';
97
+ const isLoginPage = isOnLoginPage(currentUrl, currentTitle, indicators);
98
+ if (!isLoginPage) {
99
+ logger.info('[BrowserProfileManager] Already authenticated');
100
+ return { success: true };
101
+ }
102
+ logger.info('[BrowserProfileManager] Login required, switching to visible mode...');
103
+ await client.close();
104
+ await new Promise(resolve => setTimeout(resolve, 1000));
105
+ const visibleLaunched = await client.launch({
106
+ headless: false,
107
+ userDataDir: getProfileDir(),
108
+ cdpPort: SUB_AGENT_CDP_PORT,
109
+ });
110
+ if (!visibleLaunched.success) {
111
+ return { success: false, error: 'Failed to launch visible browser for login' };
112
+ }
113
+ await client.navigate(baseUrl);
114
+ logger.info('[BrowserProfileManager] Waiting for user to log in (up to 120s)...');
115
+ const loginTimeout = 120_000;
116
+ const loginStart = Date.now();
117
+ while (Date.now() - loginStart < loginTimeout) {
118
+ await new Promise(resolve => setTimeout(resolve, 3000));
119
+ const info = await client.getPageInfo();
120
+ const url = info.url || '';
121
+ const title = info.title || '';
122
+ if (!isOnLoginPage(url, title, indicators)) {
123
+ logger.info('[BrowserProfileManager] Login detected, switching back to headless...');
124
+ await client.close();
125
+ await new Promise(resolve => setTimeout(resolve, 1000));
126
+ const headlessLaunched = await launchSubAgentBrowser(true);
127
+ if (!headlessLaunched) {
128
+ return { success: false, error: 'Failed to relaunch headless after login' };
129
+ }
130
+ return { success: true };
131
+ }
132
+ }
133
+ await client.close();
134
+ return { success: false, error: 'Login timeout (120s). Please try again.' };
135
+ }
136
+ function isOnLoginPage(url, title, indicators) {
137
+ const urlLower = url.toLowerCase();
138
+ const titleLower = title.toLowerCase();
139
+ for (const pattern of indicators.urlPatterns) {
140
+ if (urlLower.includes(pattern.toLowerCase()))
141
+ return true;
142
+ }
143
+ for (const pattern of indicators.titlePatterns) {
144
+ if (titleLower.includes(pattern.toLowerCase()))
145
+ return true;
146
+ }
147
+ return false;
148
+ }
149
+ //# sourceMappingURL=browser-profile-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-profile-manager.js","sourceRoot":"","sources":["../../../src/agents/browser/browser-profile-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { LLMClient } from '../../core/llm/llm-client.js';
2
+ import { LLMSimpleTool, ToolResult } from '../../tools/types.js';
3
+ import { LoginIndicators } from './browser-profile-manager.js';
4
+ export interface BrowserSubAgentConfig {
5
+ requiresAuth: boolean;
6
+ serviceType: 'confluence' | 'jira' | 'search';
7
+ loginIndicators?: LoginIndicators;
8
+ }
9
+ export declare class BrowserSubAgent {
10
+ private llmClient;
11
+ private serviceName;
12
+ private tools;
13
+ private systemPrompt;
14
+ private config;
15
+ constructor(llmClient: LLMClient, serviceName: string, tools: LLMSimpleTool[], systemPrompt: string, config: BrowserSubAgentConfig);
16
+ run(instruction: string, sourceUrl?: string): Promise<ToolResult>;
17
+ private resolveServiceUrl;
18
+ private getUrlNotConfiguredMessage;
19
+ private bindToolsToClient;
20
+ private executeToolWithClient;
21
+ }
22
+ //# sourceMappingURL=browser-sub-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-sub-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/browser-sub-agent.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIjE,OAAO,EAKL,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC9C,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;gBAJN,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,EAAE,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,qBAAqB;IAGjC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0EvE,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,iBAAiB;YAaX,qBAAqB;CAyEpC"}
@@ -0,0 +1,165 @@
1
+ import { SubAgent } from '../common/sub-agent.js';
2
+ import { configManager } from '../../core/config/config-manager.js';
3
+ import { ensureAuthenticated, launchSubAgentBrowser, getSubAgentBrowserClient, ATLASSIAN_LOGIN_INDICATORS, } from './browser-profile-manager.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ export class BrowserSubAgent {
6
+ llmClient;
7
+ serviceName;
8
+ tools;
9
+ systemPrompt;
10
+ config;
11
+ constructor(llmClient, serviceName, tools, systemPrompt, config) {
12
+ this.llmClient = llmClient;
13
+ this.serviceName = serviceName;
14
+ this.tools = tools;
15
+ this.systemPrompt = systemPrompt;
16
+ this.config = config;
17
+ }
18
+ async run(instruction, sourceUrl) {
19
+ const startTime = Date.now();
20
+ try {
21
+ const url = sourceUrl || this.resolveServiceUrl();
22
+ if (!url && this.config.serviceType !== 'search') {
23
+ return {
24
+ success: false,
25
+ error: this.getUrlNotConfiguredMessage(),
26
+ };
27
+ }
28
+ const launched = await launchSubAgentBrowser(true);
29
+ if (!launched) {
30
+ return {
31
+ success: false,
32
+ error: 'Failed to launch browser. Chrome or Edge must be installed.',
33
+ };
34
+ }
35
+ if (this.config.requiresAuth && url) {
36
+ const indicators = this.config.loginIndicators || ATLASSIAN_LOGIN_INDICATORS;
37
+ const authResult = await ensureAuthenticated(url, indicators);
38
+ if (!authResult.success) {
39
+ return {
40
+ success: false,
41
+ error: `Authentication failed: ${authResult.error}`,
42
+ };
43
+ }
44
+ }
45
+ const enrichedInstruction = url
46
+ ? `[Target URL: ${url}]\n\n${instruction}`
47
+ : instruction;
48
+ const client = getSubAgentBrowserClient();
49
+ const boundTools = this.bindToolsToClient(client);
50
+ const agent = new SubAgent(this.llmClient, this.serviceName, boundTools, this.systemPrompt, { maxIterations: 25 });
51
+ const result = await agent.run(enrichedInstruction);
52
+ const duration = Date.now() - startTime;
53
+ logger.info(`BrowserSubAgent[${this.serviceName}] completed`, {
54
+ success: result.success,
55
+ duration,
56
+ });
57
+ return result;
58
+ }
59
+ catch (error) {
60
+ const errorMsg = error instanceof Error ? error.message : String(error);
61
+ logger.error(`BrowserSubAgent[${this.serviceName}] error`, { error: errorMsg });
62
+ return {
63
+ success: false,
64
+ error: `Browser sub-agent error: ${errorMsg}`,
65
+ };
66
+ }
67
+ }
68
+ resolveServiceUrl() {
69
+ try {
70
+ const config = configManager.getConfig();
71
+ const services = config.browserServices || [];
72
+ const first = services.find(s => s.type === this.config.serviceType);
73
+ return first?.url;
74
+ }
75
+ catch {
76
+ return undefined;
77
+ }
78
+ }
79
+ getUrlNotConfiguredMessage() {
80
+ const typeLabel = this.config.serviceType === 'confluence' ? 'Confluence' : 'Jira';
81
+ return `${typeLabel} URL is not configured.\n\n` +
82
+ `How to configure: Add browserServices to config.json.\n` +
83
+ `Example:\n` +
84
+ `{\n` +
85
+ ` "browserServices": [\n` +
86
+ ` { "type": "${this.config.serviceType}", "name": "My ${typeLabel}", "url": "https://${this.config.serviceType}.example.com" }\n` +
87
+ ` ]\n` +
88
+ `}`;
89
+ }
90
+ bindToolsToClient(client) {
91
+ return this.tools.map(tool => ({
92
+ ...tool,
93
+ execute: async (args) => {
94
+ const toolName = tool.definition.function.name;
95
+ return this.executeToolWithClient(toolName, args, client);
96
+ },
97
+ }));
98
+ }
99
+ async executeToolWithClient(toolName, args, client) {
100
+ try {
101
+ let result;
102
+ switch (toolName) {
103
+ case 'browser_navigate':
104
+ result = await client.navigate(args['url']);
105
+ break;
106
+ case 'browser_screenshot':
107
+ result = await client.screenshot(args['full_page']);
108
+ if (result.success && result.image) {
109
+ return { success: true, result: `Screenshot captured (base64 image, ${(result.image || '').length} chars)` };
110
+ }
111
+ break;
112
+ case 'browser_click':
113
+ result = await client.click(args['selector']);
114
+ break;
115
+ case 'browser_fill':
116
+ result = await client.fill(args['selector'], args['value']);
117
+ break;
118
+ case 'browser_get_text':
119
+ result = await client.getText(args['selector']);
120
+ break;
121
+ case 'browser_get_html':
122
+ result = await client.getHtml();
123
+ break;
124
+ case 'browser_get_page_info':
125
+ result = await client.getPageInfo();
126
+ break;
127
+ case 'browser_focus':
128
+ result = await client.focus();
129
+ break;
130
+ case 'browser_press_key':
131
+ result = await client.pressKey(args['key'], args['selector']);
132
+ break;
133
+ case 'browser_type':
134
+ result = await client.type(args['text'], args['selector']);
135
+ break;
136
+ case 'browser_execute_script':
137
+ result = await client.executeScript(args['script']);
138
+ break;
139
+ case 'browser_wait':
140
+ result = await client.waitFor(args['selector'], args['timeout']);
141
+ break;
142
+ case 'browser_send':
143
+ result = await client.send(args['method'], args['params']);
144
+ break;
145
+ default:
146
+ return { success: false, error: `Unknown browser tool: ${toolName}` };
147
+ }
148
+ if (!result.success) {
149
+ return { success: false, error: result.error || 'Unknown error' };
150
+ }
151
+ const { success: _, error: _err, ...rest } = result;
152
+ const resultText = Object.keys(rest).length > 0
153
+ ? JSON.stringify(rest, null, 2)
154
+ : result['message'] || '(success)';
155
+ return { success: true, result: typeof resultText === 'string' ? resultText : JSON.stringify(resultText) };
156
+ }
157
+ catch (error) {
158
+ return {
159
+ success: false,
160
+ error: `Tool execution error: ${error instanceof Error ? error.message : String(error)}`,
161
+ };
162
+ }
163
+ }
164
+ }
165
+ //# sourceMappingURL=browser-sub-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-sub-agent.js","sourceRoot":"","sources":["../../../src/agents/browser/browser-sub-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { LLMAgentTool } from '../../tools/types.js';
2
+ export declare function createConfluenceRequestTool(): LLMAgentTool;
3
+ //# sourceMappingURL=confluence-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/confluence-agent.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKpD,wBAAgB,2BAA2B,IAAI,YAAY,CAqC1D"}
@@ -0,0 +1,35 @@
1
+ import { BROWSER_SUB_AGENT_TOOLS } from '../../tools/browser/browser-tools.js';
2
+ import { BrowserSubAgent } from './browser-sub-agent.js';
3
+ import { CONFLUENCE_SYSTEM_PROMPT } from './prompts.js';
4
+ export function createConfluenceRequestTool() {
5
+ return {
6
+ definition: {
7
+ type: 'function',
8
+ function: {
9
+ name: 'confluence_request',
10
+ description: 'Delegate a task to the Confluence specialist agent. Capable of page creation/editing, search, comments, reading content, and all Confluence operations. Describe the desired task in natural language.',
11
+ parameters: {
12
+ type: 'object',
13
+ properties: {
14
+ instruction: {
15
+ type: 'string',
16
+ description: 'Natural language instruction for the Confluence task to perform',
17
+ },
18
+ source: {
19
+ type: 'string',
20
+ description: 'Confluence URL to use (specify a particular instance when multiple URLs are configured)',
21
+ },
22
+ },
23
+ required: ['instruction'],
24
+ },
25
+ },
26
+ },
27
+ execute: async (args, llmClient) => {
28
+ const agent = new BrowserSubAgent(llmClient, 'confluence', BROWSER_SUB_AGENT_TOOLS, CONFLUENCE_SYSTEM_PROMPT, { requiresAuth: true, serviceType: 'confluence' });
29
+ return agent.run(args['instruction'], args['source']);
30
+ },
31
+ categories: ['llm-agent'],
32
+ requiresSubLLM: true,
33
+ };
34
+ }
35
+ //# sourceMappingURL=confluence-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-agent.js","sourceRoot":"","sources":["../../../src/agents/browser/confluence-agent.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EACT,wMAAwM;gBAC1M,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,WAAW,EAAE;4BACX,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,iEAAiE;yBAC/E;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,yFAAyF;yBACvG;qBACF;oBACD,QAAQ,EAAE,CAAC,aAAa,CAAC;iBAC1B;aACF;SACF;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,SAAS,EACT,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAClD,CAAC;YACF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAW,EAAE,IAAI,CAAC,QAAQ,CAAuB,CAAC,CAAC;QACxF,CAAC;QACD,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createConfluenceRequestTool } from './confluence-agent.js';
2
+ export { createJiraRequestTool } from './jira-agent.js';
3
+ export { createSearchRequestTool } from './search-agent.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createConfluenceRequestTool } from './confluence-agent.js';
2
+ export { createJiraRequestTool } from './jira-agent.js';
3
+ export { createSearchRequestTool } from './search-agent.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/browser/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { LLMAgentTool } from '../../tools/types.js';
2
+ export declare function createJiraRequestTool(): LLMAgentTool;
3
+ //# sourceMappingURL=jira-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/jira-agent.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKpD,wBAAgB,qBAAqB,IAAI,YAAY,CAqCpD"}
@@ -0,0 +1,35 @@
1
+ import { BROWSER_SUB_AGENT_TOOLS } from '../../tools/browser/browser-tools.js';
2
+ import { BrowserSubAgent } from './browser-sub-agent.js';
3
+ import { JIRA_SYSTEM_PROMPT } from './prompts.js';
4
+ export function createJiraRequestTool() {
5
+ return {
6
+ definition: {
7
+ type: 'function',
8
+ function: {
9
+ name: 'jira_request',
10
+ description: 'Delegate a task to the Jira specialist agent. Capable of issue viewing/creation/editing, comments, status transitions, JQL search, and all Jira operations. Describe the desired task in natural language.',
11
+ parameters: {
12
+ type: 'object',
13
+ properties: {
14
+ instruction: {
15
+ type: 'string',
16
+ description: 'Natural language instruction for the Jira task to perform',
17
+ },
18
+ source: {
19
+ type: 'string',
20
+ description: 'Jira URL to use (specify a particular instance when multiple URLs are configured)',
21
+ },
22
+ },
23
+ required: ['instruction'],
24
+ },
25
+ },
26
+ },
27
+ execute: async (args, llmClient) => {
28
+ const agent = new BrowserSubAgent(llmClient, 'jira', BROWSER_SUB_AGENT_TOOLS, JIRA_SYSTEM_PROMPT, { requiresAuth: true, serviceType: 'jira' });
29
+ return agent.run(args['instruction'], args['source']);
30
+ },
31
+ categories: ['llm-agent'],
32
+ requiresSubLLM: true,
33
+ };
34
+ }
35
+ //# sourceMappingURL=jira-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-agent.js","sourceRoot":"","sources":["../../../src/agents/browser/jira-agent.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,cAAc;gBACpB,WAAW,EACT,4MAA4M;gBAC9M,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,WAAW,EAAE;4BACX,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,2DAA2D;yBACzE;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mFAAmF;yBACjG;qBACF;oBACD,QAAQ,EAAE,CAAC,aAAa,CAAC;iBAC1B;aACF;SACF;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,SAAS,EACT,MAAM,EACN,uBAAuB,EACvB,kBAAkB,EAClB,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAC5C,CAAC;YACF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAW,EAAE,IAAI,CAAC,QAAQ,CAAuB,CAAC,CAAC;QACxF,CAAC;QACD,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const CONFLUENCE_SYSTEM_PROMPT = "You are an elite browser automation agent.\nExecute the user's instruction using the available browser tools.\nWhen the task is complete, you MUST call the \"complete\" tool with a detailed summary.\nCall only one tool at a time. After each tool result, decide the next step.\nAlways respond in the same language as the user's instruction.\n\n\u2550\u2550\u2550 TOOL USAGE \u2550\u2550\u2550\n\u2022 browser_navigate: Navigate to a URL\n\u2022 browser_click: Click an element by CSS selector\n\u2022 browser_fill: Fill a value into an input field\n\u2022 browser_type: Type text character by character\n\u2022 browser_get_text: Get text from page/element (omit selector for full page)\n\u2022 browser_get_html: Get the page HTML\n\u2022 browser_get_page_info: Get current URL, title, and basic info\n\u2022 browser_screenshot: Take a screenshot (for debugging)\n\u2022 browser_execute_script: Execute JavaScript (DOM manipulation, data extraction)\n\u2022 browser_wait: Wait until a CSS selector appears\n\u2022 browser_press_key: Press a keyboard key (Enter, Tab, Escape, etc.)\n\u2022 browser_focus: Focus the browser window\n\u2022 browser_send: Send a raw CDP command\n\n\u2550\u2550\u2550 NAVIGATION STRATEGY \u2550\u2550\u2550\n1. If [Target URL] is provided, use that URL as the starting point\n2. After page load, always check current state with browser_get_page_info\n3. For dynamic pages, use browser_wait to wait for element loading before proceeding\n4. In SPAs (Single Page Apps), DOM may change without URL change \u2192 verify with browser_get_text/get_html\n\n\u2550\u2550\u2550 SELECTOR STRATEGY \u2550\u2550\u2550\nCSS selector priority:\n1. [data-testid=\"...\"], [data-test=\"...\"] \u2014 Test attributes (most stable)\n2. #id \u2014 ID selectors\n3. [aria-label=\"...\"], [role=\"...\"] \u2014 Accessibility attributes\n4. .className \u2014 Classes (may change with frameworks)\n5. Tag combinations \u2014 div > span:nth-child(2) (last resort)\nIf page structure is unknown, check with browser_get_html first.\n\n\u2550\u2550\u2550 ERROR RECOVERY \u2550\u2550\u2550\n1. Click/input fails \u2192 use browser_wait for element, then retry\n2. Selector not found \u2192 use browser_get_html to inspect actual DOM, then fix selector\n3. Page not loaded \u2192 check URL with browser_get_page_info \u2192 re-navigate if needed\n4. Try at least 2 different approaches before reporting failure\n\n\u2550\u2550\u2550 CONFLUENCE EXPERT \u2550\u2550\u2550\nYou are a Confluence automation specialist.\n\n\u2550\u2550\u2550 COMMON CONFLUENCE URLS \u2550\u2550\u2550\n\u2022 Main page: {baseUrl}/wiki/spaces/{spaceKey}/overview\n\u2022 View page: {baseUrl}/wiki/spaces/{spaceKey}/pages/{pageId}\n\u2022 Create page: {baseUrl}/wiki/spaces/{spaceKey}/pages/create\n\u2022 Search: {baseUrl}/wiki/search?text={query}\n\u2022 Space list: {baseUrl}/wiki/spaces\n\n\u2550\u2550\u2550 PAGE VIEWING \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 target page URL\nSTEP 2: browser_wait \u2192 \"#content\" or \".wiki-content\" (wait for page content to load)\nSTEP 3: browser_get_text \u2192 \"#content\" or \"#main-content\" (extract body text)\nSTEP 4: complete \u2192 return organized content\n\n\u2550\u2550\u2550 PAGE EDITING \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 page URL\nSTEP 2: Click edit button: browser_click \u2192 \"#editPageLink\" or \"button[aria-label='Edit']\" or \"a[href*='editpage']\"\n \u26A0 Confluence Cloud: \".css-1vdy7v\" or \"[data-testid='edit-button']\"\n \u26A0 Confluence Server: \"#editPageLink\"\nSTEP 3: Wait for editor: browser_wait \u2192 \".ProseMirror\" or \"#tinymce\" or \"#wysiwygTextarea\"\nSTEP 4: Modify content:\n \u2022 Confluence Cloud (ProseMirror editor):\n - browser_click \u2192 \".ProseMirror\" (focus editor)\n - browser_execute_script \u2192 document.querySelector('.ProseMirror').innerHTML to check current content\n - browser_type or browser_execute_script to modify content\n \u2022 Confluence Server (TinyMCE):\n - browser_execute_script \u2192 tinymce.activeEditor.getContent() to check current content\n - browser_execute_script \u2192 tinymce.activeEditor.setContent(html) to set content\nSTEP 5: Save:\n \u2022 browser_click \u2192 \"#rte-button-publish\" or \"[data-testid='publish-button']\" or \"button:has-text('Publish')\"\n \u2022 or browser_press_key \u2192 \"Control+s\" (shortcut)\nSTEP 6: Verify save, then complete\n\n\u2550\u2550\u2550 PAGE CREATION \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 {baseUrl}/wiki/spaces/{spaceKey}/pages/create\n or \"+\" button: browser_click \u2192 \"[data-testid='create-button']\"\nSTEP 2: Wait for editor: browser_wait \u2192 \".ProseMirror\" or \"#tinymce\"\nSTEP 3: Enter title: browser_fill \u2192 \"[data-testid='title-text-area']\" or \"#content-title\"\nSTEP 4: Write body (same as EDITING STEP 4)\nSTEP 5: Save (same as EDITING STEP 5)\n\n\u2550\u2550\u2550 SEARCH \u2550\u2550\u2550\nbrowser_navigate \u2192 {baseUrl}/wiki/search?text={encodedQuery}\nbrowser_wait \u2192 \".search-results\" or \"[data-testid='search-results']\"\nbrowser_get_text \u2192 search results area\n\n\u2550\u2550\u2550 COMMENT \u2550\u2550\u2550\nPage bottom comment area:\nbrowser_click \u2192 \"#comments-section-title\" or \"button:has-text('Add comment')\"\nbrowser_wait \u2192 wait for comment editor to load\nbrowser_type \u2192 comment content\nbrowser_click \u2192 save button\n\n\u2550\u2550\u2550 IMPORTANT \u2550\u2550\u2550\n\u2022 Confluence Cloud vs Server have different DOM structures \u2192 check with browser_get_html first\n\u2022 Editor content may be inside an iframe \u2192 use browser_execute_script to access iframe content\n\u2022 After saving, always verify the page displays correctly \u2192 check URL with browser_get_page_info";
2
+ export declare const JIRA_SYSTEM_PROMPT = "You are an elite browser automation agent.\nExecute the user's instruction using the available browser tools.\nWhen the task is complete, you MUST call the \"complete\" tool with a detailed summary.\nCall only one tool at a time. After each tool result, decide the next step.\nAlways respond in the same language as the user's instruction.\n\n\u2550\u2550\u2550 TOOL USAGE \u2550\u2550\u2550\n\u2022 browser_navigate: Navigate to a URL\n\u2022 browser_click: Click an element by CSS selector\n\u2022 browser_fill: Fill a value into an input field\n\u2022 browser_type: Type text character by character\n\u2022 browser_get_text: Get text from page/element (omit selector for full page)\n\u2022 browser_get_html: Get the page HTML\n\u2022 browser_get_page_info: Get current URL, title, and basic info\n\u2022 browser_screenshot: Take a screenshot (for debugging)\n\u2022 browser_execute_script: Execute JavaScript (DOM manipulation, data extraction)\n\u2022 browser_wait: Wait until a CSS selector appears\n\u2022 browser_press_key: Press a keyboard key (Enter, Tab, Escape, etc.)\n\u2022 browser_focus: Focus the browser window\n\u2022 browser_send: Send a raw CDP command\n\n\u2550\u2550\u2550 NAVIGATION STRATEGY \u2550\u2550\u2550\n1. If [Target URL] is provided, use that URL as the starting point\n2. After page load, always check current state with browser_get_page_info\n3. For dynamic pages, use browser_wait to wait for element loading before proceeding\n4. In SPAs (Single Page Apps), DOM may change without URL change \u2192 verify with browser_get_text/get_html\n\n\u2550\u2550\u2550 SELECTOR STRATEGY \u2550\u2550\u2550\nCSS selector priority:\n1. [data-testid=\"...\"], [data-test=\"...\"] \u2014 Test attributes (most stable)\n2. #id \u2014 ID selectors\n3. [aria-label=\"...\"], [role=\"...\"] \u2014 Accessibility attributes\n4. .className \u2014 Classes (may change with frameworks)\n5. Tag combinations \u2014 div > span:nth-child(2) (last resort)\nIf page structure is unknown, check with browser_get_html first.\n\n\u2550\u2550\u2550 ERROR RECOVERY \u2550\u2550\u2550\n1. Click/input fails \u2192 use browser_wait for element, then retry\n2. Selector not found \u2192 use browser_get_html to inspect actual DOM, then fix selector\n3. Page not loaded \u2192 check URL with browser_get_page_info \u2192 re-navigate if needed\n4. Try at least 2 different approaches before reporting failure\n\n\u2550\u2550\u2550 JIRA EXPERT \u2550\u2550\u2550\nYou are a Jira automation specialist.\n\n\u2550\u2550\u2550 COMMON JIRA URLS \u2550\u2550\u2550\n\u2022 Issue detail: {baseUrl}/browse/{issueKey} (e.g., PROJ-1234)\n\u2022 Board: {baseUrl}/jira/software/projects/{projectKey}/board\n\u2022 Backlog: {baseUrl}/jira/software/projects/{projectKey}/backlog\n\u2022 JQL search: {baseUrl}/issues/?jql={encodedJQL}\n\u2022 Create issue: {baseUrl}/secure/CreateIssue!default.jspa\n\u2022 Dashboard: {baseUrl}/jira/dashboards\n\n\u2550\u2550\u2550 ISSUE VIEWING \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 {baseUrl}/browse/{issueKey}\nSTEP 2: browser_wait \u2192 \"#summary-val\" or \"[data-testid='issue.views.issue-base.foundation.summary.heading']\"\nSTEP 3: Collect information:\n \u2022 Title: browser_get_text \u2192 \"#summary-val\" or \"h1[data-testid*='summary']\"\n \u2022 Status: browser_get_text \u2192 \"#status-val\" or \"[data-testid='issue.views.issue-base.foundation.status.status-field-wrapper']\"\n \u2022 Assignee: browser_get_text \u2192 \"#assignee-val\" or \"[data-testid*='assignee']\"\n \u2022 Description: browser_get_text \u2192 \"#description-val\" or \"[data-testid*='description']\"\n \u2022 Comments: browser_get_text \u2192 \"#activitymodule\" or \".issue-body-content\"\nSTEP 4: complete \u2192 return organized information\n\n\u2550\u2550\u2550 JQL SEARCH \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 {baseUrl}/issues/?jql={encodedJQL}\n \u2022 e.g.: status=\"In Progress\" AND assignee=currentUser()\n \u2022 e.g.: project=PROJ AND type=Bug AND status!=Done\nSTEP 2: browser_wait \u2192 \".issue-list\" or \"[data-testid='issue-navigator']\"\nSTEP 3: browser_get_text \u2192 search results area\n or browser_execute_script to extract structured table data\nSTEP 4: complete \u2192 organize results\n\n\u2550\u2550\u2550 ISSUE CREATION \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 {baseUrl}/secure/CreateIssue!default.jspa\n or browser_click \u2192 \"[data-testid='global-create-button']\" or \"#create-menu\"\nSTEP 2: browser_wait \u2192 \"#create-issue-dialog\" or \"[data-testid='create-issue-dialog']\"\nSTEP 3: Fill fields:\n \u2022 Project: browser_fill or browser_click \u2192 project selector\n \u2022 Issue type: browser_fill \u2192 \"#issuetype-field\" or dropdown\n \u2022 Summary: browser_fill \u2192 \"#summary\" or \"[data-testid*='summary']\"\n \u2022 Description: browser_fill/type \u2192 \"#description\" or editor area\n \u2022 Assignee: browser_fill \u2192 \"#assignee-field\"\n \u2022 Priority: browser_fill \u2192 \"#priority-field\"\nSTEP 4: browser_click \u2192 \"#create-issue-submit\" or \"button:has-text('Create')\"\nSTEP 5: Verify creation \u2192 complete\n\n\u2550\u2550\u2550 ISSUE EDITING \u2550\u2550\u2550\nInline editing on issue detail page:\n\u2022 Edit summary: click title \u2192 editor activates \u2192 edit \u2192 Enter/check button\n\u2022 Edit description: click description area \u2192 editor \u2192 edit \u2192 save\n\u2022 Change status: click status button \u2192 select transition\n\u2022 Change assignee: click assignee field \u2192 search \u2192 select\n\n\u2550\u2550\u2550 COMMENT \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 {baseUrl}/browse/{issueKey}\nSTEP 2: Scroll to comment area: browser_click \u2192 \"#footer-comment-button\" or \"button:has-text('Add a comment')\"\nSTEP 3: browser_wait \u2192 wait for comment editor to load\nSTEP 4: browser_type \u2192 comment content\nSTEP 5: browser_click \u2192 save button\nSTEP 6: Verify save \u2192 complete\n\n\u2550\u2550\u2550 STATUS TRANSITION \u2550\u2550\u2550\nSTEP 1: Click status button on issue detail page\n browser_click \u2192 \"#action_id_*\" or \"[data-testid*='status']\" or \".aui-lozenge\"\nSTEP 2: If transition dialog appears, fill required fields\nSTEP 3: browser_click \u2192 confirm/transition button\n\n\u2550\u2550\u2550 IMPORTANT \u2550\u2550\u2550\n\u2022 Jira Cloud vs Server/Data Center have different DOM structures \u2192 check with browser_get_html first\n\u2022 Next-gen (Team-managed) vs Classic (Company-managed) projects have different UIs\n\u2022 Inline editing: Escape to cancel, Enter/checkmark to save\n\u2022 Special characters in JQL need URL encoding";
3
+ export declare const SEARCH_SYSTEM_PROMPT = "You are an elite browser automation agent.\nExecute the user's instruction using the available browser tools.\nWhen the task is complete, you MUST call the \"complete\" tool with a detailed summary.\nCall only one tool at a time. After each tool result, decide the next step.\nAlways respond in the same language as the user's instruction.\n\n\u2550\u2550\u2550 TOOL USAGE \u2550\u2550\u2550\n\u2022 browser_navigate: Navigate to a URL\n\u2022 browser_click: Click an element by CSS selector\n\u2022 browser_fill: Fill a value into an input field\n\u2022 browser_type: Type text character by character\n\u2022 browser_get_text: Get text from page/element (omit selector for full page)\n\u2022 browser_get_html: Get the page HTML\n\u2022 browser_get_page_info: Get current URL, title, and basic info\n\u2022 browser_screenshot: Take a screenshot (for debugging)\n\u2022 browser_execute_script: Execute JavaScript (DOM manipulation, data extraction)\n\u2022 browser_wait: Wait until a CSS selector appears\n\u2022 browser_press_key: Press a keyboard key (Enter, Tab, Escape, etc.)\n\u2022 browser_focus: Focus the browser window\n\u2022 browser_send: Send a raw CDP command\n\n\u2550\u2550\u2550 NAVIGATION STRATEGY \u2550\u2550\u2550\n1. If [Target URL] is provided, use that URL as the starting point\n2. After page load, always check current state with browser_get_page_info\n3. For dynamic pages, use browser_wait to wait for element loading before proceeding\n4. In SPAs (Single Page Apps), DOM may change without URL change \u2192 verify with browser_get_text/get_html\n\n\u2550\u2550\u2550 SELECTOR STRATEGY \u2550\u2550\u2550\nCSS selector priority:\n1. [data-testid=\"...\"], [data-test=\"...\"] \u2014 Test attributes (most stable)\n2. #id \u2014 ID selectors\n3. [aria-label=\"...\"], [role=\"...\"] \u2014 Accessibility attributes\n4. .className \u2014 Classes (may change with frameworks)\n5. Tag combinations \u2014 div > span:nth-child(2) (last resort)\nIf page structure is unknown, check with browser_get_html first.\n\n\u2550\u2550\u2550 ERROR RECOVERY \u2550\u2550\u2550\n1. Click/input fails \u2192 use browser_wait for element, then retry\n2. Selector not found \u2192 use browser_get_html to inspect actual DOM, then fix selector\n3. Page not loaded \u2192 check URL with browser_get_page_info \u2192 re-navigate if needed\n4. Try at least 2 different approaches before reporting failure\n\n\u2550\u2550\u2550 SEARCH EXPERT \u2550\u2550\u2550\nYou are a web search and information extraction specialist.\n\n\u2550\u2550\u2550 SEARCH ENGINES \u2550\u2550\u2550\n\nGoogle:\n\u2022 URL: https://www.google.com/search?q={encodedQuery}\n\u2022 Result selector: \"#search .g\" or \"[data-header-feature]\"\n\u2022 Links: \".g a[href]\"\n\u2022 Titles: \".g h3\"\n\u2022 Snippets: \".g .VwiC3b\" or \".g [data-sncf]\"\n\u2022 Next page: \"#pnnext\"\n\nStackOverflow:\n\u2022 URL: https://stackoverflow.com/search?q={encodedQuery}\n\u2022 Result selector: \".s-post-summary\"\n\u2022 Title: \".s-post-summary--content-title a\"\n\u2022 Excerpt: \".s-post-summary--content-excerpt\"\n\u2022 Vote count: \".s-post-summary--stats-item-number\"\n\u2022 Answer page: click link, then \".answercell .s-prose\" or \"#answers .answer\"\n\nNaver:\n\u2022 URL: https://search.naver.com/search.naver?query={encodedQuery}\n\u2022 Blog results: \".api_txt_lines\"\n\u2022 Knowledge Q&A: \".question_text\"\n\u2022 Web documents: \".total_area\"\n\n\u2550\u2550\u2550 SEARCH WORKFLOW \u2550\u2550\u2550\nSTEP 1: browser_navigate \u2192 search URL (query URL-encoded)\nSTEP 2: browser_wait \u2192 wait for results to load (refer to selectors above)\nSTEP 3: browser_get_text \u2192 collect text from search results area\n or browser_execute_script for structured data extraction:\n ```javascript\n // Google result extraction example\n Array.from(document.querySelectorAll('#search .g')).slice(0, 10).map(el => ({\n title: el.querySelector('h3')?.textContent || '',\n url: el.querySelector('a')?.href || '',\n snippet: el.querySelector('.VwiC3b')?.textContent || ''\n }))\n ```\nSTEP 4: If detailed info is needed, visit individual links:\n browser_navigate \u2192 result URL\n browser_get_text \u2192 page body\nSTEP 5: complete \u2192 return organized search results\n\n\u2550\u2550\u2550 STACKOVERFLOW DEEP SEARCH \u2550\u2550\u2550\nFor coding-related questions:\nSTEP 1: Search StackOverflow\nSTEP 2: Click the most relevant question (considering vote count)\nSTEP 3: browser_get_text \u2192 collect question + accepted answer\nSTEP 4: Collect other answers if needed\nSTEP 5: complete \u2192 organize questions/answers cleanly\n\n\u2550\u2550\u2550 MULTI-ENGINE SEARCH \u2550\u2550\u2550\nIf no specific engine is mentioned in the instruction, default to Google.\nUser may specify engine in their language (e.g., \"search on Naver\", \"search on StackOverflow\").\nWhen combining results from multiple engines: search each engine sequentially \u2192 merge results.\n\n\u2550\u2550\u2550 IMPORTANT \u2550\u2550\u2550\n\u2022 Google may trigger automation detection (CAPTCHA) \u2192 report in complete if detected\n\u2022 Exclude ads/sponsored results when extracting search results\n\u2022 Collect at most 10 results (avoid excessive scrolling)\n\u2022 Korean text in search queries must be URL-encoded";
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/agents/browser/prompts.ts"],"names":[],"mappings":"AAiDA,eAAO,MAAM,wBAAwB,wqLA4D4D,CAAC;AAElG,eAAO,MAAM,kBAAkB,0hNAwEe,CAAC;AAE/C,eAAO,MAAM,oBAAoB,8sKAgEmB,CAAC"}