@marktoflow/integrations 2.0.0-alpha.7 → 2.0.0-alpha.9
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 +738 -9
- package/dist/adapters/claude-agent-hooks.d.ts +176 -0
- package/dist/adapters/claude-agent-hooks.d.ts.map +1 -0
- package/dist/adapters/claude-agent-hooks.js +339 -0
- package/dist/adapters/claude-agent-hooks.js.map +1 -0
- package/dist/adapters/claude-agent-types.d.ts +426 -0
- package/dist/adapters/claude-agent-types.d.ts.map +1 -0
- package/dist/adapters/claude-agent-types.js +62 -0
- package/dist/adapters/claude-agent-types.js.map +1 -0
- package/dist/adapters/claude-agent-workflow.d.ts +393 -0
- package/dist/adapters/claude-agent-workflow.d.ts.map +1 -0
- package/dist/adapters/claude-agent-workflow.js +445 -0
- package/dist/adapters/claude-agent-workflow.js.map +1 -0
- package/dist/adapters/claude-agent.d.ts +171 -0
- package/dist/adapters/claude-agent.d.ts.map +1 -0
- package/dist/adapters/claude-agent.js +468 -0
- package/dist/adapters/claude-agent.js.map +1 -0
- package/dist/adapters/codex-types.d.ts +463 -0
- package/dist/adapters/codex-types.d.ts.map +1 -0
- package/dist/adapters/codex-types.js +53 -0
- package/dist/adapters/codex-types.js.map +1 -0
- package/dist/adapters/codex-workflow.d.ts +414 -0
- package/dist/adapters/codex-workflow.d.ts.map +1 -0
- package/dist/adapters/codex-workflow.js +470 -0
- package/dist/adapters/codex-workflow.js.map +1 -0
- package/dist/adapters/codex.d.ts +136 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +390 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/github-copilot-types.d.ts +1012 -0
- package/dist/adapters/github-copilot-types.d.ts.map +1 -0
- package/dist/adapters/github-copilot-types.js +80 -0
- package/dist/adapters/github-copilot-types.js.map +1 -0
- package/dist/adapters/github-copilot-workflow.d.ts +462 -0
- package/dist/adapters/github-copilot-workflow.d.ts.map +1 -0
- package/dist/adapters/github-copilot-workflow.js +473 -0
- package/dist/adapters/github-copilot-workflow.js.map +1 -0
- package/dist/adapters/github-copilot.d.ts +221 -37
- package/dist/adapters/github-copilot.d.ts.map +1 -1
- package/dist/adapters/github-copilot.js +336 -58
- package/dist/adapters/github-copilot.js.map +1 -1
- package/dist/adapters/opencode.d.ts +2 -0
- package/dist/adapters/opencode.d.ts.map +1 -1
- package/dist/adapters/opencode.js +6 -0
- package/dist/adapters/opencode.js.map +1 -1
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -1
- package/dist/services/ai-browser.d.ts +112 -0
- package/dist/services/ai-browser.d.ts.map +1 -0
- package/dist/services/ai-browser.js +363 -0
- package/dist/services/ai-browser.js.map +1 -0
- package/dist/services/asana.d.ts +159 -0
- package/dist/services/asana.d.ts.map +1 -0
- package/dist/services/asana.js +196 -0
- package/dist/services/asana.js.map +1 -0
- package/dist/services/aws-s3.d.ts +89 -0
- package/dist/services/aws-s3.d.ts.map +1 -0
- package/dist/services/aws-s3.js +154 -0
- package/dist/services/aws-s3.js.map +1 -0
- package/dist/services/dropbox.d.ts +134 -0
- package/dist/services/dropbox.d.ts.map +1 -0
- package/dist/services/dropbox.js +190 -0
- package/dist/services/dropbox.js.map +1 -0
- package/dist/services/mailchimp.d.ts +169 -0
- package/dist/services/mailchimp.d.ts.map +1 -0
- package/dist/services/mailchimp.js +180 -0
- package/dist/services/mailchimp.js.map +1 -0
- package/dist/services/playwright.d.ts +678 -0
- package/dist/services/playwright.d.ts.map +1 -0
- package/dist/services/playwright.js +1141 -0
- package/dist/services/playwright.js.map +1 -0
- package/dist/services/sendgrid.d.ts +43 -0
- package/dist/services/sendgrid.d.ts.map +1 -0
- package/dist/services/sendgrid.js +87 -0
- package/dist/services/sendgrid.js.map +1 -0
- package/dist/services/shopify.d.ts +160 -0
- package/dist/services/shopify.d.ts.map +1 -0
- package/dist/services/shopify.js +166 -0
- package/dist/services/shopify.js.map +1 -0
- package/dist/services/stripe.d.ts +275 -0
- package/dist/services/stripe.d.ts.map +1 -0
- package/dist/services/stripe.js +229 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/services/teams.d.ts +224 -0
- package/dist/services/teams.d.ts.map +1 -0
- package/dist/services/teams.js +229 -0
- package/dist/services/teams.js.map +1 -0
- package/dist/services/trello.d.ts +160 -0
- package/dist/services/trello.d.ts.map +1 -0
- package/dist/services/trello.js +194 -0
- package/dist/services/trello.js.map +1 -0
- package/dist/services/twilio.d.ts +126 -0
- package/dist/services/twilio.d.ts.map +1 -0
- package/dist/services/twilio.js +153 -0
- package/dist/services/twilio.js.map +1 -0
- package/dist/services/zendesk.d.ts +134 -0
- package/dist/services/zendesk.d.ts.map +1 -0
- package/dist/services/zendesk.js +148 -0
- package/dist/services/zendesk.js.map +1 -0
- package/package.json +26 -4
- package/dist/claude-code.d.ts +0 -16
- package/dist/claude-code.d.ts.map +0 -1
- package/dist/claude-code.js +0 -56
- package/dist/claude-code.js.map +0 -1
- package/dist/github.d.ts +0 -3
- package/dist/github.d.ts.map +0 -1
- package/dist/github.js +0 -13
- package/dist/github.js.map +0 -1
- package/dist/jira.d.ts +0 -3
- package/dist/jira.d.ts.map +0 -1
- package/dist/jira.js +0 -21
- package/dist/jira.js.map +0 -1
- package/dist/ollama.d.ts +0 -3
- package/dist/ollama.d.ts.map +0 -1
- package/dist/ollama.js +0 -9
- package/dist/ollama.js.map +0 -1
- package/dist/opencode.d.ts +0 -19
- package/dist/opencode.d.ts.map +0 -1
- package/dist/opencode.js +0 -104
- package/dist/opencode.js.map +0 -1
- package/dist/script.d.ts +0 -3
- package/dist/script.d.ts.map +0 -1
- package/dist/script.js +0 -21
- package/dist/script.js.map +0 -1
- package/dist/slack.d.ts +0 -3
- package/dist/slack.d.ts.map +0 -1
- package/dist/slack.js +0 -11
- package/dist/slack.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { DiscordInitializer } from './services/discord.js';
|
|
|
10
10
|
import { AirtableInitializer } from './services/airtable.js';
|
|
11
11
|
import { ConfluenceInitializer } from './services/confluence.js';
|
|
12
12
|
import { HttpInitializer } from './services/http.js';
|
|
13
|
+
import { PlaywrightInitializer } from './services/playwright.js';
|
|
13
14
|
import { GoogleSheetsInitializer } from './services/google-sheets.js';
|
|
14
15
|
import { GoogleCalendarInitializer } from './services/google-calendar.js';
|
|
15
16
|
import { GoogleDriveInitializer } from './services/google-drive.js';
|
|
@@ -19,11 +20,24 @@ import { WhatsAppInitializer } from './services/whatsapp.js';
|
|
|
19
20
|
import { SupabaseInitializer } from './services/supabase.js';
|
|
20
21
|
import { PostgresInitializer } from './services/postgres.js';
|
|
21
22
|
import { MySQLInitializer } from './services/mysql.js';
|
|
23
|
+
import { StripeInitializer } from './services/stripe.js';
|
|
24
|
+
import { TeamsInitializer } from './services/teams.js';
|
|
25
|
+
import { TwilioInitializer } from './services/twilio.js';
|
|
26
|
+
import { SendGridInitializer } from './services/sendgrid.js';
|
|
27
|
+
import { ShopifyInitializer } from './services/shopify.js';
|
|
28
|
+
import { ZendeskInitializer } from './services/zendesk.js';
|
|
29
|
+
import { MailchimpInitializer } from './services/mailchimp.js';
|
|
30
|
+
import { AsanaInitializer } from './services/asana.js';
|
|
31
|
+
import { TrelloInitializer } from './services/trello.js';
|
|
32
|
+
import { DropboxInitializer } from './services/dropbox.js';
|
|
33
|
+
import { AWSS3Initializer } from './services/aws-s3.js';
|
|
22
34
|
// AI Adapters
|
|
23
35
|
import { OllamaInitializer } from './adapters/ollama.js';
|
|
24
36
|
import { ClaudeCodeInitializer } from './adapters/claude-code.js';
|
|
37
|
+
import { ClaudeAgentInitializer } from './adapters/claude-agent.js';
|
|
25
38
|
import { OpenCodeInitializer } from './adapters/opencode.js';
|
|
26
39
|
import { GitHubCopilotInitializer } from './adapters/github-copilot.js';
|
|
40
|
+
import { CodexInitializer } from './adapters/codex.js';
|
|
27
41
|
// Tools
|
|
28
42
|
import { ScriptInitializer } from './tools/script.js';
|
|
29
43
|
export function registerIntegrations(registry) {
|
|
@@ -35,6 +49,8 @@ export function registerIntegrations(registry) {
|
|
|
35
49
|
// Email
|
|
36
50
|
registry.registerInitializer('googleapis', GmailInitializer);
|
|
37
51
|
registry.registerInitializer('@microsoft/microsoft-graph-client', OutlookInitializer);
|
|
52
|
+
// Collaboration
|
|
53
|
+
registry.registerInitializer('teams', TeamsInitializer);
|
|
38
54
|
// Project Management & Issue Tracking
|
|
39
55
|
registry.registerInitializer('jira.js', JiraInitializer);
|
|
40
56
|
registry.registerInitializer('linear', LinearInitializer);
|
|
@@ -48,6 +64,21 @@ export function registerIntegrations(registry) {
|
|
|
48
64
|
registry.registerInitializer('supabase', SupabaseInitializer);
|
|
49
65
|
registry.registerInitializer('pg', PostgresInitializer);
|
|
50
66
|
registry.registerInitializer('mysql2', MySQLInitializer);
|
|
67
|
+
// Payments & E-commerce
|
|
68
|
+
registry.registerInitializer('stripe', StripeInitializer);
|
|
69
|
+
registry.registerInitializer('@shopify/shopify-api', ShopifyInitializer);
|
|
70
|
+
// Communications
|
|
71
|
+
registry.registerInitializer('twilio', TwilioInitializer);
|
|
72
|
+
registry.registerInitializer('@sendgrid/mail', SendGridInitializer);
|
|
73
|
+
registry.registerInitializer('@mailchimp/mailchimp_marketing', MailchimpInitializer);
|
|
74
|
+
// Customer Support
|
|
75
|
+
registry.registerInitializer('node-zendesk', ZendeskInitializer);
|
|
76
|
+
// Project Management
|
|
77
|
+
registry.registerInitializer('asana', AsanaInitializer);
|
|
78
|
+
registry.registerInitializer('trello', TrelloInitializer);
|
|
79
|
+
// File Storage
|
|
80
|
+
registry.registerInitializer('dropbox', DropboxInitializer);
|
|
81
|
+
registry.registerInitializer('@aws-sdk/client-s3', AWSS3Initializer);
|
|
51
82
|
// Google Services
|
|
52
83
|
registry.registerInitializer('google-sheets', GoogleSheetsInitializer);
|
|
53
84
|
registry.registerInitializer('google-calendar', GoogleCalendarInitializer);
|
|
@@ -55,11 +86,18 @@ export function registerIntegrations(registry) {
|
|
|
55
86
|
registry.registerInitializer('google-docs', GoogleDocsInitializer);
|
|
56
87
|
// Generic HTTP
|
|
57
88
|
registry.registerInitializer('http', HttpInitializer);
|
|
89
|
+
// Browser Automation
|
|
90
|
+
registry.registerInitializer('playwright', PlaywrightInitializer);
|
|
58
91
|
// AI Adapters
|
|
59
92
|
registry.registerInitializer('ollama', OllamaInitializer);
|
|
60
93
|
registry.registerInitializer('claude-code', ClaudeCodeInitializer);
|
|
94
|
+
registry.registerInitializer('claude-agent', ClaudeAgentInitializer);
|
|
95
|
+
registry.registerInitializer('@anthropic-ai/claude-agent-sdk', ClaudeAgentInitializer);
|
|
61
96
|
registry.registerInitializer('opencode', OpenCodeInitializer);
|
|
62
97
|
registry.registerInitializer('github-copilot', GitHubCopilotInitializer);
|
|
98
|
+
registry.registerInitializer('@github/copilot-sdk', GitHubCopilotInitializer);
|
|
99
|
+
registry.registerInitializer('codex', CodexInitializer);
|
|
100
|
+
registry.registerInitializer('@openai/codex-sdk', CodexInitializer);
|
|
63
101
|
// Tools
|
|
64
102
|
registry.registerInitializer('script', ScriptInitializer);
|
|
65
103
|
}
|
|
@@ -77,6 +115,8 @@ export { DiscordClient, DiscordInitializer, } from './services/discord.js';
|
|
|
77
115
|
export * from './services/airtable.js';
|
|
78
116
|
export * from './services/confluence.js';
|
|
79
117
|
export * from './services/http.js';
|
|
118
|
+
export * from './services/playwright.js';
|
|
119
|
+
export { AIBrowserClient } from './services/ai-browser.js';
|
|
80
120
|
export * from './services/google-sheets.js';
|
|
81
121
|
export * from './services/google-calendar.js';
|
|
82
122
|
export * from './services/google-drive.js';
|
|
@@ -86,13 +126,32 @@ export { WhatsAppClient, WhatsAppInitializer, } from './services/whatsapp.js';
|
|
|
86
126
|
export * from './services/supabase.js';
|
|
87
127
|
export { PostgresClient, PostgresInitializer, } from './services/postgres.js';
|
|
88
128
|
export { MySQLClient, MySQLInitializer, } from './services/mysql.js';
|
|
129
|
+
export { StripeClient, StripeInitializer, } from './services/stripe.js';
|
|
130
|
+
export { TeamsClient, TeamsInitializer, } from './services/teams.js';
|
|
131
|
+
export { TwilioClientWrapper, TwilioInitializer, } from './services/twilio.js';
|
|
132
|
+
export { SendGridClient, SendGridInitializer, } from './services/sendgrid.js';
|
|
133
|
+
export { ShopifyClient, ShopifyInitializer, } from './services/shopify.js';
|
|
134
|
+
export { ZendeskClient, ZendeskInitializer, } from './services/zendesk.js';
|
|
135
|
+
export { MailchimpClient, MailchimpInitializer, } from './services/mailchimp.js';
|
|
136
|
+
export { AsanaClient, AsanaInitializer, } from './services/asana.js';
|
|
137
|
+
export { TrelloClient, TrelloInitializer, } from './services/trello.js';
|
|
138
|
+
export { DropboxClient, DropboxInitializer, } from './services/dropbox.js';
|
|
139
|
+
export { AWSS3Client, AWSS3Initializer, } from './services/aws-s3.js';
|
|
89
140
|
// Export triggers
|
|
90
141
|
export { SlackSocketTrigger } from './services/slack-socket.js';
|
|
91
142
|
// Export AI adapters
|
|
92
143
|
export * from './adapters/ollama.js';
|
|
93
144
|
export * from './adapters/claude-code.js';
|
|
145
|
+
export * from './adapters/claude-agent.js';
|
|
146
|
+
export * from './adapters/claude-agent-types.js';
|
|
147
|
+
export * from './adapters/claude-agent-workflow.js';
|
|
148
|
+
export * from './adapters/claude-agent-hooks.js';
|
|
94
149
|
export * from './adapters/opencode.js';
|
|
95
150
|
export * from './adapters/github-copilot.js';
|
|
151
|
+
export * from './adapters/github-copilot-workflow.js';
|
|
152
|
+
export * from './adapters/codex.js';
|
|
153
|
+
export * from './adapters/codex-types.js';
|
|
154
|
+
export * from './adapters/codex-workflow.js';
|
|
96
155
|
// Export tools
|
|
97
156
|
export * from './tools/script.js';
|
|
98
157
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,WAAW;AACX,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Browser Automation Client
|
|
3
|
+
*
|
|
4
|
+
* Provides AI-powered browser automation using GitHub Copilot or Claude Code SDK
|
|
5
|
+
* as backends instead of relying on external API services.
|
|
6
|
+
*
|
|
7
|
+
* This integrates with marktoflow's existing AI adapters to provide natural language
|
|
8
|
+
* browser control without additional API costs.
|
|
9
|
+
*/
|
|
10
|
+
import type { PlaywrightClient } from './playwright.js';
|
|
11
|
+
import type { GitHubCopilotClient } from '../adapters/github-copilot.js';
|
|
12
|
+
import type { ClaudeCodeClient } from '../adapters/claude-code.js';
|
|
13
|
+
export type AIBackend = 'copilot' | 'claude-code';
|
|
14
|
+
export interface AIBrowserConfig {
|
|
15
|
+
/** AI backend to use */
|
|
16
|
+
backend: AIBackend;
|
|
17
|
+
/** AI client instance */
|
|
18
|
+
aiClient: GitHubCopilotClient | ClaudeCodeClient;
|
|
19
|
+
/** Playwright client instance */
|
|
20
|
+
playwrightClient: PlaywrightClient;
|
|
21
|
+
/** Enable debug logging */
|
|
22
|
+
debug?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface ActOptions {
|
|
25
|
+
/** Natural language action to perform */
|
|
26
|
+
action: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ActResult {
|
|
29
|
+
success: boolean;
|
|
30
|
+
message: string;
|
|
31
|
+
action: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ObserveOptions {
|
|
34
|
+
/** Optional instruction to filter observations */
|
|
35
|
+
instruction?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ObservedElement {
|
|
38
|
+
selector?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
tagName?: string;
|
|
41
|
+
text?: string;
|
|
42
|
+
actions?: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface AIExtractOptions {
|
|
45
|
+
/** Natural language instruction for what to extract */
|
|
46
|
+
instruction: string;
|
|
47
|
+
/** JSON schema for structured extraction */
|
|
48
|
+
schema?: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* AI-powered browser automation client
|
|
52
|
+
*
|
|
53
|
+
* Uses GitHub Copilot or Claude Code SDK for AI reasoning instead of
|
|
54
|
+
* external API services like OpenAI or Anthropic.
|
|
55
|
+
*/
|
|
56
|
+
export declare class AIBrowserClient {
|
|
57
|
+
private backend;
|
|
58
|
+
private aiClient;
|
|
59
|
+
private playwrightClient;
|
|
60
|
+
private debug;
|
|
61
|
+
constructor(config: AIBrowserConfig);
|
|
62
|
+
/**
|
|
63
|
+
* Perform an action described in natural language
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* await client.act({ action: 'Click the login button' });
|
|
67
|
+
* await client.act({ action: 'Type "john@example.com" into the email field' });
|
|
68
|
+
*/
|
|
69
|
+
act(options: ActOptions): Promise<ActResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Observe the current page and identify available actions
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* const elements = await client.observe({ instruction: 'Find all form inputs' });
|
|
75
|
+
*/
|
|
76
|
+
observe(options?: ObserveOptions): Promise<ObservedElement[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Extract structured data using AI
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* const data = await client.aiExtract({
|
|
82
|
+
* instruction: 'Extract all product names and prices',
|
|
83
|
+
* schema: {
|
|
84
|
+
* type: 'object',
|
|
85
|
+
* properties: {
|
|
86
|
+
* products: {
|
|
87
|
+
* type: 'array',
|
|
88
|
+
* items: {
|
|
89
|
+
* type: 'object',
|
|
90
|
+
* properties: {
|
|
91
|
+
* name: { type: 'string' },
|
|
92
|
+
* price: { type: 'number' }
|
|
93
|
+
* }
|
|
94
|
+
* }
|
|
95
|
+
* }
|
|
96
|
+
* }
|
|
97
|
+
* }
|
|
98
|
+
* });
|
|
99
|
+
*/
|
|
100
|
+
aiExtract(options: AIExtractOptions): Promise<{
|
|
101
|
+
data: unknown;
|
|
102
|
+
}>;
|
|
103
|
+
private queryAI;
|
|
104
|
+
private buildActPrompt;
|
|
105
|
+
private buildObservePrompt;
|
|
106
|
+
private buildExtractPrompt;
|
|
107
|
+
private parseActionResponse;
|
|
108
|
+
private parseObserveResponse;
|
|
109
|
+
private parseExtractResponse;
|
|
110
|
+
private executeAction;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ai-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-browser.d.ts","sourceRoot":"","sources":["../../src/services/ai-browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,OAAO,EAAE,SAAS,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,mBAAmB,GAAG,gBAAgB,CAAC;IACjD,iCAAiC;IACjC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAMD;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,EAAE,eAAe;IAOnC;;;;;;OAMG;IACG,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA0ClD;;;;;OAKG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA6BnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;YAmCxD,OAAO;IAcrB,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,oBAAoB;YAkBd,aAAa;CA+C5B"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Browser Automation Client
|
|
3
|
+
*
|
|
4
|
+
* Provides AI-powered browser automation using GitHub Copilot or Claude Code SDK
|
|
5
|
+
* as backends instead of relying on external API services.
|
|
6
|
+
*
|
|
7
|
+
* This integrates with marktoflow's existing AI adapters to provide natural language
|
|
8
|
+
* browser control without additional API costs.
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// AI Browser Client
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* AI-powered browser automation client
|
|
15
|
+
*
|
|
16
|
+
* Uses GitHub Copilot or Claude Code SDK for AI reasoning instead of
|
|
17
|
+
* external API services like OpenAI or Anthropic.
|
|
18
|
+
*/
|
|
19
|
+
export class AIBrowserClient {
|
|
20
|
+
backend;
|
|
21
|
+
aiClient;
|
|
22
|
+
playwrightClient;
|
|
23
|
+
debug;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.backend = config.backend;
|
|
26
|
+
this.aiClient = config.aiClient;
|
|
27
|
+
this.playwrightClient = config.playwrightClient;
|
|
28
|
+
this.debug = config.debug ?? false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Perform an action described in natural language
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* await client.act({ action: 'Click the login button' });
|
|
35
|
+
* await client.act({ action: 'Type "john@example.com" into the email field' });
|
|
36
|
+
*/
|
|
37
|
+
async act(options) {
|
|
38
|
+
try {
|
|
39
|
+
// Get current page context
|
|
40
|
+
const pageInfo = await this.playwrightClient.pageInfo(false);
|
|
41
|
+
const prompt = this.buildActPrompt(options.action, pageInfo.url, pageInfo.title);
|
|
42
|
+
if (this.debug) {
|
|
43
|
+
console.log('[AI Browser] Act prompt:', prompt);
|
|
44
|
+
}
|
|
45
|
+
// Query AI backend
|
|
46
|
+
const response = await this.queryAI(prompt);
|
|
47
|
+
if (this.debug) {
|
|
48
|
+
console.log('[AI Browser] AI response:', response);
|
|
49
|
+
}
|
|
50
|
+
// Parse AI response
|
|
51
|
+
const parsedAction = this.parseActionResponse(response);
|
|
52
|
+
if (!parsedAction) {
|
|
53
|
+
throw new Error('Failed to parse AI response');
|
|
54
|
+
}
|
|
55
|
+
// Execute the action via Playwright
|
|
56
|
+
await this.executeAction(parsedAction);
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
message: `Executed: ${options.action}`,
|
|
60
|
+
action: options.action,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
message: error instanceof Error ? error.message : String(error),
|
|
67
|
+
action: options.action,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Observe the current page and identify available actions
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* const elements = await client.observe({ instruction: 'Find all form inputs' });
|
|
76
|
+
*/
|
|
77
|
+
async observe(options) {
|
|
78
|
+
try {
|
|
79
|
+
// Get page content
|
|
80
|
+
const pageInfo = await this.playwrightClient.pageInfo(true);
|
|
81
|
+
const prompt = this.buildObservePrompt(pageInfo.content || '', pageInfo.url, options?.instruction);
|
|
82
|
+
if (this.debug) {
|
|
83
|
+
console.log('[AI Browser] Observe prompt:', prompt.slice(0, 500) + '...');
|
|
84
|
+
}
|
|
85
|
+
const response = await this.queryAI(prompt);
|
|
86
|
+
if (this.debug) {
|
|
87
|
+
console.log('[AI Browser] AI response:', response);
|
|
88
|
+
}
|
|
89
|
+
// Parse elements from AI response
|
|
90
|
+
return this.parseObserveResponse(response);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('[AI Browser] Observe error:', error);
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract structured data using AI
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* const data = await client.aiExtract({
|
|
102
|
+
* instruction: 'Extract all product names and prices',
|
|
103
|
+
* schema: {
|
|
104
|
+
* type: 'object',
|
|
105
|
+
* properties: {
|
|
106
|
+
* products: {
|
|
107
|
+
* type: 'array',
|
|
108
|
+
* items: {
|
|
109
|
+
* type: 'object',
|
|
110
|
+
* properties: {
|
|
111
|
+
* name: { type: 'string' },
|
|
112
|
+
* price: { type: 'number' }
|
|
113
|
+
* }
|
|
114
|
+
* }
|
|
115
|
+
* }
|
|
116
|
+
* }
|
|
117
|
+
* }
|
|
118
|
+
* });
|
|
119
|
+
*/
|
|
120
|
+
async aiExtract(options) {
|
|
121
|
+
try {
|
|
122
|
+
// Get page content
|
|
123
|
+
const pageInfo = await this.playwrightClient.pageInfo(true);
|
|
124
|
+
const prompt = this.buildExtractPrompt(pageInfo.content || '', pageInfo.url, options.instruction, options.schema);
|
|
125
|
+
if (this.debug) {
|
|
126
|
+
console.log('[AI Browser] Extract prompt:', prompt.slice(0, 500) + '...');
|
|
127
|
+
}
|
|
128
|
+
const response = await this.queryAI(prompt);
|
|
129
|
+
if (this.debug) {
|
|
130
|
+
console.log('[AI Browser] AI response:', response);
|
|
131
|
+
}
|
|
132
|
+
// Parse extracted data
|
|
133
|
+
const data = this.parseExtractResponse(response);
|
|
134
|
+
return { data };
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new Error(`AI extraction failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Private Methods - AI Communication
|
|
142
|
+
// ============================================================================
|
|
143
|
+
async queryAI(prompt) {
|
|
144
|
+
if (this.backend === 'copilot') {
|
|
145
|
+
const client = this.aiClient;
|
|
146
|
+
return await client.send({ prompt });
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const client = this.aiClient;
|
|
150
|
+
return await client.generate({ prompt });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ============================================================================
|
|
154
|
+
// Private Methods - Prompt Building
|
|
155
|
+
// ============================================================================
|
|
156
|
+
buildActPrompt(action, url, title) {
|
|
157
|
+
return `You are an AI browser automation assistant. Convert natural language actions to Playwright commands.
|
|
158
|
+
|
|
159
|
+
Current Page:
|
|
160
|
+
- URL: ${url}
|
|
161
|
+
- Title: ${title}
|
|
162
|
+
|
|
163
|
+
User Action: "${action}"
|
|
164
|
+
|
|
165
|
+
Available Playwright Actions:
|
|
166
|
+
- navigate: { url, waitUntil? }
|
|
167
|
+
- click: { selector, button?, force? }
|
|
168
|
+
- type: { selector, text, delay?, clear? }
|
|
169
|
+
- fill: { selector, value }
|
|
170
|
+
- select: { selector, values }
|
|
171
|
+
- check: { selector }
|
|
172
|
+
- uncheck: { selector }
|
|
173
|
+
- hover: { selector }
|
|
174
|
+
- press: { selector, key }
|
|
175
|
+
- wait: { selector?, url?, loadState?, timeout? }
|
|
176
|
+
|
|
177
|
+
IMPORTANT:
|
|
178
|
+
1. Return ONLY valid JSON in this exact format:
|
|
179
|
+
{ "action": "click", "inputs": { "selector": "#button" } }
|
|
180
|
+
2. Choose the most appropriate selector (id, class, text, or CSS selector)
|
|
181
|
+
3. For typing text, use "fill" for instant input or "type" for keyboard simulation
|
|
182
|
+
4. For navigation, use "navigate"
|
|
183
|
+
5. NO explanatory text, ONLY the JSON object
|
|
184
|
+
|
|
185
|
+
Example Responses:
|
|
186
|
+
- "Click the login button" -> { "action": "click", "inputs": { "selector": "button:has-text('Login')" } }
|
|
187
|
+
- "Type email@example.com in the email field" -> { "action": "fill", "inputs": { "selector": "input[type='email']", "value": "email@example.com" } }
|
|
188
|
+
- "Select 'United States' from country dropdown" -> { "action": "select", "inputs": { "selector": "#country", "values": "United States" } }
|
|
189
|
+
|
|
190
|
+
Now convert this action to JSON:
|
|
191
|
+
"${action}"
|
|
192
|
+
|
|
193
|
+
JSON:`;
|
|
194
|
+
}
|
|
195
|
+
buildObservePrompt(htmlContent, url, instruction) {
|
|
196
|
+
// Limit HTML content to avoid token limits
|
|
197
|
+
const maxLength = 15000;
|
|
198
|
+
const truncatedHtml = htmlContent.length > maxLength
|
|
199
|
+
? htmlContent.slice(0, maxLength) + '\n... (truncated)'
|
|
200
|
+
: htmlContent;
|
|
201
|
+
return `You are analyzing a web page to identify interactive elements.
|
|
202
|
+
|
|
203
|
+
Current Page URL: ${url}
|
|
204
|
+
|
|
205
|
+
${instruction ? `Focus: ${instruction}\n` : ''}
|
|
206
|
+
HTML Content:
|
|
207
|
+
${truncatedHtml}
|
|
208
|
+
|
|
209
|
+
Analyze the page and identify interactive elements (buttons, links, inputs, forms, etc.).
|
|
210
|
+
|
|
211
|
+
Return a JSON array of elements in this exact format:
|
|
212
|
+
[
|
|
213
|
+
{
|
|
214
|
+
"selector": "CSS selector for the element",
|
|
215
|
+
"description": "What this element does",
|
|
216
|
+
"tagName": "HTML tag name",
|
|
217
|
+
"text": "visible text if any",
|
|
218
|
+
"actions": ["click", "fill", "select", etc.]
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
IMPORTANT:
|
|
223
|
+
1. Return ONLY valid JSON array, no explanatory text
|
|
224
|
+
2. Provide actionable CSS selectors (id, class, or text-based)
|
|
225
|
+
3. Include only interactive elements that can be automated
|
|
226
|
+
4. Limit to the 10 most important elements
|
|
227
|
+
5. For forms, identify input fields, buttons, and selects
|
|
228
|
+
|
|
229
|
+
JSON Array:`;
|
|
230
|
+
}
|
|
231
|
+
buildExtractPrompt(htmlContent, url, instruction, schema) {
|
|
232
|
+
const maxLength = 15000;
|
|
233
|
+
const truncatedHtml = htmlContent.length > maxLength
|
|
234
|
+
? htmlContent.slice(0, maxLength) + '\n... (truncated)'
|
|
235
|
+
: htmlContent;
|
|
236
|
+
return `You are extracting structured data from a web page.
|
|
237
|
+
|
|
238
|
+
Current Page URL: ${url}
|
|
239
|
+
|
|
240
|
+
Extraction Task: ${instruction}
|
|
241
|
+
|
|
242
|
+
${schema ? `Expected JSON Schema:\n${JSON.stringify(schema, null, 2)}\n` : ''}
|
|
243
|
+
HTML Content:
|
|
244
|
+
${truncatedHtml}
|
|
245
|
+
|
|
246
|
+
Extract the requested data and return it as valid JSON.
|
|
247
|
+
|
|
248
|
+
IMPORTANT:
|
|
249
|
+
1. Return ONLY valid JSON, no explanatory text
|
|
250
|
+
2. Follow the provided schema if given
|
|
251
|
+
3. Extract accurate data from the HTML
|
|
252
|
+
4. Use null for missing values
|
|
253
|
+
5. Ensure all property names match the schema
|
|
254
|
+
|
|
255
|
+
JSON:`;
|
|
256
|
+
}
|
|
257
|
+
// ============================================================================
|
|
258
|
+
// Private Methods - Response Parsing
|
|
259
|
+
// ============================================================================
|
|
260
|
+
parseActionResponse(response) {
|
|
261
|
+
try {
|
|
262
|
+
// Extract JSON from response (handle markdown code blocks)
|
|
263
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
264
|
+
if (!jsonMatch) {
|
|
265
|
+
console.error('[AI Browser] No JSON found in response:', response);
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
269
|
+
if (!parsed.action || !parsed.inputs) {
|
|
270
|
+
console.error('[AI Browser] Invalid action format:', parsed);
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
return parsed;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
console.error('[AI Browser] Failed to parse action:', error, response);
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
parseObserveResponse(response) {
|
|
281
|
+
try {
|
|
282
|
+
// Extract JSON array from response
|
|
283
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
284
|
+
if (!jsonMatch) {
|
|
285
|
+
console.error('[AI Browser] No JSON array found in response');
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
289
|
+
if (!Array.isArray(parsed)) {
|
|
290
|
+
console.error('[AI Browser] Response is not an array');
|
|
291
|
+
return [];
|
|
292
|
+
}
|
|
293
|
+
return parsed;
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
console.error('[AI Browser] Failed to parse observe response:', error);
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
parseExtractResponse(response) {
|
|
301
|
+
try {
|
|
302
|
+
// Extract JSON from response
|
|
303
|
+
const jsonMatch = response.match(/\{[\s\S]*\}|\[[\s\S]*\]/);
|
|
304
|
+
if (!jsonMatch) {
|
|
305
|
+
throw new Error('No JSON found in AI response');
|
|
306
|
+
}
|
|
307
|
+
return JSON.parse(jsonMatch[0]);
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
throw new Error(`Failed to parse extraction response: ${error instanceof Error ? error.message : String(error)}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// ============================================================================
|
|
314
|
+
// Private Methods - Action Execution
|
|
315
|
+
// ============================================================================
|
|
316
|
+
async executeAction(action) {
|
|
317
|
+
const { action: actionName, inputs } = action;
|
|
318
|
+
// Map action names to Playwright client methods
|
|
319
|
+
switch (actionName) {
|
|
320
|
+
case 'navigate':
|
|
321
|
+
await this.playwrightClient.navigate(inputs);
|
|
322
|
+
break;
|
|
323
|
+
case 'click':
|
|
324
|
+
await this.playwrightClient.click(inputs);
|
|
325
|
+
break;
|
|
326
|
+
case 'type':
|
|
327
|
+
await this.playwrightClient.type(inputs);
|
|
328
|
+
break;
|
|
329
|
+
case 'fill':
|
|
330
|
+
await this.playwrightClient.fill(inputs);
|
|
331
|
+
break;
|
|
332
|
+
case 'select':
|
|
333
|
+
await this.playwrightClient.select(inputs);
|
|
334
|
+
break;
|
|
335
|
+
case 'check': {
|
|
336
|
+
const checkInputs = inputs;
|
|
337
|
+
await this.playwrightClient.check(checkInputs.selector);
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
case 'uncheck': {
|
|
341
|
+
const uncheckInputs = inputs;
|
|
342
|
+
await this.playwrightClient.uncheck(uncheckInputs.selector);
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
case 'hover': {
|
|
346
|
+
const hoverInputs = inputs;
|
|
347
|
+
await this.playwrightClient.hover(hoverInputs.selector);
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
case 'press': {
|
|
351
|
+
const pressInputs = inputs;
|
|
352
|
+
await this.playwrightClient.press(pressInputs.selector, pressInputs.key);
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
case 'wait':
|
|
356
|
+
await this.playwrightClient.wait(inputs);
|
|
357
|
+
break;
|
|
358
|
+
default:
|
|
359
|
+
throw new Error(`Unsupported action: ${actionName}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=ai-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-browser.js","sourceRoot":"","sources":["../../src/services/ai-browser.ts"],"names":[],"mappings":"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"}
|