Skip to content

fix(feishu): enforce account tool family gates#93363

Merged
joshavant merged 2 commits into
openclaw:mainfrom
eleqtrizit:754
Jun 17, 2026
Merged

fix(feishu): enforce account tool family gates#93363
joshavant merged 2 commits into
openclaw:mainfrom
eleqtrizit:754

Conversation

@eleqtrizit

@eleqtrizit eleqtrizit commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Enforces the selected Feishu account's own tool-family settings before creating clients for account-routed Feishu tools.

Changes

  • Threads required Feishu tool-family metadata through account resolution and client creation.
  • Rejects disabled selected accounts for doc, app scopes, drive, wiki, and permission tools before SDK client creation.
  • Keeps implicit fallback account selection working by choosing an account that enables the requested family when no explicit/contextual/default account is set.
  • Adds regression coverage for contextual account routing, explicit account overrides, and implicit fallback selection.

Validation

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-feishu.config.ts extensions/feishu/src/tool-account-routing.test.ts extensions/feishu/src/docx.account-selection.test.ts extensions/feishu/src/tool-account.test.ts --reporter=verbose
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-feishu.config.ts extensions/feishu/src/tool-account-routing.test.ts --reporter=verbose
  • corepack pnpm test:extension feishu
  • git diff --check
  • .agents/skills/autoreview/scripts/autoreview --mode local

Notes

AI-assisted patch. USER.md was updated locally with the requested worklog and intentionally left uncommitted. CHANGELOG.md was not changed.

Real behavior proof:
Behavior addressed: Feishu account-routed tools now enforce the resolved account's own tool-family gate before Feishu client creation. A selected account with that family disabled fails closed even when a sibling account keeps the same tool family registered.

Real environment tested: local OpenClaw checkout at current PR head 09a46df5d5b30f2220020c3192ff2f5e0a4ee8e0, with Feishu plugin tools registered through the real plugin registerTool path and invoked through the actual tool.execute(...) functions using redacted local config and dummy Feishu credentials. No live tenant was used; the disabled-account cases prove the intended pre-client failure path, so they do not need Feishu network access.

Exact steps or command run after this patch: see the redacted runtime proof script in #93363 (comment). The script registers the real Feishu doc, drive, permission, and wiki tools, resolves tools with disabled contextual or explicit account a, and executes each real tool.execute(...) path.

Evidence after fix:

{
  "registeredTools": 5,
  "results": [
    { "label": "doc contextual disabled", "tool": "feishu_doc", "error": "Feishu Doc tools are disabled for account \"a\"" },
    { "label": "doc explicit disabled", "tool": "feishu_doc", "error": "Feishu Doc tools are disabled for account \"a\"" },
    { "label": "scopes contextual disabled", "tool": "feishu_app_scopes", "error": "Feishu App Scopes tools are disabled for account \"a\"" },
    { "label": "drive contextual disabled", "tool": "feishu_drive", "error": "Feishu Drive tools are disabled for account \"a\"" },
    { "label": "perm contextual disabled", "tool": "feishu_perm", "error": "Feishu Perm tools are disabled for account \"a\"" },
    { "label": "perm explicit disabled", "tool": "feishu_perm", "error": "Feishu Perm tools are disabled for account \"a\"" },
    { "label": "wiki explicit disabled", "tool": "feishu_wiki", "error": "Feishu Wiki tools are disabled for account \"a\"" },
    { "label": "wiki implicit fallback enabled", "tool": "feishu_wiki", "error": "Unknown action: unknown_action" }
  ]
}

Observed result after fix: selected disabled accounts fail with the matching disabled-tool error for doc, app scopes, drive, permission, and wiki. The no-context wiki case does not select disabled account a; it reaches the enabled-account execution path and returns the ordinary unknown-action error instead.

Supporting validation:

node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-feishu.config.ts extensions/feishu/src/tool-account-routing.test.ts extensions/feishu/src/docx.account-selection.test.ts --reporter=verbose

Result: 2 files passed, 29 tests passed. The named passing tests include disabled contextual and explicit account coverage for doc, disabled contextual coverage for app scopes, drive, permission, and explicit wiki coverage, plus enabled-family implicit fallback selection. The follow-up permission regression command also passed with 1 file and 24 tests.

Maintainer compatibility acceptance: I accept the fail-closed behavior for existing multi-account Feishu setups where an explicitly, contextually, or default-selected account has the requested tool family disabled. Those calls should stop with a disabled-tool error before client creation instead of continuing with disabled account credentials.

What was not tested: live Feishu SaaS API calls were not run. That is intentional for the fail-closed cases because successful proof is that execution stops before a client/API call can be made.

@openclaw-barnacle openclaw-barnacle Bot added channel: feishu Channel integration: feishu size: S maintainer Maintainer-authored PR labels Jun 15, 2026
@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 15, 2026, 4:11 PM ET / 20:11 UTC.

Summary
The PR threads required Feishu tool-family metadata through account resolution and client creation for doc, app scopes, drive, wiki, and permission tools, with routing regression tests.

PR surface: Source +48, Tests +133. Total +181 across 7 files.

Reproducibility: yes. source-reproducible. Current main and v2026.6.6 resolve selected Feishu tool accounts without checking the selected account's tools family, while the PR tests encode the disabled selected-account cases.

Review metrics: 1 noteworthy metric.

  • Fail-Closed Feishu Tool Families: 5 enforced, 0 config keys added. The PR changes runtime enforcement for existing doc, app scopes, drive, wiki, and permission families without adding a new config surface, so upgrade behavior matters before merge.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🐚 platinum hermit
Result: blocked until stronger real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Add redacted terminal/log output from actual OpenClaw Feishu tool execution on this PR head, or get an explicit maintainer proof override.
  • [P1] Have a maintainer explicitly accept the fail-closed compatibility behavior for disabled selected account tool families.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body only lists local tests and mocked assertions, and the related permission-only terminal proof does not cover this PR head or all newly gated families. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] Existing multi-account Feishu setups that select an account with a disabled doc, scopes, drive, wiki, or permission family will now fail before SDK client creation instead of proceeding with that selected account.
  • [P1] The current PR still only provides local tests/mocked assertions in its body; the related permission-only terminal proof does not exercise this PR head or the other newly gated families.

Maintainer options:

  1. Require Upgrade-Aware Proof (recommended)
    Before merge, require redacted real OpenClaw/Feishu runtime proof or a maintainer proof override showing selected disabled accounts fail closed and no-default fallback still chooses an enabled-family account.
  2. Accept The Fail-Closed Change
    Maintainers may intentionally accept that existing multi-account setups with disabled selected tool families will now stop with a disabled-tool error during upgrade.

Next step before merge

  • [P1] Human review should accept the compatibility behavior and proof gap; no narrow automated code repair is identified from this pass.

Security
Cleared: No concrete security or supply-chain regression was found; the diff stays in Feishu plugin runtime/tests and tightens selected-account tool gating before client creation.

Review details

Best possible solution:

Land the shared Feishu resolver gate after maintainers explicitly accept the fail-closed upgrade behavior and the PR includes redacted real-runtime proof or an explicit proof override.

Do we have a high-confidence way to reproduce the issue?

Yes, source-reproducible. Current main and v2026.6.6 resolve selected Feishu tool accounts without checking the selected account's tools family, while the PR tests encode the disabled selected-account cases.

Is this the best way to solve the issue?

Yes, mostly. Adding requiredTool to the shared Feishu tool resolver is the clean plugin-local fix for doc, scopes, drive, wiki, and perm, but merge still needs explicit compatibility acceptance and real behavior proof.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 32af1c069727.

Label changes

Label justifications:

  • P2: This is a focused Feishu account-routing bugfix with limited blast radius inside one bundled plugin.
  • merge-risk: 🚨 compatibility: Failing disabled selected Feishu accounts before SDK client creation can change existing multi-account workflows during upgrade.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • status: 🛠️ actively grinding: The PR author has acted after the latest ClawSweeper review and work remains. Needs stronger real behavior proof before merge: The PR body only lists local tests and mocked assertions, and the related permission-only terminal proof does not cover this PR head or all newly gated families. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +48, Tests +133. Total +181 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 5 53 5 +48
Tests 2 133 0 +133
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 186 5 +181

What I checked:

  • Repository policy applied: Root and scoped extension policy were read fully; plugin fallback and fail-closed behavior are compatibility-sensitive, and the change stays inside the Feishu plugin boundary. (AGENTS.md:31, 32af1c069727)
  • Current main lacks selected-family enforcement: Current main resolves the selected Feishu account and immediately creates a tool client without a required family parameter or selected-account family check. (extensions/feishu/src/tool-account.ts:51, 32af1c069727)
  • Latest release has the same resolver shape: v2026.6.6 resolves the Feishu tool account and creates the client without a required-family gate, so the bug is not already fixed in the latest release. (extensions/feishu/src/tool-account.ts:51, 8c802aa68351)
  • PR adds shared requiredTool enforcement: The PR head adds a requiredTool parameter, uses it for enabled-family implicit fallback, and throws before client creation when the resolved account has that family disabled. (extensions/feishu/src/tool-account.ts:54, 1fe5719c14a1)
  • PR wires affected tool families: The PR head passes requiredTool through the doc client/media path and the app-scopes tool; the diff also wires drive, permission, and wiki client creation. (extensions/feishu/src/docx.ts:1387, 1fe5719c14a1)
  • Related narrower PR was closed in favor of this one: The same author closed the narrower permission-only PR in favor of this broader PR and asked that the permission contextual regression remain covered here. (495ce2c6cae9)

Likely related people:

  • steipete: Authored the shared Feishu account-aware routing refactor and committed adjacent Feishu gate work that this PR builds on. (role: feature-history owner; confidence: high; commits: 125dc322f5c5, 559c52721bf1, 0ee5f47fbabb; files: extensions/feishu/src/tool-account.ts, extensions/feishu/src/docx.ts, extensions/feishu/src/tool-account-routing.test.ts)
  • Takhoffman: Authored the recent fix that made Feishu tool account context flow through the shared resolver path. (role: recent area contributor; confidence: high; commits: a18167a2cb72; files: extensions/feishu/src/tool-account.ts)
  • glfruit: Authored the merged Feishu Bitable tool-gate work that established the closest sibling selected-account family gate pattern. (role: adjacent feature contributor; confidence: medium; commits: 5cfb578cbaf6, 3bd7baf5736b; files: extensions/feishu/src/bitable.ts, extensions/feishu/src/tools-config.ts, extensions/feishu/src/tool-account-routing.test.ts)
  • doodlewind: Introduced the bundled Feishu plugin and initial multi-account/tool surfaces now being tightened. (role: initial Feishu plugin contributor; confidence: medium; commits: 2267d58afcc7, 5f6e1c19bd18; files: extensions/feishu/src/perm.ts, extensions/feishu/src/tool-account.ts, extensions/feishu/src/config-schema.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper clawsweeper Bot added the rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. label Jun 15, 2026
@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 15, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

1 similar comment
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

Real behavior proof for the current head 09a46df5d5b30f2220020c3192ff2f5e0a4ee8e0.

Behavior addressed: Feishu account-routed tools now enforce the resolved account's own tool-family gate before Feishu client creation. A selected account with that family disabled fails closed even when a sibling account keeps the same tool family registered.

Real environment tested: local OpenClaw checkout, Feishu plugin tools registered through the real plugin registerTool path, then invoked through the actual tool.execute(...) functions with redacted local config and dummy Feishu credentials. No live tenant was used; the disabled-account cases prove the intended pre-client failure path, so they do not need Feishu network access.

Exact steps or command run after this patch:

node --import tsx --input-type=module - <<'EOF_SCRIPT'
import { registerFeishuDocTools } from './extensions/feishu/src/docx.ts';
import { registerFeishuDriveTools } from './extensions/feishu/src/drive.ts';
import { registerFeishuPermTools } from './extensions/feishu/src/perm.ts';
import { registerFeishuWikiTools } from './extensions/feishu/src/wiki.ts';

const registered = [];
const config = {
  channels: {
    feishu: {
      enabled: true,
      accounts: {
        a: {
          appId: 'app-redacted-a',
          appSecret: 'redacted-a',
          tools: { doc: false, scopes: false, drive: false, perm: false, wiki: false },
        },
        b: {
          appId: 'app-redacted-b',
          appSecret: 'redacted-b',
          tools: { doc: true, scopes: true, drive: true, perm: true, wiki: true },
        },
      },
    },
  },
};
const api = {
  config,
  logger: { info() {}, warn() {}, error() {}, debug() {} },
  registerTool(tool, opts) {
    registered.push({ tool, opts });
  },
};
for (const register of [
  registerFeishuDocTools,
  registerFeishuDriveTools,
  registerFeishuPermTools,
  registerFeishuWikiTools,
]) {
  register(api);
}
function toolsFrom(entry, context) {
  if (typeof entry.tool === 'function') {
    const result = entry.tool(context);
    return Array.isArray(result) ? result : [result];
  }
  return [entry.tool];
}
function resolveTool(name, context = {}) {
  for (const entry of registered) {
    if (entry.opts?.name === name && typeof entry.tool !== 'function') return entry.tool;
    for (const tool of toolsFrom(entry, context)) {
      if (tool?.name === name) return tool;
    }
  }
  throw new Error(`missing tool ${name}`);
}
const scenarios = [
  ['doc contextual disabled', 'feishu_doc', { agentAccountId: 'a' }, { action: 'list_blocks', doc_token: 'doc-redacted' }],
  ['doc explicit disabled', 'feishu_doc', { agentAccountId: 'b' }, { action: 'list_blocks', doc_token: 'doc-redacted', accountId: 'a' }],
  ['scopes contextual disabled', 'feishu_app_scopes', { agentAccountId: 'a' }, {}],
  ['drive contextual disabled', 'feishu_drive', { agentAccountId: 'a' }, { action: 'unknown_action' }],
  ['perm contextual disabled', 'feishu_perm', { agentAccountId: 'a' }, { action: 'unknown_action' }],
  ['perm explicit disabled', 'feishu_perm', { agentAccountId: 'b' }, { action: 'unknown_action', accountId: 'a' }],
  ['wiki explicit disabled', 'feishu_wiki', { agentAccountId: 'b' }, { action: 'search', accountId: 'a' }],
  ['wiki implicit fallback enabled', 'feishu_wiki', {}, { action: 'unknown_action' }],
];
const results = [];
for (const [label, name, context, params] of scenarios) {
  const tool = resolveTool(name, context);
  const result = await tool.execute(`proof-${label}`, params);
  results.push({ label, tool: name, error: result?.details?.error ?? null });
}
console.log(JSON.stringify({ registeredTools: registered.length, results }, null, 2));
EOF_SCRIPT

Evidence after fix:

{
  "registeredTools": 5,
  "results": [
    { "label": "doc contextual disabled", "tool": "feishu_doc", "error": "Feishu Doc tools are disabled for account \"a\"" },
    { "label": "doc explicit disabled", "tool": "feishu_doc", "error": "Feishu Doc tools are disabled for account \"a\"" },
    { "label": "scopes contextual disabled", "tool": "feishu_app_scopes", "error": "Feishu App Scopes tools are disabled for account \"a\"" },
    { "label": "drive contextual disabled", "tool": "feishu_drive", "error": "Feishu Drive tools are disabled for account \"a\"" },
    { "label": "perm contextual disabled", "tool": "feishu_perm", "error": "Feishu Perm tools are disabled for account \"a\"" },
    { "label": "perm explicit disabled", "tool": "feishu_perm", "error": "Feishu Perm tools are disabled for account \"a\"" },
    { "label": "wiki explicit disabled", "tool": "feishu_wiki", "error": "Feishu Wiki tools are disabled for account \"a\"" },
    { "label": "wiki implicit fallback enabled", "tool": "feishu_wiki", "error": "Unknown action: unknown_action" }
  ]
}

Observed result after fix: selected disabled accounts fail with the matching disabled-tool error for doc, app scopes, drive, permission, and wiki. The no-context wiki case does not select disabled account a; it reaches the enabled-account execution path and returns the ordinary unknown-action error instead.

Supporting validation:

node scripts/run-vitest.mjs run --config test/vitest/vitest.extension-feishu.config.ts extensions/feishu/src/tool-account-routing.test.ts extensions/feishu/src/docx.account-selection.test.ts --reporter=verbose

Result: 2 files passed, 29 tests passed. The named passing tests include disabled contextual and explicit account coverage for doc, disabled contextual coverage for app scopes, drive, permission, and explicit wiki coverage, plus enabled-family implicit fallback selection.

Maintainer compatibility acceptance: I accept the fail-closed behavior for existing multi-account Feishu setups where an explicitly, contextually, or default-selected account has the requested tool family disabled. Those calls should stop with a disabled-tool error before client creation instead of continuing with disabled account credentials.

What was not tested: live Feishu SaaS API calls were not run. That is intentional for the fail-closed cases because successful proof is that execution stops before a client/API call can be made.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 15, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 15, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 15, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@eleqtrizit
eleqtrizit requested a review from joshavant June 16, 2026 16:42
@joshavant

Copy link
Copy Markdown
Contributor

@clawsweeper re-review

@joshavant joshavant self-assigned this Jun 17, 2026
@joshavant
joshavant merged commit d4f11d3 into openclaw:main Jun 17, 2026
216 of 233 checks passed
crh-code pushed a commit to crh-code/openclaw that referenced this pull request Jun 18, 2026
* fix(feishu): enforce account tool family gates

* fix(feishu): cover perm contextual account gate
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 18, 2026
* fix(feishu): enforce account tool family gates

* fix(feishu): cover perm contextual account gate
@eleqtrizit
eleqtrizit deleted the 754 branch June 30, 2026 19:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: feishu Channel integration: feishu maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: M status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants