人工智能AI AgentAgent记忆MCP服务【免费下载链接】engramPersistent memory system for AI coding agents. Agent-agnostic Go binary with SQLite FTS5, MCP server, HTTP API, CLI, and TUI.项目地址https://gitcode.com/gh_mirrors/engra/engram点击查看免费下载导读本文围绕 Engram 的 Cloud Dashboard云端浏览器控制台展开说明它如何在internal/cloud/dashboard中完成服务端渲染templ HTMX如何经由cloudserver的认证边界挂载并最终依赖cloudstore的 Postgres 读模型、项目同步控制与审计日志实现UI 绝不撒谎的核心不变量。读完你将掌握 Dashboard 的目录职责划分、会话/管理员边界、分页与 HTMX partial 模式以及同步暂停从按钮点击到POST /sync/push被 409 拒绝的完整闭环。Dashboard 在 Engram 分层中的位置Engram 是面向 AI 编码代理的持久记忆系统Cloud Dashboard 是它的云端状态浏览器 UI。它的第一设计原则写得很明确The dashboard is a server-rendered browser UI over cloud state; it must never simulate policy that is not enforced server-side.即UI 属于internal/cloud/dashboard而持久状态与策略执行属于cloudstore/cloudserver。任何只在模板里假装生效的控制都不允许存在。整体请求路径如下继承自 dashboard.mdBrowser GET /dashboard/* │ ▼ internal/cloud/cloudserver auth/session/admin boundary │ ▼ internal/cloud/dashboard handlers templ components static assets │ ▼ DashboardStore interface │ ▼ internal/cloud/cloudstore Postgres read model controls audit logBrowser 只与cloudserver的认证/会话/管理员边界打交道边界之后才进入 dashboard 的处理器与 templ 组件handlers 不直接碰数据库而是通过DashboardStore接口向cloudstore请求数据。cloudstore在 Postgres 之上维护读模型read model、逐项目同步控制project controls和相关事件审计audit log。关键文件与职责边界文件职责internal/cloud/dashboard/dashboard.go路由挂载、handlers、DashboardStore接口定义internal/cloud/dashboard/*_templ.go生成并入库的 templ 组件components_templ.go、layout_templ.go、login_templ.go等internal/cloud/dashboard/static/styles.cssDashboard 样式internal/cloud/dashboard/middleware.go会话/路由保护internal/cloud/dashboard/principal.go操作者视觉身份Operator 身份视图internal/cloud/cloudserver/cloudserver.go认证边界、Dashboard 挂载与同步传输internal/cloud/cloudstore/dashboard_queries.goDashboard 查询/读模型internal/cloud/cloudstore/project_controls.go逐项目同步控制internal/cloud/cloudstore/audit_log.go相关事件审计值得注意的分层约束handlers 只允许存在于 dashboard 包查询与读模型只允许存在于 cloudstore 包策略强制例如同步暂停只允许发生在 cloudserver/cloudstore。templ 是编译期生成并提交到仓库的dashboard.go顶部有//go:generate go -C ../../.. tool templ generate -path ./internal/cloud/dashboard因此生成组件必须与改动一并保留。中央不变量UI 不能说谎Central dashboard invariant是本文档的灵魂如果 UI 显示 sync paused同步已暂停那么每一条 push 路径都必须在服务端被阻断包括POST /sync/push与POST /sync/mutations/push。如果 UI 显示管理控制项那么这些控制必须映射到可强制执行、可测试的行为上。源码中这条不变量有完整实现。以 chunk 推送为例cloudserver.go 在接收 chunk 之前先做push-path pause guardif storeForControls, ok : s.store.(interface { IsProjectSyncEnabled(project string) (bool, error) }); ok { enabled, err : storeForControls.IsProjectSyncEnabled(project) ... if !enabled { // 先写审计再返回 409 auditor.InsertAuditEntry(..., cloudstore.AuditEntry{ Action: cloudstore.AuditActionChunkPush, Outcome: cloudstore.AuditOutcomeRejectedProjectPaused, ReasonCode: sync-paused, }) jsonResponse(w, http.StatusConflict, map[string]any{ error_class: constants.UpgradeErrorClassPolicy, error_code: sync-paused, ... }) } }这里用结构型接口断言structural type assertion检查 store 是否实现了IsProjectSyncEnabled从而不扩张ChunkStore接口——暂停能力对既有同步路径是透明的增强。对 mutation 推送同样有守卫见 mutations.goREQ-414 保证两条路径返回一致的 409 envelope。对应测试在 cloudserver_test.goREQ-109与 mutations_test.go断言响应体包含sync-paused并验证审计行被捕获。也就是说Dashboard 上的暂停开关不是前端开关而是一个真正写入 Postgres 控制表、并在两个独立推送端点上被强制执行的服务端策略。挂载与路由表cloudserver在routes()中调用dashboard.Mount(s.mux, dashboard.MountConfig{...})cloudserver.go把 Dashboard 挂到自身 mux 上。MountConfigdashboard.go是 dashboard 包与宿主解耦的关键全部以闭包注入能力RequireSession(r) error会话校验ValidateLoginToken(token) error/CreateSessionCookie(w, r, token) error/ClearSessionCookie(w, r)登录令牌与 cookie 生命周期IsAdmin(r) bool、CanManageManagedUsers(r) bool、GetDisplayName(r) string管理员边界与操作者身份Store DashboardStore读模型入口StoreForRequest(r) (DashboardStore, error)为受管主体返回不可变的 request-owned store 视图ManagedUsers ManagedUsersStore受管用户渲染边界MaxLoginBodyBytes int64登录表单体积上限StatusProvider SyncStatusProvider同步状态显示。Mountdashboard.go注册的路由大致分为几组开放路由GET /dashboard/health返回{status:ok,subsystem:dashboard}、GET/POST /dashboard/login、POST /dashboard/logout、GET /dashboard/static/从嵌入式StaticFS提供静态资源。浏览路由会话保护/dashboard、/dashboard/stats、/dashboard/activity、/dashboard/browserobservations/sessions/prompts 及其{sessionID}详情、/dashboard/projects、/dashboard/contributors。管理员路由/dashboard/admin、/dashboard/admin/projects、/dashboard/admin/users、/dashboard/admin/health、/dashboard/admin/audit-log。同步控制变更POST /dashboard/admin/projects/{name}/sync这是 mutation不是 dashboard 读取因此刻意不走request read scoping见下方注释。受管用户managed users的变更路由创建/启用/禁用/令牌/授权则直接注册在 cloudserver 的 mux 上而不是走dashboard.Mountcloudserver.go因为它们需要 admin identity store、令牌 hasher 与审计辅助走的是/admin/*JSON API 同一套 policy/store/audit 路径而非重新决策。每个受保护 handler 都通过requireScopedSession包装dashboard.go先requireSession认证再通过StoreForRequest派生 request-local store把不可变副本放入复制的 handlers 值从而避免 principal 作用域数据污染进程级MountConfig或 CloudStore 缓存解析失败则 fail closed在 handler 观察到共享 store 之前就终止请求。会话边界与登录安全细节middleware.go 的requireSession定义了未登录行为的两条分支HTMX 请求带HX-Request: true头返回401HX-Redirect到登录页让前端 partial 直接跳转普通浏览器请求303 SeeOther重定向到dashboardLoginPathWithNext保留next参数。登录流程dashboard.go有三道防护MaxLoginBodyBytes用http.MaxBytesReader限制表单体积超限返回 413空 token 与非法 token 分别渲染带错误提示的LoginPage成功后才创建会话 cookie。会话 cookie 由 cloudserver 注入cloudserver.go关键属性HttpOnly、Secure视请求判断、SameSiteLax、Path/dashboard、MaxAge8 小时。next参数登录后回跳由sanitizeDashboardNext把关helpers.go只接受以单/开头且不以//开头的路径拒绝绝对 URL、含 host/scheme/userinfo 的地址并做path.Clean规范化最后强制限定在/dashboard前缀内——这是防开放重定向的落地实现。操作者身份由 principal.go 承载Principal是一个只读视图字段来自MountConfig闭包handlers 中不做任何 context 读取身份的操作Design Decision 6。空显示名回退为OPERATOR并携带IsAdmin()与CanManageManagedUsers()两个权限位。DashboardStore 接口与读模型DashboardStoredashboard.go是 dashboard 唯一的取数通道按功能分为浏览查询ListProjects、ProjectDetail、ListContributors、ListRecentSessions/Observations/Prompts分页查询ListProjectsPaginated、ListRecentObservationsPaginated、ListRecentSessionsPaginated、ListRecentPromptsPaginated、ListContributorsPaginated均返回(rows, total, error)详情查询GetSessionDetail、GetObservationDetail、GetPromptDetail、GetContributorDetail系统状态SystemHealth、AdminOverview、ListDistinctTypes同步控制ListProjectSyncControls、GetProjectSyncControl、SetProjectSyncEnabled、IsProjectSyncEnabled审计ListAuditEntriesPaginated(ctx, filter, limit, offset)。与之并行的是ManagedUsersStore只读ListHumanUsers它刻意与 contributor 分析分离受管人类用户 ≠ 贡献者分析cloud-user-token-management PR4。受管用户的变更由 cloudserver 拥有并做策略门控dashboard 只渲染结果并链接到 cloudserver 拥有的路由。读模型侧dashboard_queries.gobuildDashboardReadModel把 chunk 行按createdAt → chunkID → project → createdBy稳定排序后折叠出项目统计、贡献者、session/observation/prompt 三张实体表。行结构如DashboardObservationRow携带SyncID作为详情页 URL 段、ChunkID跨 mutation 保留、Type、Title、Content、TopicKey、ToolName等字段。查询层还定义了一组专用错误dashboard_queries.goErrDashboardProjectInvalid/Forbidden/NotFound、ErrDashboardContributorNotFound、ErrDashboardSessionNotFound/ObservationNotFound/PromptNotFound。classifyStoreErrordashboard.go把它们逐一映射为语义化 HTTP 状态与页面文案——例如 session 缺失显示 Session not found 而不是误导性的 Project not foundR5-4默认分支返回503与 temporarily unavailable。分页与 HTMX partial 契约Dashboard 所有列表页采用统一的shell partial模式整页导航渲染 templLayout外壳HTMX 请求只交换内容片段。以/dashboard/contributors为例dashboard.go壳层不查 store列表由GET /dashboard/contributors/list的ContributorsListPartial加载。分页参数helpers.go默认每页10条范围10~100UI 选择器提供10 / 25 / 50 / 100四档allowedPageSizesPagination提供Offset/Start/End/HasPrev/HasNext/ShowPagination/PageNumbers超过 7 页时用-1表示省略号。关键设计是先取数、后钳位parsePaginationRawhelpers.go在总行数未知时不预先 clamp 页码拿到 store 返回的真实 total 后再由reclampPaginationhelpers.go钳位若请求页超出末页则触发recoverPaginationRowshelpers.go三层回退初次取数Tier 1在钳位后的 offset 上重取Tier 2失败时保留原行而非报错R3-7 优雅降级仅当重取失败且原行为空时回退到第 1 页Tier 3R4-9。部分端点遵循partial-only 契约R6-2即便收到非 HTMX 请求也绝不套Layout外壳出错时只返回片段如EmptyState(Service Unavailable, ...)配 502。这套恢复逻辑在 pagination_recovery_test.go 中有系统性覆盖。时间与文本渲染也有细节formatTimestamphelpers.go兼容 RFC3339 与 SQLite 风格字符串显示格式02 Jan 2006 15:04时区遵循ENGRAM_TIMEZONE环境变量回退系统本地时区空值显示-、可为空语义显示Never。结构化观察内容**What**/**Why**/**Where**/**Learned**:字段由renderStructuredContent识别并渲染为分块卡片。同步暂停控制的端到端闭环暂停控制的数据面在 project_controls.goIsProjectSyncEnabledproject_controls.go控制行缺失时默认启用sql.ErrNoRows → true查询出错时fail closed返回(false, error)防止未知状态被静默放行SetProjectSyncEnabledproject_controls.goINSERT ... ON CONFLICT DO UPDATE的 UPSERT写入sync_enabled、paused_reason、updated_by、updated_at并在写入后invalidateDashboardReadModel()使读模型缓存即时失效无需等待下一次 chunk 写入ListProjectSyncControlsproject_controls.gocloud_chunks的 distinct 项目与cloud_project_controls的 UNION配合COALESCE(c.sync_enabled, TRUE)让从未配置过但已同步 chunk的项目也以启用状态出现在列表里。UI 侧POST /dashboard/admin/projects/{name}/syncdashboard.go是管理员专属的变更入口enabled只接受字面量true/false否则 400reason 非空则写入paused_reason变更通过SetProjectSyncEnabled落库时带上当前操作者显示名。对 HTMX 请求返回200 HX-Redirect对普通表单返回303。于是完整闭环是管理员在/dashboard/admin/projects点击暂停提交enabledfalse与原因cloudstore.SetProjectSyncEnabledUPSERTcloud_project_controls并失效读模型缓存之后任何 chunk push 或 mutation push 到达cloudserverIsProjectSyncEnabled返回false请求在写审计后以409error_codesync-paused被拒绝Dashboard 的 Paused 徽标与暂停审计来自同一张控制表UI 与后端状态永远一致。审计日志筛选与深链审计写入侧audit_log.go定义了常量AuditActionChunkPush/AuditActionMutationPush与AuditOutcomeRejectedProjectPausedAuditEntry携带Contributor/Project/Action/Outcome/EntryCount/ReasonCode/MetadataMetadata以 JSON 入库nil 存 NULL。InsertAuditEntry同步写入、错误不吞。读取侧GET /dashboard/admin/audit-log壳与GET /dashboard/admin/audit-log/listpartial均管理员门控由parseAuditFilter解析筛选dashboard.gocontributor、project、outcome文本筛选from/to时间筛选接受RFC3339或 **date-onlyYYYY-MM-DD按 UTC 零点**两种格式非法格式返回400而非静默丢弃JW6buildAuditListURLhelpers.go把筛选参数编码进初始hx-get让?contributoralice这样的深链在刷新后依然保留筛选JW2。Dashboard 变更检查清单对任何修改 Dashboard 的提交本文档要求逐条核对UI 表示真实状态而非假控制管理员策略在cloudserver/cloudstore强制执行而非只在 templ/HTMX 里生效handlers 只放在internal/cloud/dashboard查询/读模型只放在internal/cloud/cloudstore生成的 templ 组件随改动一起保留测试覆盖路由、认证/会话/管理、HTMX partial 与边缘情况。测试与验证指引路由/会话/管理员/HTMX/边缘测试见 internal/cloud/dashboard/dashboard_test.go分页恢复三层回退见 internal/cloud/dashboard/pagination_recovery_test.go暂停项目 chunk push 返回sync-paused见 internal/cloud/cloudserver/cloudserver_test.go暂停项目 mutation push 返回sync-paused并写审计见 internal/cloud/cloudserver/mutations_test.go受管用户路由与 Dashboard 挂载的协同见 internal/cloud/cloudserver/dashboard_admin_users_test.go。进一步阅读整体分层见 docs/codebase/interfaces.md 与 docs/codebase/sync-and-cloud.mdDashboard 所展示的同步状态语义ReasonPaused、ReasonAuthRequired、ReasonTransportFailed等定义于 internal/cloud/constants/constants.go。赞分享人工智能AI AgentAgent记忆MCP服务【免费下载链接】engramPersistent memory system for AI coding agents. Agent-agnostic Go binary with SQLite FTS5, MCP server, HTTP API, CLI, and TUI.项目地址https://gitcode.com/gh_mirrors/engra/engram点击查看免费下载相关推荐Spectrum 服务端渲染SSR架构解析Hyperion 渲染服务器开发与运行指南Spectrum 服务端渲染SSR架构解析Hyperion 渲染服务器开发与运行指南 Hyperion 是 Spectrum 开源社区平台中专司服务端渲染后端前端即时通讯社交vue-vben-admin 组件设计3 层目录 2 个 api看懂它怎么拼中后台vue vben admin 组件设计3 层目录 2 个 api看懂它怎么拼中后台 打开 vue vben admin 的 packages 目录组件前端如何从零跑通 Autoware面向新手的完整安装指南如何从零跑通 Autoware面向新手的完整安装指南 Autoware 是世界上最活跃的开源自动驾驶软件栈负责从定位、感知到规划控制的完整链路。本文面向零基自动驾驶上一篇Longhorn存储容量管理终极指南阈值设置与自动扩容配置详解下一篇PX4 Autopilot 向 Betaflight 飞控板刷写 PX4 Bootloader 的三种方法与固件构建指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?