56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
/** Islander interaction runtime — single source of truth for selectors & limits. */
|
||
|
||
export const ISLANDER_CONFIG = {
|
||
rootSelectors: ['.ac-app-shell', 'main', 'body'],
|
||
refAttr: 'data-islander-ref',
|
||
labelAttr: 'data-islander-label',
|
||
kindAttr: 'data-islander-kind',
|
||
ignoreAttr: 'data-islander-ignore',
|
||
pageTitleSelectors: ['[data-islander-page-title]', '.ac-title-bar', 'main h1'],
|
||
maxElements: 48,
|
||
maxAgentRounds: 4,
|
||
navigateWaitMs: 450,
|
||
actionBlockRe: '```islander-actions\\s*([\\s\\S]*?)```',
|
||
excludeSelectors: [
|
||
'.ac-islander',
|
||
'.ac-job-monitor',
|
||
`[data-islander-ignore]`,
|
||
'[aria-hidden="true"]',
|
||
'script',
|
||
'style',
|
||
'svg',
|
||
'path',
|
||
],
|
||
interactiveSelectors: [
|
||
'a[href]',
|
||
'button',
|
||
'input',
|
||
'textarea',
|
||
'select',
|
||
'summary',
|
||
'[role="button"]',
|
||
'[role="tab"]',
|
||
'[role="menuitem"]',
|
||
'[role="link"]',
|
||
'[role="switch"]',
|
||
'[role="checkbox"]',
|
||
'label[for]',
|
||
`[data-islander-label]`,
|
||
],
|
||
blockedClickPatterns: [/登出/i, /logout/i],
|
||
// 這些 action 會實際對外發布、啟動背景/付費任務或寫入後端,
|
||
// 必須由真人確認(window.confirm),不能只靠 AI 在 JSON 自填 confirm。
|
||
// 避免被海巡抓回的不可信貼文做 prompt injection 觸發自動發文。
|
||
dangerousActionTypes: [
|
||
'publishOutreach',
|
||
'publishCopyDraft',
|
||
'startViralScan',
|
||
'startCopyMissionAnalyze',
|
||
'startCopyMissionScan',
|
||
'generateCopyMatrix',
|
||
'generateCopyDraft',
|
||
] as string[],
|
||
defaultSuggestions: [] as string[],
|
||
highlightClass: 'ac-islander-target-highlight',
|
||
highlightDurationMs: 1800,
|
||
} as const |