Skip to content

feat: deliver certified records to Feishu Bitable - #79

Open
1012839419a-alt wants to merge 25 commits into
2233admin:mainfrom
1012839419a-alt:codex/feishu-bitable-record-delivery
Open

feat: deliver certified records to Feishu Bitable#79
1012839419a-alt wants to merge 25 commits into
2233admin:mainfrom
1012839419a-alt:codex/feishu-bitable-record-delivery

Conversation

@1012839419a-alt

Copy link
Copy Markdown
Contributor

Summary

  • add encrypted, reusable Feishu Bitable connections under provider settings, including connection probes
  • add a secret-free workflow sink that delivers certified stored Record references with provenance and mutation-permission gates
  • persist idempotent delivery attempts and expose redacted typed errors, migrations, UI configuration, and regression coverage
  • preserve Gaojixing fresh question-bank run flow while merging the latest upstream main

Verification

  • backend focused suite: 45 passed
  • frontend workflow regressions: 81 passed
  • TypeScript: pnpm --dir frontend exec tsc --noEmit
  • Ruff changed Python files: passed
  • git diff --check: passed

Notes

No live Feishu credentials are committed. Pre-existing broad Ruff baseline debt and duplicate run-event follow-up remain documented in deferred-work.md.

- chrome-extra: captcha watchdog (captcha_alert.py), userscript deployer
  (deploy_userscripts.py), Tampermonkey runtime, doubao captcha userscripts,
  entrypoint with noVNC quality fix + --enable-unsafe-swiftshader so the
  frontend login page (Three.js WebGL background) renders in container Chrome
- browsers.py: dynamic agent pool instances mount chrome-extra and seed
  Tampermonkey profile from agent-1
- docker-compose: api uses 0.4.1-gjx image, mounts captcha tooling; agent-1
  mounts chrome-extra entrypoint/tampermonkey/scripts
Replace hard-coded D:/projects/opencli-Razormind/chrome-extra absolute
paths with ./chrome-extra relative to the compose file (portable for
upstream). browsers.py falls back to ./chrome-extra when CHROME_EXTRA_DIR
is unset; deployers can still point it at a host absolute path via env.
…record-delivery

# Conflicts:
#	backend/security/identity.py
#	frontend/components/flow/run-trace-panel.tsx
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 201 files, which is 101 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4849fa42-58e9-406b-ad2c-2735db8117fa

📥 Commits

Reviewing files that changed from the base of the PR and between b9ec317 and 4d3db78.

⛔ Files ignored due to path filters (33)
  • backend/workflow/fixtures/gaojixing_fixture_底部.svg is excluded by !**/*.svg
  • backend/workflow/fixtures/gaojixing_fixture_正文.svg is excluded by !**/*.svg
  • backend/workflow/fixtures/gaojixing_fixture_顶部.svg is excluded by !**/*.svg
  • chrome-extra/tampermonkey/images/icon.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon128.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon16.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon19.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon24.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon32.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon38.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon48.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_blocker16.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_blocker19.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_blocker24.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_blocker32.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_blocker38.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_forbidden16.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_forbidden19.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_forbidden24.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_forbidden32.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_forbidden38.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_grey16.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_grey19.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_grey24.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_grey32.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_grey38.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_paused16.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_paused19.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_paused24.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_paused32.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/icon_paused38.png is excluded by !**/*.png
  • chrome-extra/tampermonkey/images/txt.png is excluded by !**/*.png
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (201)
  • .env.docker.example
  • .env.example
  • .github/workflows/ci.yml
  • .nvmrc
  • DESIGN.md
  • MOTION.md
  • README.md
  • _bmad-output/implementation-artifacts/deferred-work.md
  • _bmad-output/implementation-artifacts/spec-feishu-bitable-record-delivery.md
  • _bmad-output/implementation-artifacts/spec-gaojixing-latest-flow-live-collection.md
  • _bmad-output/implementation-artifacts/spec-gh-79-ci-readiness.md
  • backend/api/v1/__init__.py
  • backend/api/v1/browsers.py
  • backend/api/v1/chat.py
  • backend/api/v1/delivery_connections.py
  • backend/api/v1/local_auth.py
  • backend/api/v1/studio_workflows.py
  • backend/api/v1/system.py
  • backend/api/v1/workflows.py
  • backend/config.py
  • backend/main.py
  • backend/migrations/versions/a8b9c0d1e2f3_add_durable_agent_runs.py
  • backend/migrations/versions/b9c0d1e2f3a5_add_gaojixing_collection_runtime.py
  • backend/migrations/versions/c0d1e2f3a4b5_add_gaojixing_conversation_cleanup.py
  • backend/migrations/versions/d1e2f3a4b5c6_add_delivery_connections.py
  • backend/migrations/versions/l9m0n1o2p3q4_add_local_owner_auth.py
  • backend/migrations/versions/z7a8b9c0d1e2_add_local_admin.py
  • backend/models/__init__.py
  • backend/models/agent_run.py
  • backend/models/delivery_connection.py
  • backend/models/gaojixing_collection.py
  • backend/models/identity.py
  • backend/schemas/delivery_connection.py
  • backend/schemas/workflow.py
  • backend/security/fleet_auth.py
  • backend/security/identity.py
  • backend/security/local_auth.py
  • backend/security/question_bank_body_limit.py
  • backend/services/feishu_bitable_delivery.py
  • backend/services/gaojixing_collection_service.py
  • backend/worker/tasks.py
  • backend/workflow/block_reasons.py
  • backend/workflow/capability_projection.py
  • backend/workflow/compiler.py
  • backend/workflow/fixtures/gaojixing_doubao_offline.json
  • backend/workflow/gaojixing_archive.py
  • backend/workflow/gaojixing_certification.py
  • backend/workflow/gaojixing_collection_runner.py
  • backend/workflow/gaojixing_doubao.py
  • backend/workflow/gaojixing_doubao_driver.py
  • backend/workflow/gaojixing_worker_runtime.py
  • backend/workflow/hda_templates.py
  • backend/workflow/managed_gaojixing_question_batches.py
  • backend/workflow/node_registry.py
  • backend/workflow/opencli_hda_tracer.py
  • backend/workflow/runtime_contracts.py
  • backend/workflow/runtime_registry.py
  • backend/workflow/tool_capabilities.py
  • backend/workflow/workflow_run_events.py
  • chrome-extra/captcha_alert.py
  • chrome-extra/deploy_userscripts.py
  • chrome-extra/entrypoint.sh
  • chrome-extra/scripts/doubao_captcha_autoreload.user.js
  • chrome-extra/scripts/rmc_captcha_refresh.user.js
  • chrome-extra/tampermonkey/LICENSE
  • chrome-extra/tampermonkey/_locales/ar/messages.json
  • chrome-extra/tampermonkey/_locales/be/messages.json
  • chrome-extra/tampermonkey/_locales/cs/messages.json
  • chrome-extra/tampermonkey/_locales/da/messages.json
  • chrome-extra/tampermonkey/_locales/de/messages.json
  • chrome-extra/tampermonkey/_locales/el/messages.json
  • chrome-extra/tampermonkey/_locales/en/messages.json
  • chrome-extra/tampermonkey/_locales/es/messages.json
  • chrome-extra/tampermonkey/_locales/fr/messages.json
  • chrome-extra/tampermonkey/_locales/he/messages.json
  • chrome-extra/tampermonkey/_locales/hi/messages.json
  • chrome-extra/tampermonkey/_locales/hr/messages.json
  • chrome-extra/tampermonkey/_locales/hu/messages.json
  • chrome-extra/tampermonkey/_locales/id/messages.json
  • chrome-extra/tampermonkey/_locales/it/messages.json
  • chrome-extra/tampermonkey/_locales/ja/messages.json
  • chrome-extra/tampermonkey/_locales/ko/messages.json
  • chrome-extra/tampermonkey/_locales/mk/messages.json
  • chrome-extra/tampermonkey/_locales/nb/messages.json
  • chrome-extra/tampermonkey/_locales/nl/messages.json
  • chrome-extra/tampermonkey/_locales/pl/messages.json
  • chrome-extra/tampermonkey/_locales/pt_BR/messages.json
  • chrome-extra/tampermonkey/_locales/pt_PT/messages.json
  • chrome-extra/tampermonkey/_locales/ru/messages.json
  • chrome-extra/tampermonkey/_locales/sk/messages.json
  • chrome-extra/tampermonkey/_locales/sr/messages.json
  • chrome-extra/tampermonkey/_locales/tr/messages.json
  • chrome-extra/tampermonkey/_locales/uk/messages.json
  • chrome-extra/tampermonkey/_locales/vi/messages.json
  • chrome-extra/tampermonkey/_locales/zh_CN/messages.json
  • chrome-extra/tampermonkey/_locales/zh_TW/messages.json
  • chrome-extra/tampermonkey/_metadata/verified_contents.json
  • chrome-extra/tampermonkey/action.html
  • chrome-extra/tampermonkey/ask.html
  • chrome-extra/tampermonkey/background.html
  • chrome-extra/tampermonkey/background.js
  • chrome-extra/tampermonkey/cache.js
  • chrome-extra/tampermonkey/content.js
  • chrome-extra/tampermonkey/editor.css
  • chrome-extra/tampermonkey/editor.js
  • chrome-extra/tampermonkey/extension.js
  • chrome-extra/tampermonkey/lint.js
  • chrome-extra/tampermonkey/manifest.json
  • chrome-extra/tampermonkey/offscreen.html
  • chrome-extra/tampermonkey/offscreen.js
  • chrome-extra/tampermonkey/options.html
  • chrome-extra/tampermonkey/page.js
  • chrome-extra/tampermonkey/schema.json
  • chrome-extra/tampermonkey/style.css
  • chrome-extra/tampermonkey/test.js
  • chrome-extra/tampermonkey/userscript.html
  • chrome-extra/tampermonkey/vendor/eslint/LICENSE
  • chrome-extra/tampermonkey/vendor/eslint/eslint.js
  • chrome-extra/tampermonkey/vendor/jsdiff/diff.js
  • chrome-extra/tampermonkey/vendor/saveas/LICENSE.md
  • chrome-extra/tampermonkey/vendor/saveas/filesaver.js
  • docker-compose.yml
  • docs/adr/0043-use-local-administrator-password-after-bootstrap.md
  • docs/backend-capability-exposure-matrix.yaml
  • docs/ptt-acceptance.md
  • frontend/app/(app)/operations-agents/page.tsx
  • frontend/app/(app)/providers/catalog/page.tsx
  • frontend/app/api/workflow/run-scope.ts
  • frontend/app/api/workflow/run/question-bank/route.ts
  • frontend/app/api/workflow/run/route.ts
  • frontend/app/api/workflow/runs/[runId]/gaojixing/resume/route.ts
  • frontend/app/api/workflow/runs/[runId]/trace/route.ts
  • frontend/app/login/page.tsx
  • frontend/components/auth/auth-provider.tsx
  • frontend/components/auth/local-admin-access.tsx
  • frontend/components/flow/feishu-bitable-target-editor.tsx
  • frontend/components/flow/inspector.tsx
  • frontend/components/flow/run-trace-panel.tsx
  • frontend/components/flow/workflow-editor-session.tsx
  • frontend/components/providers/feishu-bitable-connection-panel.tsx
  • frontend/components/shell/global-agent-dock.tsx
  • frontend/e2e/login.spec.mjs
  • frontend/lib/agent-dock-state.ts
  • frontend/lib/api/endpoints.ts
  • frontend/lib/api/hooks.ts
  • frontend/lib/api/types.ts
  • frontend/lib/auth/session.ts
  • frontend/lib/auth/types.ts
  • frontend/lib/flow/store.ts
  • frontend/lib/plugins/generated-capability-catalog.json
  • frontend/lib/workflow/backend-runs.ts
  • frontend/lib/workflow/draft-persistence.ts
  • frontend/lib/workflow/gaojixing-doubao-workflow.ts
  • frontend/lib/workflow/live-run-monitor.ts
  • frontend/lib/workflow/node-catalog.ts
  • frontend/lib/workflow/studio-templates.ts
  • frontend/package.json
  • frontend/playwright.config.mjs
  • frontend/scripts/check-feishu-bitable-regressions.mjs
  • frontend/scripts/check-gaojixing-doubao-workflow.mjs
  • frontend/scripts/check-global-agent-dock-regressions.mjs
  • frontend/scripts/check-login-theme-regressions.mjs
  • frontend/scripts/check-navigation-transition-regressions.mjs
  • frontend/scripts/check-workflow-draft-persistence-regressions.mjs
  • frontend/scripts/check-workflow-regressions.mjs
  • openspec/changes/agent-execution-experience/brief.md
  • openspec/changes/agent-execution-experience/design.md
  • openspec/changes/agent-execution-experience/motion.md
  • openspec/changes/agent-execution-experience/qa.md
  • openspec/changes/agent-execution-experience/tasks.md
  • openspec/changes/local-admin-onboarding/brief.md
  • openspec/changes/local-admin-onboarding/design.md
  • openspec/changes/local-admin-onboarding/directions.md
  • openspec/changes/local-admin-onboarding/motion.md
  • openspec/changes/local-admin-onboarding/qa.md
  • openspec/changes/local-admin-onboarding/tasks.md
  • package.json
  • pyproject.toml
  • scripts/dev-environment.mjs
  • scripts/dev-environment.test.mjs
  • scripts/gjx_backfill_followups.py
  • scripts/install.ps1
  • scripts/install.sh
  • tests/integration/test_auth_api.py
  • tests/integration/test_chat_api.py
  • tests/integration/test_delivery_connections_api.py
  • tests/integration/test_legacy_native_intelligence_migration.py
  • tests/integration/test_legacy_plugin_migration.py
  • tests/integration/test_studio_lifecycle_api.py
  • tests/integration/test_workflow_gaojixing_hda.py
  • tests/unit/security/test_local_auth.py
  • tests/unit/security/test_question_bank_body_limit.py
  • tests/unit/test_feishu_bitable_delivery.py
  • tests/unit/test_gaojixing_collection_service.py
  • tests/unit/test_gaojixing_doubao_driver.py
  • tests/unit/test_gaojixing_workflow_tools.py
  • tests/unit/test_identity_models.py
  • tests/unit/test_managed_gaojixing_question_batches.py
  • tests/unit/test_migration_heads.py
  • tests/unit/test_public_release_contract.py
  • tests/unit/test_workflow_run_events.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Warning

Your free Security trial is over. An organization admin can activate billing to continue.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant