social-agent-cli 1.3.1 → 1.5.0
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/ai/mapper.ts +6 -5
- package/ai/runner.ts +2 -30
- package/bin/social-agent.js +2 -2
- package/cli.ts +1 -5
- package/config.example.json +3 -14
- package/core/config.ts +0 -8
- package/install.ts +0 -11
- package/package.json +1 -1
- package/platforms/browser/driver.ts +4 -38
- package/knowledge/bluesky.md +0 -1083
- package/knowledge/facebook.md +0 -603
- package/knowledge/instagram.md +0 -686
- package/knowledge/telegram.md +0 -824
package/ai/mapper.ts
CHANGED
|
@@ -209,11 +209,12 @@ export async function generateMap(
|
|
|
209
209
|
|
|
210
210
|
GÖREV: "${taskDescription}"
|
|
211
211
|
|
|
212
|
-
|
|
213
|
-
${domSnapshot
|
|
212
|
+
Sayfanın Accessibility Tree'si (ARIA Snapshot):
|
|
213
|
+
${domSnapshot}
|
|
214
214
|
|
|
215
215
|
Kurallar:
|
|
216
|
-
-
|
|
216
|
+
- ARIA snapshot'taki role ve name bilgilerini kullanarak selector oluştur
|
|
217
|
+
- aria-label, role, data-testid, id tercih et
|
|
217
218
|
- Her adım için 2+ fallback selector
|
|
218
219
|
- Parametreler için placeholder kullan: {{CONTENT}} = metin, {{USERNAME}} = kullanıcı adı, {{URL}} = link, vs.
|
|
219
220
|
- Hangi parametreleri kullandığını "parameters" alanında listele
|
|
@@ -311,8 +312,8 @@ Başarısız olan adım (#${failedStepIndex + 1}):
|
|
|
311
312
|
Kalan orijinal adımlar:
|
|
312
313
|
${remainingOriginal.map((s, i) => ` ${failedStepIndex + i + 1}. [${s.action}] ${s.description} → ${s.selector}`).join("\n")}
|
|
313
314
|
|
|
314
|
-
|
|
315
|
-
${domSnapshot
|
|
315
|
+
Sayfanın Accessibility Tree'si:
|
|
316
|
+
${domSnapshot}
|
|
316
317
|
|
|
317
318
|
GÖREV: Ekranın mevcut durumunu analiz et. Amaca ulaşmak için kalan adımları yeniden planla.
|
|
318
319
|
- Belki selector değişmiş → yeni selector bul
|
package/ai/runner.ts
CHANGED
|
@@ -160,35 +160,7 @@ export async function runCommand(
|
|
|
160
160
|
const healScreenshot = join(PATHS.screenshots, `${platform}_heal_${stepIdx}.png`);
|
|
161
161
|
await page.screenshot({ path: healScreenshot });
|
|
162
162
|
|
|
163
|
-
const
|
|
164
|
-
var SKIP = {"script":1,"style":1,"noscript":1,"link":1,"meta":1};
|
|
165
|
-
function ser(el, d, b) {
|
|
166
|
-
if (d > 15 || b.c <= 0) return "";
|
|
167
|
-
var t = el.tagName.toLowerCase();
|
|
168
|
-
if (SKIP[t]) return "";
|
|
169
|
-
if (t === "svg") return "<svg/>";
|
|
170
|
-
var st = window.getComputedStyle(el);
|
|
171
|
-
if (st.display === "none" || st.visibility === "hidden") return "";
|
|
172
|
-
var at = [];
|
|
173
|
-
for (var i = 0; i < el.attributes.length; i++) {
|
|
174
|
-
var a = el.attributes[i];
|
|
175
|
-
if (a.name === "style") continue;
|
|
176
|
-
at.push(a.name + '="' + (a.value.length > 150 ? a.value.substring(0,150) : a.value).replace(/"/g,"'") + '"');
|
|
177
|
-
}
|
|
178
|
-
var as = at.length ? " " + at.join(" ") : "";
|
|
179
|
-
var dt = "";
|
|
180
|
-
for (var j = 0; j < el.childNodes.length; j++) {
|
|
181
|
-
if (el.childNodes[j].nodeType === 3) { var tx = (el.childNodes[j].textContent||"").trim(); if (tx) dt += tx.substring(0,100); }
|
|
182
|
-
}
|
|
183
|
-
var ch = "";
|
|
184
|
-
for (var k = 0; k < el.children.length; k++) ch += ser(el.children[k], d+1, b);
|
|
185
|
-
if (!as && !dt && !ch) return "";
|
|
186
|
-
var r = "<"+t+as+">"+dt+ch+"</"+t+">";
|
|
187
|
-
b.c -= r.length;
|
|
188
|
-
return r;
|
|
189
|
-
}
|
|
190
|
-
return ser(document.body, 0, {c:500000});
|
|
191
|
-
})()`);
|
|
163
|
+
const ariaSnap = await page.locator('body').ariaSnapshot();
|
|
192
164
|
|
|
193
165
|
// AI kaldığı yerden devam etsin (her denemede effort artar)
|
|
194
166
|
const newSteps = await healAndContinue(
|
|
@@ -196,7 +168,7 @@ export async function runCommand(
|
|
|
196
168
|
stepIdx,
|
|
197
169
|
steps,
|
|
198
170
|
healScreenshot,
|
|
199
|
-
|
|
171
|
+
ariaSnap,
|
|
200
172
|
err.message,
|
|
201
173
|
post.content || step.description,
|
|
202
174
|
effort
|
package/bin/social-agent.js
CHANGED
|
@@ -113,8 +113,8 @@ switch (command) {
|
|
|
113
113
|
social-agent learn "<task>" <platform> Teach AI a new action
|
|
114
114
|
social-agent run <platform> "<cmd>" Execute with natural language
|
|
115
115
|
|
|
116
|
-
API Platforms (Mastodon
|
|
117
|
-
social-agent post "<text>" --platforms mastodon
|
|
116
|
+
API Platforms (Mastodon):
|
|
117
|
+
social-agent post "<text>" --platforms mastodon
|
|
118
118
|
|
|
119
119
|
Info:
|
|
120
120
|
social-agent status Show connected platforms
|
package/cli.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { MastodonDriver } from "./platforms/mastodon.js";
|
|
2
|
-
import { BlueskyDriver } from "./platforms/bluesky.js";
|
|
3
2
|
import { BrowserDriver } from "./platforms/browser/driver.js";
|
|
4
3
|
import { loadConfig } from "./core/config.js";
|
|
5
4
|
import { runCommand } from "./ai/runner.js";
|
|
@@ -18,7 +17,6 @@ function getAllDrivers(): PlatformDriver[] {
|
|
|
18
17
|
|
|
19
18
|
// API-based (ücretsiz)
|
|
20
19
|
if (config.mastodon) drivers.push(new MastodonDriver());
|
|
21
|
-
if (config.bluesky) drivers.push(new BlueskyDriver());
|
|
22
20
|
|
|
23
21
|
// Browser-based (ücretli platformlar)
|
|
24
22
|
for (const [name, url] of Object.entries(BROWSER_PLATFORMS)) {
|
|
@@ -137,8 +135,6 @@ async function cmdStatus() {
|
|
|
137
135
|
|
|
138
136
|
// API platformları - config'de varsa göster
|
|
139
137
|
if (config.mastodon) console.log(` 🔗 mastodon (api) → ${config.mastodon.instanceUrl}`);
|
|
140
|
-
if (config.bluesky) console.log(` 🔗 bluesky (api) → ${config.bluesky.identifier}`);
|
|
141
|
-
if (config.telegram) console.log(` 🔗 telegram (api)`);
|
|
142
138
|
|
|
143
139
|
// Browser platformları - sadece login olmuşları göster
|
|
144
140
|
for (const [name] of Object.entries(BROWSER_PLATFORMS)) {
|
|
@@ -148,7 +144,7 @@ async function cmdStatus() {
|
|
|
148
144
|
}
|
|
149
145
|
}
|
|
150
146
|
|
|
151
|
-
const hasAny = config.mastodon ||
|
|
147
|
+
const hasAny = config.mastodon ||
|
|
152
148
|
Object.keys(BROWSER_PLATFORMS).some(p => getSavedProfile(p));
|
|
153
149
|
|
|
154
150
|
if (!hasAny) {
|
package/config.example.json
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mastodon": {
|
|
3
|
-
"instanceUrl": "https://mastodon.
|
|
4
|
-
"accessToken": "
|
|
5
|
-
},
|
|
6
|
-
"bluesky": {
|
|
7
|
-
"identifier": "kullanici.bsky.social",
|
|
8
|
-
"password": "app-password-buraya"
|
|
9
|
-
},
|
|
10
|
-
"telegram": {
|
|
11
|
-
"botToken": "123456:ABC-DEF...",
|
|
12
|
-
"chatId": "@kanal_adi"
|
|
13
|
-
},
|
|
14
|
-
"browser": {
|
|
15
|
-
"headless": true
|
|
3
|
+
"instanceUrl": "https://mastodon.social",
|
|
4
|
+
"accessToken": "erişim-belirteciniz"
|
|
16
5
|
},
|
|
17
6
|
"claude": {
|
|
18
|
-
"model": "
|
|
7
|
+
"model": "opus"
|
|
19
8
|
}
|
|
20
9
|
}
|
package/core/config.ts
CHANGED
|
@@ -18,14 +18,6 @@ export interface Config {
|
|
|
18
18
|
instanceUrl: string;
|
|
19
19
|
accessToken: string;
|
|
20
20
|
};
|
|
21
|
-
bluesky?: {
|
|
22
|
-
identifier: string;
|
|
23
|
-
password: string;
|
|
24
|
-
};
|
|
25
|
-
telegram?: {
|
|
26
|
-
botToken: string;
|
|
27
|
-
chatId: string;
|
|
28
|
-
};
|
|
29
21
|
browser?: {
|
|
30
22
|
chromePath?: string;
|
|
31
23
|
headless?: boolean;
|
package/install.ts
CHANGED
|
@@ -114,17 +114,6 @@ Gönderme komutları (HER ZAMAN bu komutları kullan, asla cd veya npx tsx kulla
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
const blueskyId = await ask(rl, "Bluesky hesabın var mı? (handle veya email, yoksa boş bırak)");
|
|
118
|
-
if (blueskyId) {
|
|
119
|
-
const blueskyPass = await ask(rl, "Bluesky app password (bsky.app/settings/app-passwords)");
|
|
120
|
-
if (blueskyPass) {
|
|
121
|
-
config.bluesky = {
|
|
122
|
-
identifier: blueskyId,
|
|
123
|
-
password: blueskyPass,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
117
|
config.claude = { model: "opus" };
|
|
129
118
|
|
|
130
119
|
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
package/package.json
CHANGED
|
@@ -162,48 +162,14 @@ export class BrowserDriver {
|
|
|
162
162
|
const screenshotPath = join(PATHS.screenshots, `${this.platform}_learn_${actionName}.png`);
|
|
163
163
|
await page.screenshot({ path: screenshotPath, fullPage: false });
|
|
164
164
|
|
|
165
|
-
//
|
|
166
|
-
const
|
|
167
|
-
var SKIP = {"script":1,"style":1,"noscript":1,"link":1,"meta":1};
|
|
168
|
-
function ser(el, depth, budget) {
|
|
169
|
-
if (depth > 15 || budget.c <= 0) return "";
|
|
170
|
-
var tag = el.tagName.toLowerCase();
|
|
171
|
-
if (SKIP[tag]) return "";
|
|
172
|
-
if (tag === "svg") return "<svg/>";
|
|
173
|
-
var st = window.getComputedStyle(el);
|
|
174
|
-
if (st.display === "none" || st.visibility === "hidden") return "";
|
|
175
|
-
var attrs = [];
|
|
176
|
-
for (var i = 0; i < el.attributes.length; i++) {
|
|
177
|
-
var a = el.attributes[i];
|
|
178
|
-
if (a.name === "style") continue;
|
|
179
|
-
var v = a.value.length > 150 ? a.value.substring(0,150) : a.value;
|
|
180
|
-
attrs.push(a.name + '="' + v.replace(/"/g, "'") + '"');
|
|
181
|
-
}
|
|
182
|
-
var as = attrs.length ? " " + attrs.join(" ") : "";
|
|
183
|
-
var dt = "";
|
|
184
|
-
for (var j = 0; j < el.childNodes.length; j++) {
|
|
185
|
-
if (el.childNodes[j].nodeType === 3) {
|
|
186
|
-
var t = (el.childNodes[j].textContent || "").trim();
|
|
187
|
-
if (t) dt += t.substring(0, 100);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
var ch = "";
|
|
191
|
-
for (var k = 0; k < el.children.length; k++) {
|
|
192
|
-
ch += ser(el.children[k], depth + 1, budget);
|
|
193
|
-
}
|
|
194
|
-
if (!as && !dt && !ch) return "";
|
|
195
|
-
var r = "<" + tag + as + ">" + dt + ch + "</" + tag + ">";
|
|
196
|
-
budget.c -= r.length;
|
|
197
|
-
return r;
|
|
198
|
-
}
|
|
199
|
-
return ser(document.body, 0, {c: 500000});
|
|
200
|
-
})()`);
|
|
165
|
+
// ARIA Snapshot - accessibility tree (98x daha küçük, sadece interaktif elementler)
|
|
166
|
+
const ariaSnapshot = await page.locator('body').ariaSnapshot();
|
|
201
167
|
|
|
202
168
|
console.log(`[${this.platform}] Screenshot: ${screenshotPath}`);
|
|
203
|
-
console.log(`[${this.platform}]
|
|
169
|
+
console.log(`[${this.platform}] Accessibility tree: ${ariaSnapshot.length} bytes`);
|
|
204
170
|
console.log(`[${this.platform}] Claude analiz ediyor...`);
|
|
205
171
|
|
|
206
|
-
const map = await generateMap(this.platform, screenshotPath,
|
|
172
|
+
const map = await generateMap(this.platform, screenshotPath, ariaSnapshot, taskDescription, actionName);
|
|
207
173
|
|
|
208
174
|
console.log(`[${this.platform}] "${actionName}" map oluşturuldu (${map.steps.length} adım)`);
|
|
209
175
|
await this.close();
|