qiksy 1.0.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/ARCHITECTURE.md +78 -0
- package/INSTALL-PROMPT.md +53 -0
- package/bin/qiksy.mjs +302 -0
- package/package.json +32 -0
- package/tools/client-finder/vendor/README.md +70 -0
- package/tools/client-finder/vendor/find.mjs +121 -0
- package/tools/client-finder/vendor/icp/assist-pl-shops.json +30 -0
- package/tools/client-finder/vendor/icp/assist-ua-shops.json +30 -0
- package/tools/client-finder/vendor/knowledge/assist.md +68 -0
- package/tools/client-finder/vendor/knowledge/custom.md +36 -0
- package/tools/client-finder/vendor/knowledge/multilogin.md +29 -0
- package/tools/client-finder/vendor/knowledge/pay.md +26 -0
- package/tools/client-finder/vendor/knowledge/qa-copilot.md +43 -0
- package/tools/client-finder/vendor/knowledge/travel.md +43 -0
- package/tools/client-finder/vendor/knowledge/work-finder.md +52 -0
- package/tools/client-finder/vendor/lib/access.mjs +108 -0
- package/tools/client-finder/vendor/lib/agent.mjs +204 -0
- package/tools/client-finder/vendor/lib/approver-mcp.mjs +78 -0
- package/tools/client-finder/vendor/lib/browser.mjs +108 -0
- package/tools/client-finder/vendor/lib/catalog.mjs +86 -0
- package/tools/client-finder/vendor/lib/channels.mjs +54 -0
- package/tools/client-finder/vendor/lib/deliver.mjs +89 -0
- package/tools/client-finder/vendor/lib/engine.mjs +283 -0
- package/tools/client-finder/vendor/lib/formats.mjs +108 -0
- package/tools/client-finder/vendor/lib/jobs.mjs +75 -0
- package/tools/client-finder/vendor/lib/knowledge.mjs +26 -0
- package/tools/client-finder/vendor/lib/prompts.mjs +183 -0
- package/tools/client-finder/vendor/lib/report.mjs +75 -0
- package/tools/client-finder/vendor/lib/scope.mjs +162 -0
- package/tools/client-finder/vendor/lib/spawn-claude.mjs +44 -0
- package/tools/client-finder/vendor/lib/verify.mjs +96 -0
- package/tools/client-finder/vendor/package.json +8 -0
- package/tools/client-finder/vendor/server.mjs +390 -0
- package/tools/travel/vendor/README.md +58 -0
- package/tools/travel/vendor/docs/CONTRACT.md +174 -0
- package/tools/travel/vendor/docs/ENGINE-MIGRATION.md +33 -0
- package/tools/travel/vendor/lib/agent.mjs +190 -0
- package/tools/travel/vendor/lib/engine.mjs +283 -0
- package/tools/travel/vendor/lib/jobs.mjs +125 -0
- package/tools/travel/vendor/lib/license.mjs +41 -0
- package/tools/travel/vendor/lib/plans.mjs +28 -0
- package/tools/travel/vendor/lib/prompts.mjs +394 -0
- package/tools/travel/vendor/lib/proposal.mjs +207 -0
- package/tools/travel/vendor/lib/spawn-claude.mjs +44 -0
- package/tools/travel/vendor/lib/store.mjs +75 -0
- package/tools/travel/vendor/package.json +12 -0
- package/tools/travel/vendor/public/app.js +996 -0
- package/tools/travel/vendor/public/index.html +112 -0
- package/tools/travel/vendor/public/styles.css +760 -0
- package/tools/travel/vendor/scripts/approver-mcp.mjs +80 -0
- package/tools/travel/vendor/scripts/launch-browser.mjs +77 -0
- package/tools/travel/vendor/server.mjs +755 -0
- package/tools/work-finder/vendor/.claude/settings.local.json +27 -0
- package/tools/work-finder/vendor/.mcp.json +9 -0
- package/tools/work-finder/vendor/CLAUDE.md +24 -0
- package/tools/work-finder/vendor/README.md +44 -0
- package/tools/work-finder/vendor/bin/qiksy-work-finder.mjs +127 -0
- package/tools/work-finder/vendor/lib/agent.mjs +159 -0
- package/tools/work-finder/vendor/lib/catalog.mjs +41 -0
- package/tools/work-finder/vendor/lib/channels.mjs +73 -0
- package/tools/work-finder/vendor/lib/engine.mjs +283 -0
- package/tools/work-finder/vendor/lib/jobs.mjs +127 -0
- package/tools/work-finder/vendor/lib/license.mjs +60 -0
- package/tools/work-finder/vendor/lib/linkcheck.mjs +72 -0
- package/tools/work-finder/vendor/lib/linkedin.mjs +22 -0
- package/tools/work-finder/vendor/lib/plans.mjs +33 -0
- package/tools/work-finder/vendor/lib/prompts.mjs +217 -0
- package/tools/work-finder/vendor/lib/spawn-claude.mjs +44 -0
- package/tools/work-finder/vendor/lib/store.mjs +125 -0
- package/tools/work-finder/vendor/package.json +41 -0
- package/tools/work-finder/vendor/public/app.js +1863 -0
- package/tools/work-finder/vendor/public/index.html +518 -0
- package/tools/work-finder/vendor/public/styles.css +930 -0
- package/tools/work-finder/vendor/scripts/approver-mcp.mjs +69 -0
- package/tools/work-finder/vendor/scripts/extract-linkedin.mjs +81 -0
- package/tools/work-finder/vendor/scripts/launch-browser.mjs +78 -0
- package/tools/work-finder/vendor/scripts/screenshot.mjs +17 -0
- package/tools/work-finder/vendor/server.mjs +1006 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Minimal MCP stdio server: permission-prompt handler for headless agents.
|
|
4
|
+
*
|
|
5
|
+
* The user's global ~/.claude/settings.json puts WebSearch/WebFetch in the
|
|
6
|
+
* "ask" list; in -p mode "ask" becomes "deny". This server is passed via
|
|
7
|
+
* `--permission-prompt-tool mcp__approver__approve` and auto-approves only
|
|
8
|
+
* the whitelisted tools below — everything else stays denied.
|
|
9
|
+
*
|
|
10
|
+
* Домен: агентам можно искать и читать веб + водить браузер (playwright);
|
|
11
|
+
* всё деструктивное (Bash/Edit/Write и произвольный JS в браузере) — deny.
|
|
12
|
+
*/
|
|
13
|
+
// DENY wins over the broad playwright ALLOW: block arbitrary in-page JS
|
|
14
|
+
// (evaluate/run_code_unsafe) and file uploads even though playwright is allowed.
|
|
15
|
+
const DENY = [
|
|
16
|
+
/^mcp__playwright__browser_run_code_unsafe$/,
|
|
17
|
+
/^mcp__playwright__browser_evaluate$/,
|
|
18
|
+
/^mcp__playwright__browser_file_upload$/,
|
|
19
|
+
];
|
|
20
|
+
const ALLOW = [/^WebSearch$/, /^WebFetch$/, /^ToolSearch$/, /^mcp__playwright__/];
|
|
21
|
+
|
|
22
|
+
const send = msg => process.stdout.write(JSON.stringify(msg) + '\n');
|
|
23
|
+
|
|
24
|
+
function handle(msg) {
|
|
25
|
+
const { id, method, params } = msg;
|
|
26
|
+
if (method === 'initialize') {
|
|
27
|
+
return send({
|
|
28
|
+
jsonrpc: '2.0', id,
|
|
29
|
+
result: {
|
|
30
|
+
protocolVersion: params?.protocolVersion || '2024-11-05',
|
|
31
|
+
capabilities: { tools: {} },
|
|
32
|
+
serverInfo: { name: 'approver', version: '1.0.0' },
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (method === 'tools/list') {
|
|
37
|
+
return send({
|
|
38
|
+
jsonrpc: '2.0', id,
|
|
39
|
+
result: {
|
|
40
|
+
tools: [{
|
|
41
|
+
name: 'approve',
|
|
42
|
+
description: 'Auto-approve permission prompts for whitelisted tools',
|
|
43
|
+
inputSchema: {
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: {
|
|
46
|
+
tool_name: { type: 'string' },
|
|
47
|
+
input: { type: 'object' },
|
|
48
|
+
tool_use_id: { type: 'string' },
|
|
49
|
+
},
|
|
50
|
+
required: ['tool_name', 'input'],
|
|
51
|
+
},
|
|
52
|
+
}],
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (method === 'tools/call') {
|
|
57
|
+
const { name, arguments: args = {} } = params || {};
|
|
58
|
+
if (name !== 'approve') return send({ jsonrpc: '2.0', id, error: { code: -32601, message: 'unknown tool' } });
|
|
59
|
+
const tool = args.tool_name || '';
|
|
60
|
+
const ok = !DENY.some(re => re.test(tool)) && ALLOW.some(re => re.test(tool));
|
|
61
|
+
const payload = ok
|
|
62
|
+
? { behavior: 'allow', updatedInput: args.input || {} }
|
|
63
|
+
: { behavior: 'deny', message: `tool ${tool} is not whitelisted for travel-assistant agents` };
|
|
64
|
+
return send({ jsonrpc: '2.0', id, result: { content: [{ type: 'text', text: JSON.stringify(payload) }] } });
|
|
65
|
+
}
|
|
66
|
+
if (id !== undefined) send({ jsonrpc: '2.0', id, result: {} });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let buf = '';
|
|
70
|
+
process.stdin.setEncoding('utf8');
|
|
71
|
+
process.stdin.on('data', chunk => {
|
|
72
|
+
buf += chunk;
|
|
73
|
+
let nl;
|
|
74
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
75
|
+
const line = buf.slice(0, nl).trim();
|
|
76
|
+
buf = buf.slice(nl + 1);
|
|
77
|
+
if (!line) continue;
|
|
78
|
+
try { handle(JSON.parse(line)); } catch { /* ignore malformed line */ }
|
|
79
|
+
}
|
|
80
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Ensure a CDP Chrome is up on :9222 (калька с work-finder).
|
|
4
|
+
*
|
|
5
|
+
* If something already listens on the port — reuse it. Otherwise launch
|
|
6
|
+
* Chrome with travel-assistant's own persistent profile
|
|
7
|
+
* (.cdp-browser-profile/, git-ignored), so logins survive restarts.
|
|
8
|
+
*
|
|
9
|
+
* Env overrides: CHROME_PATH, CDP_PORT (default 9222), TA_HEADLESS=1
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { resolve, dirname } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const PORT = Number(process.env.CDP_PORT) || 9222;
|
|
17
|
+
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
18
|
+
const PROFILE_DIR = resolve(ROOT, '.cdp-browser-profile');
|
|
19
|
+
|
|
20
|
+
const CHROME_CANDIDATES = {
|
|
21
|
+
darwin: [
|
|
22
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
23
|
+
'/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
24
|
+
],
|
|
25
|
+
linux: ['/usr/bin/google-chrome', '/usr/bin/google-chrome-stable', '/usr/bin/chromium'],
|
|
26
|
+
win32: [
|
|
27
|
+
process.env.LOCALAPPDATA ? `${process.env.LOCALAPPDATA}\\Google\\Chrome\\Application\\chrome.exe` : null,
|
|
28
|
+
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
29
|
+
].filter(Boolean),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
async function probeCDP() {
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch(`http://localhost:${PORT}/json/version`, { signal: AbortSignal.timeout(1500) });
|
|
35
|
+
return res.ok;
|
|
36
|
+
} catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function ensureBrowser() {
|
|
42
|
+
if (await probeCDP()) {
|
|
43
|
+
console.error(`[browser] CDP already up on :${PORT}, reusing.`);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const chromePath = process.env.CHROME_PATH
|
|
47
|
+
|| (CHROME_CANDIDATES[process.platform] || []).find(p => existsSync(p));
|
|
48
|
+
if (!chromePath) {
|
|
49
|
+
console.error('[browser] Chrome not found; set CHROME_PATH.');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const headless = /^(1|true)$/i.test(process.env.TA_HEADLESS || '');
|
|
53
|
+
const args = [
|
|
54
|
+
`--remote-debugging-port=${PORT}`,
|
|
55
|
+
`--user-data-dir=${PROFILE_DIR}`,
|
|
56
|
+
'--no-first-run',
|
|
57
|
+
...(headless ? ['--headless=new', '--disable-gpu'] : []),
|
|
58
|
+
];
|
|
59
|
+
console.error(`[browser] Launching Chrome${headless ? ' (headless)' : ''} on :${PORT}…`);
|
|
60
|
+
const child = spawn(chromePath, args, { detached: true, stdio: 'ignore' });
|
|
61
|
+
child.unref();
|
|
62
|
+
const t0 = Date.now();
|
|
63
|
+
while (Date.now() - t0 < 15_000) {
|
|
64
|
+
if (await probeCDP()) {
|
|
65
|
+
console.error('[browser] Ready.');
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
await new Promise(r => setTimeout(r, 300));
|
|
69
|
+
}
|
|
70
|
+
console.error(`[browser] Chrome did not respond on :${PORT} within 15s.`);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
75
|
+
const ok = await ensureBrowser();
|
|
76
|
+
process.exit(ok ? 0 : 1);
|
|
77
|
+
}
|