مواد پر جائیں

ڈومین ایونٹس

DomainEventBus ایک ان پروسیس براڈکاسٹ پبلش/سبسکرائب بس ہے۔ پبلشرز publish(event) کال کرتے ہیں؛ سبسکرائبرز ایک ٹائپ شدہ on<T>() اسٹریم استعمال کرتے ہیں۔ ہر ایونٹ DomainEvent کو نافذ کرتا ہے اور occurredAt ساتھ رکھتا ہے۔

بس cc_server کے اندر چلتی ہے۔ ہر پبلشر اور ہر زندہ سبسکرائبر وہیں رہتا ہے۔ کوئی کلائنٹ اس بس کو نہیں دیکھتا — سرور ایک چُنا ہوا ذیلی مجموعہ notifications/* JSON-RPC فریمز کے طور پر آگے بھیجتا ہے، جو فی سبسکرائبر ورک اسپیس رکنیت کے مطابق فلٹر ہوتا ہے۔

پیمانہ تعداد
ٹھوس ایونٹ کلاسز 54
سورس فائلیں (packages/cc_domain/lib/core/domain/events/) 14 (نیز domain_event_bus.dart)
ایبسٹریکٹ بیسز جو کبھی براہِ راست شائع نہیں ہوتے 1 (TaskLifecycleEvent، ایک سیلڈ درجہ بندی)

نیچے کی کیٹلاگ کا ہر ایونٹ اسی ایک ڈائریکٹری میں رہتا ہے؛ کہیں اور کوئی ڈومین ایونٹ اعلان شدہ نہیں ہے۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
WorkspaceCreated workspaceId ورک اسپیس بنتا ہے
AgentRunCompleted agentId, runId?, workspaceId?, conversationId? ایجنٹ ایک رن مکمل کرتا ہے (کامیابی یا ناکامی)
AgentAwaitingInput workspaceId, kind, summary, spaceId?, conversationId?, agentId?, agentName? کوئی ایجنٹ کسی انسان کا انتظار شروع کرتا ہے: کوئی منظوری، کوئی ask_user سوال یا اسناد کی وجہ سے رکا ہوا رن (kind کی قدر approval، question یا credential ہوتی ہے)
RepoAdded repoId, path, workspaceId ایک ریپو رجسٹر ہوتا ہے؛ پس منظر میں کوڈ انڈیکسنگ شروع کرتا ہے
SkillUpdated workspaceId, slug, origin, computedHash, scanVerdict? کوئی مہارت انسٹال یا تازہ ہوتی ہے اور اپنا سپلائی چین اسکین فیصلہ ساتھ لاتی ہے

پہلا بلاک خود PR کا لائف سائیکل ہے۔ دوسرا خود لکھے PR کی نگرانی ہے: ایسے سگنلز جو آپ کے کھولے ہوئے PR کے بارے میں ہیں، اور اِن میں سے ہر ایک forUserId ساتھ رکھتا ہے تاکہ پول اُنہیں سب کو نشر کرنے کے بجائے اُس شخص تک پہنچا سکے جس سے وہ تعلق رکھتے ہیں۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
PullRequestPublished prId, workspaceId, repoOwner, repoName ایجنٹ ایک PR کھولتا ہے
PullRequestStatusChanged status, workspaceId, prId?, repoFullName?, prNumber? PR مرج/بند/کھلا/دوبارہ کھلا/منظور
PrMerged prId, workspaceId, agentId PR مرج ہوتا ہے — ایک تنگ، صرف مرج کا سگنل جو اینالیٹکس/اطلاعات کے لیے رکھا گیا ہے
PrReviewRequested workspaceId, repoOwner, repoName, prNumber, prTitle GitHub سرور صارف سے ریویو مانگتا ہے (اطلاعات پول، review_requested)
PrMentioned workspaceId, repoOwner, repoName, prNumber, prTitle کسی PR پر سرور صارف کا ذکر ہوتا ہے (اطلاعات پول، mention)
ExternalPrMerged workspaceId, repoOwner, repoName, prNumber, prTitle, mergedByLogin? باہر سے نگرانی شدہ (غیر ایجنٹ) PR مرج ہوا، جس کا پتہ GitHub اطلاعات پول نے لگایا؛ prMerged اطلاع کی قسم پر میپ ہوتا ہے
ExternalPrDetected repoOwner, repoName, prNumber, prTitle, author, workspaceId? پولنگ سے ملا غیر ایجنٹ PR — صرف پائپ لائن (جو external_pr_welcome چلاتا ہے)، کوئی اطلاع نہیں اٹھاتا
PrHeadChanged repoOwner, repoName, prNumber, prTitle, previousHeadSha, headSha, workspaceId PR کا head SHA آگے بڑھا — مصنف نے پش کیا
ReviewBecameStale workspaceId, spaceId, repoOwner, repoName, prNumber, prTitle, reviewedHeadSha, headSha کوئی مکمل شدہ AI ریویو اب اُس PR کی وضاحت نہیں کرتا جس کا اُس نے ریویو کیا تھا۔ صرف اُس وقت جاری ہوتا ہے جب بے دخل کیے گئے کمٹ کے لیے کوئی ریویو موجود ہو، اس لیے یہ فی پش پنگ کے بجائے ایک سگنل رہتا ہے

اِن تمام چھ میں workspaceId، repoOwner، repoName، prNumber، prTitle اور ایک اختیاری forUserId ہوتا ہے۔

ایونٹ اضافی پیلوڈ کب جاری ہوتا ہے
PrMergeReadinessChanged ready, reason آپ کا لکھا PR مرج کے قابل ہو گیا، یا ہونا بند ہو گیا
PrReviewDecisionChanged decision, reviewersRemaining, approverLogin? کسی ریویوور نے منظوری دی، تبدیلیاں مانگیں، یا اُس کی منظوری برطرف ہوئی
PrChecksStatusChanged failing, failingCheckName?, failingCheckUrl? CI سرخ ہو گیا، یا بحال ہو گیا
PrCommentMentioned commentId, authorLogin, bodyPreview, isReviewComment, threadId?, path?, line? کسی نے PR کمنٹ یا ریویو کمنٹ میں آپ کا ذکر کیا
PrThreadReplied commentId, authorLogin, bodyPreview, threadId?, path?, line? کسی نے اُس ریویو تھریڈ میں جواب دیا جس میں آپ شامل ہیں
PrThreadResolved threadId, commentId?, path?, line? کسی نے اُس ریویو تھریڈ کو حل کیا جس میں آپ شامل ہیں
ایونٹ پیلوڈ کب جاری ہوتا ہے
MessageReceived spaceId, messageId, senderName, contentPreview, isAgentMessage, workspaceId?, mentions, requestedByUserId?, senderUserId? نیا پیغام آتا ہے
SpaceCreated spaceId, workspaceId اسپیس بنتی ہے
SpaceDeleted spaceId, workspaceId اسپیس حذف ہو جاتی ہے
SpaceProvisioningChanged workspaceId, spaceId, status, step? اسپیس کا ورک اسپیس پروویژننگ میں داخل ہوتا ہے، کسی قدم تک پہنچتا ہے (ریپو کلون کرنا، PR چیک آؤٹ کرنا، ایجنٹ سیٹ اپ کرنا)، یا تیار/ناکام پر پلٹ جاتا ہے — چیٹ برج اسے اُس کے ٹاسک کارڈ پر بیان کرتا ہے
ایونٹ پیلوڈ کب جاری ہوتا ہے
TicketCreated ticketId, workspaceId ٹکٹ بنتا ہے
TicketAssigned ticketId, ticketTitle, ticketBody?, ticketUrl?, assignedAgentId?, assigneeType, assignedTeamId?, workspaceId ٹکٹ کسی پرنسپل یا ٹیم کو تفویض
TicketCompleted ticketId کام مکمل ہوتا ہے (حتمی)
TicketFailed ticketId, errorMessage ایجنٹ ناکام ہوتا ہے (حتمی)
TicketCancelled ticketId ٹکٹ منسوخ (حتمی)
TicketStatusChanged ticketId, workspaceId, from, to کوئی بھی اسٹیٹس تبدیلی
TicketReassigned ticketId, workspaceId, fromAgentId?, toAgentId? ٹکٹ دوبارہ تفویض
TicketDetailsUpdated ticketId, workspaceId عنوان، تفصیل یا ترجیح بدلتی ہے

یکجا ٹاسک لائف سائیکل اسٹریم — ایک ڈسپیچ شدہ ایجنٹ رن، جس کی کلید اُس کا رن لاگ id ہے۔ ہر ایونٹ taskId، فی ٹاسک ایک مونوٹونک seq، workspaceId?، agentId? اور ایک phase ساتھ رکھتا ہے؛ نیچے کی قطاریں صرف اضافی فیلڈز بتاتی ہیں۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
TaskDispatched — ٹاسک عمل درآمد کے لیے کسی بیک اینڈ کے حوالے
TaskRunning — ٹاسک نے آؤٹ پٹ دینا شروع کیا
TaskWaitingLocalDirectory lockedPath, holderTaskId? ٹاسک پارک — ڈسک پر موجود اُس پاتھ لاک کا مالک کوئی اور ٹاسک ہے جس کی اُسے ضرورت ہے
TaskProgress note? رن کے دوران پیش رفت کا چیک پوائنٹ
TaskMessage messageType, content اسٹریم شدہ پیغام (text/thinking/tool_use/tool_result/error)؛ progress فیز کے تحت رپورٹ ہوتا ہے
TaskCompleted summary? ٹاسک کامیابی سے مکمل
TaskFailed errorMessage ٹاسک ایرر کے ساتھ مکمل
TaskCancelled — ٹاسک تکمیل سے پہلے منسوخ

TaskPhase enum میں queued رکن بھی ہے، مگر کوئی چیز قطار میں رکھے جانے کا ایونٹ شائع نہیں کرتی — کوئی TaskQueued کلاس نہیں ہے۔ کسی ٹاسک کا پہلا قابلِ مشاہدہ فریم TaskDispatched ہے۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
PipelineRunCompleted workspaceId, pipelineRunId, templateId رن مکمل ہوتا ہے
PipelineRunCancelled workspaceId, pipelineRunId, templateId رن منسوخ (صارف یا نظام کی طرف سے) — ایک سوچا سمجھا توقف، ایرر نہیں
PipelineRunFailed workspaceId, pipelineRunId, templateId, errorMessage رن ناکام ہوتا ہے

صرف حتمی تبدیلیاں شائع ہوتی ہیں۔ نہ کوئی PipelineRunStarted ہے اور نہ فی قدم کوئی ایونٹ: کسی قدم کی پیش رفت کلائنٹس تک رن کی اپنی قطاروں اور جس ایجنٹ کو اُس نے ڈسپیچ کیا اُس کے ٹاسک لائف سائیکل اسٹریم کے ذریعے پہنچتی ہے، بس کے ذریعے نہیں۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
ActivityLogged id, actorType, actorId?, action, entityType, entityId?, details?, workspaceId?, runId? آڈٹ ٹریل کا اندراج بنتا ہے
BudgetThresholdCrossed scopeType, scopeId, spentCents, budgetCents, isHardStop خرچ حد سے بڑھ جاتا ہے
ایونٹ پیلوڈ کب جاری ہوتا ہے
WorkspaceMemberAdded workspaceId, userId, role کوئی صارف ورک اسپیس میں شامل ہوتا ہے (دعوت کا استعمال یا ایڈمن کا اضافہ)
WorkspaceMemberRemoved workspaceId, userId کوئی رکن ہٹایا جاتا ہے — اُس صارف کے ورک اسپیس تک محدود زندہ سیشنز کو فوراً رسائی دوبارہ جانچنی ہوتی ہے
WorkspaceMemberRoleChanged workspaceId, userId, role کسی رکن کا کردار بدلتا ہے

بس پر شناخت کی پوری سطح رکنیت ہی ہے۔ صارف کی تخلیق اور ڈیوائس کی منسوخی ہوتی ہے، مگر وہ ڈومین ایونٹس کے طور پر شائع نہیں ہوتیں — منسوخی بس سے گزارنے کے بجائے براہِ راست زندہ سیشنز پر نافذ کی جاتی ہے۔

ایونٹ پیلوڈ کب جاری ہوتا ہے
CalendarAuthExpired workspaceId, accountEmail کسی منسلک اکاؤنٹ کا OAuth ریفریش ٹوکن مستقل طور پر ناجائز ہو جاتا ہے (فی منقطع ہونے کے واقعے ایک بار شائع ہوتا ہے)
MeetingStartingSoon workspaceId, eventId, title, startTime, meetingUrl? کوئی کیلنڈر ایونٹ کنفیگر شدہ لیڈ ونڈو کے اندر شروع ہو رہا ہے
MeetingRecordingStopped workspaceId, meetingId, title, userNotes, transcript, summaryInstructions? کوئی میٹنگ ریکارڈنگ مکمل ہوتی ہے اور بلٹ اِن meeting_summary پائپ لائن شروع کرتی ہے
ایونٹ پیلوڈ کب جاری ہوتا ہے
RigClosedEvent workspaceId, rigId, reason ایک رگ ختم ہو گئی، اپنی بندش کی وجہ کے ساتھ؛ صارفین صرف backendFailure پر عمل کرتے ہیں — باقی ہر وجہ یا تو درخواست کی گئی ہوتی ہے یا اُس کے ساتھ کوئی RigReaped بھی ہوتا ہے
RigControlChanged workspaceId, rigId, controller? کسی انسان نے ایک رگ پر خصوصی کنٹرول لیا یا واپس دے دیا (چھوڑتے وقت controller null — ایونٹ یہ ریکارڈ نہیں کرتا کہ کس نے چھوڑا)
RigReaped workspaceId, rigId, reason, agentId? نظام نے مشین واپس لے لی: بیکاری، TTL، یا میموری کے دباؤ پر انخلا (جو idleTimeout کے طور پر رپورٹ ہوتا ہے)، چلانے والے ایجنٹ کے ساتھ

رگ کا کھلنا کوئی ایونٹ نہیں ہے۔ بوٹ مکمل ہوتا ہے اور رگ کی قطار تیار پر پلٹ جاتی ہے؛ کچھ شائع نہیں ہوتا، اس لیے سبسکرائب کرنے کے لیے کوئی RigOpened نہیں ہے۔

وہ ذیلی ڈومینز جن میں بالکل کوئی ایونٹ نہیں

سیکشن کا عنوان “وہ ذیلی ڈومینز جن میں بالکل کوئی ایونٹ نہیں”

کئی ذیلی نظام جو باہر سے ایونٹ پر مبنی دکھائی دیتے ہیں، دراصل نہیں ہیں۔ وہ یہاں اس لیے درج ہیں کیونکہ اُن کی عدم موجودگی ایک ڈیزائن کا فیصلہ ہے، جو کسی ہک کی تلاش میں نکلنے سے پہلے جاننے کے قابل ہے:

ذیلی ڈومین اس کے بجائے حالت کیسے آگے بڑھتی ہے
میموری record_memory_fact اور اُس کے ساتھی لکھ کر واپس آتے ہیں؛ recall پڑھتا ہے۔ کسی فیکٹ یا تنازع پر کچھ شائع نہیں ہوتا
آرکیسٹریشن پروپوزل، اُس کی منظوری اور پیدا شدہ پائپ لائن رن قطاریں اور RPC کالیں ہیں
پلان دستاویزات submit_plan ایک ریویژن لکھتا ہے؛ منظوری ایک آرکیسٹریشن مواد بناتی ہے۔ کسی کا بھی اعلان نہیں ہوتا
آرٹی فیکٹس publish_artifact / revise_artifact سیدھا ریویژنز لکھتے ہیں
منظوریاں ایسکلیشن منظوری ورک فلو سروس کے اندر نمٹایا جاتا ہے
ٹکٹ سنک وینڈر کوآرڈینیٹر اوپر بیان کردہ ٹکٹ ایونٹس کو سبسکرائب کرتا ہے؛ آنے والے ویب ہکس سیدھا لاگو کیے جاتے ہیں
کیلنڈر ریفریش ایک سنک ایونٹس اپسرٹ کرتا ہے اور کلائنٹ دوبارہ پڑھتا ہے؛ کوئی ریفریش براڈکاسٹ نہیں ہے
worktree مرج worktree_merge_log میں ریکارڈ ہوتے ہیں اور وہیں سے پڑھے جاتے ہیں

نیچے کا ہر سبسکرائبر runCcServer کے اندر (یا اُس کی بنائی ہوئی کسی سروس میں) بنایا جاتا ہے۔ کوئی کلائنٹ سائیڈ سبسکرائبر نہیں ہے۔

سبسکرائبر جو ایونٹس استعمال کرتا ہے
WorkspaceSeeder WorkspaceCreated
اسٹارٹر ایوال سوٹ کی بیجائی (ان لائن) WorkspaceCreated
چیٹ اسپیس پروویژننگ (ان لائن) SpaceCreated
PipelineTriggerDispatcher ہر DomainEvent؛ ہر فعال ٹرگر اپنی قسم کے لیے فلٹر کرتا ہے
SubPipelineResumeListener PipelineRunCompleted, PipelineRunFailed
PipelineCostRollupListener AgentRunCompleted
BudgetEvaluationListener AgentRunCompleted
MeetingSummaryReconciler PipelineRunCompleted, PipelineRunFailed, PipelineRunCancelled (صرف meeting_summary رنز)
PipelineStepResumeListener AgentRunCompleted
AgentRunTaskCompleter AgentRunCompleted
GoalSupervisor AgentRunCompleted
CheckerDispatchListener AgentRunCompleted
TeamRoutingService AgentRunCompleted, TicketAssigned
OrchestrationRunListener PipelineRunCancelled, PipelineRunFailed
MultiVendorTicketSyncCoordinator TicketCreated, TicketAssigned, TicketReassigned, TicketStatusChanged, TicketDetailsUpdated
WorktreeGcListener TicketCompleted, TicketCancelled, SpaceDeleted, PrMerged, PullRequestStatusChanged
ChatBridgeService MessageReceived, SpaceProvisioningChanged
ActivityLogPersister ActivityLogged
RigEventListener RigControlChanged, RigReaped, RigClosedEvent — چلانے والے ایجنٹ کے اسٹیئرنگ لین پر ایک سادہ زبان میں نوٹس داخل کرتا ہے
StaleReviewWatcher PrHeadChanged — ReviewBecameStale صرف اُس وقت شائع کرتا ہے جب بے دخل کیے گئے کمٹ کے لیے کوئی مکمل شدہ ریویو موجود ہو
GitHubPrConversationBridge AgentRunCompleted — باہر جانے والے PR گفتگو کے جوابات
NotificationFeedRecorder نیچے دیے گئے بائیس اطلاع کلاس ایونٹس
RemoteEventForwarder وہی بائیس نیز TicketReassigned اور ہر TaskLifecycleEvent۔ تینوں رکنیت ایونٹس صرف اُس کا فی ورک اسپیس رکنیت کیشے باطل کرتے ہیں؛ وہ فریمز کے طور پر آگے نہیں بھیجے جاتے
LocalRpcServer / RemoteRelayHost WorkspaceMemberRemoved — اُس صارف کی منسلک ورک اسپیس سبسکرپشنز گرا دیتا ہے؛ ساکٹ کھلا رہتا ہے

TicketAssigned ایک آڈٹ اور اطلاع کا سگنل اور ایک پائپ لائن ٹرگر ہے۔ کسی ایجنٹ کو تفویض ملکیت ریکارڈ کرتی ہے اور کوئی رن شروع نہیں کرتی — کوئی ٹکٹ ڈسپیچر نہیں ہے۔ کسی ٹیم کو تفویض (assignedTeamId سیٹ) استثناء ہے: TeamRoutingService ٹیم لیڈر کو ڈسپیچ کرتی ہے۔

TicketRemoteSyncHandler کا اعلان ہے مگر پروڈکشن کوڈ میں کبھی بنایا نہیں جاتا، اس لیے آج یہ کسی چیز کو سبسکرائب نہیں کرتا۔ کلائنٹ سائیڈ NotificationEventMapper صرف اپنے ہی ٹیسٹ میں بنایا جاتا ہے — یہ کلائنٹ/سرور کی تقسیم سے پہلے والے ان پروسیس راستے کا بقیہ ہے۔ زندہ ٹوسٹس نیچے دیے گئے وائر فریمز سے آتے ہیں۔

سرور پر NotificationFeedRecorder اور RemoteEventForwarder اِن ایونٹس کو notifications/* وائر فریمز (notification_wire.dart) میں بدلتے ہیں۔ کلائنٹ پر RpcNotificationMapper → mapNotificationFrame ایک فریم کو AppNotification میں بدلتا ہے۔

ٹھیک سترہ اطلاع کی اقسام ہیں۔ کئی ایونٹس ایک سے زیادہ وائر میتھڈ پر میپ ہوتے ہیں، کیونکہ فریم کنارہ لے کر چلتا ہے (ناکام بمقابلہ بحال) جبکہ قسم سوال لے کر چلتی ہے (“CI کیا کر رہا ہے؟”)۔

قسم ماخذ ایونٹ وائر میتھڈ
newMessage MessageReceived notifications/message_received (آپ کا ذکر کرتا ہے)
agentRunCompleted MessageReceived notifications/message_received (is_agent_message، آپ کا ذکر نہیں)
agentAwaitingInput AgentAwaitingInput notifications/agent_awaiting_input
ticketAssigned TicketAssigned notifications/ticket_assigned
ticketStatusChanged TicketStatusChanged notifications/ticket_status_changed
pullRequestPublished PullRequestPublished notifications/pr_published
prMerged PrMerged notifications/pr_merged
prMerged ExternalPrMerged notifications/external_pr_merged
prMentioned PrMentioned notifications/pr_mentioned
prMentioned PrCommentMentioned notifications/pr_comment_mentioned
reviewRequested PrReviewRequested notifications/pr_review_requested
reviewStale ReviewBecameStale notifications/review_stale
prMergeReadiness PrMergeReadinessChanged notifications/pr_ready_to_merge / pr_merge_blocked
prReviewDecision PrReviewDecisionChanged notifications/pr_approved / pr_changes_requested / pr_review_dismissed
prChecksStatus PrChecksStatusChanged notifications/pr_checks_failed / pr_checks_recovered
prThreadActivity PrThreadReplied notifications/pr_thread_replied
prThreadActivity PrThreadResolved notifications/pr_thread_resolved
meetingStartsSoon MeetingStartingSoon notifications/meeting_starting_soon
calendarAuthExpired CalendarAuthExpired notifications/calendar_auth_expired
rigStatusChanged RigControlChanged notifications/rig_control_changed
rigStatusChanged RigReaped notifications/rig_reaped
rigStatusChanged RigClosedEvent notifications/rig_closed

رگ ٹیک اوور کا فریم اُسے واپس نہیں بھیجا جاتا جس نے کنٹرول لیا، چھوڑنے کا فریم بغیر فلٹر ہوتا ہے (ایونٹ یہ ریکارڈ نہیں کرتا کہ کس نے چھوڑا)، اور صرف backendFailure بندش ہی rig_closed فریم پیدا کرتی ہے — باقی وجوہات یا تو درخواست کی گئی ہوتی ہیں یا ریپ فریم پہلے ہی اُنہیں ڈھانپ چکا ہوتا ہے۔

AgentAwaitingInput کو AgentAwaitingInputPublisher شائع کرتا ہے، جو منظوریوں اور اسناد کی رکاوٹوں کی رجسٹریوں میں نئے اندراجات پر نظر رکھتا ہے، اور ہر ask_user سوال کی خبر اُسے AgentQuestionService دیتا ہے۔ ایک انتظار ایک ایونٹ ہے؛ انتظار ختم ہونے پر کچھ شائع نہیں ہوتا۔

خود لکھے PR کی پانچ اقسام forUserId ساتھ رکھتی ہیں، اس لیے وہ ورک اسپیس میں سب کے بجائے مصنف تک پہنچتی ہیں۔

RemoteEventForwarder مزید TicketReassigned کو notifications/ticket_reassigned کے طور پر اور ہر TaskLifecycleEvent کو notifications/task_<phase> کے طور پر آگے بھیجتا ہے۔ اِن میں سے کوئی بھی اطلاع کی قسم پر میپ نہیں ہوتا — وہ لائیو UI چلاتے ہیں، اطلاعات کا مرکز نہیں۔ رکنیت ایونٹس فریمز کے طور پر آگے نہیں بھیجے جاتے: وہ فارورڈر کا کیشے باطل کرتے ہیں، اور سیشن ہوسٹس ہٹائے گئے رکن کی ورک اسپیس سبسکرپشنز گرا دیتے ہیں۔