مواد پر جائیں

پائپ لائن قدم

ایک پائپ لائن قدم کے دو آزاد محور ہوتے ہیں:

  • قسم (StepKind) — انجن قدم کو اُس کے ٹریگرز کے مقابلے میں کیسے شیڈیول کرتا ہے۔
  • باڈی کلید (BuiltInBodyKeys) — کون سا رجسٹر شدہ باڈی کلوزر قدم کا کام انجام دیتا ہے۔

packages/cc_domain/lib/features/pipelines/domain/entities/step_kind.dart میں متعین۔

قسم شیڈولنگ کے معنی
trigger لازمی داخلے کا مقام — فی ٹیمپلیٹ عین ایک، ہمیشہ پہلا نوڈ۔ خود کوئی کام نہیں کرتا؛ رن کیا شروع کرتا ہے (دستی / ایونٹ / شیڈول) الگ سے PipelineTrigger قطاروں کے طور پر ٹریک ہوتا ہے۔ اِس کی باڈی no-op pipeline.trigger ہے۔
listen جب تمام ماخذ قدم (StepTrigger.sourceStepIds میں) مکمل ہو جائیں تو چلتا ہے۔
join جب waitForStepIds کے تمام قدم حتمی حالت تک پہنچ جائیں تو چلتا ہے۔
router مشروط شاخ بندی — باڈی StepResult.route(key) واپس کرتی ہے، جو صرف اُسی نیچے والے کنارے کو چلاتی ہے جس کی routeKey مماثل ہو؛ جن شاخوں کا انتخاب نہیں ہوا وہ چھوڑی گئی قرار دے دی جاتی ہیں۔
forEach listen کی طرح شیڈیول ہوتا ہے (جب تمام sourceStepIds مکمل ہوں تو چلتا ہے)۔ تکراری کام رجسٹر شدہ flow.forEach باڈی کرتی ہے؛ انجن ہر آئٹم کے لیے ایک الگ چائلڈ قدم پیدا نہیں کرتا۔
terminal بغیر باڈی والا شیڈیولر سینٹینل۔ کوئی حتمی قدم مکمل ہو جائے تو پائپ لائن رن مکمل ہو جاتا ہے۔

رجسٹر شدہ باڈی کلوزرز، جن کی کلیدیں BuiltInBodyKeys کے مستقل حروف ہیں (packages/cc_domain/lib/features/pipelines/domain/templates/builtin_template_seeds.dart)۔ یہ 25 ہیں اور سب نیچے درج ہیں۔ جہاں کوئی اور بات نہ کہی گئی ہو، کنفیگریشن قدم کے PipelineNodeConfig (نیچے دیکھیں) سے پڑھی جاتی ہے؛ «اسٹیٹ کلیدیں» عمل درآمد کے وقت پائپ لائن اسٹیٹ / ٹریگر پے لوڈ سے پڑھی جاتی ہیں۔

جس قدم کی bodyKey رجسٹر نہ ہو، وہ ٹیمپلیٹ لوڈ کے وقت ایک وارننگ پیدا کرتا ہے اور پھر کبھی نہیں چلتا — اس سے رن ناکام نہیں ہوتا۔ trigger اور terminal قدم اُس وارننگ سے مستثنیٰ ہیں: ٹریگر پھر بھی no-op pipeline.trigger باڈی چلاتا ہے؛ terminal قدم کی کوئی باڈی نہیں ہوتی۔

لازمی trigger نوڈ کی no-op باڈی — فوراً مکمل ہو جاتی ہے تاکہ انجن نیچے کے سننے والوں تک فین آؤٹ کرے۔ کوئی کنفیگریشن نہیں۔

بغیر ایجنٹ والا شیل قدم (bash -c)۔ اسکرپٹ میں {{key}} پلیس ہولڈرز اسٹیٹ + ٹریگر پے لوڈ سے، شیل-اسکیپ شدہ قدروں کے ساتھ بدلے جاتے ہیں۔

کنفیگ فیلڈ تفصیل
script چلانے کے لیے شیل کمانڈ (لازمی)
outputKey وہ اسٹیٹ کلید جسے exit 0 پر ٹرِم شدہ stdout ملتا ہے

یہ cwd <cc_root>/pipelines/<pipelineRunId>/ (ایک رن کے تمام bash قدموں کے لیے مشترک) اور ماحول میں GITHUB_TOKEN کے ساتھ چلتا ہے۔ اسٹیٹ میں <stepId>_runDir بھی لکھتا ہے۔ غیر صفر exit قدم کو stderr کے آخری حصے کے ساتھ ناکام کر دیتا ہے۔

عمومی پرامپٹ-اور-ڈسپیچ نوڈ: پرامپٹ رینڈر کرتا ہے، ایجنٹ کو ایک گفتگو میں ڈسپیچ کرتا ہے اور رن مکمل ہونے تک معطل رہتا ہے۔ ایجنٹ کا submit_output پے لوڈ outputKey کے تحت اسٹیٹ میں جمع کر لیا جاتا ہے۔

کنفیگ فیلڈ تفصیل
agentId ڈسپیچ کرنے کے لیے ورک اسپیس کے دائرے کا ایجنٹ UUID (لازمی)
prompt ہدایت کا متن؛ {{key}} تبدیلی کی حمایت کرتا ہے (لازمی)
outputKey جمع شدہ آؤٹ پٹ کے لیے اسٹیٹ کلید
outputSchema وہ JSON Schema جسے آؤٹ پٹ پورا کرے
label کینوس پر دکھایا جانے والا انسانی لیبل
extras.spaceId کام کرنے کے لیے موجودہ گفتگو (ڈیفالٹ: ایک پوشیدہ)
extras.conversationTitle اُس اسپیس کے اندر نامزد اسٹریم (اختیاری)
extras.mode اُس نوڈ پر پڑھا جاتا ہے جو کمرہ کھولتا ہے (messaging.createSpace)، یہاں نہیں۔ ڈیفالٹ review۔

روٹر باڈی — config.extras پڑھتی ہے، ایک شرط کا جائزہ لیتی ہے اور StepResult.route(key) واپس کرتی ہے۔ شرطیں JavaScript اظہار نہیں ہیں؛ ترجیحی ترتیب کے ساتھ تین تحریری شکلیں معاون ہیں:

  • پریڈیکیٹ ٹری (extras.predicate) — ایک بولین ٹری جو "true" / "false" روٹ کرتا ہے۔ ہر نوڈ ایک میپ ہے جس میں ایک type ہوتا ہے:
    • {"type": "fileExists", "paths": [...], "baseKey": "repo_local_path", "negate": false, "recursive": false} — جب فہرست میں شامل کوئی بھی پاتھ ڈسک پر موجود ہو تو true؛ negate اسے پلٹ دیتا ہے؛ recursive ذیلی ڈائریکٹریز میں بھی تلاش کرتا ہے (.git، node_modules، build، .dart_tool چھوڑ کر)۔ نسبتی پاتھ state[baseKey] (ڈیفالٹ repo_local_path) کے مقابلے میں حل ہوتے ہیں، ورنہ فی رن ورک اسپیس ڈائریکٹری کے۔
    • {"type": "comparison", "left": "{{score}}", "op": "gt", "right": 80} — آپریٹرز equals، notEquals، contains، exists، notExists، gt، lt؛ پائپ لائن اسٹیٹ پڑھتا ہے، فائل سسٹم نہیں۔
    • {"type": "and" | "or", "of": [<predicate>, ...]} — بولین گروپس۔
    • {"type": "not", "of": <predicate>} — نفی۔
  • سوئچ (extras.switchKey) — {"switchKey": "pr_class", "cases": [...], "default": "standard"}؛ پہلے ایسے کیس پر روٹ کرتا ہے جسے اسٹیٹ ویلیو بڑے/چھوٹے حروف کے فرق کے بغیر شامل ہو، ورنہ default پر۔
  • موازنہ (پرانی اعلیٰ سطحی extras.left / extras.op / extras.right) — ایک comparison پریڈیکیٹ کے برابر، اُن ٹیمپلیٹس کے لیے رکھا گیا جو ٹری سے پہلے لکھے گئے تھے۔

نوڈ سے نکلنے والے کناروں کے ساتھ ایک routeKey ہوتی ہے جو واپس کی گئی کلید سے مماثل ہونی چاہیے۔

یکجا شدہ نتائج کو GitHub PR کلائنٹ کے ذریعے PR ریویو تبصرے کے طور پر پوسٹ کرتا ہے۔

اسٹیٹ کلید تفصیل
repo_full_name owner/repo (لازمی)
pr_number PR نمبر — int یا عددی سٹرنگ (لازمی)
consolidated_findings تبصرے کی باڈی (لازمی)

StepResult.terminal واپس کرتا ہے، اور اسٹیٹ میں comment_review_id اور commented_at ہوتے ہیں۔

MessagingPort کے ذریعے کسی میسجنگ اسپیس پر پیغام پوسٹ کرتا ہے۔

اسٹیٹ کلید تفصیل
space_id ہدف اسپیس (لازمی)
content پیغام کی باڈی، اسٹیٹ سے بغیر تبدیلی پڑھی جاتی ہے (لازمی)

اسٹیٹ میں posted_space_id اور posted_at لکھتا ہے۔

ایک واحد ایجنٹ کے بجائے پوری ٹیم ڈسپیچ کرتا ہے، پھر ارکان کے رنز مکمل ہونے تک معطل رہتا ہے۔

کنفیگ فیلڈ تفصیل
teamId ڈسپیچ کرنے کے لیے ورک اسپیس کے دائرے کی ٹیم (لازمی؛ agentId کے ساتھ باہم ناسازگار)
prompt مقصد کا متن؛ {{key}} تبدیلی کی حمایت کرتا ہے (لازمی)
dispatchMode allParallel (ڈیفالٹ — فی رکن ایک ٹاسک) یا manager (ہم آہنگی کے لیے صرف لیڈر کو ڈسپیچ کریں)
outputKey جمع شدہ ارکان کے آؤٹ پٹس کے لیے اسٹیٹ کلید
outputSchema, label, extras.spaceId جیسا کہ conversation.promptAgent کے لیے

منظوری گیٹ۔ منظور کرنے والے ایجنٹ کو ایک گفتگو (ریویو موڈ) میں گیٹ پرامپٹ اور {decision, reason} آؤٹ پٹ کنٹریکٹ کے ساتھ ڈسپیچ کرتا ہے، پھر منظور کنندہ کے submit_output کے ذریعے جمع کرانے تک معطل رہتا ہے۔

کنفیگ فیلڈ تفصیل
agentId منظور کرنے والا ایجنٹ (لازمی)
prompt گیٹ پرامپٹ (اختیاری؛ موجود نہ ہو تو ڈیفالٹ استعمال ہوتا ہے)
outputKey جمع شدہ {decision, reason} پے لوڈ کے لیے اسٹیٹ کلید
outputSchema ڈیفالٹ طور پر ایک منظوری اسکیما (decision: approved / rejected، reason)
label, extras.spaceId جیسا کہ conversation.promptAgent کے لیے

گیٹ صرف submit_output کے ذریعے حل ہوتا ہے۔ BuiltInBodyKeys.humanGate، نوڈ ٹائپ لائبریری اور ایک بلٹ اِن ٹیمپلیٹ کا پرامپٹ متن، سب approve_step اور reject_step MCP ٹولز کا نام لیتے ہیں؛ اِن میں سے کوئی ٹول بھی کسی پیکج یا رجسٹری میں موجود نہیں۔

پرانی الگ تھلگ worktrees ہٹاتا ہے؛ اپنا موڈ ٹریگر پے لوڈ سے چنتا ہے۔ رن کے dryRun فلیگ کا لحاظ کرتا ہے۔

اسٹیٹ کلید تفصیل
ticket_id اُس ٹکٹ کے worktrees جاری کر دیں
repo_full_name + pr_number عارضی PR-ایڈیٹر worktree جاری کریں
space_id اُس گفتگو کے worktrees اور فولڈر کو ختم کریں
(مندرجہ بالا میں سے کوئی نہیں) ورک اسپیس کی صفائی کریں: غائب ہو چکی ڈائریکٹریز، مردہ اسپیسز، یتیم گفتگو فولڈرز

outputKey (اختیاری) میں ایک خلاصہ سٹرنگ ملتی ہے۔

کسی اسٹیٹ مجموعے پر میپ / فین آؤٹ: ہر آئٹم کے لیے پرامپٹ ایک بار رینڈر کرتا ہے، پھر اُن پرامپٹس کو جوڑ کر (--- جداکار) ایجنٹ کو ایک بار ڈسپیچ کرتا ہے اور وہ رن مکمل ہونے تک معطل رہتا ہے۔ خالی مجموعہ فوراً ایک خالی فہرست کے ساتھ مکمل ہو جاتا ہے۔ یہ فی آئٹم ایک متوازی ڈسپیچ نہیں ہے۔

کنفیگ فیلڈ تفصیل
agentId فی آئٹم ڈسپیچ کرنے والا ایجنٹ (لازمی)
prompt فی آئٹم پرامپٹ؛ {{key}} تبدیلی کی حمایت کرتا ہے (لازمی)
extras.iterableKey وہ اسٹیٹ کلید جس میں مجموعہ رکھا ہے (لازمی)
extras.itemKey وہ کلید جس سے موجودہ آئٹم پرامپٹ میں بندھتا ہے (ڈیفالٹ item)
outputKey جمع شدہ آؤٹ پٹ کے لیے اسٹیٹ کلید (ایک ڈسپیچ، فہرست نہیں)

ایک اور پائپ لائن ٹیمپلیٹ کو نیسٹڈ ذیلی قدم کے طور پر چلاتا ہے (ذیلی پائپ لائن ایک چائلڈ رن کے طور پر چلتی ہے جس میں parentPipelineRunId سیٹ ہوتا ہے)۔ قدم معطل رہتا ہے جب تک بچہ حتمی حالت تک نہ پہنچے، پھر بچے کی حتمی حالت outputKey کے تحت ضم کر دی جاتی ہے۔

کنفیگ فیلڈ تفصیل
extras.templateId چلانے کے لیے چائلڈ ٹیمپلیٹ (لازمی؛ کوئی پائپ لائن خود کو کال نہیں کر سکتی)
inputKeys وہ اسٹیٹ کلیدیں جو بچے کے ٹریگر پے لوڈ میں نقل کی جاتی ہیں
outputKey بچے کی ضم شدہ حتمی حالت کے لیے اسٹیٹ کلید

پس منظر میں tree-sitter انڈیکسنگ: ایک ریپو پر چلتا ہے، ورکر آئسولیٹس میں علامات/ایجیز نکالتا ہے اور اُنہیں ورک اسپیس کوڈ گراف میں شامل کرتا ہے۔ پیش رفت کو قدم-رن قطار میں اسٹریم کرتا ہے؛ dry-run کی حمایت کرتا ہے۔ Tree-sitter اور اُس کے گرامرز لازمی نیٹِوز ہیں — dylib کی کمی کا مطلب ہے کہ سرور کبھی بوٹ ہی نہیں ہوا، اور کوئی گرامر جو رن کے دوران حل نہ ہو سکے، قدم کو چھوڑنے کے بجائے ناکام کر دیتا ہے۔

اسٹیٹ کلید تفصیل
repo_id انڈیکس کرنے والا ریپو (لازمی)
repo_local_path چیک آؤٹ کا مقامی پاتھ (لازمی)

آف لائن اسپیکر ڈائریائزیشن۔ میٹنگ کی محفوظ رکھی گئی آڈیو پڑھتا ہے، اُسے اسپیکرز (Person 1، Person 2، …) میں کلسٹر کرتا ہے، ٹرانسکرپٹ سیگمنٹس کو نئے لیبل دیتا ہے اور transcript اسٹیٹ دوبارہ لکھتا ہے؛ متوازی meeting.updateTranscript قدم کے لیے diarization_spans بھی خارج کرتا ہے۔ جب کوئی آڈیو محفوظ نہ رکھی گئی ہو یا ماڈلز انسٹال نہ ہوں تو ٹرانسکرپٹ کو بغیر تبدیلی گزرنے دیتا ہے۔

اسٹیٹ کلید تفصیل
meeting_id ڈائریائز کرنے والی میٹنگ (لازمی)

میٹنگ خلاصے کو محفوظ کرنے والی متعیّن باڈیز۔ ہر ایک اسٹیٹ سے meeting_id اور ایجنٹ قدم کا منظم meeting_outcome پے لوڈ ({summary, enhancedNotes, actionItems[], decisions[]}) پڑھتی ہے اور اپنا حصہ اپنی ٹیبل میں لکھتی ہے — نوٹس، ایکشن آئٹمز یا فیصلے۔ کسی تنزلی والے رن پر پہلے سے محفوظ قطاریں کبھی مٹائی نہیں جاتیں۔

باڈی کلید تفصیل
meeting.identifySpeakers بین میٹنگ اسپیکر شناخت: ڈائریائز شدہ اسپیکرز کو محفوظ آواز پروفائلز سے ملاقاتا ہے اور پُراعتماد مماثلتیں خودکار طور پر لاگو کرتا ہے۔ پروفائلز/ایمبیڈنگز کے بغیر no-op۔
meeting.updateTranscript diarization_spans سے Person N لیبل لاگو کرتا ہے اور فی ونڈو ٹکڑوں کو فی اسپیکر باریوں میں ضم کرتا ہے، پھر صاف شدہ ٹرانسکرپٹ محفوظ کرتا ہے۔ جب ڈائریائزیشن نے کچھ پیدا نہ کیا ہو تو no-op۔
meeting.assemblePlayback میٹنگ کا مکس شدہ پلے بیک ٹریک محفوظ رکھی گئی فی چینل WAVs سے تیار کرتا ہے۔ کوئی آڈیو محفوظ نہ رکھی گئی ہو تو no-op۔
orchestration.markPhase کام کے DAG کے اختتام پر، بغیر آؤٹ پٹ والے ذیلی ٹکٹس کے لیے ناکامی کے سینٹینلز لکھتا ہے اور آرکیسٹریشن کو synthesizing پر بدل دیتا ہے۔
orchestration.persistDeliverable ترکیب کا آؤٹ پٹ پیرنٹ ٹکٹ میں لکھتا ہے، اُسے مکمل کرتا ہے، حتمی نتیجہ پوسٹ کرتا ہے اور آرکیسٹریشن کو completed نشان زد کرتا ہے۔
orchestration.awaitApproval جزوی منظوری گیٹ: جب قدم کی نوڈ کلید آرکیسٹریشن کے منظور شدہ سیٹ میں ہو تو فوراً مکمل ہو جاتا ہے، ورنہ بعد کی منظوری کے دوبارہ شروع کرنے تک معطل رہتا ہے۔ یہ واحد باڈی ہے جو extras.awaitApproval سیٹ کرتی ہے، جس کی وجہ سے یہ 24 گھنٹے کی معطل قدم ٹائم آؤٹ سے مستثنیٰ ہو جاتی ہے۔
messaging.createSpace وہ گفتگو کھولتا ہے جس میں باقی ٹیمپلیٹ کام کرتا ہے، جو قدم کی outputKey کے تحت شائع ہوتی ہے (بلٹ اِن pipeline_space_id استعمال کرتے ہیں)۔ خالی repoIds فہرست کچھ بھی چیک آؤٹ نہیں کرتی؛ extras['allRepos'] ورک اسپیس کے ہر ریپو کو چیک آؤٹ کرتا ہے۔ extras['createConversation'] (ڈیفالٹ طور پر بند) ایک نامزد اسٹریم بھی کھولتا ہے۔ کوئی ایجنٹ قدم کسی کمرے میں شامل ہوتا ہے اور کبھی خود کوئی کمرہ نہیں کھولتا، اس لیے اِس نوڈ کے بغیر کوئی فین آؤٹ ڈسپیچ پر ناکام ہو جاتا ہے — اور اِسے ایک بار جوڑنے کا مطلب یہ ہے کہ پورا فین آؤٹ ایک ہی چیک آؤٹ شیئر کرتا ہے بجائے اس کے کہ ہر ایک کے لیے الگ چیک آؤٹ تیار کیا جائے۔
prReview.finalize PR-ریویو ٹیمپلیٹ کا آخری قدم: جمع شدہ ریویو نوڈز کو اتفاقِ رائے کی بالٹیوں میں ترتیب دیتا ہے اور فی PR فیصلہ شمار کرتا ہے۔
skills.analyze ورک اسپیس کی انسٹال شدہ مہارتوں پر مہارتوں کا سپلائی چین اسکین چلاتا ہے اور ہر فیصلہ ریکارڈ کرتا ہے۔

ایک قدم کی باڈی StepResult واپس کرتی ہے (packages/cc_domain/lib/features/pipelines/domain/entities/step_result.dart)۔ failed کے سوا تمام فیکٹریاں ایک اختیاری mutatedState میپ قبول کرتی ہیں جو پائپ لائن اسٹیٹ میں ضم کر دیا جاتا ہے۔

فیکٹری دستخط تفصیل
ok StepResult.ok({mutatedState}) عام تکمیل؛ نیچے کے سننے والوں کا جائزہ لیا جاتا ہے
route StepResult.route(nextRouterKey, {mutatedState}) روٹر کی تکمیل؛ وہ نیچے والی شاخ چنتا ہے جس کی routeKey مماثل ہو
suspendUntilEvent StepResult.suspendUntilEvent(eventType, {mutatedState}) معطل رکھیں جب تک کوئی مخصوص ڈومین ایونٹ ٹائپ رونما نہ ہو
suspendUntilTasksComplete StepResult.suspendUntilTasksComplete(taskIds, {mutatedState}) معطل رکھیں جب تک فہرست کے تمام ٹاسکس حتمی حالت تک نہ پہنچ جائیں
terminal StepResult.terminal({mutatedState}) پائپ لائن رن مکمل ہو گیا — مزید کوئی قدم نہیں
failed StepResult.failed(errorMessage) قدم ایک خرابی کے پیغام کے ساتھ ناکام ہو گیا

ناکام ہونے والی نوڈ باڈی کے لیے دوبارہ کوشش کا رویہ (PipelineNodeConfig.retryPolicy؛ null دوبارہ کوششیں بند کر دیتا ہے)۔

فیلڈ ٹائپ تفصیل
maxAttempts int پہلی کوشش سمیت کل کوششیں (3 = 1 کوشش + 2 دوبارہ کوششیں)؛ ≥ 1 ہونا لازم ہے
backoff String linear یا exponential (ڈیفالٹ)
initialDelayMs int پہلی دوبارہ کوشش سے پہلے تاخیر، ملی سیکنڈ میں؛ بعد کی تاخیریں backoff کے مطابق بڑھتی ہیں

فی نوڈ کنفیگریشن جو قدم کی تعریف کے اندر رکھی جاتی ہے (packages/cc_domain/lib/features/pipelines/domain/entities/pipeline_node_config.dart)۔ بلٹ اِن اور حسب ضرورت نوڈز، دونوں یہی شکل رکھتے ہیں؛ ہر باڈی صرف وہی فیلڈز پڑھتی ہے جن سے اُسے سروکار ہو۔

فیلڈ ٹائپ تفصیل
prompt String? {{key}} تبدیلی والا پرامپٹ ٹیمپلیٹ
script String? {{key}} تبدیلی والی Bash اسکرپٹ باڈی
agentId String? ڈسپیچ کرنے کے لیے ورک اسپیس کے دائرے کا ایجنٹ UUID
inputKeys List<String> وہ اسٹیٹ کلیدیں جو یہ نوڈ بطور اِن پٹ لیتا ہے
repoIds List<String> وہ ریپوز جو messaging.createSpace نوڈ چیک آؤٹ کرتا ہے (<repoId> یا <repoId>@<branch>)۔ خالی = کوئی نہیں؛ extras['allRepos'] = ورک اسپیس کا ہر ریپو۔ ایجنٹ قدموں پر نظر انداز کیا جاتا ہے۔
outputKey String? وہ اسٹیٹ کلید جس کے تحت اِس نوڈ کا آؤٹ پٹ لکھا جاتا ہے
label String? کینوس پر دکھایا جانے والا انسانی لیبل (ڈیفالٹ طور پر قدم کی ID)
outputSchema Map<String, dynamic>? JSON Schema (ذیلی مجموعہ) جسے آؤٹ پٹ ویلیو پورا کرے
reducer String? جب متوازی شاخیں ایک ہی outputKey لکھیں تو ضم کرنے کی حکمت عملی: append، mergeLists، mergeMaps، sum یا override (ڈیفالٹ)
retryPolicy StepRetryPolicy? باڈی ناکام ہونے پر دوبارہ کوشش کی پالیسی؛ null = ایک ہی کوشش
continueOnFail bool جب true ہو تو کوئی حتمی ناکامی رن کو ناکام نہیں کرتی؛ خرابی state['_stepErrors'][stepId] کے تحت رکھ دی جاتی ہے
timeoutMs int? نوڈ باڈی کے لیے وال-کلاک ٹائم آؤٹ، ملی سیکنڈ میں؛ null = کوئی ٹائم آؤٹ نہیں
teamId String? ڈسپیچ کرنے والی ٹیم (team.dispatch نوڈز)؛ agentId کے ساتھ باہم ناسازگار
dispatchMode String? ٹیم کے عمل درآمد کا موڈ: allParallel یا manager
extras Map<String, dynamic> آزاد شکل والی، باڈی کے لیے مخصوص کنفیگ (مثلاً iterableKey، templateId، شرط کے ٹری)

اخذ شدہ ایکسیسرز: spaceId (extras['spaceId'] — کام کرنے کے لیے موجودہ گفتگو)، createsConversation (extras['createConversation'])، conversationTitle (extras['conversationTitle'])، modeName (extras['mode'] — chat / review / plan، اسپیس کھولنے والے نوڈ پر پڑھا جاتا ہے) اور runWhen (extras['runWhen'] — شرط پوری نہ ہونے پر نوڈ چھوڑ دیں)۔