Tools
การอนุมัติการดำเนินการ — ขั้นสูง
หัวข้อขั้นสูงของการอนุมัติ exec: fast-path ของ safeBins, การผูกกับอินเทอร์พรีเตอร์/รันไทม์
และการส่งต่อการอนุมัติไปยังช่องแชท (รวมถึงการส่งแบบเนทีฟ)
สำหรับนโยบายหลักและโฟลว์การอนุมัติ โปรดดู การอนุมัติ Exec
ไบนารีที่ปลอดภัย (stdin เท่านั้น)
tools.exec.safeBins กำหนดรายการขนาดเล็กของไบนารี stdin เท่านั้น (เช่น
cut) ที่สามารถทำงานในโหมด allowlist ได้ โดยไม่ต้องมี รายการ allowlist
ที่ระบุชัดเจน ไบนารีที่ปลอดภัยจะปฏิเสธอาร์กิวเมนต์ไฟล์แบบตำแหน่งและโทเค็นที่มีลักษณะเป็นพาธ ดังนั้นจึง
ทำงานได้เฉพาะกับสตรีมขาเข้าเท่านั้น ให้ถือว่านี่เป็น fast-path แบบแคบสำหรับ
ตัวกรองสตรีม ไม่ใช่รายการความเชื่อถือทั่วไป
ไบนารีที่ปลอดภัยตามค่าเริ่มต้น:
cut, uniq, head, tail, tr, wc
grep และ sort ไม่ได้อยู่ในรายการค่าเริ่มต้น หากคุณเลือกใช้ ให้คงรายการ
allowlist ที่ชัดเจนไว้สำหรับเวิร์กโฟลว์ที่ไม่ใช่ stdin ของคำสั่งเหล่านั้น สำหรับ grep ในโหมด safe-bin
ให้ระบุแพตเทิร์นด้วย -e/--regexp; รูปแบบแพตเทิร์นแบบตำแหน่งจะถูกปฏิเสธ
เพื่อไม่ให้โอเปอแรนด์ไฟล์ถูกลักลอบส่งผ่านเป็นอาร์กิวเมนต์ตำแหน่งที่กำกวมได้
การตรวจสอบ argv และแฟล็กที่ถูกปฏิเสธ
การตรวจสอบเป็นแบบกำหนดแน่นอนจากรูปทรงของ argv เท่านั้น (ไม่มีการตรวจสอบว่าไฟล์มีอยู่จริงบนระบบโฮสต์) ซึ่งป้องกันพฤติกรรม oracle การมีอยู่ของไฟล์จากความแตกต่างระหว่าง allow/deny อ็อปชันที่มุ่งกับไฟล์จะถูกปฏิเสธสำหรับไบนารีที่ปลอดภัยตามค่าเริ่มต้น; อ็อปชันแบบยาว จะถูกตรวจสอบแบบ fail-closed (แฟล็กที่ไม่รู้จักและตัวย่อที่กำกวมจะถูก ปฏิเสธ)
แฟล็กที่ถูกปฏิเสธตามโปรไฟล์ safe-bin:
grep:--dereference-recursive,--directories,--exclude-from,--file,--recursive,-R,-d,-f,-rjq:--argfile,--from-file,--library-path,--rawfile,--slurpfile,-L,-fsort:--compress-program,--files0-from,--output,--random-source,--temporary-directory,-T,-owc:--files0-from
ไบนารีที่ปลอดภัยยังบังคับให้โทเค็น argv ถูกปฏิบัติเป็น ข้อความตามตัวอักษร ขณะดำเนินการ
(ไม่มี globbing และไม่มีการขยาย $VARS) สำหรับเซกเมนต์แบบ stdin เท่านั้น ดังนั้นแพตเทิร์น
เช่น * หรือ $HOME/... จึงไม่สามารถใช้ลักลอบอ่านไฟล์ได้
ไดเรกทอรีไบนารีที่เชื่อถือได้
ไบนารีที่ปลอดภัยต้อง resolve จากไดเรกทอรีไบนารีที่เชื่อถือได้ (ค่าเริ่มต้นของระบบรวมกับ
tools.exec.safeBinTrustedDirs ที่เลือกเพิ่มได้) รายการใน PATH จะไม่ถูกเชื่อถือโดยอัตโนมัติ
ไดเรกทอรีที่เชื่อถือได้ตามค่าเริ่มต้นถูกตั้งใจให้มีน้อยที่สุด: /bin, /usr/bin หาก
ไฟล์ปฏิบัติการ safe-bin ของคุณอยู่ในพาธของ package-manager/ผู้ใช้ (เช่น
/opt/homebrew/bin, /usr/local/bin, /opt/local/bin, /snap/bin) ให้เพิ่มพาธเหล่านั้น
ลงใน tools.exec.safeBinTrustedDirs อย่างชัดเจน
การเชื่อมคำสั่งเชลล์, wrapper และ multiplexer
การเชื่อมคำสั่งเชลล์ (&&, ||, ;) อนุญาตเมื่อทุกเซกเมนต์ระดับบนสุด
ผ่าน allowlist (รวมถึงไบนารีที่ปลอดภัยหรือ skill auto-allow) การ redirect
ยังไม่รองรับในโหมด allowlist การแทนที่คำสั่ง ($() / backticks) จะถูก
ปฏิเสธระหว่างการแยกวิเคราะห์ allowlist รวมถึงภายในเครื่องหมายคำพูดคู่; ใช้เครื่องหมายคำพูดเดี่ยว
หากคุณต้องการข้อความ $() ตามตัวอักษร
ในการอนุมัติ companion-app บน macOS ข้อความเชลล์ดิบที่มีไวยากรณ์ควบคุมหรือ
ขยายเชลล์ (&&, ||, ;, |, `, $, <, >, (, )) จะ
ถูกถือว่าไม่ตรงกับ allowlist เว้นแต่ไบนารีเชลล์เองจะอยู่ใน allowlist
สำหรับ shell wrapper (bash|sh|zsh ... -c/-lc) env override ที่มีขอบเขตตามคำขอจะ
ถูกลดเหลือ allowlist ขนาดเล็กที่ระบุชัดเจน (TERM, LANG, LC_*, COLORTERM,
NO_COLOR, FORCE_COLOR)
สำหรับการตัดสินใจ allow-always ในโหมด allowlist wrapper สำหรับ dispatch ที่รู้จัก (env,
flock, nice, nohup, stdbuf, timeout) จะบันทึกพาธไฟล์ปฏิบัติการภายใน
แทนพาธ wrapper shell multiplexer (busybox, toybox) จะถูก
unwrap สำหรับแอปเพล็ตเชลล์ (sh, ash เป็นต้น) ในแบบเดียวกัน หาก wrapper หรือ
multiplexer ไม่สามารถ unwrap ได้อย่างปลอดภัย จะไม่มีการบันทึกรายการ allowlist
โดยอัตโนมัติ
หากคุณเพิ่มอินเทอร์พรีเตอร์อย่าง python3 หรือ node ลงใน allowlist ให้ใช้
tools.exec.strictInlineEval=true เพื่อให้ inline eval ยังคงต้องขอ
การอนุมัติอย่างชัดเจน ในโหมด strict allow-always ยังสามารถบันทึกการเรียกใช้
อินเทอร์พรีเตอร์/สคริปต์ที่ไม่เป็นอันตรายได้ แต่ตัวพา inline-eval จะไม่ถูกบันทึก
โดยอัตโนมัติ
ไบนารีที่ปลอดภัยเทียบกับ allowlist
| หัวข้อ | tools.exec.safeBins |
Allowlist (exec-approvals.json) |
|---|---|---|
| เป้าหมาย | อนุญาตตัวกรอง stdin แบบแคบโดยอัตโนมัติ | เชื่อถือไฟล์ปฏิบัติการที่ระบุโดยชัดเจน |
| ประเภทการจับคู่ | ชื่อไฟล์ปฏิบัติการ + นโยบาย argv ของ safe-bin | glob พาธไฟล์ปฏิบัติการที่ resolve แล้ว หรือ glob ชื่อคำสั่งเปล่าสำหรับคำสั่งที่เรียกผ่าน PATH |
| ขอบเขตอาร์กิวเมนต์ | จำกัดโดยโปรไฟล์ safe-bin และกฎ literal-token | จับคู่พาธโดยค่าเริ่มต้น; argPattern ที่เลือกเพิ่มได้สามารถจำกัด argv ที่แยกวิเคราะห์แล้ว |
| ตัวอย่างทั่วไป | head, tail, tr, wc |
jq, python3, node, ffmpeg, CLI แบบกำหนดเอง |
| การใช้งานที่เหมาะที่สุด | การแปลงข้อความความเสี่ยงต่ำใน pipeline | เครื่องมือใดก็ตามที่มีพฤติกรรมกว้างกว่าหรือมีผลข้างเคียง |
ตำแหน่งการกำหนดค่า:
safeBinsมาจาก config (tools.exec.safeBinsหรือagents.list[].tools.exec.safeBinsแบบต่อ agent)safeBinTrustedDirsมาจาก config (tools.exec.safeBinTrustedDirsหรือagents.list[].tools.exec.safeBinTrustedDirsแบบต่อ agent)safeBinProfilesมาจาก config (tools.exec.safeBinProfilesหรือagents.list[].tools.exec.safeBinProfilesแบบต่อ agent) คีย์โปรไฟล์ต่อ agent จะ override คีย์ส่วนกลาง- รายการ allowlist อยู่ในไฟล์ approvals เฉพาะโฮสต์ภายใต้
agents.<id>.allowlist(หรือผ่าน Control UI /openclaw approvals allowlist ...) openclaw security auditเตือนด้วยtools.exec.safe_bins_interpreter_unprofiledเมื่อไบนารีอินเทอร์พรีเตอร์/รันไทม์ปรากฏในsafeBinsโดยไม่มีโปรไฟล์ที่ชัดเจนopenclaw doctor --fixสามารถ scaffold รายการsafeBinProfiles.<bin>แบบกำหนดเองที่ขาดหายเป็น{}(ตรวจทานและทำให้เข้มงวดภายหลัง) ไบนารีอินเทอร์พรีเตอร์/รันไทม์จะไม่ถูก scaffold โดยอัตโนมัติ
ตัวอย่างโปรไฟล์แบบกำหนดเอง:
OC_I18N_900000
หากคุณเลือกเพิ่ม jq ลงใน safeBins อย่างชัดเจน OpenClaw ยังคงปฏิเสธ env builtin ในโหมด safe-bin
เพื่อให้ jq -n env ไม่สามารถ dump environment ของโปรเซสโฮสต์ได้หากไม่มีพาธ allowlist
หรือพรอมป์การอนุมัติที่ชัดเจน
คำสั่งอินเทอร์พรีเตอร์/รันไทม์
การรันอินเทอร์พรีเตอร์/รันไทม์ที่รองรับด้วยการอนุมัติถูกออกแบบให้ระมัดระวังโดยตั้งใจ:
- บริบท argv/cwd/env ที่แน่นอนจะถูกผูกไว้เสมอ
- รูปแบบไฟล์สคริปต์เชลล์โดยตรงและไฟล์รันไทม์โดยตรงจะพยายามผูกกับสแนปช็อตไฟล์ภายในเครื่องที่เป็นรูปธรรมหนึ่งไฟล์อย่างดีที่สุด
- รูปแบบ wrapper ของ package-manager ทั่วไปที่ยัง resolve ไปยังไฟล์ภายในเครื่องโดยตรงหนึ่งไฟล์ (เช่น
pnpm exec,pnpm node,npm exec,npx) จะถูก unwrap ก่อนผูก - หาก OpenClaw ไม่สามารถระบุไฟล์ภายในเครื่องที่เป็นรูปธรรมได้อย่างแน่นอนหนึ่งไฟล์สำหรับคำสั่งอินเทอร์พรีเตอร์/รันไทม์ (เช่น package scripts, รูปแบบ eval, เชน loader เฉพาะรันไทม์ หรือรูปแบบหลายไฟล์ที่กำกวม) การดำเนินการที่รองรับด้วยการอนุมัติจะถูกปฏิเสธแทนการอ้างว่าครอบคลุมเชิงความหมายในสิ่งที่ไม่ได้ครอบคลุม
- สำหรับเวิร์กโฟลว์เหล่านั้น ให้ใช้ sandboxing, ขอบเขตโฮสต์แยกต่างหาก หรือ allowlist/เวิร์กโฟลว์เต็มที่เชื่อถือโดยชัดเจน ซึ่ง operator ยอมรับ semantic ของรันไทม์ที่กว้างกว่า
เมื่อจำเป็นต้องมีการอนุมัติ เครื่องมือ exec จะคืนค่าทันทีพร้อม approval id ใช้ id นั้นเพื่อ
เชื่อมโยงกับอีเวนต์ระบบ approved-run ภายหลัง (Exec finished, และ Exec running เมื่อกำหนดค่าไว้)
หากไม่มีการตัดสินใจมาถึงก่อน timeout คำขอจะถูกถือว่าเป็น approval timeout และ
แสดงผลเป็นการปฏิเสธ host-command ระดับ terminal สำหรับการอนุมัติ async ของ main-agent ที่มี
session ต้นทาง OpenClaw ยัง resume session นั้นด้วย followup ภายในเพื่อให้ agent เห็นว่า
คำสั่งไม่ได้รัน แทนที่จะไปซ่อมผลลัพธ์ที่หายไปภายหลัง
พฤติกรรมการส่ง followup
หลังจาก async exec ที่ได้รับอนุมัติเสร็จสิ้น OpenClaw จะส่งเทิร์น agent แบบ followup ไปยัง session เดิม
การอนุมัติ async ที่ถูกปฏิเสธใช้พาธ followup ของ main-session เดียวกันสำหรับสถานะการปฏิเสธ แต่จะไม่
ลงทะเบียน handoff รันไทม์แบบยกระดับ และจะไม่รันคำสั่ง การปฏิเสธที่ไม่มี main session ที่ resume ได้
จะถูก suppress หรือรายงานผ่านเส้นทางตรงที่ปลอดภัยเมื่อมีอยู่
- หากมีเป้าหมายการส่งภายนอกที่ถูกต้อง (ช่องทางที่ส่งได้พร้อมเป้าหมาย
to) การส่ง followup จะใช้ช่องทางนั้น - ในโฟลว์ webchat-only หรือ internal-session ที่ไม่มีเป้าหมายภายนอก การส่ง followup จะอยู่เฉพาะใน session (
deliver: false) - หาก caller ขอการส่งภายนอกแบบ strict อย่างชัดเจนโดยไม่มีช่องทางภายนอกที่ resolve ได้ คำขอจะล้มเหลวด้วย
INVALID_REQUEST - หากเปิดใช้
bestEffortDeliverและไม่สามารถ resolve ช่องทางภายนอกได้ การส่งจะถูกลดระดับเป็นเฉพาะ session แทนที่จะล้มเหลว
การส่งต่อการอนุมัติไปยังช่องแชท
คุณสามารถส่งต่อพรอมป์การอนุมัติ exec ไปยังช่องแชทใดก็ได้ (รวมถึงช่องทาง Plugin) และอนุมัติ
ด้วย /approve สิ่งนี้ใช้ pipeline การส่งขาออกปกติ
Config:
OC_I18N_900001
ตอบกลับในแชท:
OC_I18N_900002
คำสั่ง /approve รองรับทั้งการอนุมัติ exec และการอนุมัติ Plugin หาก ID ไม่ตรงกับการอนุมัติ exec ที่รอดำเนินการ ระบบจะตรวจสอบการอนุมัติ Plugin แทนโดยอัตโนมัติ
การส่งต่อการอนุมัติ Plugin
การส่งต่อการอนุมัติ Plugin ใช้ pipeline การส่งเดียวกับการอนุมัติ exec แต่มี
config อิสระของตนเองภายใต้ approvals.plugin การเปิดหรือปิดหนึ่งรายการจะไม่กระทบอีกรายการ
สำหรับพฤติกรรมการเขียน Plugin, ฟิลด์คำขอ และ semantic การตัดสินใจ โปรดดู
คำขอสิทธิ์ Plugin
OC_I18N_900003
รูปทรง config เหมือนกับ approvals.exec: enabled, mode, agentFilter,
sessionFilter และ targets ทำงานเหมือนกัน
ช่องทางที่รองรับการตอบกลับแบบ interactive ร่วมจะแสดงปุ่มอนุมัติเดียวกันสำหรับทั้งการอนุมัติ exec และ
Plugin ช่องทางที่ไม่มี shared interactive UI จะ fallback เป็นข้อความธรรมดาพร้อมคำแนะนำ /approve
คำขออนุมัติ Plugin อาจจำกัดการตัดสินใจที่มีอยู่ได้ พื้นผิวการอนุมัติใช้ชุดการตัดสินใจที่คำขอ
ประกาศไว้ และ Gateway จะปฏิเสธความพยายามส่งการตัดสินใจที่ไม่ได้ถูกเสนอ
การอนุมัติในแชทเดียวกันบนทุกช่องทาง
เมื่อคำขออนุมัติ exec หรือ Plugin มีต้นทางจากพื้นผิวแชทที่ส่งได้ แชทเดียวกัน
จะสามารถอนุมัติด้วย /approve ได้โดยค่าเริ่มต้นแล้ว สิ่งนี้ใช้กับช่องทางอย่าง Slack, Matrix และ
Microsoft Teams นอกเหนือจากโฟลว์ Web UI และ terminal UI ที่มีอยู่แล้ว
เส้นทางคำสั่งแบบข้อความที่ใช้ร่วมกันนี้ใช้โมเดลการยืนยันตัวตนของช่องทางปกติสำหรับการสนทนานั้น หากแชต ต้นทางสามารถส่งคำสั่งและรับคำตอบได้อยู่แล้ว คำขออนุมัติจะไม่ต้องมี อะแดปเตอร์การส่งแบบเนทีฟแยกต่างหากเพียงเพื่อคงสถานะรอดำเนินการ
Discord และ Telegram ยังรองรับ /approve ในแชตเดียวกันด้วย แต่ช่องทางเหล่านั้นยังคงใช้
รายการผู้อนุมัติที่ resolve แล้วสำหรับการอนุญาต แม้จะปิดการส่งการอนุมัติแบบเนทีฟไว้ก็ตาม
สำหรับ Telegram และไคลเอนต์การอนุมัติแบบเนทีฟอื่นที่เรียก Gateway โดยตรง fallback นี้ถูกจำกัดไว้เฉพาะความล้มเหลวแบบ "ไม่พบการอนุมัติ" โดยตั้งใจ การปฏิเสธ/ข้อผิดพลาดของ การอนุมัติ exec จริงจะไม่ลองใหม่แบบเงียบ ๆ ในฐานะการอนุมัติ Plugin
การส่งการอนุมัติแบบเนทีฟ
บางช่องทางยังสามารถทำหน้าที่เป็นไคลเอนต์การอนุมัติแบบเนทีฟได้ด้วย ไคลเอนต์แบบเนทีฟเพิ่ม DM ของผู้อนุมัติ การกระจายไปยังแชตต้นทาง
และ UX การอนุมัติแบบโต้ตอบเฉพาะช่องทางไว้บนโฟลว์ /approve
ในแชตเดียวกันที่ใช้ร่วมกัน
เมื่อมีการ์ด/ปุ่มอนุมัติแบบเนทีฟ UI แบบเนทีฟนั้นจะเป็นเส้นทางหลัก
ที่ agent เห็น agent ไม่ควร echo คำสั่งแชตธรรมดา
/approve ซ้ำอีก เว้นแต่ผลลัพธ์ของเครื่องมือจะบอกว่าใช้การอนุมัติผ่านแชตไม่ได้ หรือ
การอนุมัติด้วยตนเองเป็นเส้นทางเดียวที่เหลืออยู่
หากมีการกำหนดค่าไคลเอนต์การอนุมัติแบบเนทีฟไว้ แต่ไม่มีรันไทม์แบบเนทีฟที่ทำงานอยู่สำหรับ
ช่องทางต้นทาง OpenClaw จะยังแสดงพรอมป์ /approve
แบบ local deterministic ไว้ หากรันไทม์แบบเนทีฟทำงานอยู่และพยายามส่งแล้ว แต่ไม่มี
เป้าหมายใดได้รับการ์ด OpenClaw จะส่งประกาศ fallback ในแชตเดียวกันพร้อมคำสั่ง
/approve <id> <decision> แบบตรงตัว เพื่อให้คำขอยังสามารถถูก resolve ได้
โมเดลทั่วไป:
- นโยบาย exec ของโฮสต์ยังคงตัดสินว่าจำเป็นต้องมีการอนุมัติ exec หรือไม่
approvals.execควบคุมการส่งต่อพรอมป์อนุมัติไปยังปลายทางแชตอื่นchannels.<channel>.execApprovalsควบคุมว่าจะเปิดใช้ไคลเอนต์แบบเนทีฟเฉพาะช่องทางของ Discord, Slack, Telegram และช่องทางที่คล้ายกันหรือไม่- การอนุมัติ Plugin ของ Slack สามารถใช้ไคลเอนต์การอนุมัติแบบเนทีฟของ Slack ได้เมื่อคำขอมาจาก Slack
และ resolve ผู้อนุมัติ Plugin ของ Slack ได้;
approvals.pluginยังสามารถ route การอนุมัติ Plugin ไปยังเซสชันหรือเป้าหมายของ Slack ได้ แม้จะปิดการอนุมัติ exec ของ Slack ไว้ - การ์ดอนุมัติแบบเนทีฟของ Google Chat จัดการการอนุมัติ exec และ Plugin ที่มีต้นทางจาก space หรือ thread ของ Google
Chat เมื่อ resolve ผู้อนุมัติ
users/<id>ที่เสถียรจากdm.allowFromหรือdefaultToได้; การ์ดเหล่านี้ไม่ใช้เหตุการณ์ reaction ในการตัดสินใจ - การส่งการอนุมัติผ่าน reaction ของ WhatsApp และ Signal ถูกกั้นด้วย
approvals.execและapprovals.plugin; ทั้งสองไม่มีบล็อกchannels.<channel>.execApprovals
ไคลเอนต์การอนุมัติแบบเนทีฟจะเปิดใช้การส่งแบบ DM ก่อนโดยอัตโนมัติเมื่อทั้งหมดนี้เป็นจริง:
- ช่องทางรองรับการส่งการอนุมัติแบบเนทีฟ
- สามารถ resolve ผู้อนุมัติจาก
execApprovals.approversที่ระบุไว้ชัดเจน หรือ identity ของเจ้าของ เช่นcommands.ownerAllowFrom - ไม่ได้ตั้งค่า
channels.<channel>.execApprovals.enabledไว้ หรือเป็น"auto"
ตั้ง enabled: false เพื่อปิดไคลเอนต์การอนุมัติแบบเนทีฟอย่างชัดเจน ตั้ง enabled: true เพื่อบังคับ
เปิดเมื่อ resolve ผู้อนุมัติได้ การส่งไปยังแชตต้นทางสาธารณะยังคงต้องระบุอย่างชัดเจนผ่าน
channels.<channel>.execApprovals.target
คำถามที่พบบ่อย: ทำไมจึงมีการกำหนดค่าการอนุมัติ exec สองรายการสำหรับการอนุมัติผ่านแชต?
- Discord:
channels.discord.execApprovals.* - Slack:
channels.slack.execApprovals.* - Telegram:
channels.telegram.execApprovals.* - Google Chat: กำหนดค่าผู้อนุมัติที่เสถียรด้วย
channels.googlechat.dm.allowFromหรือchannels.googlechat.defaultTo; ไม่จำเป็นต้องมีบล็อกexecApprovals - WhatsApp: ใช้
approvals.execและapprovals.pluginเพื่อ route พรอมป์อนุมัติไปยัง WhatsApp - Signal: ใช้
approvals.execและapprovals.pluginเพื่อ route พรอมป์อนุมัติไปยัง Signal
ไคลเอนต์การอนุมัติแบบเนทีฟเหล่านี้เพิ่มการ route DM และการกระจายไปยังช่องทางแบบเลือกได้ไว้บนโฟลว์
/approve ในแชตเดียวกันที่ใช้ร่วมกัน และปุ่มอนุมัติที่ใช้ร่วมกัน
พฤติกรรมที่ใช้ร่วมกัน:
- Slack, Matrix, Microsoft Teams และแชตที่ส่งได้ลักษณะคล้ายกันใช้โมเดลการยืนยันตัวตนของช่องทางปกติ
สำหรับ
/approveในแชตเดียวกัน - เมื่อไคลเอนต์การอนุมัติแบบเนทีฟเปิดใช้อัตโนมัติ เป้าหมายการส่งแบบเนทีฟเริ่มต้นคือ DM ของผู้อนุมัติ
- สำหรับ Discord และ Telegram เฉพาะผู้อนุมัติที่ resolve แล้วเท่านั้นที่สามารถอนุมัติหรือปฏิเสธได้
- ผู้อนุมัติ Discord สามารถระบุชัดเจน (
execApprovals.approvers) หรืออนุมานจากcommands.ownerAllowFrom - ผู้อนุมัติ Telegram สามารถระบุชัดเจน (
execApprovals.approvers) หรืออนุมานจากcommands.ownerAllowFrom - ผู้อนุมัติ Slack สามารถระบุชัดเจน (
execApprovals.approvers) หรืออนุมานจากcommands.ownerAllowFrom - DM การอนุมัติ Plugin ของ Slack ใช้ผู้อนุมัติ Plugin ของ Slack จาก
allowFromและการ route เริ่มต้นของบัญชี ไม่ใช่ผู้อนุมัติ exec ของ Slack - ปุ่มเนทีฟของ Slack เก็บชนิด id การอนุมัติไว้ ดังนั้น id
plugin:จึงสามารถ resolve การอนุมัติ Plugin ได้โดยไม่ต้องมีชั้น fallback แบบ local ของ Slack อีกชั้น - การ์ดเนทีฟของ Google Chat เก็บ fallback
/approveแบบทำเองไว้ในข้อความ แต่ callback ของปุ่มการ์ด จะพกเฉพาะ token การกระทำแบบ opaque; id การอนุมัติและการตัดสินใจจะถูกกู้คืนจากสถานะรอดำเนินการฝั่งเซิร์ฟเวอร์ - การอนุมัติด้วยอีโมจิ WhatsApp จัดการทั้งพรอมป์ exec และ Plugin เฉพาะเมื่อ family การส่งต่อระดับบนสุด ที่ตรงกันเปิดใช้อยู่และ route ไปยัง WhatsApp; การส่งต่อไปยัง WhatsApp แบบระบุเป้าหมายเท่านั้นยังอยู่บน เส้นทางการส่งต่อที่ใช้ร่วมกัน เว้นแต่จะตรงกับเป้าหมายต้นทางแบบเนทีฟเดียวกัน
- การอนุมัติผ่าน reaction ของ Signal จัดการทั้งพรอมป์ exec และ Plugin เฉพาะเมื่อ family การส่งต่อระดับบนสุด
ที่ตรงกันเปิดใช้อยู่และ route ไปยัง Signal การอนุมัติ exec ของ Signal ในแชตเดียวกันโดยตรงสามารถ
suppress fallback
/approveแบบ local ได้โดยไม่ต้องมีผู้อนุมัติที่ระบุชัดเจน; การ resolve reaction ของ Signal ยังต้องมีผู้อนุมัติ Signal ที่ระบุชัดเจนจากchannels.signal.allowFromหรือdefaultTo - การ route DM/ช่องทางแบบเนทีฟของ Matrix และ shortcut ผ่าน reaction จัดการทั้งการอนุมัติ exec และ Plugin;
การอนุญาต Plugin ยังคงมาจาก
channels.matrix.dm.allowFrom - พรอมป์เนทีฟของ Matrix รวมเนื้อหาเหตุการณ์กำหนดเอง
com.openclaw.approvalไว้ในเหตุการณ์พรอมป์แรก เพื่อให้ไคลเอนต์ Matrix ที่รู้จัก OpenClaw สามารถอ่านสถานะการอนุมัติแบบมีโครงสร้างได้ ขณะที่ไคลเอนต์มาตรฐาน ยังคงมี fallback/approveแบบข้อความธรรมดา - ผู้ร้องขอไม่จำเป็นต้องเป็นผู้อนุมัติ
- แชตต้นทางสามารถอนุมัติโดยตรงด้วย
/approveได้เมื่อแชตนั้นรองรับคำสั่งและการตอบกลับอยู่แล้ว - ปุ่มอนุมัติแบบเนทีฟของ Discord จะ route ตามชนิด id การอนุมัติ: id
plugin:จะไปยังการอนุมัติ Plugin โดยตรง ส่วนอย่างอื่นทั้งหมดจะไปยังการอนุมัติ exec - ปุ่มอนุมัติแบบเนทีฟของ Telegram ใช้ fallback จาก exec ไป Plugin แบบจำกัดเดียวกับ
/approve - เมื่อ
targetแบบเนทีฟเปิดใช้การส่งไปยังแชตต้นทาง พรอมป์อนุมัติจะรวมข้อความคำสั่งไว้ด้วย - การอนุมัติ exec ที่รอดำเนินการจะหมดอายุหลัง 30 นาทีตามค่าเริ่มต้น
- หากไม่มี UI สำหรับ operator หรือไคลเอนต์อนุมัติที่กำหนดค่าไว้ใดสามารถรับคำขอได้ พรอมป์จะ fallback ไปยัง
askFallback
คำสั่งกลุ่มที่ละเอียดอ่อนและให้เฉพาะเจ้าของใช้ เช่น /diagnostics และ /export-trajectory ใช้การ route
เจ้าของแบบส่วนตัวสำหรับพรอมป์อนุมัติและผลลัพธ์สุดท้าย OpenClaw จะลอง route แบบส่วนตัวบน
พื้นผิวเดียวกับที่เจ้าของรันคำสั่งก่อน หากพื้นผิวนั้นไม่มี route เจ้าของแบบส่วนตัว ระบบจะ
fallback ไปยัง route เจ้าของรายการแรกที่พร้อมใช้งานจาก commands.ownerAllowFrom ดังนั้นคำสั่งกลุ่มใน Discord
จึงยังสามารถส่งการอนุมัติและผลลัพธ์ไปยัง DM ของ Telegram ของเจ้าของได้ เมื่อ Telegram เป็นอินเทอร์เฟซส่วนตัวหลัก
ที่กำหนดค่าไว้ แชตกลุ่มจะได้รับเพียง acknowledgement สั้น ๆ
Telegram ใช้ค่าเริ่มต้นเป็น DM ของผู้อนุมัติ (target: "dm") คุณสามารถสลับเป็น channel หรือ both เมื่อคุณ
ต้องการให้พรอมป์อนุมัติปรากฏในแชต/หัวข้อ Telegram ต้นทางด้วย สำหรับหัวข้อฟอรัม Telegram
OpenClaw จะรักษาหัวข้อไว้สำหรับพรอมป์อนุมัติและการติดตามผลหลังอนุมัติ
ดูเพิ่มเติม:
โฟลว์ IPC ของ macOS
OC_I18N_900004 หมายเหตุด้านความปลอดภัย:
- โหมด Unix socket
0600, token เก็บไว้ในexec-approvals.json - ตรวจสอบ peer ที่มี UID เดียวกัน
- challenge/response (nonce + HMAC token + request hash) + TTL สั้น
คำถามที่พบบ่อย
accountId และ threadId จะถูกใช้บนเป้าหมายการอนุมัติเมื่อใด?
ใช้ accountId เมื่อช่องทางมี identity ที่กำหนดค่าไว้หลายรายการ และพรอมป์อนุมัติต้อง
ออกผ่านบัญชีเฉพาะบัญชีหนึ่ง ใช้ threadId เมื่อปลายทางรองรับหัวข้อหรือ
thread และพรอมป์ควรอยู่ภายใน thread นั้นแทนที่จะอยู่ในแชตระดับบนสุด
กรณี Telegram ที่ชัดเจนคือ supergroup สำหรับงานปฏิบัติการที่มีหัวข้อฟอรัมและบัญชีบอต Telegram
สองบัญชี ค่า to ระบุชื่อ supergroup, accountId เลือกบัญชีบอต และ threadId
เลือกหัวข้อฟอรัม:
OC_I18N_900005
ด้วยการตั้งค่านั้น การอนุมัติ exec ที่ส่งต่อจะถูกโพสต์โดยบัญชี Telegram ops-bot เข้าไปในหัวข้อ
77 ของแชต -1001234567890 เป้าหมายที่ไม่มี accountId จะใช้บัญชีเริ่มต้นของช่องทาง และ
เป้าหมายที่ไม่มี threadId จะโพสต์ไปยังปลายทางระดับบนสุด
เมื่อการอนุมัติถูกส่งไปยังเซสชัน ทุกคนในเซสชันนั้นสามารถอนุมัติได้หรือไม่?
ไม่ได้ การส่งไปยังเซสชันควบคุมเฉพาะตำแหน่งที่พรอมป์ปรากฏเท่านั้น โดยตัวมันเองไม่ได้อนุญาตให้ ผู้เข้าร่วมทุกคนในแชตนั้นอนุมัติได้
สำหรับ /approve ในแชตเดียวกันแบบทั่วไป ผู้ส่งต้องได้รับอนุญาตให้ใช้คำสั่งใน
เซสชันของช่องทางนั้นอยู่แล้ว หากช่องทางเปิดเผยผู้อนุมัติการอนุมัติแบบชัดเจน ผู้อนุมัติเหล่านั้นสามารถอนุญาต
การกระทำ /approve ได้ แม้โดยปกติพวกเขาจะไม่ได้รับอนุญาตให้ใช้คำสั่งในเซสชันนั้นก็ตาม
บางช่องทางเข้มงวดกว่า Discord, Telegram, Matrix, DM การอนุมัติแบบเนทีฟของ Slack และ
ไคลเอนต์การอนุมัติแบบเนทีฟที่คล้ายกันใช้รายการผู้อนุมัติที่ resolve แล้วสำหรับการอนุญาตการอนุมัติ ตัวอย่างเช่น
พรอมป์อนุมัติในหัวข้อฟอรัม Telegram อาจมองเห็นได้สำหรับทุกคนในหัวข้อนั้น แต่เฉพาะ ID ผู้ใช้ Telegram
แบบตัวเลขที่ resolve จาก channels.telegram.execApprovals.approvers หรือ
commands.ownerAllowFrom เท่านั้นที่สามารถอนุมัติหรือปฏิเสธได้
ที่เกี่ยวข้อง
- การอนุมัติ exec — นโยบายหลักและโฟลว์การอนุมัติ
- เครื่องมือ exec
- โหมด elevated
- Skills — พฤติกรรม auto-allow ที่หนุนด้วย skill