Концепції, цінність і типові сценарії
Концепції, цінність і типові сценарії
Preparing Ring content
Preparing Ring content
Preparing Ring content
Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Ring Tasks розширюють обмін повідомленнями структурованим типом повідомлення task — це не окремий продукт CRM (завдання CRM для адміністративної пошти за адресою /admin/crm/tasks не пов'язані з ними).
Учасники надсилають одне одному завдання в чаті: опис, необов'язкового виконавця, кінцевий термін, бюджет і необов'язковий ескроу кредитів. Глобальне дерево /tasks містить список останніх завдань у всіх розмовах. Автори можуть перетворити завдання на особисту можливість request.
|| Шар | Де |
||-------|--------|
|| Типи | features/chat/types/index.ts — Message.type: 'task', TaskMetadata |
|| Модуль функції | features/tasks/** |
|| Серверні дії | app/_actions/tasks.ts |
|| API списків | GET /api/tasks, GET /api/tasks/conversation/[id] |
|| Сторінки | /tasks, /tasks/[chatId] |
|| Глибоке посилання на чат | /messages?c=<conversationId> (без сегмента /messages/[id]) |
|| Статус | Значення |
||--------|---------|
|| available | Опубліковано без виконавця |
|| requested | Хтось попросив призначити його виконавцем |
|| in_progress | Виконавця призначено |
|| completed | Виконано автором або виконавцем |
|| accepted | Автор прийняв роботу (ескроу, якщо він утримується, вивільняється) |
|| canceled | Автор скасував (утримуваний ескроу повертається на кредитний баланс) |
|| disputed | Автор оскаржив після виконання, коли ескроу утримується |
Одних повідомлень недостатньо, щоб завершити роботу. Завдання перетворюють чат на просту робочу домовленість: хто відповідає за роботу, коли її потрібно виконати та чи утримується оплата до прийняття.
Завдання відображаються як віджети в тому самому списку розмов.
Перетворіть завдання на публічний/приватний запит за потреби залучити аудиторію маркетплейсу.
Ескроу v1 утримує та вивільняє кредитний баланс (бали).
Передумова: завдання — це віджети повідомлень чату в тому самому списку розмов.
Наступний крок: перетворені запити потрапляють у стрічку перегляду з джерелом From chat, а не машинними тегами.
Залежить від: ескроу завдань v1 утримує та вивільняє бали кредитного балансу.
Поглиблено: PaymentPurpose task_escrow повторно використовує рейки Conductor.
Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Ring Tasks розширюють обмін повідомленнями структурованим типом повідомлення task — це не окремий продукт CRM (завдання CRM для адміністративної пошти за адресою /admin/crm/tasks не пов'язані з ними).
Учасники надсилають одне одному завдання в чаті: опис, необов'язкового виконавця, кінцевий термін, бюджет і необов'язковий ескроу кредитів. Глобальне дерево /tasks містить список останніх завдань у всіх розмовах. Автори можуть перетворити завдання на особисту можливість request.
|| Шар | Де |
||-------|--------|
|| Типи | features/chat/types/index.ts — Message.type: 'task', TaskMetadata |
|| Модуль функції | features/tasks/** |
|| Серверні дії | app/_actions/tasks.ts |
|| API списків | GET /api/tasks, GET /api/tasks/conversation/[id] |
|| Сторінки | /tasks, /tasks/[chatId] |
|| Глибоке посилання на чат | /messages?c=<conversationId> (без сегмента /messages/[id]) |
|| Статус | Значення |
||--------|---------|
|| available | Опубліковано без виконавця |
|| requested | Хтось попросив призначити його виконавцем |
|| in_progress | Виконавця призначено |
|| completed | Виконано автором або виконавцем |
|| accepted | Автор прийняв роботу (ескроу, якщо він утримується, вивільняється) |
|| canceled | Автор скасував (утримуваний ескроу повертається на кредитний баланс) |
|| disputed | Автор оскаржив після виконання, коли ескроу утримується |
Одних повідомлень недостатньо, щоб завершити роботу. Завдання перетворюють чат на просту робочу домовленість: хто відповідає за роботу, коли її потрібно виконати та чи утримується оплата до прийняття.
Завдання відображаються як віджети в тому самому списку розмов.
Перетворіть завдання на публічний/приватний запит за потреби залучити аудиторію маркетплейсу.
Ескроу v1 утримує та вивільняє кредитний баланс (бали).
Передумова: завдання — це віджети повідомлень чату в тому самому списку розмов.
Наступний крок: перетворені запити потрапляють у стрічку перегляду з джерелом From chat, а не машинними тегами.
Залежить від: ескроу завдань v1 утримує та вивільняє бали кредитного балансу.
Поглиблено: PaymentPurpose task_escrow повторно використовує рейки Conductor.
Використовуйте вкладки Founder / Developer на бічній панелі документації, щоб відфільтрувати цю сторінку. Ring Tasks розширюють обмін повідомленнями структурованим типом повідомлення task — це не окремий продукт CRM (завдання CRM для адміністративної пошти за адресою /admin/crm/tasks не пов'язані з ними).
Учасники надсилають одне одному завдання в чаті: опис, необов'язкового виконавця, кінцевий термін, бюджет і необов'язковий ескроу кредитів. Глобальне дерево /tasks містить список останніх завдань у всіх розмовах. Автори можуть перетворити завдання на особисту можливість request.
|| Шар | Де |
||-------|--------|
|| Типи | features/chat/types/index.ts — Message.type: 'task', TaskMetadata |
|| Модуль функції | features/tasks/** |
|| Серверні дії | app/_actions/tasks.ts |
|| API списків | GET /api/tasks, GET /api/tasks/conversation/[id] |
|| Сторінки | /tasks, /tasks/[chatId] |
|| Глибоке посилання на чат | /messages?c=<conversationId> (без сегмента /messages/[id]) |
|| Статус | Значення |
||--------|---------|
|| available | Опубліковано без виконавця |
|| requested | Хтось попросив призначити його виконавцем |
|| in_progress | Виконавця призначено |
|| completed | Виконано автором або виконавцем |
|| accepted | Автор прийняв роботу (ескроу, якщо він утримується, вивільняється) |
|| canceled | Автор скасував (утримуваний ескроу повертається на кредитний баланс) |
|| disputed | Автор оскаржив після виконання, коли ескроу утримується |
Одних повідомлень недостатньо, щоб завершити роботу. Завдання перетворюють чат на просту робочу домовленість: хто відповідає за роботу, коли її потрібно виконати та чи утримується оплата до прийняття.
Завдання відображаються як віджети в тому самому списку розмов.
Перетворіть завдання на публічний/приватний запит за потреби залучити аудиторію маркетплейсу.
Ескроу v1 утримує та вивільняє кредитний баланс (бали).
Передумова: завдання — це віджети повідомлень чату в тому самому списку розмов.
Наступний крок: перетворені запити потрапляють у стрічку перегляду з джерелом From chat, а не машинними тегами.
Залежить від: ескроу завдань v1 утримує та вивільняє бали кредитного балансу.
Поглиблено: PaymentPurpose task_escrow повторно використовує рейки Conductor.
/tasks).PaymentPurpose.task_escrow)./admin/crm/task-escrows — вивільнення, повернення або примусове скасування утримуваних ескроу.Сповіщення: NotificationType.TASK_ASSIGNED, TASK_UPDATED.
/tasks|| Кінцева точка | Поведінка |
||----------|----------|
|| GET /api/tasks?filter= | all | available | in_progress | completed — до 3 найновіших завдань на розмову, глобальний ліміт 21 |
|| GET /api/tasks/conversation/[id] | Усі завдання в одному чаті |
|| Відповідність фільтрів | available → available+requested; in_progress → in_progress; completed → completed+accepted |
Маршрути: ROUTES.TASKS, ROUTES.TASK(chatId) у constants/routes.ts.
PaymentPurpose містить task_escrow (lib/payments/conductor/types.ts). Посилання на замовлення: task_{escrowId}_{timestamp}.
|| Подія | Поведінка |
||-------|----------|
|| Фінансування під час створення (кредит) | creditBalanceService.spendCredits → документ ескроу held + метадані повідомлення |
|| Фінансування під час створення (фіат/нативні кошти) | Документ ескроу в стані очікування → needsCheckout → POST /api/tasks/escrow/[id]/checkout |
|| Вебхук WFP/Stripe / вбудований нативний платіж | markHeldFromPayment → held + сповіщення автора |
|| Скасування до вивільнення | Кредит: addFiatUsd desk_refund + стабільний reference_id; WFP: refundStorePayment; нативні кошти: treasury→автор або резервний варіант — еквівалент у кредитах (як під час вивільнення) |
|| Прийняття після виконання | Кредит/фіат: addFiatUsd + reference_id; нативні кошти: treasury→виконавець або резервний варіант — еквівалент у кредитах |
|| Паралельне отримання | Справжній CAS: db().transaction + FOR UPDATE — лише одна з дій accept/cancel може отримати held |
|| Адміністраторське оскарження | /admin/crm/task-escrows — вивільнення / повернення / скасування через TaskEscrowService.adminResolve |
Колекція: task_escrows (документ JSONB через DatabaseService). Стабільні посилання реєстру: task_escrow_release_${id}, task_escrow_refund_${id} (зберігаються під час отримання до переміщення коштів).
SOLANA_TREASURY_PRIVATE_KEY, SOLANA_FEE_PAYER_PRIVATE_KEY, RPC).held.features/wallet/ops/TREASURY-SWAP-OPS.md § Task escrow.convertTaskToOpportunity (лише автор, не скасоване) викликає createOpportunity з type: 'request', isPrivate: true, visibility: 'subscriber', tags: [] і джерелом у metadata.source:
{ kind: 'chat_task', messageId, conversationId }.
Після цього завдання зберігає opportunityId у метаданих. Картки стрічки приховують застарілі теги sourceMessageId: / sourceConversationId: / chat_task через splitOpportunityTags (features/opportunities/lib/opportunity-tags.ts). Власник бачить чип From chat → /messages?c=<conversationId> (той самий запит, що й глибоке посилання на чат на цій сторінці). Немає зворотного заповнення, яке копіює старі закодовані теги в metadata.source.
Створіть завдання з композитора чату (ListTodo) — необов'язкові виконавець, кінцевий термін, кредитний бюджет і ескроу.
Співрозмовник натискає Start / Request → Done → автор натискає Accept (або Dispute, коли ескроу утримується).
Переглядайте /tasks або /tasks/[chatId]; відкривайте чат через /messages?c=.
За потреби перетворіть завдання на можливість → список запитів /opportunities.
/tasks).PaymentPurpose.task_escrow)./admin/crm/task-escrows — вивільнення, повернення або примусове скасування утримуваних ескроу.Сповіщення: NotificationType.TASK_ASSIGNED, TASK_UPDATED.
/tasks|| Кінцева точка | Поведінка |
||----------|----------|
|| GET /api/tasks?filter= | all | available | in_progress | completed — до 3 найновіших завдань на розмову, глобальний ліміт 21 |
|| GET /api/tasks/conversation/[id] | Усі завдання в одному чаті |
|| Відповідність фільтрів | available → available+requested; in_progress → in_progress; completed → completed+accepted |
Маршрути: ROUTES.TASKS, ROUTES.TASK(chatId) у constants/routes.ts.
PaymentPurpose містить task_escrow (lib/payments/conductor/types.ts). Посилання на замовлення: task_{escrowId}_{timestamp}.
|| Подія | Поведінка |
||-------|----------|
|| Фінансування під час створення (кредит) | creditBalanceService.spendCredits → документ ескроу held + метадані повідомлення |
|| Фінансування під час створення (фіат/нативні кошти) | Документ ескроу в стані очікування → needsCheckout → POST /api/tasks/escrow/[id]/checkout |
|| Вебхук WFP/Stripe / вбудований нативний платіж | markHeldFromPayment → held + сповіщення автора |
|| Скасування до вивільнення | Кредит: addFiatUsd desk_refund + стабільний reference_id; WFP: refundStorePayment; нативні кошти: treasury→автор або резервний варіант — еквівалент у кредитах (як під час вивільнення) |
|| Прийняття після виконання | Кредит/фіат: addFiatUsd + reference_id; нативні кошти: treasury→виконавець або резервний варіант — еквівалент у кредитах |
|| Паралельне отримання | Справжній CAS: db().transaction + FOR UPDATE — лише одна з дій accept/cancel може отримати held |
|| Адміністраторське оскарження | /admin/crm/task-escrows — вивільнення / повернення / скасування через TaskEscrowService.adminResolve |
Колекція: task_escrows (документ JSONB через DatabaseService). Стабільні посилання реєстру: task_escrow_release_${id}, task_escrow_refund_${id} (зберігаються під час отримання до переміщення коштів).
SOLANA_TREASURY_PRIVATE_KEY, SOLANA_FEE_PAYER_PRIVATE_KEY, RPC).held.features/wallet/ops/TREASURY-SWAP-OPS.md § Task escrow.convertTaskToOpportunity (лише автор, не скасоване) викликає createOpportunity з type: 'request', isPrivate: true, visibility: 'subscriber', tags: [] і джерелом у metadata.source:
{ kind: 'chat_task', messageId, conversationId }.
Після цього завдання зберігає opportunityId у метаданих. Картки стрічки приховують застарілі теги sourceMessageId: / sourceConversationId: / chat_task через splitOpportunityTags (features/opportunities/lib/opportunity-tags.ts). Власник бачить чип From chat → /messages?c=<conversationId> (той самий запит, що й глибоке посилання на чат на цій сторінці). Немає зворотного заповнення, яке копіює старі закодовані теги в metadata.source.
Створіть завдання з композитора чату (ListTodo) — необов'язкові виконавець, кінцевий термін, кредитний бюджет і ескроу.
Співрозмовник натискає Start / Request → Done → автор натискає Accept (або Dispute, коли ескроу утримується).
Переглядайте /tasks або /tasks/[chatId]; відкривайте чат через /messages?c=.
За потреби перетворіть завдання на можливість → список запитів /opportunities.
/tasks).PaymentPurpose.task_escrow)./admin/crm/task-escrows — вивільнення, повернення або примусове скасування утримуваних ескроу.Сповіщення: NotificationType.TASK_ASSIGNED, TASK_UPDATED.
/tasks|| Кінцева точка | Поведінка |
||----------|----------|
|| GET /api/tasks?filter= | all | available | in_progress | completed — до 3 найновіших завдань на розмову, глобальний ліміт 21 |
|| GET /api/tasks/conversation/[id] | Усі завдання в одному чаті |
|| Відповідність фільтрів | available → available+requested; in_progress → in_progress; completed → completed+accepted |
Маршрути: ROUTES.TASKS, ROUTES.TASK(chatId) у constants/routes.ts.
PaymentPurpose містить task_escrow (lib/payments/conductor/types.ts). Посилання на замовлення: task_{escrowId}_{timestamp}.
|| Подія | Поведінка |
||-------|----------|
|| Фінансування під час створення (кредит) | creditBalanceService.spendCredits → документ ескроу held + метадані повідомлення |
|| Фінансування під час створення (фіат/нативні кошти) | Документ ескроу в стані очікування → needsCheckout → POST /api/tasks/escrow/[id]/checkout |
|| Вебхук WFP/Stripe / вбудований нативний платіж | markHeldFromPayment → held + сповіщення автора |
|| Скасування до вивільнення | Кредит: addFiatUsd desk_refund + стабільний reference_id; WFP: refundStorePayment; нативні кошти: treasury→автор або резервний варіант — еквівалент у кредитах (як під час вивільнення) |
|| Прийняття після виконання | Кредит/фіат: addFiatUsd + reference_id; нативні кошти: treasury→виконавець або резервний варіант — еквівалент у кредитах |
|| Паралельне отримання | Справжній CAS: db().transaction + FOR UPDATE — лише одна з дій accept/cancel може отримати held |
|| Адміністраторське оскарження | /admin/crm/task-escrows — вивільнення / повернення / скасування через TaskEscrowService.adminResolve |
Колекція: task_escrows (документ JSONB через DatabaseService). Стабільні посилання реєстру: task_escrow_release_${id}, task_escrow_refund_${id} (зберігаються під час отримання до переміщення коштів).
SOLANA_TREASURY_PRIVATE_KEY, SOLANA_FEE_PAYER_PRIVATE_KEY, RPC).held.features/wallet/ops/TREASURY-SWAP-OPS.md § Task escrow.convertTaskToOpportunity (лише автор, не скасоване) викликає createOpportunity з type: 'request', isPrivate: true, visibility: 'subscriber', tags: [] і джерелом у metadata.source:
{ kind: 'chat_task', messageId, conversationId }.
Після цього завдання зберігає opportunityId у метаданих. Картки стрічки приховують застарілі теги sourceMessageId: / sourceConversationId: / chat_task через splitOpportunityTags (features/opportunities/lib/opportunity-tags.ts). Власник бачить чип From chat → /messages?c=<conversationId> (той самий запит, що й глибоке посилання на чат на цій сторінці). Немає зворотного заповнення, яке копіює старі закодовані теги в metadata.source.
Створіть завдання з композитора чату (ListTodo) — необов'язкові виконавець, кінцевий термін, кредитний бюджет і ескроу.
Співрозмовник натискає Start / Request → Done → автор натискає Accept (або Dispute, коли ескроу утримується).
Переглядайте /tasks або /tasks/[chatId]; відкривайте чат через /messages?c=.
За потреби перетворіть завдання на можливість → список запитів /opportunities.
// app/_actions/tasks.ts (names)
createTaskMessage
startTask | requestTask | approveTaskRequest | rejectTaskRequest
completeTask | acceptTask | disputeTask | cancelTask
editTaskContent | deleteTask
convertTaskToOpportunity
// app/_actions/tasks.ts (names)
createTaskMessage
startTask | requestTask | approveTaskRequest | rejectTaskRequest
completeTask | acceptTask | disputeTask | cancelTask
editTaskContent | deleteTask
convertTaskToOpportunity
// app/_actions/tasks.ts (names)
createTaskMessage
startTask | requestTask | approveTaskRequest | rejectTaskRequest
completeTask | acceptTask | disputeTask | cancelTask
editTaskContent | deleteTask
convertTaskToOpportunity