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,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "assist-pl-shops",
|
|
3
|
+
"product": {
|
|
4
|
+
"name": "Qiksy Assist",
|
|
5
|
+
"pitch": "A chat widget for your site that lives in the owner's Telegram: the visitor writes in the bubble, the owner replies by swiping in their own Telegram — the visitor needs no Telegram at all. One line of code on any site (WordPress, Shopify, a hand-built one). Free / Start $99 a year / Pro $199 a year.",
|
|
6
|
+
"url": "https://qiksy.app/assist/"
|
|
7
|
+
},
|
|
8
|
+
"who": "A small Polish online shop or service business with its own site, run by an owner or a two-person team, that sells through conversation but has no live chat on the site — a visitor with a question has only a form or a phone number.",
|
|
9
|
+
"must": [
|
|
10
|
+
"Has its own website in Polish, business operates in Poland",
|
|
11
|
+
"There is NO live chat on the site: no widget, no operator bubble",
|
|
12
|
+
"The business is alive: current prices, working cart or booking form, recent posts or products",
|
|
13
|
+
"Small enough that the owner decides: no call centre, no support desk"
|
|
14
|
+
],
|
|
15
|
+
"mustNot": [
|
|
16
|
+
"Already runs a chat widget (Tidio, Smartsupp, LiveChat, Crisp, tawk.to, Zendesk, Intercom and the like) — Tidio and Smartsupp are Polish and very common, check carefully",
|
|
17
|
+
"A chain, a franchise or a marketplace",
|
|
18
|
+
"An abandoned site: dead links, old prices, news over a year old"
|
|
19
|
+
],
|
|
20
|
+
"signals": [
|
|
21
|
+
"Messenger icons in the footer or contacts — they already sell by conversation",
|
|
22
|
+
"The site is on WordPress, Shoper, WooCommerce or a builder — one line of code is within reach",
|
|
23
|
+
"An owner is visible: a name on the About page, a signature under posts",
|
|
24
|
+
"A contact form is the only way to reach them, which is exactly the gap"
|
|
25
|
+
],
|
|
26
|
+
"geo": "Poland",
|
|
27
|
+
"language": "Polish",
|
|
28
|
+
"contact": "the contact form or the e-mail published on the contact page",
|
|
29
|
+
"avoid": ["marketplaces", "aggregators", "government sites", "sites with no products or prices"]
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "assist-ua-shops",
|
|
3
|
+
"product": {
|
|
4
|
+
"name": "Qiksy Assist",
|
|
5
|
+
"pitch": "Чат для сайта, который живёт в Telegram владельца: посетитель пишет в виджет — владелец отвечает свайпом из своей Телеги, клиенту Telegram не нужен. Одна строка кода на любой сайт (Тильда, WordPress, самопис). Free / Start $99 в год / Pro $199 в год.",
|
|
6
|
+
"url": "https://qiksy.app/assist/"
|
|
7
|
+
},
|
|
8
|
+
"who": "Небольшой украинский интернет-магазин или сервисный бизнес с собственным сайтом, который продаёт через мессенджеры и живёт в Telegram, но на сайте у него нет чата — посетителю некуда написать, кроме формы или телефона.",
|
|
9
|
+
"must": [
|
|
10
|
+
"Есть собственный сайт (не только страница в Instagram и не только маркетплейс)",
|
|
11
|
+
"Сайт на украинском или русском, бизнес работает в Украине",
|
|
12
|
+
"На сайте НЕТ живого чата: ни виджета, ни всплывающего окна оператора",
|
|
13
|
+
"Есть признак, что бизнес живой: свежие товары/цены, работающая корзина или форма, актуальные контакты"
|
|
14
|
+
],
|
|
15
|
+
"mustNot": [
|
|
16
|
+
"Уже стоит чат-виджет (Tidio, Crisp, JivoSite, tawk.to, Smartsupp, HelpCrunch, Binotel, LiveChat и подобные)",
|
|
17
|
+
"Это крупный ритейлер или сеть с собственным колл-центром",
|
|
18
|
+
"Сайт заброшен: битые ссылки, цены в старой валюте, новости годичной давности"
|
|
19
|
+
],
|
|
20
|
+
"signals": [
|
|
21
|
+
"В контактах указан Telegram — значит владелец уже там живёт",
|
|
22
|
+
"Отвечают в Instagram Direct или Viber, то есть переписка и есть их канал продаж",
|
|
23
|
+
"Сайт сделан на Тильде, WordPress или конструкторе — вставить одну строку кода они смогут сами",
|
|
24
|
+
"Владелец виден: имя в разделе «о нас», подпись под текстами, личный аккаунт"
|
|
25
|
+
],
|
|
26
|
+
"geo": "Украина",
|
|
27
|
+
"language": "украинский (или русский, если сайт русскоязычный)",
|
|
28
|
+
"contact": "форма на сайте или почта из раздела контактов; Telegram владельца — если он сам указал его публично",
|
|
29
|
+
"avoid": ["маркетплейсы", "агрегаторы", "государственные сайты", "сайты без товаров и цен"]
|
|
30
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Qiksy Assist — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** чат для сайта, который живёт в Telegram владельца — посетитель
|
|
4
|
+
пишет в виджет, владелец отвечает свайпом из своей Телеги, и клиенту Telegram не
|
|
5
|
+
нужен.
|
|
6
|
+
|
|
7
|
+
## Цены (канон — [products/assist/docs/PAYMENTS.md](../../assist/docs/PAYMENTS.md))
|
|
8
|
+
|
|
9
|
+
| План | Цена | Что даёт |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Free | $0 | Виджет с брендингом, ответы на почту |
|
|
12
|
+
| Start | **$8/мес = $96/год** | Ответы из Telegram, файлы и фото в обе стороны |
|
|
13
|
+
| Pro | **$15/мес = $180/год** | White-label, несколько сайтов, статистика |
|
|
14
|
+
| Founding | **$49/год**, промо | Ранние клиенты, лимит мест |
|
|
15
|
+
|
|
16
|
+
Оплата: касса Qiksy Pay (наша, на mono) — карта, Apple Pay, Google Pay. Триал 14 дней.
|
|
17
|
+
|
|
18
|
+
## Как работает технически
|
|
19
|
+
|
|
20
|
+
- **Виджет** — один `<script>` на любой сайт: Тильда, WordPress, Shopify, самопис.
|
|
21
|
+
Вставляется в `<head>` или перед `</body>`, ничего больше настраивать не нужно.
|
|
22
|
+
- **Бэкенд** — Cloudflare Worker + Durable Object (`ChatHub`): держит переписку и
|
|
23
|
+
доставку. Живой адрес `qiksy-assist.qiksy.workers.dev`.
|
|
24
|
+
- **Связь с Telegram** — сообщения посетителя приходят владельцу в личный чат с
|
|
25
|
+
ботом; ответ свайпом (reply) уходит обратно в виджет. Посетителю Telegram не
|
|
26
|
+
нужен вообще — он остаётся на сайте.
|
|
27
|
+
- **Что умеет пересылать:** текст, фото, файлы, PDF — в обе стороны.
|
|
28
|
+
- **Публичный API виджета:** `qiksy.ask(...)`, `qiksy.identify(...)` — чтобы
|
|
29
|
+
открыть чат кнопкой на сайте или передать, кто этот посетитель.
|
|
30
|
+
|
|
31
|
+
## Кому продаём
|
|
32
|
+
|
|
33
|
+
Небольшой бизнес с сайтом, который продаёт через переписку и живёт в мессенджерах:
|
|
34
|
+
магазин, услуги, студия, мастерская, агентство. Владелец сам отвечает клиентам.
|
|
35
|
+
|
|
36
|
+
**Признак боли:** на сайте нет чата — посетителю некуда написать, кроме формы или
|
|
37
|
+
телефона; он уходит и пишет в Instagram, где всё теряется.
|
|
38
|
+
|
|
39
|
+
## Возражения и ответы
|
|
40
|
+
|
|
41
|
+
**«У меня уже есть Tidio / Crisp / JivoSite».**
|
|
42
|
+
Спросите, где они читают сообщения. Все они заставляют жить в своём дашборде или
|
|
43
|
+
приложении оператора. Assist кладёт диалог в Telegram, где владелец уже сидит —
|
|
44
|
+
отвечаешь свайпом, а не заходишь куда-то ещё. Это единственная реальная разница,
|
|
45
|
+
и говорить надо о ней, а не о функциях.
|
|
46
|
+
|
|
47
|
+
**«А клиенту нужен Telegram?»**
|
|
48
|
+
Нет. Клиент пишет прямо на сайте, в виджет. Telegram нужен только владельцу.
|
|
49
|
+
|
|
50
|
+
**«Дорого».**
|
|
51
|
+
Tidio ~$29/мес, JivoChat ~$28 за оператора, Crisp ~$45/мес. Assist — $8. Разница
|
|
52
|
+
не в скидке, а в том, что мы не строим операторский центр: мы соединяем сайт с
|
|
53
|
+
телефоном владельца.
|
|
54
|
+
|
|
55
|
+
**«Не хочу ставить код на сайт».**
|
|
56
|
+
Одна строка, и её можно вставить через любой конструктор. Если сайт делал кто-то
|
|
57
|
+
другой — вставка занимает минуту, мы можем показать где.
|
|
58
|
+
|
|
59
|
+
**«Безопасно ли?»**
|
|
60
|
+
Переписка идёт через наш Worker и Telegram. Мы не продаём данные, не показываем
|
|
61
|
+
рекламу и не даём доступ к чужим диалогам: у каждого сайта свой изолированный
|
|
62
|
+
канал.
|
|
63
|
+
|
|
64
|
+
## Чего НЕ обещать
|
|
65
|
+
|
|
66
|
+
- Не обещать рост конверсии в процентах — цифры зависят от их трафика.
|
|
67
|
+
- Не называть Assist «CRM» или «службой поддержки»: это чат и лиды, а не тикеты.
|
|
68
|
+
- White-label — только на плане Pro.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Qiksy Build / Ops — кастомная разработка
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** студия делает продукты (Build) и автоматизирует то, как бизнес
|
|
4
|
+
уже работает (Ops).
|
|
5
|
+
|
|
6
|
+
## Цена
|
|
7
|
+
|
|
8
|
+
От проекта. Кастом — это наше время, поэтому цена считается по объёму, а не по
|
|
9
|
+
прайсу. Партнёрам: 10% за приведённый лид, 20% за полностью проведённую сделку
|
|
10
|
+
([EARN.md](../../assist/docs/EARN.md)).
|
|
11
|
+
|
|
12
|
+
## Что делаем
|
|
13
|
+
|
|
14
|
+
- **Build** — новые продукты за недели: лендинги, приложения, интеграции,
|
|
15
|
+
собственные инструменты.
|
|
16
|
+
- **Ops** — автоматизация существующих процессов: то, что сейчас держится на людях
|
|
17
|
+
и таблицах.
|
|
18
|
+
|
|
19
|
+
Доказательство состоятельности — собственные продукты: Assist (живой воркер на
|
|
20
|
+
Cloudflare), QA Copilot (в Chrome Web Store), Work Finder и Travel (локальные
|
|
21
|
+
агенты на Claude), Investments (живой крипторадар). Всё это построено студией и
|
|
22
|
+
работает.
|
|
23
|
+
|
|
24
|
+
## Кому продаём
|
|
25
|
+
|
|
26
|
+
Бизнес, которому надо построить или автоматизировать, а своей команды разработки
|
|
27
|
+
нет.
|
|
28
|
+
|
|
29
|
+
**Признак боли:** процесс держится на людях и таблицах; или есть идея продукта и
|
|
30
|
+
некому её собрать.
|
|
31
|
+
|
|
32
|
+
## Чего НЕ обещать
|
|
33
|
+
|
|
34
|
+
- Не называть сроки и цену до разговора о задаче.
|
|
35
|
+
- Не обещать «под ключ за неделю» — это то обещание, из-за которого потом теряют
|
|
36
|
+
доверие.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# MultiLogin Tabs — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** расширение Chrome, которое изолирует сессии по вкладкам —
|
|
4
|
+
несколько аккаунтов одного сервиса открыты одновременно, без инкогнито и без
|
|
5
|
+
перелогинов.
|
|
6
|
+
|
|
7
|
+
## Цена
|
|
8
|
+
|
|
9
|
+
**Бесплатно.** Всегда. Партнёрской ставки у него нет и не будет — это канон
|
|
10
|
+
программы Earn ([docs/PRODUCTS.md](../../../docs/PRODUCTS.md)).
|
|
11
|
+
|
|
12
|
+
## Как работает технически
|
|
13
|
+
|
|
14
|
+
- Manifest V3, чистый вэнилла-JS.
|
|
15
|
+
- Изоляция на уровне вкладки: cookies, localStorage, IndexedDB, Cache Storage.
|
|
16
|
+
- В Chrome Web Store: ★5.0, около 700 пользователей.
|
|
17
|
+
|
|
18
|
+
## Кому продаём
|
|
19
|
+
|
|
20
|
+
Ничего не продаём — раздаём. Это инструмент, которым удобно начать разговор:
|
|
21
|
+
SMM, арбитраж, агентства, поддержка, все, кто ведёт несколько аккаунтов.
|
|
22
|
+
|
|
23
|
+
**Как использовать в продаже:** повод для первого контакта и доказательство, что
|
|
24
|
+
студия делает работающие вещи, а не только обещает.
|
|
25
|
+
|
|
26
|
+
## Чего НЕ делать
|
|
27
|
+
|
|
28
|
+
- Не приписывать ему платный план и не показывать реф-пилюлю.
|
|
29
|
+
- Не обещать обход антифрода площадок: это изоляция сессий, а не подмена отпечатка.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Qiksy Pay — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** подписки и платежи под ключ поверх собственного эквайринга —
|
|
4
|
+
биллинг, который не надо писать.
|
|
5
|
+
|
|
6
|
+
## Статус
|
|
7
|
+
|
|
8
|
+
**Ранний доступ.** Продукт заявлен, лендинг ведёт на лист ожидания. В разговоре
|
|
9
|
+
это надо называть честно: «мы открываем ранний доступ», а не «у нас есть готовый
|
|
10
|
+
биллинг». Каталог студии уже поправлен именно по этой причине.
|
|
11
|
+
|
|
12
|
+
Полная позиция и аргументы против Stripe/Paddle/Chargebee — в
|
|
13
|
+
[docs/PAY.md](../../../docs/PAY.md).
|
|
14
|
+
|
|
15
|
+
## Кому продаём
|
|
16
|
+
|
|
17
|
+
Сервисы с регулярными платежами, которым нужен биллинг, а не банк: подписочные
|
|
18
|
+
продукты, школы, SaaS.
|
|
19
|
+
|
|
20
|
+
**Признак боли:** подписки считаются руками или биллинг пишется своими силами.
|
|
21
|
+
|
|
22
|
+
## Чего НЕ обещать
|
|
23
|
+
|
|
24
|
+
- Не называть Qiksy Pay банком или платёжной системой: мы софт поверх эквайринга.
|
|
25
|
+
- Не называть сроки запуска, которых нет.
|
|
26
|
+
- Не обещать конкретные комиссии до того, как они зафиксированы.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Qiksy QA Copilot — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** расширение Chrome для ручного QA — умное заполнение форм, живой
|
|
4
|
+
аудит страницы и готовые к вставке находки.
|
|
5
|
+
|
|
6
|
+
## Цена (канон — [products/qa-copilot/docs/OPERATIONS.md](../../qa-copilot/docs/OPERATIONS.md))
|
|
7
|
+
|
|
8
|
+
**$20** — разовая покупка = Pro на 1 год. Опубликовано в Chrome Web Store.
|
|
9
|
+
|
|
10
|
+
## Как работает технически
|
|
11
|
+
|
|
12
|
+
- Расширение Manifest V3: TypeScript + React, сборка esbuild, загружаемая папка
|
|
13
|
+
`dist`.
|
|
14
|
+
- Умное заполнение форм — понимает типы полей и подставляет валидные данные,
|
|
15
|
+
экономя ручной ввод на регрессе.
|
|
16
|
+
- Аудит страницы — собирает проблемы (доступность, битые ссылки, консоль) прямо на
|
|
17
|
+
живой странице.
|
|
18
|
+
- Находки оформляются в готовый текст, который вставляется в баг-трекер.
|
|
19
|
+
- Есть MCP-мост (`qiksy-mcp` в npm) — для тех, кто хочет дергать это из своего
|
|
20
|
+
агента.
|
|
21
|
+
|
|
22
|
+
## Кому продаём
|
|
23
|
+
|
|
24
|
+
QA-инженеры, тест-лиды, небольшие продуктовые команды без автотестов, аутсорс-
|
|
25
|
+
студии с ручным регрессом.
|
|
26
|
+
|
|
27
|
+
**Признак боли:** регресс руками и оформление багов копипастой.
|
|
28
|
+
|
|
29
|
+
## Возражения и ответы
|
|
30
|
+
|
|
31
|
+
**«У нас есть автотесты».**
|
|
32
|
+
Автотесты закрывают известные сценарии. Ручной регресс никуда не девается — этот
|
|
33
|
+
инструмент про него, а не про замену автоматизации.
|
|
34
|
+
|
|
35
|
+
**«$20 — а что через год?»**
|
|
36
|
+
Год Pro за разовую покупку; продлевать необязательно, расширение продолжит
|
|
37
|
+
работать в базовом виде.
|
|
38
|
+
|
|
39
|
+
## Чего НЕ обещать
|
|
40
|
+
|
|
41
|
+
- Не называть это автотестами и не обещать «покрытие».
|
|
42
|
+
- Не обещать интеграцию с конкретным трекером, если её нет — находки копируются
|
|
43
|
+
текстом.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Qiksy Travel Assistant — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** авиабилеты, отели и трансферы для командировок — агент собирает
|
|
4
|
+
варианты и готовит маршрут; локально, на ключе клиента.
|
|
5
|
+
|
|
6
|
+
## Цены (канон — [docs/PAYMENTS.md](../../../docs/PAYMENTS.md))
|
|
7
|
+
|
|
8
|
+
| План | Цена | Что даёт |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| Free | $0 | До 3 путешественников («семья») |
|
|
11
|
+
| Pro | **$9/мес**, без ограничения по людям | Неограниченно путешественников, все функции |
|
|
12
|
+
|
|
13
|
+
Оплата: касса Qiksy Pay (наша, на mono) → `qiksy-licenses`, ключ `tr_`, проверяется локальным бэкендом.
|
|
14
|
+
|
|
15
|
+
## Как работает технически
|
|
16
|
+
|
|
17
|
+
- Локальный Node-бэкенд (`npm run backend:travel`, порт 5545); фронт ходит к нему
|
|
18
|
+
через прокси `/api`.
|
|
19
|
+
- Агенты Claude собирают варианты и складывают маршрут; approver-MCP ограничивает,
|
|
20
|
+
какими инструментами агенту можно пользоваться.
|
|
21
|
+
- Ключ Anthropic — клиента.
|
|
22
|
+
|
|
23
|
+
## Кому продаём
|
|
24
|
+
|
|
25
|
+
Компании и агентства, которые часто отправляют людей в командировки, и тревел-
|
|
26
|
+
координаторы, которые собирают маршруты руками.
|
|
27
|
+
|
|
28
|
+
**Признак боли:** командировка собирается в двадцати вкладках и пересобирается при
|
|
29
|
+
каждом переносе.
|
|
30
|
+
|
|
31
|
+
## Возражения и ответы
|
|
32
|
+
|
|
33
|
+
**«У нас есть корпоративный тревел-агент».**
|
|
34
|
+
Это не замена агенту, а замена рутине до него: собрать варианты, сравнить, свести
|
|
35
|
+
в маршрут. Агенту остаётся то, за что ему платят.
|
|
36
|
+
|
|
37
|
+
**«А данные сотрудников?»**
|
|
38
|
+
Остаются на машине клиента: продукт локальный, у нас только лицензия.
|
|
39
|
+
|
|
40
|
+
## Чего НЕ обещать
|
|
41
|
+
|
|
42
|
+
- Не обещать цены ниже рынка — мы не туроператор и не выкупаем билеты.
|
|
43
|
+
- Не гарантировать наличие мест: данные берутся из открытых источников.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Qiksy Work Finder — база знаний
|
|
2
|
+
|
|
3
|
+
**Одной фразой:** агенты Claude сканируют рынок вакансий, подбирают их под профиль
|
|
4
|
+
и готовят персональные отклики — локально, на ключе самого пользователя.
|
|
5
|
+
|
|
6
|
+
## Цены (канон — [docs/PAYMENTS.md](../../../docs/PAYMENTS.md))
|
|
7
|
+
|
|
8
|
+
| План | Цена | Что даёт |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| Free | $0 | 1 профиль кандидата, поиск и отклики |
|
|
11
|
+
| Pro | **$9/мес**, без ограничения по людям | Неограниченно профилей, авто-отклики, лиды по найму |
|
|
12
|
+
|
|
13
|
+
Оплата: касса Qiksy Pay (наша, на mono) → воркер `qiksy-licenses` выдаёт лицензионный ключ (`wf_`), который
|
|
14
|
+
локальный бэкенд проверяет. Продаётся по числу пользователей, **не по кредитам**:
|
|
15
|
+
токены идут с ключа Anthropic самого клиента.
|
|
16
|
+
|
|
17
|
+
## Как работает технически
|
|
18
|
+
|
|
19
|
+
- **Локальный бэкенд** на машине пользователя (`npm run backend:wf`, порт 5544) —
|
|
20
|
+
ничего про его поиск работы не уходит к нам.
|
|
21
|
+
- **Агент** — headless `claude -p` со stream-json; поиск идёт через WebSearch и
|
|
22
|
+
WebFetch, при необходимости — через настоящий браузер по CDP.
|
|
23
|
+
- **Ключ Anthropic** — свой у каждого пользователя, вводится в интерфейсе.
|
|
24
|
+
- **Лицензия** проверяется у воркера с офлайн-грейсом 7 дней: интернет отвалился —
|
|
25
|
+
платный план не слетает.
|
|
26
|
+
|
|
27
|
+
## Кому продаём
|
|
28
|
+
|
|
29
|
+
Специалисты в IT, которые ищут работу: разработка, QA, проджект-менеджмент,
|
|
30
|
+
дизайн, DevOps. И рекрутинговые агентства, которым нужен масштаб.
|
|
31
|
+
|
|
32
|
+
**Признак боли:** тратит вечера на отклики и переписывание сопроводительных.
|
|
33
|
+
|
|
34
|
+
## Возражения и ответы
|
|
35
|
+
|
|
36
|
+
**«Есть же LinkedIn Easy Apply».**
|
|
37
|
+
Easy Apply рассылает одно и то же. Здесь агент читает вакансию и профиль и пишет
|
|
38
|
+
отклик под конкретную вакансию — то, на что у человека не хватает вечера.
|
|
39
|
+
|
|
40
|
+
**«Мои данные уйдут к вам?»**
|
|
41
|
+
Нет. Продукт работает на машине пользователя, на его ключе. Мы не видим ни резюме,
|
|
42
|
+
ни переписки — у нас только факт лицензии.
|
|
43
|
+
|
|
44
|
+
**«Почему я ещё и за токены плачу?»**
|
|
45
|
+
Потому что иначе мы бы продавали токены с наценкой. Свой ключ — это прозрачная
|
|
46
|
+
цена работы, и её можно оптимизировать самому.
|
|
47
|
+
|
|
48
|
+
## Чего НЕ обещать
|
|
49
|
+
|
|
50
|
+
- Не обещать трудоустройство и количество офферов.
|
|
51
|
+
- Не называть авто-отклики «рассылкой» — это персональные отклики, и точность
|
|
52
|
+
здесь важнее объёма.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Finder is for PARTNERS, not for anyone who finds the URL.
|
|
3
|
+
*
|
|
4
|
+
* The check rides the licensing worker we already run (`qiksy-licenses`), the same
|
|
5
|
+
* one Work Finder and Travel verify against — one system, one place to revoke, and
|
|
6
|
+
* a partner code that stops working the moment someone leaves the programme. The
|
|
7
|
+
* product id is `clientfinder`; keys carry the `cf_` prefix by the same convention
|
|
8
|
+
* as `wf_` and `tr_`.
|
|
9
|
+
*
|
|
10
|
+
* Two deliberate properties:
|
|
11
|
+
* • Failure to REACH the worker never locks out a partner who was fine a minute
|
|
12
|
+
* ago (offline grace) — the same rule lib/license.mjs follows in Work Finder,
|
|
13
|
+
* because a plane without wifi is not a licence violation.
|
|
14
|
+
* • Failure to ANSWER "yes" does lock: an unknown code is refused, and refused
|
|
15
|
+
* with a sentence rather than a blank screen.
|
|
16
|
+
*
|
|
17
|
+
* `CF_PARTNER_CODES` (comma-separated) is the local escape hatch for development
|
|
18
|
+
* and for the owner's own machine, where the worker has nothing to say yet.
|
|
19
|
+
*
|
|
20
|
+
* THE STUDIO ACCOUNT IS A SECOND DOOR, not a bypass. Someone signed in to the studio
|
|
21
|
+
* as the owner — or as a partner the owner promoted — is already a partner by every
|
|
22
|
+
* meaning of the word; sending them to look for a `cf_…` licence they were never
|
|
23
|
+
* issued locks the product against the people who own it. So an account is accepted
|
|
24
|
+
* INSTEAD of a code, and it is checked the same way: the worker is asked who this
|
|
25
|
+
* is, and only the worker's answer counts. What arrives from the browser is a
|
|
26
|
+
* ref_code and a token, never a claim of being the owner.
|
|
27
|
+
*/
|
|
28
|
+
const API = (process.env.QIKSY_LICENSE_API || 'https://qiksy-licenses.qiksy.workers.dev').replace(/\/+$/, '');
|
|
29
|
+
const PRODUCT = 'clientfinder';
|
|
30
|
+
const GRACE_MS = 7 * 86400 * 1000;
|
|
31
|
+
|
|
32
|
+
const localCodes = () =>
|
|
33
|
+
String(process.env.CF_PARTNER_CODES || '')
|
|
34
|
+
.split(',')
|
|
35
|
+
.map((s) => s.trim())
|
|
36
|
+
.filter(Boolean);
|
|
37
|
+
|
|
38
|
+
/** code → { ok, at } — remembered so every request does not hit the network. */
|
|
39
|
+
const cache = new Map();
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The gate is a STUDIO ACCOUNT, the same way the admin console works: signed in →
|
|
43
|
+
* in, not signed in → out. No per-request key. Registering IS joining the programme
|
|
44
|
+
* (the worker mints the referral code at registration), so any account the worker
|
|
45
|
+
* confirms — `me.ok` — is a partner and may run the panel; owner/admin only change
|
|
46
|
+
* the source label, not the verdict.
|
|
47
|
+
*
|
|
48
|
+
* The check still rides the licensing worker on every call, and what the browser
|
|
49
|
+
* sends is a ref_code + token, never a claim of being anyone: a forged body earns
|
|
50
|
+
* nothing because the worker is the one that says who this is. Any failure to reach
|
|
51
|
+
* or confirm answers null, and the caller falls back to the legacy `cf_` code path.
|
|
52
|
+
*/
|
|
53
|
+
async function checkAccount(account) {
|
|
54
|
+
const ref = String(account?.ref_code || '').trim();
|
|
55
|
+
const token = String(account?.token || '').trim();
|
|
56
|
+
if (!ref || !token) return null;
|
|
57
|
+
try {
|
|
58
|
+
const r = await fetch(
|
|
59
|
+
`${API}/account/me?ref_code=${encodeURIComponent(ref)}&token=${encodeURIComponent(token)}`,
|
|
60
|
+
{ signal: AbortSignal.timeout(4000) },
|
|
61
|
+
);
|
|
62
|
+
if (!r.ok) return null;
|
|
63
|
+
const me = await r.json().catch(() => null);
|
|
64
|
+
if (!me || me.ok === false) return null;
|
|
65
|
+
return { ok: true, source: me.owner ? 'owner' : me.admin ? 'admin' : 'account' };
|
|
66
|
+
} catch {
|
|
67
|
+
/* unreachable worker — the caller falls back to the code path */
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function checkPartner(code, account) {
|
|
73
|
+
// A signed-in studio account is the gate. Checked FIRST, because it is now the
|
|
74
|
+
// normal way in — the `cf_` code below is a dev/legacy fallback (CF_PARTNER_CODES,
|
|
75
|
+
// and any key issued before this change).
|
|
76
|
+
const byAccount = await checkAccount(account);
|
|
77
|
+
if (byAccount) return byAccount;
|
|
78
|
+
|
|
79
|
+
const key = String(code || '').trim();
|
|
80
|
+
if (!key) {
|
|
81
|
+
return { ok: false, reason: 'Войдите в Qiksy Studio — панель открыта зарегистрированным партнёрам.' };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (localCodes().includes(key)) return { ok: true, source: 'local' };
|
|
85
|
+
|
|
86
|
+
const seen = cache.get(key);
|
|
87
|
+
try {
|
|
88
|
+
const r = await fetch(`${API}/v?key=${encodeURIComponent(key)}&product=${PRODUCT}`, {
|
|
89
|
+
signal: AbortSignal.timeout(4000),
|
|
90
|
+
});
|
|
91
|
+
if (r.ok) {
|
|
92
|
+
const j = await r.json().catch(() => null);
|
|
93
|
+
const ok = !!j && j.ok !== false && j.active !== false;
|
|
94
|
+
cache.set(key, { ok, at: Date.now() });
|
|
95
|
+
return ok
|
|
96
|
+
? { ok: true, source: 'worker', plan: j.plan }
|
|
97
|
+
: { ok: false, reason: 'Этот ключ не действует. Проверьте его в кабинете партнёра.' };
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
/* offline — fall through to the grace window below */
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (seen?.ok && Date.now() - seen.at < GRACE_MS) return { ok: true, source: 'grace' };
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
reason: 'Не удалось проверить ключ: сервис лицензий не отвечает. Попробуйте ещё раз через минуту.',
|
|
107
|
+
};
|
|
108
|
+
}
|