Skip to content

feat: pluggable embed onboarding + external auth framework#60

Open
Mingholy wants to merge 1 commit into
mainfrom
feat/embed-onboarding
Open

feat: pluggable embed onboarding + external auth framework#60
Mingholy wants to merge 1 commit into
mainfrom
feat/embed-onboarding

Conversation

@Mingholy

@Mingholy Mingholy commented Jun 10, 2026

Copy link
Copy Markdown
Owner

这是什么

plans/2026-06-10-loopat-extension-base.md 设计文档实现的通用、企业无关的 extension 基座扩展 PoC,支撑「外部 SSO 登录 + 完全自定义的 onboarding UI」,把全部企业逻辑挡在核心之外(不同于 upstream PR #20bailian-fe-default//bailian-mate:check-env 写进核心)。

配套的企业扩展(BUC SSO + 向导 + 冷启动)单独实现、不进本公开仓库(含真实内网信息),通过 LOOPAT_HOME/extensions/providers/ 在部署机运行时加载。

改了什么(全部通用、可上游、github provider 不变、新能力全 optional)

  • embed onboarding 原语OnboardingView 新增 kind:"embed" → 渲染为无 sandbox 的 srcdoc iframe(同源,相对 /api 自动带 session cookie)。provider 把 onboarding UI 作为 HTML 字符串返回;门禁仍由宿主 Layout 强制。
  • ExternalAuth 框架GET /api/auth/external/{status,start} + SPA fallback 前的 callback 拦截;auth.tsfindUserByOAuth/createOAuthUser。provider 声明 {callbackPath,tokenParam,buildLoginUrl,verify};登录页按钮文案来自 status 接口,无任何硬编码平台名
  • POST /api/settings/personal/mount — 写文件进个人 vault mount。
  • mcp-auth/startloopId 可选 + serverConfig,支持 onboarding 阶段(无 loop)的 MCP OAuth;loop 上下文报错信息保留。
  • seedDefaults ctx 加可选 token(provisioning token 透传)。
  • 通用 fixture-provider + extension-base 测试(零企业串)。

验证

  • server/web typecheck:✅ clean
  • extension-base.test.ts 12/12 ✅;api-mcp / mcp-oauth ✅(修复了一处自身引入的报错文案回归)
  • 回归核对:全量 server bun test 与未改动的 main 逐一 diff,本分支独有失败仅 1 条(已修复);其余失败在 main 上完全相同,均为本机环境所致(~/.loopat 内置 provider 的 onboarding 门禁、podman、git-sync),与本 PR 无关。

已知集成待办(端到端联调时对齐)

  1. GET /api/personal/status 需向 iframe 暴露 vaultEnvs(检测已配置的 vault token)与 ssh 公钥字段。
  2. POST /api/onboarding/done 是否写 config.onboarding.{status,wizardCompleted} 以加速下次 onboarding() 返回 done(与现有 dismiss marker 二选一,需统一)。
  3. 扩展 .ts先落 LOOPAT_HOME/extensions/providers/ 再启动(懒加载、无热重载)。

Reviewer 重点

  • iframe 必须无 sandbox 的安全取舍;OAuth 用户空 salt/hash + 自动 active(信任全押 verify());callback 中间件顺序(在 SPA fallback 之前、放行 /api·/ws)。

🤖 Generated with Claude Code

Generic, enterprise-agnostic extension-base additions so external SSO login
and fully custom onboarding UIs can be implemented in a drop-in provider
extension, with zero platform-specific logic in core:

- OnboardingView gains `kind:"embed"` → rendered as a no-sandbox srcdoc iframe
  (same-origin, so relative /api calls carry the session cookie). The provider
  returns the onboarding UI as an HTML string; the gate stays host-enforced.
- ExternalAuth framework: GET /api/auth/external/{status,start} + a callback
  interceptor before the SPA fallback; auth.ts findUserByOAuth/createOAuthUser.
  Provider declares {callbackPath,tokenParam,buildLoginUrl,verify}; AuthPage
  renders the SSO button from the status endpoint (no hardcoded provider names).
- POST /api/settings/personal/mount — write a file into the personal vault mount.
- mcp-auth/start: loopId optional + serverConfig, enabling MCP OAuth during
  onboarding (no loop yet). Loop-context error message preserved.
- seedDefaults ctx gains optional `token` (provisioning token pass-through).
- Generic fixture-provider + extension-base tests (no enterprise strings).

github provider behavior unchanged. All new capabilities optional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Mingholy Mingholy force-pushed the feat/embed-onboarding branch from 57bd26a to 3c12d4e Compare June 10, 2026 08:55
@Mingholy Mingholy changed the title feat: pluggable embed onboarding + external auth framework (+ enterprise PoC) feat: pluggable embed onboarding + external auth framework Jun 10, 2026
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