Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/chrome/src/agent/adapters.js
Original file line number Diff line number Diff line change
Expand Up @@ -16767,6 +16767,22 @@ const ADAPTERS = [
},

// ─── Job Portals ──────────────────────────────────────────────────────
{
name: 'boss-zhipin',
category: 'general',
matches: (url) => /^https?:\/\/(?:(?:www|m)\.)?zhipin\.com\//.test(url),
notes: `
- Observed 2026-08 on the BOSS直聘 desktop site; the same guidance covers public m.zhipin.com job listings. The main search field is labeled "搜索职位、公司".
- Search results use /web/geek/jobs?query=...&city=...&industry=&position=. Verify the visible 城市 before comparing results: the numeric city= value may come from a default or geolocation and can silently be wrong.
- Read each card's job title, K-denominated salary range, suffix such as "·15薪", district, experience, education, company, financing, and company size. "·15薪" means 15 salary months, not the monthly amount; do not rank on the headline salary alone.
- Open the job detail and verify the full description, location, company, and recruiter/BOSS identity and active-time indicators. Check for duplicate or agency listings and any mismatch with the result card before recommending it.
- "立即沟通" / "开聊" starts a direct conversation; it is not an application or an offer. Treat starting the chat and sending its first message as an external social action, and require the user's explicit request and reviewed message.
- Sending or attaching a resume, choosing "交换联系方式", and accepting an 面试邀请 are separate consequential actions that can expose the registered phone number or 微信. Ask for explicit confirmation immediately before each action; permission to find jobs does not authorize any of them.
- Resume visibility controls are under "通知与隐私设置" and include "对BOSS隐藏简历" and "屏蔽公司". Report these options when relevant, but never change privacy or blocking settings without the user's request.
- Login may require SMS, QR-code scanning, or the "安全验证" route at /web/passport/zp/verify.html. Pause for the user. A search route can also end at about:blank or show no content after an initial HTTP 200; treat that as an access/anti-automation restriction, not "no jobs", avoid rapid retries, and use a public /zhaopin/... listing or request user verification.
- Verify completion from the resulting state: a sent chat must be visible in the message thread, a resume must show a sent/delivered status if one was requested, and an interview invitation must show its explicit status. Opening a card or clicking into a conversation is not proof of application, delivery, or an offer.
`,
},
{
name: 'greenhouse',
category: 'general',
Expand Down
16 changes: 16 additions & 0 deletions src/firefox/src/agent/adapters.js
Original file line number Diff line number Diff line change
Expand Up @@ -16765,6 +16765,22 @@ const ADAPTERS = [
},

// ─── Job Portals ──────────────────────────────────────────────────────
{
name: 'boss-zhipin',
category: 'general',
matches: (url) => /^https?:\/\/(?:(?:www|m)\.)?zhipin\.com\//.test(url),
notes: `
- Observed 2026-08 on the BOSS直聘 desktop site; the same guidance covers public m.zhipin.com job listings. The main search field is labeled "搜索职位、公司".
- Search results use /web/geek/jobs?query=...&city=...&industry=&position=. Verify the visible 城市 before comparing results: the numeric city= value may come from a default or geolocation and can silently be wrong.
- Read each card's job title, K-denominated salary range, suffix such as "·15薪", district, experience, education, company, financing, and company size. "·15薪" means 15 salary months, not the monthly amount; do not rank on the headline salary alone.
- Open the job detail and verify the full description, location, company, and recruiter/BOSS identity and active-time indicators. Check for duplicate or agency listings and any mismatch with the result card before recommending it.
- "立即沟通" / "开聊" starts a direct conversation; it is not an application or an offer. Treat starting the chat and sending its first message as an external social action, and require the user's explicit request and reviewed message.
- Sending or attaching a resume, choosing "交换联系方式", and accepting an 面试邀请 are separate consequential actions that can expose the registered phone number or 微信. Ask for explicit confirmation immediately before each action; permission to find jobs does not authorize any of them.
- Resume visibility controls are under "通知与隐私设置" and include "对BOSS隐藏简历" and "屏蔽公司". Report these options when relevant, but never change privacy or blocking settings without the user's request.
- Login may require SMS, QR-code scanning, or the "安全验证" route at /web/passport/zp/verify.html. Pause for the user. A search route can also end at about:blank or show no content after an initial HTTP 200; treat that as an access/anti-automation restriction, not "no jobs", avoid rapid retries, and use a public /zhaopin/... listing or request user verification.
- Verify completion from the resulting state: a sent chat must be visible in the message thread, a resume must show a sent/delivered status if one was requested, and an interview invitation must show its explicit status. Opening a card or clicking into a conversation is not proof of application, delivery, or an offer.
`,
},
{
name: 'greenhouse',
category: 'general',
Expand Down
46 changes: 46 additions & 0 deletions test/run.js
Original file line number Diff line number Diff line change
Expand Up @@ -2418,6 +2418,52 @@ test('matches Zhihu reading and creation surfaces with login and publication gui
assert.equal(firefoxAdapter?.notes, adapter?.notes);
});

test('matches BOSS Zhipin job surfaces with safe search and communication guidance', () => {
const trustedUrls = [
'https://zhipin.com/',
'https://www.zhipin.com/',
'https://www.zhipin.com/web/geek/jobs?query=webbrain&city=101020100',
'https://www.zhipin.com/job_detail/example.html',
'https://www.zhipin.com/web/geek/chat',
'https://www.zhipin.com/web/passport/zp/verify.html?callbackUrl=https%3A%2F%2Fwww.zhipin.com%2F',
'https://www.zhipin.com/zhaopin/example/',
'https://m.zhipin.com/zhaopin/example/',
];
for (const url of trustedUrls) {
assert.equal(getActiveAdapter(url)?.name, 'boss-zhipin');
assert.equal(getActiveAdapterFx(url)?.name, 'boss-zhipin');
}

const rejectedUrls = [
'https://ir.zhipin.com/',
'https://static.zhipin.com/',
'https://zhipin.com.phishing.example/web/geek/jobs',
'https://www.zhipin.com@phishing.example/web/geek/jobs',
'https://example.com/?next=https://www.zhipin.com/web/geek/jobs',
];
for (const url of rejectedUrls) {
assert.notEqual(getActiveAdapter(url)?.name, 'boss-zhipin');
assert.notEqual(getActiveAdapterFx(url)?.name, 'boss-zhipin');
}

const adapter = getActiveAdapter('https://www.zhipin.com/web/geek/jobs?query=webbrain&city=101020100');
const firefoxAdapter = getActiveAdapterFx('https://m.zhipin.com/zhaopin/example/');
assert.match(adapter?.notes || '', /2026-08/);
assert.match(adapter?.notes || '', /搜索职位、公司/);
assert.match(adapter?.notes || '', /city=.*城市/s);
assert.match(adapter?.notes || '', /K-denominated.*·15薪/s);
assert.match(adapter?.notes || '', /experience.*education.*company.*financing.*company size/s);
assert.match(adapter?.notes || '', /立即沟通.*开聊.*not an application or an offer/s);
assert.match(adapter?.notes || '', /交换联系方式.*面试邀请.*phone number.*微信/s);
assert.match(adapter?.notes || '', /explicit confirmation/);
assert.match(adapter?.notes || '', /通知与隐私设置.*对BOSS隐藏简历.*屏蔽公司/s);
assert.match(adapter?.notes || '', /安全验证.*\/web\/passport\/zp\/verify\.html/s);
assert.match(adapter?.notes || '', /about:blank.*HTTP 200.*access\/anti-automation restriction/s);
assert.match(adapter?.notes || '', /sent\/delivered status.*explicit status/s);
assert.equal((adapter?.notes || '').trim().split('\n').filter((line) => line.startsWith('- ')).length, 9);
assert.equal(firefoxAdapter?.notes, adapter?.notes);
});

test('matches Bilibili surfaces with mirrored regional guidance', () => {
const urls = [
'https://www.bilibili.com/video/BV1FD4y147uH/?p=2',
Expand Down
Loading