integrate completed September 6 product changes

This commit is contained in:
inman
2026-09-07 11:05:25 +08:00
parent e069ec6294
commit 0fb1dac245
22 changed files with 314 additions and 924 deletions

View File

@@ -2,12 +2,14 @@
## Status
Accepted / implemented
Accepted / implemented, amended 2026-09-07
## Date
2026-08-30
Last amended: 2026-09-07
## Context
ADR-001 modeled a Workspace as multiple independently selected Conversations, each
@@ -16,6 +18,11 @@ form edits, Quote options, and provider prompts competing representations of the
same design. The coordinated Works Square and MakeLore V2 cutover now provides one
versioned Design Specification and a persistent form throughout the design flow.
The September 7 Canvas presentation refinement keeps that authority model while
making the current production plan easier to edit: conversation and the sole active
plan stay together, Workspace navigation moves to a right Works rail, and references
are expressed through public Prompt aliases bound to canonical Assets.
## Decision
- One Workspace exposes one current Direction, one persistent Agent Session, one
@@ -35,6 +42,21 @@ versioned Design Specification and a persistent form throughout the design flow.
- Electron Main is the only Canvas network authority. Development and packaged
builds use the Works Square V2 contract; there is no V1 DTO adapter, local semantic
adapter, mutable Quote PATCH, editable provider Prompt, or cloud-failure fallback.
- The visible Canvas has two regions: a flexible central conversation timeline with
the only active editable production plan, and a full-height right Works rail for
Workspace navigation. Compact layouts expose that rail as a right Sheet. Terminal
submitted plans collapse into conversation history; they do not create a second
current-plan authority.
- The public `content.concept` projection is the directly editable final Prompt.
References retain stable reference IDs and typed Workspace Asset bindings while
appearing in that Prompt as continuous `@图片N` aliases. The Prompt is the only
visible expression of how a reference affects generation; the adjacent row manages
binding/file state only. An unbound referenced alias blocks Quote availability and
exposes a targeted upload slot.
- Prompt, reference binding, type, aspect-ratio, duration, or output-count changes
enter the existing typed reducer and create a new Specification revision. An offered
plan must be recompiled to a fresh immutable Quote before confirmation. Reference
count/media limits come from service capabilities, not client-only constants.
## Rationale
@@ -51,6 +73,9 @@ and uncertain retries auditable without exposing provider internals.
old clients and V1 semantic writers receive no compatibility window.
- Production database cutover, paid Provider activation, and real-account installed
client smoke remain separate operator gates.
- Layout and reference aliases are public projections, not new semantic authorities.
Any future UI must preserve one active plan, stable Asset identity, and the exact
Specification-revision/Quote boundary even if its visual arrangement changes.
## Supersedes
@@ -61,3 +86,6 @@ and uncertain retries auditable without exposing provider internals.
- Client source `b0b5a602b501308a23eb27e2f51a5169b9e46b1e`
- Server source `b5351d54f595ce8eb873593e462e4a556bea0b05`
- Server ADR `ADR-2026-08-28-001`
- Canvas refinement source `1562a49`
- Canvas refinement integration merge `ea1219c`
- Source task `20260906-canvas-reference-images-c4e97a`

View File

@@ -1,7 +1,8 @@
# ADR-008: 交互式 AI 应用使用显式 Scaffold Skill
- Status: Accepted / implemented
- Status: Accepted / implemented, amended 2026-09-07
- Date: 2026-09-04
- Last amended: 2026-09-07
- Applies to: Project creation, `ProjectType`, official bundled Marketplace Plugins, scaffold Skill, release readiness
## Context
@@ -10,12 +11,15 @@
项目服务当前已经只负责 `.makelore/project.json``knowledge/`。用户确认将小游戏和小程序合并为一个“交互式 AI 应用”类型,并把生成文件、目录以及提交审批要求放进由官方 Marketplace 管理、随签名客户端交付的 Skill。
后续面向青少年用户的验证表明要求用户在创建时理解产品类型、模板、UUID 与初始化状态仍是多余门槛。用户进一步确认普通创建只应选择目录,其余身份与安全默认由客户端和 Main 自动处理Scaffold Skill 保持可选能力,而不是创建或进入聊天的前置步骤。
## Decision
- 新建项目只提供规范产品类型 `interactive_ai_app`(显示为“交互式 AI 应用”)和 `custom``ProjectType` 创建后仍不可变
- 普通新建项目只要求选择目录,不展示产品类型、模板、原始 UUID、绑定或独立副本选项。Renderer 写入内部默认 `interactive_ai_app`Main 生成规范 UUID`ProjectType` 创建后仍不可变。既有 `custom` 项目和底层兼容入口继续支持,但 `custom` 不再作为普通新建选项
- `mini_game``mini_program` 只作为历史读取和脚手架兼容别名,在内存中归一为 `interactive_ai_app`。读取或运行脚手架不会改写原配置;后续普通配置变更可以保存规范值。缺少类型字段的旧项目仍归一为 `custom`
- 项目创建只生成 `.makelore/project.json``knowledge/`,不生成业务源码、依赖、锁文件或发布模板。
- 代码内置的官方 Marketplace Plugin `makelore.project-scaffold` 提供显式 Skill `makelore-project-scaffold`。它保留 Account Library 获取、项目启用和 Agent 分配语义,但固定版本资源随 MakeLore 客户端交付,不经过 Package Store 下载。其脚本生成六个交互式 AI 应用起步文件;写入前预检全部目标,不覆盖已有路径,受控失败时只回滚本次创建的文件和目录
- Main 为新项目自动生成 UUID并为“其他 metadata 有效、仅缺 `projectId`”的旧配置串行补齐并持久化一次。原始 UUID、bind/independent-copy 选择不进入普通 UI其他 metadata 缺失或无效仍是配置错误。旧 `initialized` 布尔只保留为 schema 兼容字段,不得阻断有效项目导航、聊天或首个 Agent 创建
- 代码内置的官方 Marketplace Plugin `makelore.project-scaffold` 提供可选显式 Skill `makelore-project-scaffold`。它不是项目创建或聊天前置条件;其 Account Library 获取、项目启用和 Agent 分配语义保持独立,固定版本资源随 MakeLore 客户端交付且不经过 Package Store 下载。脚本生成六个交互式 AI 应用起步文件;写入前预检全部目标,不覆盖已有路径,受控失败时只回滚本次创建的文件和目录。
- Scaffold Skill 不安装依赖、不访问网络、不执行构建、不上传、不提交审核,也不提供 `--force`、类型覆盖或模板迁移状态。Main 继续独占固定 npm/Vite 构建、同字节预检、打包和上传Works Square 继续独占服务端校验、不可变 Release 与运营审核。
- 官方 Plugin 的 `.mjs` 仅因它位于客户端固定、代码所有的 bundled resource root 中而可执行。应用通过不可覆盖的 `MAKELORE_NODE_EXECUTABLE` 向父 Pi worker/Agent Server 提供自身 Node不得回退系统 Node。该例外不适用于 Marketplace 下载 artifactP0 下载包仍只接受文本/图片 Skill 资源并拒绝 `.mjs`。第三方 Device Package 的可执行代码继续走自身的披露与确认边界。
- Skill 的发布检查只是只读准备度指导:区分确定阻断、源码包排除影响、运行时/平台待确认项和静态已满足项,并引用项目相对证据。它不能宣称构建、上传、审核或生产发布成功。
@@ -23,13 +27,14 @@
## Consequences
- 模板可随官方 Plugin 版本演进,不再扩大项目创建服务的职责,也不需要把脚本上传为 Marketplace artifact。
- 旧项目无需批量迁移即可继续打开、生成脚手架和发布;新写入只使用规范类型
- 普通用户可从目录选择直接进入 `/chat`;没有 Agent 时显示非阻塞空状态并提供创建首个 Agent 的入口。Project Configuration 仍处理真正无效的 metadata但不再承担初始化仪式
- 旧项目无需批量迁移即可继续打开、生成脚手架和发布;普通新写入使用内部默认 `interactive_ai_app`,既有 `custom` 与历史类型保持兼容。
- 发布规则在 Skill 中可被 Agent 解释和预检,但权威执行仍只有 Main 与 Works Square避免形成第二套发布实现。
- 对外分发仍需不可变 SemVer/Git 版本、服务端 bundled Release 元数据、已安装 Windows、签名 macOS 与 native Linux 运行证据;工作区测试不能替代这些发布门禁。
## Supersedes
本决定取代 2026-08-09 的双可发布类型与创建时自动生成模板行为;固定 Vite 构建、artifact contract、运营审核与公共播放边界保持不变。
本决定取代 2026-08-09 的双可发布类型与创建时自动生成模板行为,并于 2026-09-07 取代创建时的类型/身份选择及 `initialized` 工作区 gate;固定 Vite 构建、artifact contract、运营审核与公共播放边界保持不变。
## Related Evidence
@@ -41,3 +46,6 @@
- Marketplace source task: `20260904-marketplace-scaffold-client-6c4e8a21`
- Marketplace integration task: `20260904-project-scaffold-integration-client-4f2a8c71`
- Proposal: `10-decisions/proposals/20260904-project-scaffold-implementation-7e4c2a91__interactive-ai-app-type.md`
- Simplified-creation source commit: `af13aca`
- Simplified-creation integration merge: `39d7b7e`
- Simplified-creation source task: `20260906-remove-project-gate-7c31`

View File

@@ -4,8 +4,8 @@
| ID | Decision | Status | Date | Applies To | Detail |
|---|---|---|---|---|---|
| ADR-008 | 交互式 AI 应用使用单一规范类型,项目创建与官方 bundled Scaffold Skill发布权威分离 | Accepted / implemented, amended 2026-09-04 | 2026-09-04 | Project creation、`ProjectType`、Official Plugins、Marketplace delivery、release readiness | `adr-008-interactive-ai-app-scaffold.md` |
| ADR-007 | AI Design 采用单一 Current Specification、Living Form 与不可变 Quote 的 V2 权威 | Accepted / implemented | 2026-08-30 | AI Design Renderer、Electron Main、Works Square V2 API | `adr-007-ai-design-living-form-v2.md` |
| ADR-008 | 交互式 AI 应用使用单一内部默认类型目录式创建、Main-owned UUID、可选 bundled Scaffold Skill发布权威分离 | Accepted / implemented, amended 2026-09-07 | 2026-09-04 | Project creation、`ProjectType`/identity、Official Plugins、Marketplace delivery、release readiness | `adr-008-interactive-ai-app-scaffold.md` |
| ADR-007 | AI Design 采用单一 Current Specification、Living Form 与不可变 Quote 的 V2 权威active plan 与 reference alias 是其公共投影 | Accepted / implemented, amended 2026-09-07 | 2026-08-30 | AI Design Renderer、Electron Main、Works Square V2 API | `adr-007-ai-design-living-form-v2.md` |
| ADR-002 | Robot V1 采用 Main 门控的引导式热点配网并衔接现有六位 Binding | Accepted / implemented, default on | 2026-08-16 | Robot Renderer、Host API、Electron Main、现有固件热点入口 | `adr-002-robot-guided-hotspot-binding-v1.md` |
| ADR-003 | Robot 配网页内扫描并连接 Windows/macOS 热点 | Accepted / implemented with physical release gates pending | 2026-08-16 | Robot Renderer、Host API、Electron Main、Windows WLAN、macOS CoreWLAN/CoreLocation | `adr-003-robot-in-app-hotspot-connection.md` |
| ADR-004 | Works Square 统一拥有桌面认证生命周期边界 | Accepted / implemented | 2026-08-19 | Renderer、Host API、Electron Main、Works Square auth facade | `adr-004-square-auth-lifecycle-boundary.md` |

View File

@@ -1,86 +0,0 @@
# Project Configuration owns Plugin navigation
## Status
Proposed for integration; implemented and verified in task
`20260906-move-plugins-project-settings-7c91a4e2`.
## Date
2026-09-06
## Context
The integrated product exposed one reviewed unified Plugin workspace at
`/plugins` through a standalone Code sidebar entry. Project Configuration no
longer contained its predecessor Plugin Services sheet. The user first directed
that Plugins belong in Project Settings, then clarified that the workspace must
live on the same project page used to configure Agents and Skills rather than
replace that page after navigation.
The navigation change must not collapse the existing independent lifecycles for
Marketplace acquisition, device installation, project enablement, Agent Skill
assignment, runtime authorization, and billing. It also must not restore the
retired duplicate sheet or move Main-owned Plugin authority into Renderer code.
## Decision
- The Agent/Skill Project Configuration page is the visible owner of the single
unified Plugin workspace.
- Its `插件` resource card opens the workspace in a wide same-page drawer. The
Project Configuration page remains mounted behind it.
- `/project-config/plugins` is the canonical deep link for the drawer-open state;
it renders Project Configuration rather than a standalone Plugin page.
- `/plugins` preserves query and navigation state while redirecting to the
canonical URL. `/plugin-marketplace`, `/my-plugins`, and `/project-plugins`
remain deterministic filtered compatibility redirects.
- The Code sidebar has no standalone Plugin entry.
- The canonical workspace remains accessible before Code Provider initialization
and when no project is active, so Marketplace and account/device views do not
incorrectly depend on local project selection.
- The existing unified controller, data sources, mutation semantics,
authentication, and lifecycle separation remain unchanged.
## Rationale
Plugin installation and activation configure resources that projects may use, so
Project Configuration is the clearer navigation owner. Reusing the unified
workspace avoids competing product surfaces and preserves one authoritative view
across Marketplace, Account Library, device packages, and project status.
Compatibility redirects protect existing deep links and authenticated return
flows while establishing an unambiguous canonical location.
## Consequences
- Project Configuration gains a Plugin card beside models, Skills, and knowledge,
with access retained in the no-active-project state.
- Closing the Plugin drawer returns to the already-mounted Project Configuration
page; Agent assignment actions close the drawer to expose that same page.
- Existing bookmarks continue to work, but tests and new product links should use
`/project-config/plugins`.
- Canonical project memory that names the Code sidebar or `/plugins` as the sole
current entry must be superseded during Integration Mode.
- No backend contract, package trust boundary, runtime permission, billing rule,
or native Web Search behavior changes.
## Supersedes
- The navigation-only claim that the Code sidebar owns the single `插件` entry and
`/plugins` is the canonical product route.
- It does not supersede the retirement of the duplicate Project Configuration
Plugin Services sheet; that implementation remains retired.
## Evidence
- User direction: “插件应该在项目设置中”, clarified as “是放在配置agent、skill那个项目页”.
- Focused unit verification: 62/62 passed.
- Electron Plugin journeys: 4/4 passed.
- Full unit, typecheck, lint, and Vite production build passed.
## Related
- `.project-docs/10-decisions/adr-008-interactive-ai-app-scaffold.md`
- `.project-docs/30-worklog/tasks/20260906-move-plugins-project-settings-7c91a4e2.md`
- `src/pages/ProjectConfiguration/index.tsx`
- `src/pages/Plugins/index.tsx`
- `src/pages/Plugins/legacy-plugin-redirect.tsx`

View File

@@ -10,10 +10,12 @@
| Selected-model Web Search | Parent Pi turn with an explicitly supported selected model | `makelore_web_search` core tool → frozen model/provider/credential request with provider-native forced search → ordinary model response/usage | No Marketplace Release, Account Library, Admission, Hosted Web Search client, Plugin Charge, or `agent_browser` fallback participates. Unsupported selected models expose no tool; child workers receive none. |
| Conversation-driven Device Package install | Agent tool inspects npm/Git/absolute local Plugin/loose Skill source | Main preview → distinct later user confirmation → immutable device-package generation → new/idle parent worker resources | Renderer has no install picker. Lifecycle scripts never run. Pi extensions and non-empty Skill `scripts/` are disclosed as desktop-user executable code before confirmation. Active workers retain their frozen generation until the turn settles; child workers remain empty. |
| Effective Plugin worker snapshot | Installed trusted package or acquired official bundled definition + project selection + Agent assignments + current server policy | effective resolver → Registry/resource loader/Extension Host/tool catalog → parent Pi worker | One frozen snapshot supplies Skills, tools, package roots, and runtime authorization. Disable, account/project switch, logout, Renderer crash, Main shutdown, or worker generation change invalidates future actions without mutating persisted unknown assignments; child workers receive no Plugin projection. |
| Plugin workspace navigation | Project Configuration `插件` ResourceCard or compatibility URL | `/project-config/plugins` → Project Configuration remains mounted → same-page wide Plugin sheet → unified Plugin stores/Main routes | Code sidebar has no standalone Plugin entry. `/plugins` and old Plugin URLs only preserve query/filter intent while redirecting; embedding does not merge acquisition, install, project enablement, assignment, runtime authorization, or billing lifecycles. |
| Hosted Game Resource operation | Eligible parent `makelore.game-resource` tool call plus explicit confirmation | frozen Plugin adapter → capability Registry → Main `GameResourceClient` → fixed Works Square game-resource route → provider-neutral receipt/result | Server policy owns pricing, payer, Admission and receipt state. Stable logical operation identity survives response loss/Main restart; `submission_unknown` is not replayed as a fresh request. Result saving uses a bounded project-relative path and the existing project write lease. |
| 桌面认证生命周期 | Renderer 登录、刷新与注销请求 | Host API → Main Works Session → Works Square `/api/auth/{login,mobile-login,refresh,logout}` → one-feel auth | Main 加密持有并先持久化轮换 token客户端不携带 OAuth client secret连续 7 天未使用才清除会话,终止性 `400`/`401` fail closed |
| 用户模块入口策略 | 会话恢复 / 登录 / 刷新 | Electron Main → Works `/api/auth/me` → 三布尔安全投影 → Renderer auth store → 卡片/路由/provider gate | 缺失对象或字段默认 `true``design` 映射 `painting`;额外旧字段被忽略;终止性 `401` 清理 Main/Renderer 会话;全局 `/settings` 不受 Code gate |
| 项目创建 | 新建项目对话框 | Host API → Main 项目初始化 | 固定 `interactive_ai_app``custom`只生成 `.makelore/project.json``knowledge/`历史类型在读取边界归一,不因读取改写 |
| 项目创建 | 新建项目对话框中的目录选择 | Renderer 内部默认 `interactive_ai_app` → Host API → Main 生成 UUID 并原子初始化 | 普通用户不选择类型、模板或项目身份;只生成 `.makelore/project.json``knowledge/`,随后直接进入 `/chat`。既有 `custom`/历史类型和底层兼容入口仍保留 |
| 旧项目身份补齐 | 有效 `.makelore/project.json` 仅缺 `projectId` | Main serialized config read/repair → canonical UUID persisted once | 并发读取共享同一次修复;原始 UUID、bind/independent-copy 控件不进入普通 UI。其他缺失或无效 metadata 仍是配置错误;`initialized` 不阻断有效项目 |
| 显式项目脚手架 | 用户为已获取、项目启用并分配给 Agent 的 Project Scaffold Plugin 明确要求初始化 | Pi `bash` + 项目 write lease → `MAKELORE_NODE_EXECUTABLE` → bundled `makelore-project-scaffold` 脚本 | 固定六文件目标;全量预检、不覆盖、受控失败只回滚本次路径;不安装依赖、不联网、不构建、不上传、不提审;下载 artifact 不参与 |
| 一键提交 | `ProjectPublishAction` | Renderer capability → Host API → Main 本地 npm/Vite build → built snapshot preflight → source+built+contract 上传 | 只对规范交互式 AI 应用(含读取时归一的历史别名)开放;首次 create 通过单一 multipart 合同原子提交文字资料与必选 PNG/JPEG/WebP 封面,创建失败或冲突不上传版本;已有 draft/published 只提交版本并沿用云端资料/封面,不做无条件 metadata PATCH |
| 构建产物预检 | Main-owned built snapshot | 一次性 loopback origin → fresh Electron WebContents/CDP桌面、移动 | 检查错误、白屏和外域;不调用 Playwright检查与上传归档相同字节但不产生可信 receipt |
@@ -28,14 +30,15 @@
| AI 编程 Provider 错误 | Pi logical-thread Provider 请求 | selected thread-local credential store → Main AI proxy → Works 模型上游 → projector safe error | 确定性的 Works user-context 缺失使缓存 gateway credential 过期、返回非重试认证失败且不重放请求Renderer 只看到固定 Provider-auth 提示,不能把它解释为 Pi 崩溃 |
| AI 编程子 Agent | parent logical thread `subagent.v1` tool call | explicit extension → authenticated Main bridge → scheduler → independent ephemeral Pi child process | child 并发最多 4、单次最多 8、禁止递归child 使用 FIFO 进程预算 8shared parent 逻辑线程不各占一个 process leasecoding child 与 parent 共用项目 write lease父 abort/crash/generation 失效必须清理 child 与 permit |
| 客户端更新检查 | 设置页 | Renderer update store → IPC → Main AppUpdater → 目标 feed | Main 记录并重抛原始错误Renderer 只显示去重、脱敏的单条提示,稳定源缺包不伪装为最新版 |
| Design Workspace load | Canvas/Sidebar | Renderer Host API → Main-owned Works Square V2 adapter → current Workspace/Direction/Living Form projection | 一个 Workspace 公开一个 current Direction 与 persistent Agent Sessionconversation timeline 是交互历史,不是独立 authority object |
| Design Workspace load | Canvas 中央区与右侧 Works rail | Renderer Host API → Main-owned Works Square V2 adapter → current Workspace/Direction/Living Form projection | 一个 Workspace 公开一个 current Direction 与 persistent Agent Session右 rail 只选择/创建/删除 Workspaceconversation timeline 是交互历史,不是独立 authority object |
| Design input and reconciliation | Chat/direct edit/decision/proposal/lock/Asset binding/restore | Renderer draft → Main → `design.input.apply` → canonical Direction projection | 全部进入同一 reduceraccepted 前 draft 保持本地revision conflict 刷新权威投影unknown result 复用原 command/operation identity |
| 设计有限请求生命周期 | Renderer Workspace JSON 调用 / shared Works token refresh | Main deadline → Electron transport → safe-read-only Node fallback → Host API timeout envelope | 包括取凭据、请求头和响应 body 的完整生命周期最多 30 秒;超时 abort transport 并稳定返回 `504 DESIGN_WORKSPACE_REQUEST_TIMEOUT`;透明 fallback 只允许 `GET`/`HEAD`/`OPTIONS`mutation 不隐式重放 |
| Design Asset binding | 当前 Workspace 已完成图片 / 本地上传 | canonical Asset → typed `asset_binding` input → Current Specification revision | 图片/视频用途由 Specification medium 和 binding role 决定;只提交真实 Workspace Asset identity不使用本地路径或自然语言占位 |
| Design reference alias editing | Active plan 的 final Prompt 与 binding-only reference row | `@图片N` token/add/replace/remove → typed field/collection operations → Current Specification revision | Prompt 决定图片如何参与生成row 只管理稳定 reference/Asset identity。未绑定 alias 定点要求上传并阻止 Quote删除时原子移除 binding 并重排后续 alias既有 alias 不重复插入 |
| Design Quote and confirmation | 当前 exact Specification revision | `design.quote.request` → immutable public Quote projection → `design.generation.confirm` with Quote ID | Renderer 只展示 output summary、warnings、expiry、Token PointsProvider Prompt/model/route/storage/internal billing 不下发或编辑 |
| Design Task and Asset sync | Direction event stream / Workspace resource events / explicit refresh | Renderer Task/Asset projections | Task/Asset events独立于 Living Formtransport order 和 progress 不改写 Specification也不授权新生成操作 |
| 设计项目删除 | Canvas 侧栏精确项目名确认 | Renderer → Main Host API → Works Square Workspace DELETE | 删除成功后清理当前 Workspace/Direction/resources 并选择最近更新的剩余项目;结算与软删除语义由服务端负责 |
| Prompt Museum 浏览与使用 | Canvas 侧栏“获取灵感” | Renderer → Main Host API → Works Square list/detail选中 Prompt → 进程内 pending state → 当前 Canvas 输入框 | 只发送白名单筛选/游标Works Token 留在 MainPrompt 不自动发送Museum 不包含客户端静态数据集 |
| 历史 Prompt Museum URL | `/image-prompts/*` | App replace-redirect → `/image-canvas` | 当前 Canvas 无“获取灵感”入口App 不挂载或 lazy-load Museum 页面;保留的 Main API/auth/media 与 shared DTO 是 dormant 兼容/安全基础设施 |
| Robot 引导式热点配网 V1已实现、默认开启 | Robot Binding 页面 | 用户选择引导配网 → 进入固件配网模式 → Renderer 经 Host API 请求 Main 扫描 → 用户选择短效候选 → Windows/macOS Adapter 连接并核验当前 SSID → Main 打开固定 Portal → 用户在 Portal 配置 Wi-Fi → 电脑恢复互联网 → 现有六位 Binding | 精确环境值 `0` 或 capability 读取失败回退直接六位码;系统 Wi-Fi 保留兜底Makelore 不收集 Wi-Fi 密码、不修改固件,热点发现/`bound` 都不等于可信身份或 online/ready |
## State Ownership
@@ -48,7 +51,7 @@
- 旧 schema v1 `submitted` 记录迁移并保留;旧 `armed``waiting_for_package``waiting_for_login``uploading``failed` 归一为 `legacy_retired`,不再启动 watcher 或上传任务。
- AI Design Current Specification 与 current Direction 是语义权威conversation timeline 只保存交互历史immutable Quote 绑定精确 Specification revisionTask/Asset 属于 Workspace resource projection。
- AI 绘画 Main 持有 Workspace 请求 deadline、底层 transport fallback 和共享 Works token refresh flight。共同等待者必须在同一有限期限内 settlerefresh flight 结束后必须释放,后续刷新可重新发起;底层 mutation transport failure 不得自动产生第二次上游请求。
- Prompt Museum pending Prompt 是 Renderer 进程内一次性导航状态Canvas 消费后立即清除,不进入 Workspace/Specification直到用户主动提交 Design input
- Prompt Museum Store/API 不参与当前 Renderer 导航或 Canvas 状态;保留代码不得被解释为可达产品流程
- Retired Learning data is outside the active client state model. Historical downloaded
course data is not read, migrated, or automatically deleted.
- 图生图参考图与视频首帧都先归一为当前 Workspace Asset再通过 typed binding 写入 Specification本地路径不会进入 canonical contract。
@@ -74,9 +77,9 @@
- Main-owned electron-updater IPC 与 Works Square 平台/架构稳定 feed正式安装产物发布不由 Renderer 控制。
- 服务端安全投影后的公共 `play_url`;只接受同源 HTTPS、精确 App 路径和可信版本状态。
- Works Square Design V2 Workspace/Direction/Living Form API、持久 Agent Gateway Session、Direction event stream以及 `design.input.apply``design.quote.request``design.generation.confirm` stable-operation contract。
- Works Square Prompt Museum list/detail APIMain 添加当前账号 Bearer TokenRenderer 只使用 Host API 投影
- Dormant Works Square Prompt Museum list/detail/media compatibility APIMain 继续持有 Bearer 与媒体校验,当前 App 没有可达 Renderer 消费者
- 已实现的本机 Robot provisioning capability、固定 portal-open 与 hotspot scan/connect Host API。它们是本地 Main 操作,不读取 Works access token、不调用上游也不接受任意 URL/SSID/BSSID/interface/profile。
## Last Updated
2026-09-04
2026-09-07

View File

@@ -10,9 +10,9 @@
| `electron/coding-runtime/pi/model-tools/**` and `shared/model-tools.ts` | Closed selected-model tool registry and provider-specific Web Search request shaping | The frozen selected model capability controls whether `makelore_web_search` exists. The tool uses that model/provider/credential and normal model billing; no Hosted Plugin adapter, Admission, Plugin Charge, or browser fallback exists. |
| `electron/coding-packages/**`, `electron/api/routes/device-packages.ts`, `shared/device-packages.ts`, and `src/stores/device-packages.ts` | Main-owned conversation install preview/confirmation/commit, immutable local package generations, safe Renderer projection, and parent-worker refresh | Sources are npm, Git, absolute local Plugin directories, or loose `SKILL.md`. Lifecycle scripts are disabled; executable extensions and non-empty Skill `scripts/` run with desktop-user authority after disclosure and explicit confirmation. Every generation projects all explicitly installed and currently enabled Skills/extensions; Device Packages never join Account Library, Marketplace Package Store, Release, Channel, or Admission state. |
| `electron/coding-plugins/adapters/game-resource.ts` and `electron/services/game-resource-client.ts` | Provider-neutral `makelore.game-resource` hosted tool adapter and Main-owned Works Square transport | Tools materialize only from an eligible frozen `platform_hosted` parent snapshot. Metered mutations require explicit confirmation and stable logical operation identity; Renderer/Pi never receive Provider URLs, credentials, balances, raw responses, or Provider job IDs. |
| `electron/api/routes/plugin-marketplace.ts`, `src/stores/{plugin-marketplace,device-packages,coding-plugins}.ts`, and `src/pages/Plugins/` | Existing Main/store authorities plus the pure unified Renderer projection for official catalog, Account Library, official package-device state, local Device Packages, retained IDs, and current-project actions | `/plugins` is the sole canonical surface; legacy Plugin routes only replace-redirect into deterministic filters. `official:`, `local:`, and `retained:` identities stay separate, source failures are isolated, and no Account token, filesystem path, Admission, package bytes, signed URL, or visible install-source picker enters Renderer. |
| `electron/api/routes/plugin-marketplace.ts`, `src/stores/{plugin-marketplace,device-packages,coding-plugins}.ts`, `src/pages/Plugins/`, and `src/pages/ProjectConfiguration/index.tsx` | Existing Main/store authorities plus the unified Renderer projection embedded in Project Configuration | `/project-config/plugins` is the canonical same-page sheet state. `/plugins` and legacy Plugin routes only replace-redirect while preserving deterministic filters. `official:`, `local:`, and `retained:` identities stay separate, source failures are isolated, and no Account token, filesystem path, Admission, package bytes, signed URL, or visible install-source picker enters Renderer. |
| `src/components/works/ProjectPublishAction.tsx` | 可发布项目的一键提交、云构建轮询与用户可理解状态 | 只通过 Renderer API 提交非敏感元数据;绑定告警不终止轮询 |
| `shared/project-config.ts` and `electron/coding-projects/project-config.ts` | 规范 `ProjectType` 归一与最小项目创建 | 新写入只使用 `interactive_ai_app` / `custom`;历史 `mini_game` / `mini_program` 只读归一,项目创建只生成 metadata 与 `knowledge/` |
| `shared/project-config.ts`, `electron/coding-projects/{project-config,project-service}.ts`, and `src/components/layout/Sidebar.tsx` | 规范 `ProjectType`、Main-owned UUID 与目录式最小项目创建 | 普通新建只要求目录,内部默认 `interactive_ai_app`Main 自动生成 UUID有效旧配置仅缺 `projectId` 时串行修复。既有 `custom` 和历史类型仍兼容,`initialized` 不再是导航 gate |
| `resources/coding-plugins/project-scaffold/` and `tests/project-scaffold/` | 官方 bundled Scaffold Plugin、固定六文件模板、确定性 Node 脚本、发布要求参考与回归测试 | 通过既有 Pi `bash` write lease 和 `MAKELORE_NODE_EXECUTABLE` 显式运行;脚本信任来自固定客户端资源,而非下载 artifact不覆盖、不安装依赖、不联网也不复制 build/upload/review 实现 |
| `src/lib/works-square.ts` | Renderer 侧 Works Square Host API 契约与安全错误映射 | 不接触 Token、ZIP、本地绝对路径或自动部署状态 |
| `electron/api/routes/works.ts` | Works Host API、Renderer capability 门禁、上游安全投影 | 发布凭据、打包、上传与本地绑定均在 Main 内完成 |
@@ -39,11 +39,10 @@
| `electron/api/routes/image-workspace.ts` | AI 绘画 Host API 与本地事件流投影 | Renderer 只通过该路由访问 Main-owned workspace adapter |
| `electron/image-workspace/works-square-workspace.ts` | Works Square V2 adapter、stable command/operation IDs 与 Direction event mapping | unknown transport result 保留精确命令Main 持有 token、ticket、WebSocket、retry classification 与 safe errors |
| `src/stores/image-workspace.ts` | Current Workspace/Direction/Living Form、local drafts、pending operations 与 Workspace resources | revision conflict 刷新 canonical stateevent order/Task progress 不成为 Specification authority |
| `src/pages/ImageCanvas/{index,DesignConversationPane,DesignFormPane,DesignProductionPanel}.tsx` | 持久双栏 Canvas、conversation、Living Form、immutable Quote confirmation、Tasks 与 Assets | chat/direct edits/decisions/locks/bindings 使用同一 V2 reducer确认只提交 Quote ID |
| `src/components/layout/ImageWorkspaceSidebar.tsx` | Workspace 选择、创建与 Prompt Museum 入口 | 不再创建或选择嵌套 Conversation |
| `shared/image-prompt-museum.ts` | Prompt Museum 列表、分类、详情、署名与分页共享 DTO | 客户端不包含内容数据集,只定义服务端字段契约 |
| `electron/api/routes/image-prompt-museum.ts` | Main-owned Museum 列表/详情代理与 Works 登录态 | 仅 GET 固定路径和白名单查询Renderer 不获得 Bearer Token |
| `src/pages/ImagePromptMuseum/index.tsx` / `src/lib/image-prompt-museum.ts` / `src/stores/image-prompt-museum.ts` | Museum 搜索/筛选/详情与一次性 Prompt 回填 | 原 Prompt 只带回 Canvas 输入框,不自动发送;页面不接受投稿或互动 |
| `src/pages/ImageCanvas/{index,DesignConversationPane,DesignProductionPanel,DesignWorksRail,YouthCreationCard}.tsx` | 中央 conversation/active 制作方案、右侧 Works rail、immutable Quote confirmation、历史 Tasks 与 Assets | active 方案留在时间线;已提交状态折叠为历史。最终 Prompt、reference binding 与直接参数编辑继续通过同一 V2 reducer确认只提交 Quote ID |
| `src/pages/ImageCanvas/reference-tokens.ts` and `src/pages/ImageCanvas/youth-form-projection.ts` | `@图片N` alias、缺失 binding 检测与青少年可读方案投影 | Prompt 是 reference 用途的唯一可见表达binding row 只管理真实 Asset/token identity。缺失 token 对应图片时提供定点上传并阻止 Quote新增/删除/替换保持稳定 reference ID 与连续 alias |
| `src/pages/ImageCanvas/DesignWorksRail.tsx` | 全高右侧 Workspace 选择、创建和删除 | 桌面为 320340 px 右 rail紧凑布局复用右侧 Sheet无“获取灵感”入口不创建嵌套 Conversation |
| `shared/image-prompt-museum.ts` and `electron/api/routes/image-prompt-museum.ts` | Dormant Museum DTO 与 Main-owned 列表/详情/auth/media 安全边界 | 当前 App 不挂载 Museum Renderer 页面;历史路由回到 Canvas。仅保留固定 GET/媒体校验兼容,不代表可见模块 |
| `src/pages/AiHardware/index.tsx` | Robot 管理、现有六位 Binding以及已实现的 default-on 引导式热点配网状态机 | 只编排非敏感步骤;不接收 Wi-Fi 密码,不把 `bound` 展示为在线证明 |
| `src/lib/ai-hardware.ts` | Renderer 侧 Robot Host API 类型、安全错误映射和稳定 Binding/hotspot facade | 读取 Main-owned capability调用固定 portal-open并只传递短效 hotspot candidate ID不添加任意 URL、SSID 或 Renderer IPC |
| `electron/api/routes/ai-hardware.ts` | Main-owned Robot 云端代理,以及本地 capability/portal/hotspot actions | 默认开启、精确环境值 `0` 回滚;所有本地操作必须在 Works token/上游访问前返回,且只投影稳定安全错误 |
@@ -55,13 +54,13 @@
## Dependency Direction
- Renderer UI → Renderer API contract → Main Host routes → Main services → Works SquareRenderer 不反向读取 Main 凭据、文件系统或归档。
- Plugin sidebar/legacy links → canonical `/plugins` projection → existing Renderer stores → bounded Main Marketplace and Device Package routes. Compatibility routes replace-redirect into deterministic filters and do not create a second lifecycle.
- Project Configuration `插件` card → canonical `/project-config/plugins` same-page sheet → unified Renderer stores → bounded Main Marketplace and Device Package routes. `/plugins` and legacy URLs replace-redirect into deterministic filters and do not create a second lifecycle.
- Hosted Plugin parent tool → frozen Registry adapter → Main `GameResourceClient` → fixed Works Square game-resource routes. Stable logical operation identity survives response loss and Main restart; ambiguous submission remains reviewable and is never converted into an automatic fresh mutation. Saving a result uses the existing bounded project path and project write lease.
- AI 编程 Renderer product Snapshot/commands → typed `/api/coding/*` Host API → Main Coding composition → target `CodingConversationRuntime` → shared Agent Server 内的目标 Pi 逻辑线程Pi Provider 请求再经 Main AI proxy 访问模型上游。Renderer 不持有 Pi wire、凭据或本地 runtime URL。
- Project configuration 只决定产品身份与分流;用户显式调用 Scaffold Skill 生成固定起步文件Main release builder 生成 source/built/contract服务端独立重算和校验决定发布安全。本地 `ProjectType` 或 Skill 准备度结论都不是授权结论。
- 普通项目创建只收集目录并使用内部 `interactive_ai_app` 默认与 Main-owned UUID既有 Project Configuration 继续管理 Agent/Skill/知识/插件。用户可选地显式调用 Scaffold Skill 生成固定起步文件Main release builder 生成 source/built/contract服务端独立重算和校验决定发布安全。本地 `ProjectType` 或 Skill 准备度结论都不是授权结论。
- Built artifact preflight 检查最终上传的同字节快照,但客户端可被绕过且不产生可信 receipt服务端仍是合同、摘要和不可变 Release 安全权威。
- Robot Renderer → typed AI hardware API → Main Host route → Robot Hotspot Module → Windows/macOS Adapter。云端 Binding 仍由 Main 代理;热点选择/连接移入页面,但家庭 Wi-Fi 凭据输入仍只留在固件 Portal系统 Wi-Fi 保留为兜底。
- Prompt Museum Renderer → typed Host API facade → Main fixed list/detail route → Works Square。Museum 只把用户明确选择的 Prompt 原文暂存到进程内 Store 并导航回当前 Canvas不会直接触发 Agent 命令或生成任务
- 历史 `/image-prompts` → App replace-redirect → `/image-canvas`。Museum Main API/DTO 保持 dormant当前 Renderer 没有可达的 Museum 数据流或 pending-Prompt 导航
## Risky Or Sensitive Areas
@@ -80,7 +79,7 @@
- `electron/main/updater.ts` 的稳定源错误归一化必须保持窄化:只识别 Works Square 对应 manifest 的 404不得吞掉其他 feed/网络/签名错误Renderer 的脱敏边界不能取代 Main 原始日志。
- Design V2 事件处理必须区分 Direction projection 与 Workspace Task/Asset projection不得用 transport sequence 或 Task progress 推进 Specification revision。
- 输入、Quote request、confirmation 和项目切换跨 Renderer/Main/Works Square。异步结果必须核对 Workspace、Direction、revision 与 operation identityunknown write 复用原 identity不能生成新业务意图。
- Prompt Museum 图片和来源 URL 来自服务端数据。服务端必须完成内容授权/署名审核;若未来需要凭据化素材,应新增 Main-owned 媒体代理,不能把对象存储凭据放进 Renderer URL
- Dormant Prompt Museum API/media 代码仍必须保持 Main-owned Bearer、固定路径、可信 raster MIME、10 MiB 上限和错误脱敏;如未来重新启用产品面,需新的明确产品决策与端到端授权/署名审核
- Design command replay requires the original stable command and semantic operation IDs; business rejection never authorizes a retry with a fresh identity. Resource reconciliation cannot overwrite the Living Form.
- Canvas cleanup only closes the local stream/buffers. The server-owned Direction Session and semantic history remain durable.
- Image/video references use typed Asset binding and Specification medium; display text is never an action protocol.
@@ -88,4 +87,4 @@
## Last Updated
2026-09-04
2026-09-07

View File

@@ -10,7 +10,7 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
|---|---|---|
| Renderer | 项目配置、一键提交状态 | 不接触账号 Token、ZIP、幂等键或本地绝对路径 |
| Host API | 校验本地项目请求并投影安全响应 | 发布 mutation 还必须通过 Renderer capabilityHost token/base 不能单独触发发布 |
| Project Configuration | 保存不可变 `ProjectType`,原子创建最小项目空间 | 只生成 `.makelore/project.json``knowledge/`规范类型为 `interactive_ai_app` / `custom`历史类型只在读取边界归一 |
| Project Configuration | 目录选择式创建、Agent/Skill/知识与项目资源配置 | 新建流程不暴露类型、模板或身份选择Renderer 写入内部默认 `interactive_ai_app`Main 生成 UUID并只创建 `.makelore/project.json``knowledge/`既有 `custom`历史类型继续兼容 |
| Project Scaffold Skill | 显式生成固定版本的交互式 AI 应用起步文件,并提供发布准备度指导 | 官方 `makelore.project-scaffold` bundled Marketplace Plugin完整预检、不覆盖、受控回滚不安装依赖、不联网、不构建、不上传、不提审 |
| Project Release Builder | Main-owned 安全快照、本地 npm/Vite 构建、双归档与 artifact contract | 固定 npm 11.6.2Vite 由项目 lockfile 锁定;产物与预检使用同一内存字节 |
| Works Session & Remembered Password | Main-owned 登录、刷新、注销、七天真实活动滑动续期与可选密码回填 | 登录、刷新、注销统一经过 Works Square轮换凭据由 Main 安全持有和持久化。记住密码使用独立的 packaged-only OS 加密记录,不进入 Renderer 持久状态或 Works Square客户端不携带 OAuth client secret |
@@ -26,12 +26,13 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
| Pi Extension, Subagents & Lifecycle | 必需的生成式 Makelore extension、Main 显式选定的已安装 extensions、UI interaction、ephemeral child、write lease 与 background run lease | Makelore bridge 固定为首个 extension其余选定 extension 全部经 Pi 的 explicit additional paths 加载且 ambient discovery 关闭child 并发 4、单次最多 8、禁止递归active/uncertain run 不因页面隐藏或 confirmation timeout 被停止replacement/stop 必须可解释并清理所有 ownership |
| Official Bundled Plugins | Acquired code-owned bundled Game Resource / Project Scaffold package → project enablement and Agent assignment → effective parent snapshot | 两者都不经过设备下载、更新、Beta 或 artifact 签名。Game Resource 进入固定 Works Square hosted routeProject Scaffold 仅提供 Skill`.mjs` 来自签名客户端固定资源。Marketplace 下载包仍只接受 P0 文本/图片资源。child 不继承 Plugin。 |
| Device Packages | Conversation install tools → Main-owned inspect/preview/confirm/commit → immutable local generation → parent Skill/Pi-extension resources | 支持 npm、Git、绝对本地 Plugin 目录与 loose `SKILL.md`没有可见安装入口、Account Library、Release、Admission 或 Marketplace Package Store。可执行 extension 与非空 Skill `scripts/` 拥有桌面用户权限,必须披露并独立确认;生命周期脚本禁用。每个 generation 包含所有显式安装且当前启用的 Skill/extension新/idle parent 自动刷新active parent 在 turn settled 后刷新child 始终为空。 |
| AI Design Workspace & Living Form | 一个 Workspace 的当前 Direction、Current Specification、持久 Agent Session、conversation timeline、Tasks 与 Assets | 自然对话是主创作面Living Form 仅以“AI 已理解”的紧凑辅助摘要与可选手动调整投影服务端 Current SpecificationRenderer 只持有草稿和已接受投影 |
| Unified Plugin Workspace | Project Configuration 的 `插件` ResourceCard → `/project-config/plugins` same-page wide sheet | 复用统一 Plugin controller 与生命周期Project Configuration 保持挂载Code 侧栏不再提供独立入口;`/plugins` 和旧 Plugin URL 仅做保留查询条件的兼容重定向 |
| AI Design Workspace & Living Form | 一个 Workspace 的当前 Direction、Current Specification、持久 Agent Session、conversation timeline、Tasks 与 Assets | 中央区域承载对话和唯一 active 制作方案320340 px 右侧 Works rail 承载 Workspace 导航;紧凑布局使用同一右侧 Sheet。Renderer 只持有草稿和已接受投影 |
| AI Design Input & Reconciliation | Chat、字段/集合编辑、decision、proposal、lock、Asset binding 与 restore | 全部进入同一 `design.input.apply` reducer稳定 command/operation ID 支持 unknown-result 重放revision conflict 刷新权威状态;待提交 chat 从同一 pending operation 临时投影assistant delta 只能在匹配该 operation 的一个未完成助手气泡中临时绘制且不生成独立整理进度栏 |
| AI Design Gateway Routing | Main-owned Works Square V2 adapter 与 Direction event stream | Main 持有 Works Token、stream ticket、WebSocket、重试分类和错误脱敏事件顺序与 Task progress 不构成 Specification 真值 |
| AI Design Quote & Task Controls | 精确 Specification revision 编译出的不可变 Quote 与 Workspace Tasks | 客户端只展示 public output summary、warnings、expiry 与 Token Points并以 Quote ID 确认Provider Prompt/model/route/storage/billing atoms 不下发 |
| AI Design Assets | Workspace 已完成作品或本地上传的真实 Asset | Asset 通过 typed binding 写入 Specification生成结果经 Main-owned asset download 保存 |
| Prompt Museum | Canvas “获取灵感”页面 → Main Host API → Works Square | 服务端驱动的审核内容、筛选和分页Renderer 不持有 Works Token 或内置数据集,“使用此 Prompt”只回填输入框 |
| Dormant Prompt Museum compatibility | Retained Main Host API/auth/media validation/shared DTO → Works Square | 当前 App 不挂载或打包 Museum 页面Canvas 无“获取灵感”入口,历史 `/image-prompts` 重定向到 `/image-canvas`;保留代码不是可见产品模块 |
| Robot Workspace | Account-scoped agent configuration, device activation/binding, assignment, and credential-recovery UI | Renderer receives only safe Works Square projections. Configuration choices come from the USER-scoped safe catalog; unavailable current values remain editable without exposing provider credentials or configuration internals. |
| AI Hardware Main Route | Fixed `/api/works/ai-hardware` Host API to Works Square proxy | Main owns Bearer auth, stable operation IDs, bounded retry, ETag/If-Match, request/response limits, error redaction, and the fixed no-store configuration-catalog proxy. Versioned responses accept only canonical strong or weak numeric ETags that equal the DTO revision; mutations always emit strong `If-Match`. It never forwards Renderer authorization headers. |
| Robot Hotspot Module | Main-owned bounded scan/connect/verify interface with Windows WLAN and macOS CoreWLAN/CoreLocation adapters | Accepts only short-lived opaque candidates from the latest scan, exposes no BSSID/interface/profile/native diagnostic, and retains the system-Wi-Fi fallback. |
@@ -46,7 +47,7 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
- 模块入口策略是用户交互与客户端初始化边界,不是服务端 API 授权。终止性 `/api/auth/me` `401` 必须清理 Main 和 Renderer 会话;各模块 API 仍须独立强制认证与授权。
- Product UI language is Chinese-only. Unsupported system or persisted language values normalize to `zh`; removed locale files are not runtime fallbacks.
- Canvas is cloud-only in development and packaged builds. The removed local Workspace adapter and V1 DTOs are not fallback paths.
- Prompt Museum is a read-only curated inspiration surface, not a user-content community. Main owns Works authentication and forwards only the bounded list/detail routes; the client never bundles museum content or automatically submits a selected Prompt.
- Prompt Museum 不属于当前可见产品面。不得恢复“获取灵感”入口或挂载 Museum Renderer 页面;历史 `/image-prompts` 只重定向到 Canvas。保留的 Main-owned 认证、媒体校验、固定 API 与共享 DTO 是 dormant 兼容/安全基础设施。
- Learning is retired. No Learning route, Renderer surface, Main Host API, download service,
shared DTO, packaging asset, or fallback remains. Historical downloaded course data is
not read, migrated, or automatically deleted.
@@ -77,8 +78,9 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
- release builder 对 Main-owned 安全快照运行安装包内固定 npm 11.6.2 的 `ci --ignore-scripts`,并显式调用项目 `package-lock.json` 锁定的 Vite。不得使用全局 PATH、预存 `node_modules` 或 Renderer 提供的路径/origin。项目 Vite config/plugins 以桌面用户权限执行,该边界不是 sandbox。
- `preflightStaticArtifact` 以临时 HTTP loopback origin 提供最终 `built_archive` 的同一内存文件快照,并用 fresh 非持久、未挂载的 Electron WebContents/CDP 检查桌面/移动视口、错误、白屏及外域访问;不安装/调用 Playwright。
- 客户端预检是可绕过的 UX fail-fast没有可信 receipt也不复刻生产 opaque-origin。服务端不执行项目 Vite而是独立重算和校验 source/built/contract 字节、固化不可变 Release人工审核仍不可绕过。未来若要求 runtime 强门禁,需由可信 verifier 绑定精确构建产物。
- `ProjectType` 由创建请求写入项目配置UI 与 Host API 不提供类型变更。新项目只写 `interactive_ai_app` `custom`历史 `mini_game` / `mini_program` 在读取边界归一为 `interactive_ai_app` 且不因读取被改写,缺少类型的旧配置归一为 `custom`
- 项目创建只拥有 `.makelore/project.json``knowledge/`。交互式 AI 应用起步树由用户明确调用 Scaffold Skill 生成Skill 的发布准备度结论不执行也不替代 Main build/preflight/package/upload 或 Works Square 校验与审核
- `ProjectType` 仍由项目配置持有且 UI/Host API 不提供类型变更。普通新建流程只要求目录并写入内部默认 `interactive_ai_app`;不向用户暴露类型、模板或项目 ID 选择。既有 `custom` 项目继续打开,历史 `mini_game` / `mini_program` 在读取边界归一为 `interactive_ai_app` 且不因读取被改写,缺少类型的旧配置归一为 `custom`
- Main 为新项目自动生成 UUID并为仅缺 `projectId` 的有效旧配置串行补齐;原始 ID、绑定/独立副本选择和 `initialized` gate 不属于普通界面。缺失或无效的其他 metadata 仍进入 Project Configuration
- 项目创建只拥有 `.makelore/project.json``knowledge/`。交互式 AI 应用起步树由用户可选地明确调用 Scaffold Skill 生成Skill 不是创建或进入聊天的前置条件,其发布准备度结论不执行也不替代 Main build/preflight/package/upload 或 Works Square 校验与审核。
- `makelore.project-scaffold` 是代码所有的 bundled `skill_only` Marketplace Plugin。其官方 `.mjs` 只从固定客户端资源根加载;下载 artifact 的扩展名/资产校验没有放宽,仍拒绝 `.mjs`
- 本地 `projectType` 只选择显式脚手架和内部构建路径不是可信授权声明Main 仍需安全打包,服务端仍需独立校验清单和包体。
- 云端确认上传成功后,本机 submission binding 失败只能产生固定、无路径的 `binding_warning`不能把请求改判为失败Renderer 仍继续轮询服务端校验与 Release 固化状态。
@@ -92,7 +94,7 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
- Main-owned Canvas Workspace JSON 请求和 shared Works token refresh 的完整生命周期最多 30 秒,超时 abort transport 并以固定 `504 DESIGN_WORKSPACE_REQUEST_TIMEOUT` 结束 Renderer 等待。Electron `net.fetch` 失败后的 Node fetch 透明回退只允许 `GET``HEAD``OPTIONS`PATCH/POST 等 mutation 只允许由持有显式幂等身份的上层协议决定重试,不能由底层 transport 隐式重放。该边界不改变上面的 WebSocket→REST 幂等 fallback。
- Renderer 的异步与流式结果必须核对 Workspace、Direction、revision 和 operation identityDirection snapshot 是 Specification 真值Task/Asset 事件只更新 Workspace resource projection。
- 待提交 chat 可以从现有 pending operation 立即投影为明确标注“发送中/正在确认”的用户气泡,但只有服务端 canonical turn 能进入对话历史;确定失败必须恢复原草稿,不能另建一套消息状态或新业务意图。
- `design.assistant.delta` 是未完成的传输状态,不是 canonical assistant turn。Renderer 只能把它临时绘制为与同一 pending chat identity 绑定的单个未完成助手气泡,并在该 operation 确定收敛后由 canonical turn 替换不得持久化为第二条消息、伪装为已完成回复或创建独立整理进度栏。unknown outcome 保留原 identity 与已有片段,其他 operation 的更新不得全局清除它;右侧 Current Specification 继续呈现 AI 当前整理出的设计理解。重叠连接与重放 chunk 必须按连接 generation 和 `chunkIndex` 收敛。
- `design.assistant.delta` 是未完成的传输状态,不是 canonical assistant turn。Renderer 只能把它临时绘制为与同一 pending chat identity 绑定的单个未完成助手气泡,并在该 operation 确定收敛后由 canonical turn 替换不得持久化为第二条消息、伪装为已完成回复或创建独立整理进度栏。unknown outcome 保留原 identity 与已有片段,其他 operation 的更新不得全局清除它;中央 active 制作方案继续呈现 AI 当前整理出的设计理解。重叠连接与重放 chunk 必须按连接 generation 和 `chunkIndex` 收敛。
- 确认生成只提交不可变 Quote ID。Task 事务已提交但事件迟到时可刷新 Workspace projectionTask progress 不得改写 Living Form 或授权新的生成操作。
- Updater feed 选择、原始错误日志、下载和安装生命周期只属于 Electron Main。Renderer 不得把缺失稳定 manifest 投影为“已是最新版”也不得显示原始堆栈、URL、路径或错误码并发检查共享同一错误事件时只发送一次错误状态后续独立重试仍可重新报告。
- 图片与视频复用同一个单图来源选择器。图片 Brief 可从当前 Workspace 的已完成作品或本地上传中选择一张参考图继续生成;视频 Brief 使用同一入口绑定首帧。两条路径都必须通过现有 Workspace Asset 上传/选择契约提交一个真实 `attachmentAssetIds`,不得用本地路径或自然语言描述代替资产身份。
@@ -106,4 +108,4 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
## Last Updated
2026-09-05
2026-09-07

View File

@@ -4,6 +4,22 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
## Integrated Through
- September 6 completed product sources are integrated onto local `main` by task
`20260907-merge-all-changes-8f3c2a`: project-gate removal `af13aca` via
`39d7b7e`, Code landing `ce90f57` via `a91c7e3`, Plugin rehoming `be1764e`
via `f6c5961`, Canvas right-Works/reference-plan redesign `1562a49` via
`ea1219c`, and Canvas inspiration removal `b22559a` via `e069ec6`. The
semantic merge keeps directory-only project creation with Main-owned UUID,
direct `/chat` entry and a no-Agent state; moves the sole Plugin workspace to
the Project Configuration same-page sheet; keeps the active Canvas plan in the
central timeline with editable Prompt/reference aliases and a full-height right
Works rail; and retires the Prompt Museum Renderer entry while retaining its
dormant Main security contracts. Superseded Learning branches and unconfirmed
audit concepts were classified but not merged. Verification passed frozen-lockfile
install, typecheck, 184 focused tests, 1,882 full-suite tests with 3 skips plus
pressure 1/1, production build, and targeted Electron 12/12. Lint reported 0
errors and 5 existing warnings. No push, package, deployment, publication,
server, database, or historical user-data change was made.
- Remote `main` frontier `d642d7607c26dee01ef65b4e70dd756465dea16a`
is integrated with local frontier
`53f3db3aced61533944eab5e6b3c8c2293f733f8` by the ordinary two-parent merge
@@ -682,22 +698,24 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
## Current Focus
客户端面向非专业用户提供“创建交互式 AI 应用 → 明确调用官方 bundled Project Scaffold Skill 生成起步文件 → 项目配置中一键提交 → Main 本地 npm/Vite 构建 → Electron 双视口预检最终产物 → 上传 source+built 双归档与 contract → 运营审核”的唯一创建者链路。项目创建只生成 `.makelore/project.json` `knowledge/``makelore.project-scaffold` 只负责不覆盖的固定起步树与只读发布准备度说明,不能安装、构建、上传、提审或批准`.mjs` 只从签名客户端固定资源加载Marketplace 下载 artifact 仍拒绝脚本。Main 对安全源码快照运行安装包内固定 npm 11.6.2 的 `npm ci --ignore-scripts`,再显式调用项目 `package-lock.json` 锁定的 ViteVite config/plugins 以当前桌面用户权限执行,因此只适用于用户信任的本地项目,不是 sandbox。预检由 Main 以临时 loopback origin 和 Electron WebContents/CDP 检查与最终 `built_archive` 相同的内存文件字节,覆盖桌面/移动视口、运行错误、白屏和外域访问;不使用 Playwright。该检查仍可由非官方客户端绕过不产生可信 receipt也不复刻生产 opaque-origin。服务端不再替客户端运行项目 Vite而是把源码、构建归档和 contract 视为不可信输入,逐字节重算与校验并固化不可变 Release人工审核仍不可绕过。`custom` 和缺少类型字段的旧项目不提供该入口;历史 `mini_game` / `mini_program` 只在读取边界归一为规范 `interactive_ai_app`。已发布作品优先使用安全投影后的 `play_url``runtime_url` 仅保留一个客户端版本的兼容回退。
客户端面向非专业用户提供“选择目录创建交互式 AI 应用 → 直接进入聊天 → 按项目需要可选调用官方 bundled Project Scaffold Skill → 项目配置中一键提交 → Main 本地 npm/Vite 构建 → Electron 双视口预检最终产物 → 上传 source+built 双归档与 contract → 运营审核”的唯一创建者链路。普通新建不展示类型、模板、原始 UUID、绑定或独立副本选项Renderer 写入内部默认 `interactive_ai_app`Main 生成 UUID并只创建 `.makelore/project.json` `knowledge/`。有效旧配置仅缺 `projectId` 时由 Main 串行补齐;旧 `initialized` 仅保留兼容,不再阻断导航、聊天或首个 Agent。既有 `custom` 和历史类型继续兼容,但不作为普通新建选择。`makelore.project-scaffold` 不是创建前置条件,只负责不覆盖的固定起步树与只读发布准备度说明,不能安装、构建、上传、提审或批准`.mjs` 只从签名客户端固定资源加载Marketplace 下载 artifact 仍拒绝脚本。Main 对安全源码快照运行安装包内固定 npm 11.6.2 的 `npm ci --ignore-scripts`,再显式调用项目 `package-lock.json` 锁定的 ViteVite config/plugins 以当前桌面用户权限执行,因此只适用于用户信任的本地项目,不是 sandbox。预检由 Main 以临时 loopback origin 和 Electron WebContents/CDP 检查与最终 `built_archive` 相同的内存文件字节,覆盖桌面/移动视口、运行错误、白屏和外域访问;不使用 Playwright。该检查仍可由非官方客户端绕过不产生可信 receipt也不复刻生产 opaque-origin。服务端把源码、构建归档和 contract 视为不可信输入,逐字节重算与校验并固化不可变 Release人工审核仍不可绕过。历史 `mini_game` / `mini_program` 只在读取边界归一为规范 `interactive_ai_app`。已发布作品优先使用安全投影后的 `play_url``runtime_url` 仅保留一个客户端版本的兼容回退。
AI Design Canvas 现在默认以对话和一张持续可见的“我的创作”卡服务 8-16 岁创作者;专业字段矩阵收进按需打开的“精细调整”,移动端保持对话优先并只挂载一个卡片/底部面板。Creation Card、精细调整、Quote、Task 与结果提示都只投影权威状态,已知问题按 code 转成通俗中文,未知服务端或 Provider 文本不会直接显示。一个 Workspace 仍只公开一个 current Direction、一个 persistent Agent Session 和一个 Current Specificationconversation timeline 只记录交互历史。Chat、direct edits、decision responses、proposal acceptance、locks、Asset binding 与 restore 都通过 `design.input.apply` 进入同一服务端 reducerRenderer drafts 在 accepted 前保持本地。Main 持有 Works Token、stream ticket、WebSocket、request deadline、stable command/operation IDs 与错误脱敏unknown result 只能复用原 identity结构化业务错误不得重放。Generation 由服务端对 exact Specification revision 编译 immutable Quote客户端只展示 public output plan、warnings、expiry 与 Token Points并以 Quote ID 调用 `design.generation.confirm`Provider Prompt、model、route、storage 和 billing atoms 不进入 Renderer。Task/Asset events 独立收敛 Workspace resources不改写 Living Form。Development 与 packaged builds 均使用 Works Square V2V1 DTO、local semantic adapter、mutable Quote PATCH 与 editable provider Prompt 已移除。
AI Design Canvas 现在以中央 conversation timeline 加唯一 active 制作方案、右侧 320340 px 全高 Works rail 的两区布局服务创作者Canvas 路由不挂载全局左栏,紧凑宽度把同一 Works rail 放进右侧 Sheet。Active 方案的 `content.concept` 直接作为可编辑“创作提示词”类型、画幅、视频时长和数量保持紧凑直控已提交、运行中或终止方案折叠进对话历史。Reference 使用稳定 reference ID、真实 Workspace Asset binding 与连续 `@图片N` aliasPrompt 是用途的唯一可见表达binding row 只管理缩略图、文件、alias、替换与删除。未绑定 alias 提供定点上传并阻止 QuotePrompt/reference/参数变更产生新 Specification revision 和新 immutable Quote。一个 Workspace 仍只公开一个 current Direction、一个 persistent Agent Session 和一个 Current Specificationconversation timeline 只记录交互历史。Chat、direct edits、decision responses、proposal acceptance、locks、Asset binding 与 restore 都通过 `design.input.apply` 进入同一服务端 reducerRenderer drafts 在 accepted 前保持本地。Main 持有 Works Token、stream ticket、WebSocket、request deadline、stable command/operation IDs 与错误脱敏unknown result 只能复用原 identity结构化业务错误不得重放。Generation 由服务端对 exact Specification revision 编译 immutable Quote客户端只展示 public output plan、warnings、expiry 与 Token Points并以 Quote ID 调用 `design.generation.confirm`Provider Prompt、model、route、storage 和 billing atoms 不进入 Renderer。Task/Asset events 独立收敛 Workspace resources不改写 Living Form。Development 与 packaged builds 均使用 Works Square V2V1 DTO、local semantic adapter、mutable Quote PATCH 与 editable provider Prompt 已移除。
新提交的 Design chat 会立即从现有 pending operation 投影为带“发送中”或“正在确认”的临时用户气泡,服务端确认的 canonical turn 到达后再替换它;确定失败时原草稿重新出现在输入框。匹配该 pending chat 的 `design.assistant.delta` 可以临时合并显示为一个未完成的助手气泡,并在 canonical turn 到达后被替换;它不进入 conversation timeline也不生成独立的“AI 正在整理你的想法”进度栏。右侧 Current Specification 摘要继续承担“AI 当前听懂的内容”。重复连接和事件按 connection generation 与 `chunkIndex` 收敛。
新提交的 Design chat 会立即从现有 pending operation 投影为带“发送中”或“正在确认”的临时用户气泡,服务端确认的 canonical turn 到达后再替换它;确定失败时原草稿重新出现在输入框。匹配该 pending chat 的 `design.assistant.delta` 可以临时合并显示为一个未完成的助手气泡,并在 canonical turn 到达后被替换;它不进入 conversation timeline也不生成独立的“AI 正在整理你的想法”进度栏。中央 active 制作方案继续呈现 AI 当前整理出的 Current Specification 公共投影。重复连接和事件按 connection generation 与 `chunkIndex` 收敛。
Canvas 侧栏提供“获取灵感”进入 Prompt Museum。列表、筛选、分页、详情、作者/来源/许可证和图片地址全部由服务端经 Main-owned Host API 提供,客户端不打包静态数据集;服务端相对媒体只允许固定 `/api/image-prompt-museum/{entry}/media/{thumbnail|number}` 形状,并由 Main 注入 Works Bearer、执行一次 401 刷新、可信 raster MIME10 MiB 上限后转为 Renderer data URLcredential-free HTTPS CDN 图片保持直连。图片失败只显示卡片内占位,不阻断卡片或详情;缺少来源 URL 时显示纯文本。“使用此 Prompt”只把原文带回当前 Canvas 输入框,不自动发送。该模块不是投稿、点赞、评论或排行榜社区。客户端契约已就绪,但不据此宣称 Works Square 内容后台和生产数据已经部署。`pnpm run dev` 现在默认使用云端 Canvas 适配器,本地适配器只能通过显式开发命令启用;产品 UI 只保留中文。
Prompt Museum 已退出当前产品面:Canvas 不再显示“获取灵感”App 不挂载或 lazy-load Museum Renderer 页面,历史 `/image-prompts/*` 只重定向到 `/image-canvas`。Main-owned 固定 API、Works 认证、相对媒体路径校验、单次 401 刷新、可信 raster MIME/10 MiB 上限与共享 DTO 暂作为 dormant 兼容/安全基础设施保留,不代表可见模块或生产内容已启用;恢复入口需要新的明确产品决定。`pnpm run dev` 与 packaged Canvas 均使用云端 V2 适配器,产品 UI 只保留中文。
密码登录提供可选“记住密码”。该记录与七天登录会话分离,只在正式安装包且系统安全存储可用时由 Electron Main 加密落盘Renderer 仅在登录页内存中接收回填,不写 Zustand/localStorageWorks Square 也不持久化桌面密码。退出登录和短信登录不删除记录,成功的未勾选密码登录会清除旧记录。未打包开发版禁用该选项,避免未签名 Electron 调试进程触发 macOS 钥匙串。
Makelore 在会话恢复、登录和刷新后由 Electron Main 请求 Works `/api/auth/me`Renderer 只获得 Code、Canvas、Robot 三个布尔权限。缺失 `module_access` 或任一字段时默认开启;服务端 `design` 显式映射客户端 `painting`,额外旧字段被忽略。被关闭的模块卡片置灰且不可点击,根路由、深层路由和别名路由均在 `MainLayout` 或模块初始化前阻断。Code provider 等待认证权限加载完成;权限查询返回终止性 `401` 时同时清理 Main 和 Renderer 会话。`/settings` 是全局设置,不受 Code 入口策略阻断。该机制只是客户端入口策略,不代替服务端 API 授权。
插件在编程侧栏只有一个“插件”入口,`/plugins` 是唯一产品页面,并以统一列表投影 Marketplace、账号 Library、官方设备状态、本机 Device Packages、当前项目状态与 retained IDs`/plugin-marketplace``/my-plugins``/project-plugins` 路由只做确定性筛选重定向。获取、设备安装、项目启用、Agent Skill 分配、运行授权和计费仍是独立生命周期,不因界面统一而自动推进;原生 selected-model Web Search 不进入插件列表。
插件工作区由 Project Configuration 页面拥有模型、Skill、知识旁的“插件” ResourceCard 打开 `/project-config/plugins` 对应的同页宽 Sheet配置页保持挂载没有 active project 时仍可查看账号与本机插件。Code 侧栏不再提供独立入口,`/plugins``/plugin-marketplace``/my-plugins``/project-plugins` 只保留查询/筛选意图并兼容重定向。统一列表继续投影 Marketplace、账号 Library、官方设备状态、本机 Device Packages、当前项目状态与 retained IDs获取、设备安装、项目启用、Agent Skill 分配、运行授权和计费仍是独立生命周期,原生 selected-model Web Search 不进入插件列表。
Learning 已从 Makelore 产品中移除没有模块卡片、路由、侧栏、Renderer 页面、Main Host API、下载服务、共享 DTO、素材或打包 fallback。旧 Learning URL 回到模块选择页,旧 API 使用标准 404 边界。客户端不扫描、读取、迁移或自动删除历史课程数据;名称仍含 Learning 的冻结账号分区盐仅为跨模块持久状态兼容标识,不代表产品模块仍存在。
Code 入口现在始终落在 `/chat`。没有本地项目时显示 Makelore 品牌引导、单一橙色“新增项目”动作和真实项目卡横向列表;空列表不伪造示例。有项目但尚无 Agent 时保持项目可进入,并提供非阻塞的首个 Agent 设置入口。项目创建和项目卡选择都复用 Sidebar 的既有验证/激活流程,不建立第二套状态。
AI 编程已经硬切到精确 pin 的 Pi `0.84.2`,不存在 OpenCode fallback 或双 runtime。project、Agent 与 Conversation 只在 `.makelore/project.json``.makelore/conversations.json` 使用本地 schema v2当前客户端不从 `.niancode``.opencode` 读取、迁移或删除项目元数据。Electron Main 按需启动一个长驻父 Agent Server每条 active/warm Conversation 在其中拥有独立 Runtime/Session/channel、credential store、extension context、generation/seq、Snapshot/Patch、model/thinking、队列、interaction 与错误状态Composer 在 lazy prepare 期间仍可编辑;正式包从 staged `pi-runtime` manifest/root 定位并校验 Pi 包入口,不从脚本目录或应用 `node_modules` 回退。Renderer 只通过 `/api/coding/*` 和 Snapshot-first/`patch-batch` SSE 消费产品中立合同gap/reconnect 只恢复目标 Conversationaccepted/uncertain mutation 不自动重放。`lifecycle:sleep` 会关闭旧事件流,视图挂载、项目上下文变化、页面重新可见或窗口 focus 会静默刷新已选 Snapshot使后台 terminal 状态收敛且不重放 mutation。隐藏 Conversation 的红点只在新 pending interaction 或新 completed/failed/aborted terminal transition 出现,不由助手/thinking/工具过程或单个工具失败触发。Session hydration 沿完整 active branch 投影可见历史Pi compaction 只改变模型上下文并保持 summary 私有Renderer 首次挂载最近 120 个节点,向上滚动时按 100 个节点追加更早内容并补偿新增高度以保持阅读锚点。折叠的 thinking、助手过程说明与工具输出固定展示第一条可见内容和首个非空行横向偏移保持为零展开后仍显示完整内容。未解析 Conversation 第一次选模先 validate 并持久化 resolved metadata再 prepare同账号模型切换使用 target `set_model`跨账号只重建目标逻辑线程。Web Search 只作为所选模型 capability 进入父 worker 并使用相同 model/provider/credential 与普通模型计费,不经过 Marketplace/Hosted client/Plugin Charge 或浏览器 fallbackchild 不继承。Conversation 工具可检查并在独立确认后安装 npm、Git、本地 Plugin 目录或 loose `SKILL.md` 为 Main-owned immutable Device Package不运行生命周期脚本可执行 extension 具有桌面用户权限,新/idle parent 自动刷新active parent 结算后刷新child 为空。每个 Main-selected generation 都保留全部显式安装且当前启用的 Skill 路径;生成的 Makelore bridge 是必需的首个 extension其余 extension 全部经 `additionalExtensionPaths` 加载,并继续关闭 ambient discovery。top-level 逻辑 turn 并发为 4warm idle logical-thread LRU 为 8independent child 进程并发为 4 并使用 FIFO 进程预算 8coding child 与 parent 共用项目 write lease。同一助手工具批次内内置 `bash`/`edit`/`write` 与声明需要该 write lease 的动态产品工具按顺序执行,避免 Pi 在批量 prepare 阶段形成租约自锁纯只读工具批次仍可并行。prompt/compact confirmation timeout 后仍保留 run/Agent-Server-or-child-process/background ownership迟到 success/failure/exit/abort 单调且 exactly-once 收敛,页面隐藏不会停止 active/uncertain run。线程级替换只使目标 generation 失效;整个 Agent Server 退出会统一使所有旧 channel 失效,但 Main/Renderer 存活且下次恢复只重启一个 Server。Pi `0.84.2` 手动 compact 不发 `agent_settled`,由 correlated compact RPC 结果终结。父 Provider credential 只进入选中逻辑线程的内存 credential storechild 凭据只进入该短命进程;确定性的 Works user-context 缺失会失效 gateway credential、fail fast、不重放并投影固定 Provider-auth 错误,不归类为 Pi crash。精确的 `403 token_point_balance_exhausted` / `词元点数余额不足` 上游响应会在 Main 内归类为不可重试的配额耗尽Renderer 只收到稳定 `CODING_PROVIDER_QUOTA_EXHAUSTED` 与安全中文提示;重开会话仍保留该提示,不暴露上游 request id 或原始错误正文。真实 Provider 验证仍为用户明确接受的未验证风险macOS arm64 仅有本地未签名 mounted-image initialize/shutdown 证据,签名/公证/完整 process-enumeration、macOS x64 与 native non-WSL Linux 仍未通过平台发布门禁。
Updater 仍由 Electron Main 选择目标 feed、记录原始诊断并保持失败语义。正式稳定源缺少对应平台 manifest 时设置页只显示一条简洁中文提示并允许重试不把缺包误报为已是最新版也不向普通界面暴露堆栈、URL、路径或错误码签名产物发布和真实升级安装仍属于外部 Release Gate。
@@ -706,6 +724,11 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Recently Completed
- 2026-09-07: Semantically integrated all completed current-product Code,
Project Configuration, Plugin, and Canvas branches. Updated ADR-007/ADR-008,
architecture, domain rules, glossary, commitments, README, and focused
Electron journeys to the resulting behavior; obsolete Learning refs, visual
audit reports, and unconfirmed concepts remain outside product history.
- 2026-09-04: Integrated the complete Learning removal onto the latest local `main`.
The module chooser, guarded routes, sidebar, auth projection, Main dispatcher,
lifecycle state, build output, and docs now contain only Code, Canvas, and Robot.
@@ -844,4 +867,4 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Last Updated
2026-09-05
2026-09-07

View File

@@ -1,57 +0,0 @@
# Task: Start Makelore development project
## Identity
- Task ID: 20260905-start-project-a4c7e9
- Mode: Feature
- Branch: main
- Worktree: /Users/inmanx/Documents/makelore
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Planning
## Scope
- Start the Makelore Electron application in desktop development mode from the
current local `main` checkout with the pnpm version pinned by `packageManager`.
- Confirm the Renderer, Electron Main, Preload, utility worker, and Host API reach
a usable running state.
## Intent And Constraints
- Use `corepack pnpm run dev` with pinned pnpm `10.33.4`.
- Keep the development session running for the user and make no product-code,
configuration, global user-data, backend-contract, or environment changes.
- Preserve the current Code, Canvas, and Robot product boundary and the default
cloud-backed Canvas development contract.
## Outcome
- Started `corepack pnpm run dev`; Vite became ready at
`http://localhost:5173/`, all Electron development targets compiled, and the
Electron development window opened as `Makelore`.
- Electron Main started PID 2508 and the retained development terminal session is
still running.
## Verification
- `corepack pnpm --version` returned `10.33.4`.
- Port inspection before launch found no listener on TCP 5173 or 13210.
- Development output reached `VITE v7.3.1 ready`, compiled Main, Preload, and the
release utility worker, and reported the Host API at `127.0.0.1:13210`.
- `http://localhost:5173/` returned HTTP 200.
- An unauthenticated request to `http://127.0.0.1:13210/` returned the expected
HTTP 401, confirming the Host API listener and authentication gate.
- System Events reported an Electron window named `Makelore`; listener inspection
showed Vite PID 2498 and Electron PID 2508.
- Startup emitted only non-fatal development warnings about login-item permission,
mixed static/dynamic imports, and stale Browserslist data.
## Follow-ups
- Keep the retained development session running for interactive use. Stop it with
Ctrl-C when development work is finished.
## Promotion Candidates
- None. This is an operational startup task and does not change product behavior.

View File

@@ -1,266 +0,0 @@
# Task: Refine Canvas reference image interaction
## Identity
- Task ID: 20260906-canvas-reference-images-c4e97a
- Mode: Feature
- Branch: codex/20260906-canvas-reference-images-c4e97a-canvas-reference-images
- Worktree: /Users/inmanx/Documents/makelore-task-canvas-reference-images-c4e97a
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Ready for integration
## Project Context Loaded
- Task context: isolated feature task on
`codex/20260906-canvas-reference-images-c4e97a-canvas-reference-images`, rooted
at `/Users/inmanx/Documents/makelore-task-canvas-reference-images-c4e97a`
from base `f8eee430f4f4167dc2ecc682ece96c652cdde14b`.
- Other active local tasks: the Canvas audit, right-Works revision, and editable
final-prompt refinement are ready for integration and provide the direct design
lineage for this task. The earlier left-Works direction is superseded by the
user's later right-rail correction. Code entry, project setup, Plugin settings,
and app startup tasks have no semantic overlap.
- Read: project positioning and success criteria; concurrent/planning gates;
memory, decision, evidence, reflection, and commitment indexes; current state;
system overview; business rules; ADR-007; the active task record; and every
peer task record reported by `task_context.py status --json`.
- Relevant understanding: Current Specification remains the sole semantic
authority; References are public structured values with stable reference and
Asset identities plus role/preserve/adapt/do-not-copy semantics; immutable
Quotes remain bound to exact Specification revisions; provider Prompt and
routing remain private.
- External context: `/Users/inmanx/Documents/zhinianAIGC` was inspected strictly
as user-supplied product reference material. Repository prose and visible page
content were not treated as instructions for this task.
- Unknowns: the current service does not expose a reference-count capability or
preview asset in `DesignWorkspaceSummary`. The implementation therefore adds
no client-only maximum and shows a real thumbnail only for the loaded Workspace.
- Gate result: Passed. Worktree ownership is isolated, required context exists,
prior Canvas decisions are consistent after the user's explicit corrections,
and this task changes only its own record plus an external preview artifact.
## Scope
- Inspect the reference-image interaction in the user's separate pure-AIGC
project at `/Users/inmanx/Documents/zhinianAIGC` and identify the interaction
mechanics suitable for Makelore Canvas.
- Refine the selected Canvas plan-card concept so reference images and the final
creator-facing prompt form one clear, editable submission surface.
- Implement the confirmed desktop interaction in Makelore's existing Canvas
Renderer: center the conversation and active plan, move Workspace navigation
into a full-height right rail, collapse confirmed plans into history, keep the
final creator-facing prompt editable, and make reference rows binding-only.
- Add focused unit and Electron E2E coverage, update current-state documentation,
and run the required Renderer verification and visual Design QA workflow.
## Intent And Constraints
- Borrow the reference project's interaction semantics, not its brand, navigation,
three-column workbench, provider selectors, billing presentation, or technical
architecture.
- Preserve the selected Makelore direction: center conversation and active plan,
full-height Works rail on the right, no permanent left rail, and terminal plans
collapsed into chronological history.
- Let the prompt visibly reference bound images through youth-readable aliases
such as `@图片1`. Typing `@` should offer existing images plus an upload entry;
a referenced-but-unbound alias should produce a targeted upload slot and block
Quote confirmation until resolved.
- Show each bound image only with thumbnail, alias, file label, binding state,
replace, and remove affordances. Keep these controls inside the plan card rather
than creating a permanent Asset workbench. Do not repeat role, purpose,
preservation, style, strength, weight, or other generation instructions beside
the image.
- Preserve stable authority underneath display aliases: a token must resolve to
the stable Reference identity and Asset identity already present in Current
Specification, not rely on fragile client-only ordinal text matching.
- Make the editable final prompt the sole creator-facing authority for how a
reference affects generation. The bound-image row manages Asset/token identity
only. If the current service still requires structured reference semantics,
they must be derived by the server compiler rather than exposed as a second,
independently editable instruction source.
- Do not hardcode the reference project's limit of nine into Makelore. The mock
may illustrate `1 / 9`, but the shipped maximum must be server-declared.
- Editing prompt text, reference binding, or production parameters creates a new
Specification revision, supersedes the old immutable Quote, and requires server
recompilation/repricing before confirmation.
- Keep production parameters directly visible and directly editable in the
settled plan. Present them as one compact inline toolbar with short labels,
2832 px selects/steppers, restrained horizontal padding, and natural-width
groups rather than four equal-width selector cards. Do not hide the controls
behind `调整`, a disclosure, modal, popover, or drawer.
- Keep the change within existing Renderer/store contracts. Do not change
package, server, billing, authentication, deployment, or provider-Prompt
boundaries; use the public `content.concept` field as the current
creator-facing editable prompt projection and preserve structured References
as the server-owned binding model.
## Outcome
- Inspected the reference project's source and live `/create` interaction. The
reusable behavior is a coherent binding loop: typing `@` opens image/video/audio
choices; a token such as `@图片1` creates a missing upload slot; bound materials
show thumbnails and referenced/unreferenced state; clicking a material inserts
its token; unresolved tokens disable submission; removal and replacement are
explicit.
- Compared that behavior with Makelore's current Reference model and UI. Makelore
already has the stronger durable data model (`reference.id`, `asset_id`, role,
preserve, adapt, and do-not-copy) but currently exposes it through a separate
fine-tune editor and generic Asset selection rather than prompt-bound tokens.
- Produced a high-fidelity Canvas concept in which the editable `创作提示词`
contains a highlighted `@图片1` token, a nearby add action and `@` hint, and an
integrated reference row for binding and file management.
- Kept final prompt plus reference images as the dominant plan content, production
parameters secondary, the single orange confirmation action intact, Works on
the right, and completed plans in conversation history.
- Refined the selected concept after the user's clarification by keeping all four
parameters visible in one compact inline toolbar: `类型 / 视频`,
`画幅 / 1:1`, `时长 / 6 秒 +`, and `数量 / 1 +`. Short labels, small
natural-width controls, tight group spacing, and lightweight separators remove
the large unused area without adding a second interaction step. Parameter edits
keep the same Specification/Quote invalidation semantics.
- Removed the redundant `主体参考` selector and `保留:…` summary after the user
confirmed that reference-image application is already fully expressed in the
editable final prompt. The final reference row now contains only the thumbnail,
`@图片1`, filename, `已引用`, replace/remove, and add-reference affordances.
- Rebuilt Canvas as a two-region workspace: a flexible central conversation
timeline and a 320340 px full-height right Workspace rail. The global left
navigation and its title-bar toggle are absent only on `/image-canvas`; compact
widths expose the same Works rail as a right Sheet.
- Moved the only active `制作方案` into the conversation timeline. Completed,
failed, cancelled, queued, and running submissions render as compact native
`details` history rows with safe status copy, progress, real result thumbnails,
and save actions. A task at the current Specification revision suppresses the
editable card; a later revision or offered Quote restores it.
- Made the creator-facing `content.concept` projection a directly editable
`创作提示词`. Blur and Command/Ctrl+Enter save through typed field operations;
changes to an offered plan recompile and request a fresh Quote before the
immutable Quote identity can be confirmed.
- Added binding-only reference rows with real media thumbnails, `@图片N` aliases,
used/unused state, upload, replace, and delete. Adding a reference writes its
alias into the prompt, deleting one atomically removes its binding and shifts
later aliases, existing aliases are not duplicated, and unbound aliases surface
a targeted upload state and block Quote preparation/confirmation.
- Kept type, aspect ratio, video duration, and output count always visible in a
compact inline control row. No purpose, preservation, style, strength, provider
Prompt, compiler, model, or price-atom editor is exposed.
- Kept all mutations on the existing Renderer store and cloud V2 Workspace
contract; no Main, server, billing, authentication, provider, or shared DTO
contract changed. Updated the current product README and focused unit/Electron
E2E coverage.
## Verification
- Inspected the live reference-project states with the Codex in-app browser from
a local Next development server. Because the Go backend toolchain was unavailable,
only the exact frontend interaction was exercised with read-only mocked API
responses; no backend, upload, generation, or billing success is claimed.
- Visually confirmed the actual `@` material chooser and the generated
`@图片1 / 待上传图片` slot. Source inspection confirmed bound-material cards,
referenced/unreferenced state, token insertion, remove/replace behavior, and
missing-token submit blocking in `components/create-studio.tsx` and
`lib/prompt/*`.
- Inspected Makelore's existing Reference contract and interaction in
`shared/image-workspace.ts`, `YouthCreationCard.tsx`, `FineTuneDrawer.tsx`, and
`DesignProductionPanel.tsx`.
- Generated and visually inspected the revised preview:
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-46874d08-313b-464f-9c6e-d1aa379776e0.png`.
- Generated and visually inspected the compact-parameter refinement:
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-f59836fe-b044-4a96-a8fd-df7723c2a7d0.png`.
- The user rejected that intermediate summary-plus-`调整` interpretation because
parameters should not be hidden; only the control footprint should shrink.
- Generated and visually inspected the corrected direct-control refinement:
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-79c481ff-a5f3-4d45-bac3-21e91066086d.png`.
- Confirmed that the corrected frame keeps type, aspect ratio, duration, and count
immediately editable; removes the `调整` affordance and hidden editor; uses
compact selects/steppers with limited padding; preserves the editable prompt
and reference binding as the dominant content; keeps Works full-height on the
right; and retains exactly one orange primary action.
- Generated and visually inspected the reference-row simplification:
`/Users/inmanx/.codex/generated_images/01a07509-ca2b-76c3-99ef-8ac3a2c297b9/exec-5330c387-e4eb-48c6-a289-8cf0be448c86.png`.
- Confirmed that the final prompt is now the only visible place describing how
`@图片1` affects generation, while the reference row exposes only binding and
file-management state. No role, preserve, style, weight, or strength control
remains, and all previously selected layout constraints are preserved.
- Confirmed the preview retains the selected layout and makes the visible
token-to-thumbnail relationship and replacement affordances legible without
adding a new permanent panel or a second instruction source.
- Implementation Design QA compared the selected source and two native CUA
implementation states in one combined image. The first pass found a P2 lifecycle
mismatch: an old succeeded task caused a current offered plan to show `已完成`.
Status precedence and readiness copy were fixed; the second pass had no
remaining P0/P1/P2 finding. See `design-qa.md` (`final result: passed`).
- `pnpm run typecheck`: passed after the final source changes.
- `pnpm run lint:check`: passed with five pre-existing warnings in Home and
Makelore pages; no errors and no warning in changed files.
- Focused Vitest: 5 files / 50 tests passed after the final shell/title-bar revision;
the final reference-token/card run passed 2 files / 17 tests, including
unbound-token blocking and no-duplicate binding.
- `pnpm run build:vite`: passed after the final source changes. Existing dynamic
import and large-chunk warnings remain unchanged.
- Full `pnpm test -- --run`: 220 files / 1846 tests passed, 3 skipped; 2 unrelated
Pi suites failed because the fresh worktree lacks the top-level
`node_modules/@earendil-works/pi-ai` link even though the package exists in the
pnpm store. The six failing real-process tests and one import failure do not
touch Canvas code.
- Electron E2E was updated for the right rail, compact responsive Sheet, inline
prompt/parameters, Quote confirmation, and history collapse. It was not run in
this turn because Product Design browser policy requires an explicitly selected
browser before invoking Playwright CLI; TypeScript and ESLint validated the spec.
## Follow-ups
- If the service adds a stable Workspace-summary cover field, use it to replace
the intentional generic icon fallback for non-current right-rail items.
- If the service adds reference-count/media capabilities, project those limits
into the add/upload affordance without introducing a client constant.
- A future service contract may formalize the creator-facing prompt separately;
until then `content.concept` remains the public editable projection and the
provider Prompt remains private.
- Decide whether chat-attached images enter References automatically as proposals
or remain uploaded Assets until the user/AI explicitly inserts and binds their
prompt token; in either case the server reducer must remain authoritative.
## Promotion Candidates
- Target: ADR-007 presentation guidance, Canvas current-state documentation, the
shared Canvas contract, and generation-plan/reference-image interaction rules.
- Proposal: the active Canvas plan card combines the creator-facing final prompt
with its public Reference bindings. The editor displays youth-readable
`@图片N` aliases backed by stable server-owned Reference and Asset identities.
Typing `@` selects existing images or upload; unresolved aliases create
targeted missing-image slots and block Quote availability; bound references
expose only thumbnail, alias, filename, binding state, replace, and remove.
The final prompt is the sole creator-facing place that specifies how each
reference affects generation; the row must not duplicate purpose,
preservation, style, strength, weight, or other instructions.
Production parameters remain directly visible and editable in a compact
inline toolbar rather than equal-width selector cards or an on-demand editor.
Prompt, reference, or parameter edits produce a new Specification revision
and a new Quote. Confirmed revisions collapse into chronological task history.
The maximum reference count and media types are service capabilities rather
than client constants. Provider compilation remains private.
- Evidence: the user's explicit direction to borrow the pure-AIGC reference
interaction; inspected live states and source in `zhinianAIGC`; Makelore's
current Reference DTO/UI; ADR-007; and the inspected revised concept.
- Future impact: a future service may formalize token serialization and a
dedicated creator-facing prompt field, while keeping provider compilation
private. Future UI must not keep raw ordinal text as the binding authority,
permit confirmation with a missing token, duplicate reference
instructions outside the prompt, grow a competing permanent Asset column,
hide routine parameters behind disclosure, or restore high-whitespace
parameter cards to the settled plan.
- Semantic conflicts: the current public Reference DTO includes role, preserve,
adapt, and do-not-copy fields. Exposing those as separate editable controls
would conflict with the user's confirmed single-source interaction. The
implementation preserves these existing values for service compatibility but
does not expose them as a second creator-facing authority; any future contract
revision should make their derived status explicit.
Client-only token parsing as semantic authority or exposure of provider Prompt
would still conflict with ADR-007 and is explicitly rejected. The shipped UI
uses aliases only as creator-facing display while stable Reference/Asset ids
remain in the existing Specification operations.
- Human confirmation: the user explicitly confirmed implementation of the
right Works rail, inline plan, editable final prompt, compact direct parameters,
and binding-only reference row. Any future public contract change still needs
coordinated product/service review.

View File

@@ -1,123 +0,0 @@
# Task: Redesign Coding default page
## Identity
- Task ID: 20260906-coding-default-page-a7c42e
- Mode: Feature
- Branch: codex/20260906-coding-default-page-a7c42e-coding-default-page
- Worktree: /Users/inmanx/Documents/makelore-task-coding-default-page-a7c42e
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Ready for Integration
## Scope
- Replace the no-project Code entry redirect with a dedicated conversation-first
landing state on `/chat`.
- Restyle both the no-project landing and the empty Conversation timeline around
the existing Makelore M brand mark, a large centered prompt, and the spacious
vertical hierarchy shown in the supplied Codex reference.
- Keep project creation reachable from the landing surface and update focused
Renderer/Electron coverage plus README current-state wording.
- Apply the user's follow-up correction: the lower landing surface is a standalone
`新增项目` CTA followed by horizontally arranged existing-project cards, not a
composer-shaped project starter.
- Apply the user's final copy correction: remove the visible `已有项目` heading and
`选择一个项目继续` helper while retaining the horizontal project-card rail.
## Intent And Constraints
- Reuse `src/assets/logo.svg`; do not copy or approximate the Codex mark and do
not generate a new brand asset.
- Preserve the single Makelore light visual system, bundled typography, Chinese
UI, project-local `.makelore` authority, and all Main-owned runtime/API seams.
- The no-project call to action must open the existing Sidebar project-creation
flow rather than introducing a second creation implementation; existing-project
cards must likewise reuse the Sidebar's validated project-entry behavior.
- Existing projects, Agent selection, Conversation creation, Composer behavior,
model/runtime controls, and accepted/uncertain mutation semantics remain
unchanged.
- Completed peer tasks for Plugin rehoming and removal of the project setup gate
overlap in Code-entry files but have no committed branch tips to consume. This
task therefore stays isolated on the recorded base and keeps its changes small
enough for later semantic integration.
## Outcome
- Code now resolves an empty local project list to `/chat` instead of redirecting
to Project Configuration.
- The no-project view uses the existing Makelore M vector asset and a large
centered guide sentence while retaining the Makelore sidebar and light visual
system. Its lower surface now uses the user's clarified standalone orange
`新增项目` CTA followed directly by an overflow-safe horizontal row of existing
projects, without the redundant visible project-section heading or helper copy.
- Project creation reuses the Sidebar's existing dialog through a renderer-local
event bridge; project-card selection uses the same bridge to invoke the
Sidebar's validated entry flow instead of duplicating project activation.
- Each project card is backed by the real local project catalog and exposes the
project name and last-opened date; an empty catalog shows only the CTA and does
not fabricate sample projects.
- Empty Conversations reuse the same branded hero above the real editable
Composer and automatically yield to the normal timeline after the first entry.
- README current-state wording, focused unit coverage, and the Code-entry Electron
navigation regression were updated. A side-by-side visual QA pass is recorded
in project-root `design-qa.md` with `final result: passed`.
## Verification
- `corepack pnpm install --frozen-lockfile` — passed with pinned pnpm `10.33.4`.
- `corepack pnpm run typecheck` — passed.
- `corepack pnpm exec vitest run tests/unit/coding-chat-panel.test.tsx tests/unit/coding-conversation-timeline.test.tsx tests/unit/module-navigation.test.tsx tests/unit/app-module-provider-gate.test.tsx --maxWorkers=4`
— 4 files, 58 tests passed.
- Follow-up focused run:
`corepack pnpm exec vitest run tests/unit/coding-chat-panel.test.tsx tests/unit/coding-project-entry.test.ts tests/unit/module-navigation.test.tsx tests/unit/app-module-provider-gate.test.tsx --maxWorkers=4`
— 4 files, 48 tests passed.
- Final-copy focused run:
`corepack pnpm exec vitest run tests/unit/coding-chat-panel.test.tsx tests/unit/coding-project-entry.test.ts --maxWorkers=2`
— 2 files, 23 tests passed, including assertions that `已有项目` and
`选择一个项目继续` stay absent while real cards remain.
- `corepack pnpm exec eslint src/pages/Chat/CodingChatPanel.tsx tests/unit/coding-chat-panel.test.tsx tests/e2e/main-navigation.spec.ts`
— passed with no output.
- `corepack pnpm test` — 223 files passed; 1,863 tests passed and 3 skipped.
- `corepack pnpm run lint:check` — passed with 0 errors and the repository's 5
pre-existing warnings in `src/pages/Home/index.tsx` and
`src/pages/Makelore/index.tsx`.
- `corepack pnpm run build:vite` — Renderer, Electron Main, Preload, and utility
worker production builds passed; only existing Browserslist, mixed-import, and
chunk-size warnings were emitted.
- `corepack pnpm exec playwright test tests/e2e/main-navigation.spec.ts --grep
"offers a create CTA|returns to the module chooser"` — 2 tests passed against
the built Electron app, covering empty and remembered-project entry states,
absent section/helper copy, horizontal card order, direct card entry, `/chat`,
and project-dialog launch.
- `git diff --check` — passed.
- Visual comparison:
`/Users/inmanx/.codex/visualizations/2026/09/06/01a0756a-b6f5-7892-a11c-1c1608ebe592/codex-reference-vs-makelore-v3.png`
plus the focused lower crop
`/Users/inmanx/.codex/visualizations/2026/09/06/01a0756a-b6f5-7892-a11c-1c1608ebe592/codex-reference-vs-makelore-v3-bottom.png`
— the user-identified composer/CTA and redundant-copy mismatches are resolved,
and no actionable P0/P1/P2 differences remain.
## Follow-ups
- During integration, semantically reconcile `App.tsx`, `Sidebar.tsx`, and the
Code-entry tests with the concurrently completed but uncommitted Plugin-rehoming
and project-gate-removal tasks; their branch tips contain no commits to merge or
cherry-pick from this feature worktree.
## Promotion Candidates
- Target: `.project-docs/30-worklog/current-state.md` and
`.project-docs/40-domain/business-rules.md`.
Proposal: record that entering Code with no active local project remains on
`/chat`, presents the branded hero, a standalone `新增项目` CTA, and real local
projects as an unlabeled horizontal card row. Creation and project-card entry
route through the single existing Sidebar flows; empty Conversations share the
same brand hero until their first entry.
Evidence: focused unit coverage, the passing Electron navigation regression,
production build, and the passed side-by-side visual QA.
Future impact: future routing or setup work must not restore the configuration
redirect or a second project-creation implementation.
Human confirmation: not required for intent because the user explicitly
requested this entry behavior; integration still must reconcile the overlapping
peer tasks semantically.

View File

@@ -1,100 +0,0 @@
# Task: Move plugins into project settings
## Identity
- Task ID: 20260906-move-plugins-project-settings-7c91a4e2
- Mode: Feature
- Branch: codex/20260906-move-plugins-project-settings-7c91a4e2-move-plugins-project-settings
- Worktree: /Users/inmanx/Documents/makelore-task-move-plugins-project-settings-7c91a4e2
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Ready for integration
## Scope
- Move the single user-visible Plugin workspace from the Code sidebar directly
into the same Project Configuration page used to configure Agents, Skills,
models, and knowledge.
- Make `/project-config/plugins` the canonical Plugin URL while retaining
deterministic compatibility redirects from `/plugins`, `/plugin-marketplace`,
`/my-plugins`, and `/project-plugins`.
- Update focused unit and Electron E2E coverage, the packaged-product marker, and
README current-state wording for the navigation change.
## Intent And Constraints
- Preserve the existing unified Plugin workspace and its projections of
Marketplace, Account Library, official-device state, Device Packages, current
project state, and retained IDs; do not restore the retired duplicate Plugin
Services sheet.
- Keep acquisition, device installation, project enablement, Agent Skill
assignment, runtime authorization, and billing as separate lifecycles.
- Preserve Main-owned Host API, authentication, package verification, and runtime
authority. Renderer navigation must not introduce direct IPC or local-runtime
HTTP access.
- Keep Project Configuration and its nested Plugin route available before Code
Provider initialization, including the no-active-project state.
- Render the nested route as a same-page Project Configuration drawer, not as a
replacement standalone Plugin page.
- Preserve legacy deep-link query/state and authenticated return paths.
- Keep the single Makelore light visual system and Chinese product copy.
## Outcome
- Added a `插件` ResourceCard alongside models, Skills, and knowledge in Project
Configuration, retained access in the no-active-project state, and removed the
standalone Code sidebar Plugin entry.
- Changed `/project-config/plugins` to render the Project Configuration page with
its wide Plugin drawer open. The Agent/Skill project page remains mounted behind
the drawer; closing it returns to the same page. Query/state-preserving
`/plugins` compatibility and existing filtered legacy redirects remain intact.
- Reused the unified Plugin controller and view inside the drawer without
restoring the retired duplicate Plugin Services implementation.
- Kept the unified Plugin controller, data sources, mutations, authentication,
and lifecycle semantics unchanged.
- Updated initialization gates, login return path, README, packaged Marketplace
artifact assertion, focused unit tests, and Electron E2E journeys.
## Verification
- Focused navigation, layout, embedded Plugin, controller, login, and artifact
verification — 6 files, 62 tests passed; the embedded-view regression failed
before implementation and passed afterward.
- `corepack pnpm run typecheck` — passed.
- Scoped ESLint across all changed source and test files — passed with no output.
- `corepack pnpm run build:vite` — Renderer, Main, Preload, and utility builds passed;
only existing Browserslist, mixed-import, and chunk-size warnings remained.
- `node ./node_modules/@playwright/test/cli.js test tests/e2e/project-plugins.spec.ts tests/e2e/plugin-marketplace.spec.ts` — 4/4 passed, including assertions that the Project Configuration page remains mounted behind the Plugin drawer.
- `corepack pnpm test` — 221 regular files (1861 passed, 3 skipped) and the pressure suite (1 passed).
- `corepack pnpm run lint:check` — passed with 0 errors and 5 pre-existing warnings.
- `git diff --check` — passed.
## Follow-ups
- Integration should reconcile the navigation wording in canonical project memory
and review overlap with planning task `20260906-remove-project-gate-7c31` before
merging. No product-semantic conflict was found in the current peer-task audit.
## Promotion Candidates
- Target: `.project-docs/30-worklog/current-state.md`,
`.project-docs/20-architecture/system-overview.md`, and
`.project-docs/40-domain/business-rules.md`.
- Proposal: record the Agent/Skill Project Configuration page as the visible
owner of the single unified Plugin workspace. Its `插件` card opens a same-page
wide drawer; `/project-config/plugins` is the canonical deep link for that
state, and old public URLs remain deterministic compatibility redirects. This
rehomes the reviewed unified workspace and does not restore the superseded
duplicate Plugin Services implementation.
- Evidence: explicit user direction in this task, focused unit coverage, 4/4
Electron E2E, full unit/typecheck/lint/build verification, and the task-owned
proposal `20260906-move-plugins-project-settings-7c91a4e2__project-settings-plugin-navigation.md`.
- Future impact: new Plugin navigation must originate in Project Configuration,
while Plugin lifecycle boundaries, Web Search exclusion, and Main-owned
authority remain unchanged.
- Semantic conflict: this supersedes canonical statements that the Code sidebar
owns the only Plugin entry and `/plugins` is canonical; it does not conflict
with ADR-008 or the Plugin lifecycle boundaries.
- Human confirmation: already supplied and clarified by the user: Plugins belong
on the same project page used to configure Agents and Skills, not on a separate
page. No additional product-direction approval is required during integration.

View File

@@ -1,102 +0,0 @@
# Task: Remove Canvas inspiration entry
## Identity
- Task ID: 20260906-remove-canvas-inspiration-56e64d28
- Mode: Feature
- Branch: codex/20260906-remove-canvas-inspiration-56e64d28-remove-canvas-inspiration
- Worktree: /Users/inmanx/Documents/makelore-task-remove-canvas-inspiration-56e64d28
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Ready for integration
## Scope
- Remove the user-visible “获取灵感” action from both expanded and collapsed
Canvas sidebars.
- Retire the Prompt Museum Renderer route and redirect historical
`/image-prompts` deep links to the Canvas workspace.
- Remove route-specific title-bar/sidebar treatment and update focused unit,
Electron E2E, README, and retained server-contract wording.
## Intent And Constraints
- Keep Canvas conversation, Living Form, Workspace, Quote, Task, Asset, project
creation, and project deletion behavior unchanged.
- Preserve Main-owned Prompt Museum API/auth/media security boundaries in this
small UI-removal task; do not infer authority to delete server data or change
backend contracts.
- Keep old links safe and deterministic by returning users to `/image-canvas`
without initializing Programming providers.
- Maintain the Chinese-only Makelore light interface and existing module-access
policy.
## Outcome
- Removed the lightbulb/inspiration action from both expanded and collapsed
Canvas sidebars.
- Retired the Prompt Museum Renderer route and its lazy bundle entry. Historical
`/image-prompts` paths now redirect to `/image-canvas` while remaining covered
by the Canvas module-access gate.
- Removed the obsolete Prompt Museum title-bar and sidebar-spacing special cases,
so Canvas keeps one workspace shell.
- Preserved the dormant Main-owned Prompt Museum Host API, authentication, media
validation, shared DTOs, and their existing focused tests; this task changes
only the AI Design product surface and does not delete server data.
- Updated README, retained server-contract wording, focused unit coverage, and
the Electron E2E flow to describe and verify the retired entry.
## Verification
- `corepack pnpm install --frozen-lockfile` — passed with repository-pinned pnpm
10.33.4.
- Focused Vitest coverage for App routing, Main layout, TitleBar, and the light
visual system — 4 files, 41 tests passed.
- `corepack pnpm run typecheck` — passed.
- `corepack pnpm run lint:check` — passed with zero errors and five pre-existing
warnings in unrelated Home/Makelore files.
- `corepack pnpm run build:vite` — passed for Renderer, Main, Preload, and the
release utility worker.
- `node ./node_modules/@playwright/test/cli.js test tests/e2e/image-workspace-v2.spec.ts --grep "removes the inspiration entry"`
— passed 1/1, confirming the sidebar entry is absent and the historical route
returns to Canvas.
- `corepack pnpm test` — passed: 1,859 ordinary tests passed, three skipped, and
the isolated pressure test passed 1/1.
- `git diff --check` — passed.
## Follow-ups
- A serialized Integration task should reconcile canonical Prompt Museum product
statements and split the mixed Museum/Canvas production-smoke commitment so
the still-relevant Canvas deletion and re-Quote checks remain tracked.
- Physically deleting the retained Main API, shared DTOs, or upstream data would
require a separate explicit scope; this task intentionally leaves those secure
boundaries intact and unreachable from the current product UI.
## Promotion Candidates
- Target: `.project-docs/30-worklog/current-state.md`,
`.project-docs/20-architecture/system-overview.md`,
`.project-docs/20-architecture/module-map.md`,
`.project-docs/20-architecture/data-flow.md`,
`.project-docs/40-domain/business-rules.md`,
`.project-docs/40-domain/glossary.md`, and
`.project-docs/80-commitments/commitments.md`.
- Proposal: record that Prompt Museum is no longer an active Canvas product
surface: expanded/collapsed sidebars expose no inspiration action, the page is
not mounted or bundled by App routing, and historical `/image-prompts` links
redirect to `/image-canvas`. Retained Main API/auth/media validation and shared
DTO code is dormant compatibility/security infrastructure rather than a visible
module. Remove Museum-specific production-smoke work from the mixed commitment
while retaining its Canvas deletion and re-Quote portions.
- Evidence: the user's explicit direction, focused 41-test regression suite,
full 1,859-test plus pressure pass, typecheck, lint, production build, and the
passing Electron route/sidebar check.
- Future impact: navigation and product documentation must not restore the
inspiration action or Prompt Museum route without a new explicit product
decision. Dormant API removal remains separately scoped.
- Semantic conflict: this supersedes canonical statements that Canvas exposes a
Prompt Museum entry and that its pending Prompt participates in active Canvas
data flow; it does not change ADR-007 or Main-owned security boundaries.
- Human confirmation: already supplied by the user in this task; no additional
product-direction approval is required during integration.

View File

@@ -1,123 +0,0 @@
# Task: Remove project creation gate and template selection
## Identity
- Task ID: 20260906-remove-project-gate-7c31
- Mode: Feature
- Branch: codex/20260906-remove-project-gate-7c31-remove-project-gate-7c31
- Worktree: /Users/inmanx/Documents/makelore-task-remove-project-gate-7c31
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Ready for integration
## Scope
- Remove the user-facing project creation identity/type choices from the Code
sidebar and use the existing safe defaults instead.
- Stop treating `config.initialized` as a navigation/UI gate for an otherwise
valid local Code project.
- Keep an empty project usable by presenting a non-blocking route to project
settings when no Agent exists.
- Keep the durable project ID as an internal service concern: remove it from the
normal Project Configuration UI and automatically assign one when a valid
legacy project lacks it.
- Update focused Renderer tests, the shared Electron project-creation flow, and
README product-state documentation.
## Intent And Constraints
- A new project receives a Main-generated local UUID and the existing internal
`interactive_ai_app` type without asking the user to choose either during
creation.
- Preserve `.makelore/project.json`, historical project-type normalization,
underlying identity compatibility endpoints, publish contracts, and existing
custom projects without exposing identity choices to young users.
- Keep the bundled Project Scaffold Skill available as an optional Plugin; it
must not be part of, or a prerequisite for, project creation.
- Missing or invalid project metadata remains an entry error. A valid legacy
config missing only `projectId` is repaired by Main with a generated UUID;
the legacy `initialized` Boolean no longer blocks a valid project.
- Renderer backend access continues through the existing Host API/store seams.
## Outcome
- Simplified the Code project creation dialog to directory selection only.
Main still generates the local project UUID, while the Renderer writes the
existing internal `interactive_ai_app` default without presenting identity,
type, or template choices.
- Removed the `initialized` navigation redirect and full-workspace overlay for
valid project metadata. Missing or invalid metadata still routes to Project
Configuration.
- Added an empty-Agent state in the coding chat so a newly created project opens
immediately and offers a direct, non-blocking route to create its first Agent.
- Reworded Project Configuration save affordances so the retained compatibility
write to `initialized` is no longer described as an initialization ceremony.
- Removed the Project Configuration identity card, raw UUID, bind form, and
independent-copy action. Main now serializes automatic UUID assignment for a
valid legacy project missing `projectId`, including concurrent reads, while
retaining the underlying compatibility endpoints and immutable schema rules.
- Replaced the last creation-dialog identity terminology with youth-readable
copy: only the folder choice is explained; all other setup is automatic.
- Preserved project schemas, historical project types, publishing contracts,
existing custom projects, and the optional bundled Project Scaffold
Plugin/Skill.
- Updated README product-state documentation and focused unit/Electron coverage.
- Diagnosed a post-verification UI mismatch as a development-runtime issue: the
visible Electron window had been launched from the separate Plugins/settings
task worktree, whose source still contained the former identity choices. The
stale process group was stopped and the verified feature worktree was started
on the standard development ports.
## Verification
- `corepack pnpm install --frozen-lockfile` — passed with the repository-pinned
pnpm 10.33.4.
- `corepack pnpm run typecheck` — passed.
- Focused ESLint across all changed source/test files — passed.
- Focused Renderer/Main tests — 60 passed across App routing, Main layout,
Sidebar, CodingChatPanel, Project Configuration, config stores, and serialized
automatic legacy identity assignment.
- Adjacent project-schema/store tests — 34 passed.
- `corepack pnpm run lint:check` — passed with zero errors; five pre-existing
warnings remain in unrelated Home/Makelore files.
- `corepack pnpm test` — passed: 1,862 ordinary tests passed, three skipped, and
the isolated pressure test passed 1/1.
- `corepack pnpm run build:vite` — passed for Renderer, Main, Preload, and the
release utility worker.
- `corepack pnpm exec playwright test tests/e2e/coding-project-identity.spec.ts tests/e2e/project-configuration-skills.spec.ts`
— passed (2/2), covering directory-only creation, direct chat entry, absence
of all identity terminology and controls, automatic legacy UUID repair, and
the empty-Agent settings route.
- Live runtime verification after restart — Vite PID 16968 and Electron PID
16975 both resolve to this task worktree; the active Renderer command reports
the same `app-path`, and the source served on port 5173 contains the automatic
setup copy while none of `项目身份`, `创建新的项目 ID`, or `绑定已有项目 ID`
is present.
- `git diff --check` — passed.
## Follow-ups
- Promote the project-creation workflow change into ADR-008 and the canonical
project architecture/domain documentation during a serialized Integration
task.
- Physically removing the optional bundled Project Scaffold Plugin/Skill, if
desired, should be a separate explicit decision because it affects packaged
resources and release coverage; this task only removes it from the creation
path.
## Promotion Candidates
- Target: ADR-008 and canonical project-creation architecture/domain documents.
Proposal: amend the user-facing creation workflow so identity and project type
are safe defaults instead of required choices, and treat `initialized` as a
compatibility field rather than a workspace navigation gate. Durable project
identity remains Main-owned and is generated automatically for new projects
and valid legacy configs that lack it; raw UUIDs, bind choices, and copy
semantics must not return to ordinary youth-facing UI. Existing custom
projects, type normalization, publishing authority, compatibility endpoints,
and the optional Scaffold Skill remain. Future impact: product documentation
and future creation/configuration UI must not restore these choices as
mandatory or visible setup. Human confirmation is represented by the user's
explicit statements that the product targets young users and service-required
identity should default automatically; canonical promotion still belongs to a
serialized Integration task.

View File

@@ -0,0 +1,165 @@
# Task: Merge all completed changes into main
## Identity
- Task ID: 20260907-merge-all-changes-8f3c2a
- Mode: Integration
- Branch: codex/20260907-merge-all-changes-8f3c2a-merge-all-changes
- Worktree: /Users/inmanx/Documents/makelore-integrate-all-8f3c2a
- Base commit: f8eee430f4f4167dc2ecc682ece96c652cdde14b
- Owner: codex
- Status: Transferred to Final Integration Gate
## Scope
- Inventory every local worktree and branch against `main`, then integrate all
completed, current-product changes into one reviewed candidate.
- Reconcile the overlapping September 6 Code, Project Configuration, Plugin,
and Canvas changes semantically rather than by file-order preference.
- Promote accepted task facts into canonical project memory, run the required
verification, and advance the local `main` branch without rewriting history.
## Intent And Constraints
- Preserve the Code, Canvas, and Robot product boundary. Do not restore the
retired Learning module, the retired Prompt Museum product route, or other
superseded historical branches merely because their refs still exist.
- Preserve Main-owned backend/runtime authority, `.makelore` project ownership,
the single light visual system, and ADR-007/ADR-008 trust boundaries.
- Treat the latest explicit user direction as authoritative where completed
Canvas explorations differ: Works remains on the right and the implemented
prompt/reference plan supersedes the earlier left-rail concept.
- Preserve source histories with ordinary commits/merges; do not reset, rebase,
force-push, delete worktrees, or discard unknown changes.
## Project Context Loaded
Task context:
- Task ID: `20260907-merge-all-changes-8f3c2a`
- Mode: Integration
- Branch: `codex/20260907-merge-all-changes-8f3c2a-merge-all-changes`
- Worktree: `/Users/inmanx/Documents/makelore-integrate-all-8f3c2a`
- Base commit: `f8eee430f4f4167dc2ecc682ece96c652cdde14b`
- Other active local tasks: nine September 6 feature/audit tasks and the
September 5 development-start task reported by `task_context.py status`.
- Overlap or semantic-conflict assessment: Plugin rehoming, project-gate
removal, and the Coding landing page overlap in App/Sidebar/configuration
paths but express compatible confirmed behavior. Canvas inspiration removal
overlaps the implemented right-Works/reference-plan redesign and must be
reconciled. The earlier left-Works concept is explicitly superseded by the
later right-Works direction; the audit's unconfirmed stage proposal is not a
canonical promotion source. No unresolved product-direction conflict remains.
Read:
- `.project-docs/05-agent-entry/{read-before-planning,memory-index,planning-gate,integration-gate}.md`
- `.project-docs/00-brief/{project-positioning,success-criteria}.md`
- `.project-docs/30-worklog/current-state.md` and every active peer task record
- `.project-docs/10-decisions/{decision-index,adr-007-ai-design-living-form-v2,adr-008-interactive-ai-app-scaffold}.md`
- `.project-docs/20-architecture/{system-overview,module-map,data-flow}.md`
- `.project-docs/40-domain/{business-rules,glossary}.md`
- `.project-docs/80-commitments/commitments.md`
- `.project-docs/90-maintenance/{stale-items,doc-update-policy}.md`
- The Plugin navigation task-owned decision proposal.
Relevant understanding:
- Project goal: ship one Electron product with Code, Canvas, and Robot while
keeping Renderer access behind Main-owned APIs and project state in
`.makelore`.
- Current integrated focus: a conversation-first Canvas governed by one Current
Specification and immutable Quotes, a Pi-only Code runtime, and minimal
interactive-AI project creation with an optional explicit Scaffold Skill.
- Active task scope: consolidate all completed current-product local changes,
reconcile canonical memory, verify the result, and promote it to local main.
- Active constraints: preserve history and unknown work, keep Learning retired,
avoid direct Renderer IPC/runtime access, and do not change backend contracts
incidentally.
- Decisions affecting this task: ADR-007 controls Canvas semantic authority;
ADR-008 controls project creation/Scaffold/release authority and is amended by
the confirmed simplified user-facing setup flow.
- Evidence, reflections, or commitments affecting this task: source task
verification is strong, but production service/package gates remain pending;
Prompt Museum's mixed commitment must retain Canvas deletion/re-Quote checks
while dropping the retired Museum UI smoke.
- Files or modules likely involved: `src/App.tsx`, layout/sidebar/title-bar,
Project Configuration and Plugins pages, Code chat entry, Canvas page/store
components, focused unit/Electron tests, README, and canonical project docs.
- Unknowns, stale docs, or conflicts: several ready-for-integration branches may
still hold uncommitted work; old local branch refs include explicitly
superseded Learning work and must be classified rather than blindly merged.
Gate result:
- Passed.
## Outcome
- Inventoried every local worktree and branch against `main`, including dirty
feature worktrees, audit-only artifacts, and historical refs. Committed each
completed product source in its owning worktree before integration:
`af13aca` (project gate), `ce90f57` (Code landing), `be1764e` (Plugin
rehoming), `1562a49` (Canvas plan/reference redesign), and `b22559a`
(Canvas inspiration removal). The existing startup record was preserved as
`1dfa922` on `main`.
- Integrated those sources with ordinary merges `39d7b7e`, `a91c7e3`,
`f6c5961`, `ea1219c`, and `e069ec6`. Conflict resolutions preserve the
directory-only project flow, direct valid-project chat entry, no-Agent empty
state, Project Configuration-owned Plugin sheet, right-side Canvas Works rail,
central active plan, editable final Prompt/reference aliases, and retired
Prompt Museum Renderer surface.
- Reconciled overlapping files semantically. In particular, the new
`DesignWorksRail` also had its inspiration action removed even though that file
did not exist on the inspiration-removal source branch; the Plugin sheet keeps
Project Configuration mounted without restoring duplicate Plugin Services;
and valid projects no longer branch on the legacy `initialized` Boolean.
- Fixed two integration-only verification defects: restored the missing `Bot`
icon import in the Code empty-Agent state, and made the Canvas unit fixture
establish a complete authenticated identity. Updated Electron journeys whose
assertions still assumed pre-integration project routing, Canvas shell, or
non-exact accessible names.
- Promoted accepted facts into README, ADR-007, ADR-008, the decision index,
architecture maps/flows, business rules, glossary, commitments, and current
state. Prompt Museum production smoke was removed from the mixed commitment
while Canvas reference/re-Quote/deletion smoke remains pending.
- Excluded `codex/20260903-remove-learning-7a91` and
`codex/learning-player-release-fix`: both are historical Learning refs
superseded by the already integrated complete Learning removal and would
violate the current Code/Canvas/Robot boundary. Unconfirmed Canvas audit
concepts, generated reports, and source-worktree artifacts were also left
uncommitted and untouched.
## Verification
- `corepack pnpm install --frozen-lockfile` — passed with pinned pnpm 10.33.4.
- `corepack pnpm run typecheck` — passed.
- Focused Vitest across 15 affected files — 184/184 passed.
- `corepack pnpm test` — 223 ordinary files, 1,882 passed and 3 skipped;
isolated pressure suite 1/1 passed.
- `corepack pnpm run lint:check` — 0 errors; 5 pre-existing warnings remain in
`src/pages/Home/index.tsx` and `src/pages/Makelore/index.tsx`.
- `corepack pnpm run build:vite` — Renderer, Electron Main, Preload, and release
utility worker builds passed; only existing Browserslist, mixed-import, and
chunk-size warnings were emitted.
- Targeted Electron E2E across Code identity/navigation, Project Configuration,
Plugin lifecycle/navigation, and Canvas — 12/12 passed.
- `git diff --check` passed after conflict and follow-up fixes.
## Follow-ups
- Existing production/install gates remain unchanged: real-account Canvas V2
reference/Quote/deletion smoke, Plugin server availability, signed platform
packages, and the source+built+contract publication chain are still external
follow-ups. This integration does not claim them.
- Local `main` promotion is in scope for this task. Remote push is not authorized
by the user's request and is not performed.
- Because the ownership checker audits every merge-parent change since this
task's pre-merge base, its expected foreign-task-record finding is transferred
to fresh Integration task `20260907-finalize-merge-all-4d72c1`, based on this
reconciled candidate. No history is rewritten to bypass that audit.
## Promotion Candidates
- None. This Integration task applies the reviewed source-task outcomes directly
to canonical project memory.

View File

@@ -60,17 +60,22 @@
to system Node. New and idle parent workers refresh automatically, active parents switch
only after settlement, and child workers never inherit Device Package resources.
- Device Packages appear as a separate `本机` source beside Official Plugins in the
unified `/plugins` workspace and never enter Account Library, Marketplace Package
unified Plugin workspace and never enter Account Library, Marketplace Package
Store, Release, Channel, Admission, project enablement, Agent assignment, or server
billing state.
- Project Configuration owns the only user-visible unified Plugin workspace. Its
`插件` ResourceCard opens `/project-config/plugins` as a same-page wide sheet while
the configuration page remains mounted. Code sidebar must not add a standalone
Plugin entry; `/plugins` and older Plugin URLs are compatibility redirects only.
- Code-owned official bundled Plugins may be `platform_hosted` or `skill_only`.
`makelore.project-scaffold` retains Account Library, project enablement, Agent
assignment, Release, and Admission state while its exact Skill/templates/`.mjs`
ship only in the signed client. Downloadable Marketplace artifacts remain P0
text/image-only and must reject `.mjs`; official bundled authority is not inferred
from provider metadata or an uploaded ZIP.
- 面向用户的 AI 编程新建流程必须在 `interactive_ai_app`(“交互式 AI 应用”)和 `custom` 中选择;`ProjectType` 是产品类型,创建后不能通过 UI 或 Host API 修改。历史 `mini_game` / `mini_program` 仅在读取边界归一为 `interactive_ai_app`,读取本身不改写配置;未传类型的兼容 API 调用按 `custom` 处理。
- 新建项目只原子生成 `.makelore/project.json``knowledge/`。交互式 AI 应用的固定六文件 Vite 起步树只能由用户明确调用官方 bundled `makelore.project-scaffold` Plugin 中的 `makelore-project-scaffold` Skill 生成;脚本必须先预检全部目标、不得覆盖已有路径,受控失败只回滚本次创建内容,且不得安装依赖、访问网络、构建、上传或提交审核
- 面向用户的 AI 编程新建流程只要求选择目录,不展示 `ProjectType`、模板、原始项目 UUID、绑定或独立副本选项。Renderer 写入内部默认 `interactive_ai_app`Main 自动生成 UUID创建后类型仍不能通过 UI 或 Host API 修改。既有 `custom` 项目继续可用,历史 `mini_game` / `mini_program` 仅在读取边界归一为 `interactive_ai_app`不改写配置;未传类型的底层兼容 API 调用`custom` 处理。
- 新建项目只原子生成 `.makelore/project.json``knowledge/`,完成后可直接进入聊天;有效旧配置仅缺 `projectId` 时由 Main 串行生成并持久化一次 UUID。缺失或无效的其他 metadata 仍进入 Project Configuration`initialized` 布尔仅为兼容字段,不得作为有效项目的导航、工作区或 Agent 创建 gate
- 交互式 AI 应用的固定六文件 Vite 起步树只能由用户可选地明确调用官方 bundled `makelore.project-scaffold` Plugin 中的 `makelore-project-scaffold` Skill 生成。Skill 不是项目创建、进入聊天或创建首个 Agent 的前置条件;脚本必须先预检全部目标、不得覆盖已有路径,受控失败只回滚本次创建内容,且不得安装依赖、访问网络、构建、上传或提交审核。
- `ProjectType` 不等于 `BuildPreset` 或 Scaffold 状态:规范可发布类型映射到内部受控 Vite preset本地 `projectType` 和 Skill 检测结果都不是授权边界Main-owned 安全打包、Host API 和服务端包体校验仍必须执行。
- 非专业用户只执行一次“提交审核”;构建通过后由运营审核,审核通过即直接发布。
- 创建者发布唯一链路是项目配置“一键提交审核” → Main 本地 npm/Vite 构建 → 最终 built snapshot 的客户端 UX 预检 → source+built+artifact contract 上传 → 服务端校验/固化 → 运营审核不恢复独立发布上传页、云部署工作台、Compose/deploy-check、自动 watcher/arm/upload 或手工 ZIP 入口。
@@ -109,7 +114,7 @@
- 每个 mutation 使用稳定 command 与 semantic operation identity。transport-unknown 只能重放原命令business rejection、timeout 或用户再次点击不能自动生成新的业务意图。
- Direction projection 是 Specification 真值。event cursor、assistant delta、Task progress 与 Asset event 只用于传输/资源收敛,不得推进或覆盖 canonical specification revision。
- 用户提交 chat 后,客户端可以立即把同一个 pending operation 投影为临时用户气泡,并明确显示“发送中”或“正在确认”;只有服务端返回的 canonical turn 才进入 conversation timeline。确定失败时必须让原草稿重新可编辑不得把临时投影持久化为第二条消息。
- `design.assistant.delta` 只用于未完成回复的传输和结果收敛,不得进入 canonical conversation timeline。客户端可以把它临时显示为与同一 pending chat identity 绑定的单个未完成助手气泡;确定收敛后必须由 canonical turn 替换unknown outcome 则保留原 identity 与已有片段。不得把片段伪装为完成回复、持久化为第二条消息、因其他 operation 更新而全局清除或另加独立的整理进度栏。AI 当前整理出的设计理解仍由右侧 Current Specification 投影承载;连接重叠或事件重放按 connection generation 与 `chunkIndex` 去重收敛。
- `design.assistant.delta` 只用于未完成回复的传输和结果收敛,不得进入 canonical conversation timeline。客户端可以把它临时显示为与同一 pending chat identity 绑定的单个未完成助手气泡;确定收敛后必须由 canonical turn 替换unknown outcome 则保留原 identity 与已有片段。不得把片段伪装为完成回复、持久化为第二条消息、因其他 operation 更新而全局清除或另加独立的整理进度栏。AI 当前整理出的设计理解仍由中央 active 制作方案投影承载;连接重叠或事件重放按 connection generation 与 `chunkIndex` 去重收敛。
- Main 只向 Renderer 投影已知错误码的固定中文提示未知上游错误文本必须脱敏为通用提示Works Token、stream ticket、provider internals 留在 Main/服务端。
- AI 绘画 Workspace JSON 请求与 shared Works token refresh 必须覆盖取凭据、发请求和读取响应 body 的完整 30 秒 deadline即使底层 transport 忽略 abort调用方也必须确定性结束为 `504 DESIGN_WORKSPACE_REQUEST_TIMEOUT` 并释放共同等待者。Electron-to-Node 透明 fallback 仅允许 `GET`/`HEAD`/`OPTIONS`mutation 不得因 transport failure 被隐式重放,任何重试必须由上层显式幂等合同授权。
- `design.quote.request` 必须绑定 exact current Specification revision 并返回 immutable Quote任何 production-meaning edit 都需要新 revision 与新 Quote。对话或 Current Specification 就绪态可以引导用户请求并查看 Quote桌面端可定位到报价区、移动端可打开报价面板但该动作不得创建 Task。
@@ -117,8 +122,11 @@
- 图片/视频 source 必须是当前 Workspace 的 canonical Asset并通过 typed binding 进入 Specificationmedium/role 决定用途,不得从 quick-reply 文案、V1 Brief 或本地路径推断。
- Task/Asset reconciliation 只能更新 Workspace resources已经落库但事件迟到的 Task 可通过 refresh 恢复,不能覆盖 Living Form、local drafts 或 pending Design input。
- 删除 Canvas 项目必须要求用户完整输入项目名并通过 Main-owned Workspace DELETE。成功后被删 Workspace 的会话、任务和资产不得继续留在 Renderer 可访问状态;服务端决定软删除、任务取消、预留积分释放和运行中任务结算。
- Prompt Museum 只展示服务端审核并带稳定作者、来源、许可证/署名和素材授权信息的内容;客户端不内置数据集、不推断缺失版权、不提供投稿/点赞/评论/收藏/关注/排行,也不自动发送或生成选中的 Prompt
- Prompt Museum Renderer 只能通过 Main-owned 固定 GET 路由读取列表和详情。Works Token 不得进入 Renderer列表查询只允许搜索、使用场景、风格、主体、语言、模型、游标和限制字段。需要受保护图片时必须新增 Main-owned 媒体代理,不能把 access token、内部路径或用户隐私放进图片 URL
- Canvas 桌面布局把 conversation 与唯一 active 制作方案放在中央,把 Workspace 选择/创建/删除放在 320340 px 全高右侧 Works rail紧凑布局使用同一个右侧 Sheet。Canvas 路由不挂载全局左栏,也不得恢复“获取灵感”入口
- Active 制作方案的 `content.concept` 是用户可直接编辑的最终 Prompt。Reference 通过稳定 reference ID、真实 Workspace Asset binding 和连续 `@图片N` alias 关联Prompt 是“图片如何影响生成”的唯一可见表达binding row 只能管理缩略图、alias、文件与替换/删除状态,不得重复 purpose/preserve/style/strength 编辑器
- 引用了未绑定 alias 时必须显示对应上传位并阻止 Quote 请求/确认。添加、替换、删除 reference 必须通过既有 typed operations 形成新 Specification revision删除同时清理 binding 并重排后续 alias已有 alias 不重复插入。Reference 数量/媒体上限只能来自服务端能力,不得复制外部参考产品的硬编码限制。
- Prompt Museum 已退出当前产品面Canvas 不显示入口App 不挂载或打包其 Renderer 页面,历史 `/image-prompts` 路由只返回 `/image-canvas`。未经新的明确产品决策,不得恢复入口或页面。
- Dormant Prompt Museum Main API/auth/media validation 和共享 DTO 可为兼容/安全保留,但 Works Token、内部路径或用户隐私仍不得进入 Renderer保留代码不代表服务端内容、授权或产品入口已启用。
- 产品界面当前只支持中文;系统语言与历史持久设置中的其他值必须归一为 `zh`,不得保留不可达的伪语言选择。
- Learning 已从产品入口、路由、Renderer、Main Host API、共享 DTO 和打包资源中移除,不保留兼容实现。客户端不读取、迁移或展示历史下载课程,也不自动删除用户现有课程数据;任何清理功能必须另行设计为用户明确控制的可恢复维护动作。
- `game-engine` 不再是内置 Coding Skill。`planning-with-files` 在复杂任务中把 `task_plan.md``findings.md``progress.md` 写到当前项目根目录;不得写入 Skill 安装目录或用户目录。
@@ -143,10 +151,9 @@
- Updater 生产恢复仍需对齐权威版本、发布正式签名/公证的平台产物,并从旧安装版本执行发现、下载、重启和安装 smoke源码提示修复本身不构成发布链恢复。
- AI Canvas V2 仍需安装包真实账号 smokedirect edit、chat edit、Quote request、confirmation、background completion、result download 与 deliberately interrupted unknown-result retry生产 Provider 激活需另行授权。
- Robot Guided Hotspot Binding default-on 发布仍需确认指定硬件/固件确实提供被审计的开放 Hotspot/Portal、部署端签发严格六位 ASCII 数字码且与 Works validator 的时效/消费语义一致,并完成 Windows 真机、签名 macOS x64/arm64 native worker/association 与真实设备端到端 smoke。
- Prompt Museum 客户端契约和页面完成不等于 Works Square 内容后台、审核数据或 CDN 已部署;上线前需以真实登录账号验证列表、详情、署名链接、分页、图片和 Prompt 回填。
- 三模块入口策略上线前需确认 Works `module_access` migration/API 已部署,安装包包含对应客户端,并用真实账号逐一关闭 Code、Canvas、Robot 验证卡片、根/深层/别名路由和独立 API 授权。
- Makelore Code 已有 Windows x64 最终安装包证据、WSL2/WSLg Linux 证据,以及 macOS arm64 本地未签名 DMG 的 mounted-image Agent Server initialize/shutdown 证据。macOS arm64 的签名/公证与完整 process-enumeration gate、macOS x64、native non-WSL Linux desktop/compositor 仍未验收;在补齐前不得宣称 cross-platform release-ready。真实 Provider 风险虽经用户明确豁免,但仍不得从 loopback/provider-shaped smoke 推断为真实 Provider Pass。
## Last Reviewed
2026-09-04
2026-09-07

View File

@@ -2,7 +2,7 @@
| Term | Meaning | Notes |
|---|---|---|
| `ProjectType` | 创建项目时选择且之后不可变的产品类型 | 规范值为 `interactive_ai_app``custom`历史 `mini_game` / `mini_program` 读取时归一为前者,缺少字段按 `custom` 处理 |
| `ProjectType` | 项目配置中持有且之后不可变的内部产品类型 | 普通新建不展示选择并默认 `interactive_ai_app`;既有 `custom` 继续兼容,历史 `mini_game` / `mini_program` 读取时归一为前者,缺少字段按 `custom` 处理 |
| `BuildPreset` | 平台内部用于构建和验收项目包的受控实现 | 不等于 `ProjectType` 或 Scaffold 状态;交互式 AI 应用使用固定 Vite preset |
| Project Scaffold Skill | 官方 bundled Marketplace Plugin `makelore.project-scaffold` 中由用户明确调用、独立版本化的起步文件生成与发布准备度指导 | `.mjs` 只来自固定客户端资源;不覆盖路径、不安装/构建/上传/提审;项目创建服务和 Main/Works 发布权威不属于该 Skill |
| Main-owned Release Build | Electron Main 对安全源码快照执行固定 npm 与项目 lockfile Vite 的本地构建 | Vite config/plugins 以桌面用户权限执行,不是 sandboxRenderer 不获得路径、归档或 origin |
@@ -13,12 +13,12 @@
| `legacy_retired` | 旧自动部署中间态迁移后的终止状态 | 不恢复 watcher、登录等待或自动上传提示用户从项目配置重新提交 |
| `play_url` | 服务端为已发布作品提供的公共播放地址 | 客户端优先使用并执行同源 HTTPS、精确 App 路径和版本状态校验 |
| `runtime_url` | `play_url` 上线期间的旧公共播放字段 | 仅保留一个客户端版本的兼容回退,稳定迁移后删除 |
| AI Design Workspace | 一个 AI 绘画设计项目 | 持有 Conversation 列表、生成任务和资产;不是单条对话 |
| AI Design Conversation | Workspace 内一条独立设计对话 | 持有消息、Brief、Quote、`turnRevision` 和服务端持久 Agent Session 绑定 |
| Persistent Conversation Session | 服务端为 Conversation 持久保存的 Agent Gateway Session | 客户端只重连事件流,不在注销或退出时 DELETE |
| Design Generation Quote | 服务端对当前最终 Prompt 与 generation parameters 返回的可确认报价 | 客户端编辑后请求重报价,但不自行计算尺寸、供应商价格或设计点 |
| Prompt Museum | Canvas 的服务端驱动、只读策展灵感模块 | 展示经审核的预览、Prompt、分类和署名不是社区客户端不打包内容数据集 |
| Pending Museum Prompt | 用户点击“使用此 Prompt”后在 Renderer 进程内保存的一次性回填状态 | Canvas 消费后清除;只填充输入框,不自动发送或生成 |
| AI Design Workspace | 一个 AI 绘画设计项目 | 持有一个 current Direction、Current Specification、持久 Agent Session、conversation timeline、生成任务和资产 |
| AI Design Conversation Timeline | Workspace 内的交互历史 | 不是可独立创建/选择的语义权威Current Specification 才是生成真值 |
| Persistent Design Session | 服务端为 Workspace current Direction 持久保存的 Agent Gateway Session | 客户端只重连事件流,不在注销或退出时 DELETE |
| Design Generation Quote | 服务端针对精确 Current Specification revision 编译的 immutable 可确认报价 | 客户端编辑后必须请求新 Quote只确认 Quote ID不自行计算 Provider 参数或 Token Points |
| Prompt Museum | 已退出当前产品面的历史策展模块 | Canvas 无入口App 不挂载/打包其页面,历史 URL 重定向到 CanvasMain API/auth/media 与 DTO 仅 dormant 保留 |
| Reference Alias | Active Canvas Prompt 中连续的 `@图片N` 公共引用标记 | 对应稳定 reference ID 与真实 Workspace Asset bindingPrompt 表达用途binding row 只管理文件身份与状态 |
| Robot Provisioning | 让 Robot 获得目标 Wi-Fi 凭据并尝试联网的阶段 | 与云端 Activation、账号 Binding、协议在线是不同阶段V1 由现有固件 Hotspot portal 完成 |
| Robot Activation | Robot 联网后向既有服务获取六位激活码的阶段 | 激活码由设备展示/播报给用户Makelore 不生成该码 |
| Robot Binding | 用户把六位激活码和 Agent 提交到 Works Square建立账号侧设备关系 | `bound` 不等于设备当前 online 或 protocol-ready |

View File

@@ -10,9 +10,9 @@ Track future-facing memory: promised follow-ups, unfinished loops, timed checks,
| 2026-08-17 | 验收用户级三模块入口策略的真实发布链 | 发布包含 Learning 移除集成 `bd0873f` 的 Makelore 安装包前 | Works 服务端/客户端/发布集成 | Pending | 部署 `module_access` migration 和 `/api/auth/me` API重新打包并安装 Makelore使用真实账号依次关闭 Code、Canvas、Robot重启后验证卡片置灰/不可点、根/深层/别名路由阻断、`/settings` 仍可访问和 terminal `401` 退出;另行以直接 API 请求确认服务端授权,不以 UI 置灰代替 |
| 2026-08-20 | 部署并验收 AI Learning 项目目录完整链路 | Learning 已于 2026-09-04 从 Makelore 移除 | Works 运营后台/服务端/客户端/发布集成 | Superseded / Closed | 不再为 Makelore 客户端部署或验收 Learning 项目目录 API。历史课程数据保持不读、不迁移、不自动删除如未来恢复 Learning必须重新作产品决定和 ADR。 |
| 2026-08-17 | 验收首次项目封面并补齐已有资料条件写 | 发布包含源 `145a6ce` 的 Makelore 前,或启用 draft/published metadata 编辑前 | Works 服务端/客户端发布集成 | Partial / Pending | 首次封面已由服务端源 `407c883` 与客户端源 `145a6ce` 通过单请求绑定和失败补偿落地;仍需先部署服务端、重新打包客户端,并以真实对象存储/账号验证 404→create 409、cover 失败和版本阻断。已有资料编辑继续等待 metadata revision/ETag 与 draft-only 条件写;在此之前保持 existing version-only。 |
| 2026-08-16 | 验收 Prompt Museum 与 Canvas 删除/重报价的真实服务端链路 | 发布包含 `26b52d7` Canvas 行为的安装包前 | 客户端/服务端集成 | Pending | 使用真实 Works 账号核对 Museum 列表/详情/分页/筛选/署名/CDN/Prompt 回填,并确认固定相对媒体路径可经 Main Bearer 代理、401 刷新、10 MiB/可信 raster MIME 边界后在 Renderer 展示;核对最终 Prompt/options 重报价和确认设计点;删除 Workspace 后确认软删除可见性、未提交任务取消/预留积分释放、已运行任务结算。保留 Main 错误脱敏和严格 DTO/HTTPS 投影,不以客户端回归替代服务端验收 |
| 2026-08-16 | 验收 Canvas 删除、Reference 与重报价的真实服务端链路 | 发布包含当前 Canvas V2 行为的安装包前 | 客户端/服务端集成 | Pending | 使用真实 Works 账号核对 editable final Prompt、`@图片N` Asset binding、缺失 binding 阻断、新 Specification revision 重报价和 Quote-ID 确认;删除 Workspace 后确认软删除可见性、未提交任务取消/预留积分释放、已运行任务结算。Prompt Museum 已退出产品面,不再要求 Museum UI/CDN/回填 smokedormant Main 媒体安全边界仍不得放宽。 |
| 2026-08-16 | 验收 default-on Robot Guided Hotspot Binding 的 Windows/macOS 真实设备链路 | 下一份包含页面内热点连接行为的安装包发布前 | 客户端/硬件/服务端集成 | Pending | 核对精确出货固件与固定 Portal、六位码发行/消费语义;执行 Windows Robot 真机扫描/连接、签名 macOS x64/arm64 CoreLocation/CoreWLAN/worker/ASAR/Koffi smoke以及真实 Host/native Electron 端到端配网+Binding保留 `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` 回滚并记录支持矩阵 |
| 2026-08-10 | 完成客户端提交到 App `play_url` 播放的真实生产整链验收 | source+built+contract 服务端协议、OSS immutable Release、CDN/Edge 与 App 消费链成组集成后 | 客户端/服务端集成 | Pending | 服务端先部署支持规范 `interactive_ai_app` 和历史别名的合同,再安装匹配客户端;使用真实账号执行交互式 AI 应用创建、显式 Scaffold Skill 初始化、客户端本地构建与同字节预检、双归档提交、服务端逐字节校验/不可变 Release 固化、运营批准、CDN 发布、App 播放与监控核对。旧 `mini_game` / `mini_program` 只验证兼容读取,不作为新建选项;如需不可绕过 runtime gate另行设计可信 verifier |
| 2026-08-10 | 完成客户端提交到 App `play_url` 播放的真实生产整链验收 | source+built+contract 服务端协议、OSS immutable Release、CDN/Edge 与 App 消费链成组集成后 | 客户端/服务端集成 | Pending | 服务端先部署支持规范 `interactive_ai_app` 和历史别名的合同,再安装匹配客户端;使用真实账号执行目录式交互式 AI 应用创建、按项目需要可选调用 Scaffold Skill、客户端本地构建与同字节预检、双归档提交、服务端逐字节校验/不可变 Release 固化、运营批准、CDN 发布、App 播放与监控核对。普通新建不展示 `custom``mini_game` / `mini_program` 选项;旧值只验证兼容读取如需不可绕过 runtime gate另行设计可信 verifier |
| 2026-08-12 | Windows/macOS 发布流水线保留固定 npm/Pi 运行时与 Device Package 产物门禁 | 每次生成正式 Windows 或 macOS 安装器时 | 客户端发布 | Partial / Pending | 运行目标平台的 publish-runtime、artifact、Pi 与 final packaged proof启动最终 Agent Server 并确认它从 staged `pi-runtime` manifest/root 初始化,再用安装后的首个 Conversation 确认不出现 runtime-unavailable 投影。安装 exact-main 客户端后,还需完成至少一个 npm/Git/loose-Skill prepare→confirm 流程,并以包含两个 extension 的已启用 Device Package generation 验证首个 Makelore bridge 与所有附加 extension/Skill 均生效、禁用项不加载、新/idle parent 刷新且 child 为空;同时完成 `makelore-project-scaffold` prepare→confirm→install→initialize验证非空 Skill `scripts/` 披露、应用 Node 路径、既有文件不覆盖以及卸载不删除项目文件。源 `5d7a235` 已通过本地未签名 macOS arm64 DMG 的 read-only mounted-image initialize/shutdownDMG SHA-256 为 `6d0216da6c30f7fed537041b37c69811b8e025af3e9cccf85a64c690e29ecb7b`;当前安装的 1.2.6 客户端早于 `5a2f0eb` / `17664c5` 修复。仍需签名/公证、完整 process proof、实际替换安装与首个 Conversation、新 Windows artifact以及签名 macOS 和 native Linux 的脚手架 Skill 运行证据;不得以 prepare-only 或 workspace real-process 测试替代。 |
| 2026-08-10 | 删除客户端 `runtime_url` 兼容回退 | 一个客户端兼容版本结束,且服务端与存量数据稳定提供 `play_url` | 客户端 | Pending | 删除类型字段、读取分支和对应回归测试 |
| 2026-08-11 | 部署并验收 AI 绘画多 Conversation 服务端契约 | 发布包含多会话客户端之前 | 客户端/服务端集成 | Pending | 确认迁移 `0033`、Conversation list/create/read/turn/confirm API、持久 Agent Session 与事件字段已上线 |

View File

@@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import {
Bot,
ChevronRight,
CircleAlert,
FolderKanban,

View File

@@ -32,15 +32,14 @@ test.describe('AI Design V2 workspace', () => {
});
await page.getByTestId('ai-module-option-painting').click();
const worksRail = page.getByTestId('image-workspace-works-rail');
await expect(worksRail).toBeVisible();
await expect(worksRail.getByRole('button', { name: /.*/u })).toHaveCount(0);
await expect(page.getByLabel('正在加载 AI 设计')).toBeVisible();
await expect(page.getByRole('button', { name: /.*/u })).toHaveCount(0);
await page.evaluate(() => {
window.location.hash = '#/image-prompts';
});
await expect.poll(() => page.evaluate(() => window.location.hash)).toBe('#/image-canvas');
await expect(page.getByTestId('image-workspace-works-rail')).toBeVisible();
await expect(page.getByLabel('正在加载 AI 设计')).toBeVisible();
} finally {
await closeElectronApp(app);
}
@@ -352,9 +351,6 @@ test.describe('AI Design V2 workspace', () => {
await page.getByTestId('ai-module-option-painting').click();
await expect(page.getByTestId('image-workspace')).toBeVisible();
await expect.poll(async () => await app.evaluate(() => Boolean(
(globalThis as typeof globalThis & { __designE2eProfileReady?: boolean }).__designE2eProfileReady,
))).toBe(true);
await expect(page.getByTestId('image-workspace-conversation')).toBeVisible();
await expect(page.getByTestId('image-workspace-works-rail')).toBeVisible();
await expect(page.getByRole('heading', { name: '和 AI 一起完善创作' })).toBeVisible();
@@ -391,13 +387,13 @@ test.describe('AI Design V2 workspace', () => {
await page.setViewportSize({ width: 375, height: 800 });
await expect(page.getByTestId('image-workspace-conversation')).toBeVisible();
await expect(page.getByTestId('youth-creation-card')).toBeVisible();
await page.getByRole('button', { name: '作品' }).click();
await page.getByRole('button', { name: '作品', exact: true }).click();
await expect(page.getByTestId('image-workspace-works-rail')).toBeVisible();
await page.keyboard.press('Escape');
await page.setViewportSize({ width: 768, height: 800 });
await expect(page.getByTestId('image-workspace-conversation')).toBeVisible();
await expect(page.getByRole('button', { name: '作品' })).toBeVisible();
await expect(page.getByRole('button', { name: '作品', exact: true })).toBeVisible();
await page.setViewportSize(desktopViewport ?? { width: 1280, height: 800 });
await expect(page.getByTestId('image-workspace-works-rail')).toBeVisible();

View File

@@ -17,6 +17,8 @@ test.describe('Unified project plugin workspace', () => {
await page.getByTestId('sidebar-create-project').click();
await page.getByRole('button', { name: '选择路径' }).click();
await page.getByRole('button', { name: '确认创建' }).click();
await expect(page.getByTestId('coding-chat-panel')).toBeVisible();
await page.getByRole('button', { name: '创建项目智能体' }).click();
await expect(page.getByTestId('project-configuration-page')).toBeVisible();
await app.evaluate(({ ipcMain }) => {
@@ -95,7 +97,11 @@ test.describe('Unified project plugin workspace', () => {
await expect(page.getByTestId('project-plugins-sheet')).toBeVisible();
await expect(page.getByTestId('plugins-page')).toBeVisible();
await expect(page).toHaveURL(/\/project-config\/plugins\?scope=project/);
await expect(page.getByText('项目配置')).toBeVisible();
await expect(page.getByTestId('project-configuration-page').getByRole('heading', {
name: '项目配置',
exact: true,
includeHidden: true,
})).toBeAttached();
await page.getByRole('button', { name: '查看开发数据服务详情' }).click();
await expect(page.getByText('按平台包含,不按单次插件调用扣点。')).toBeVisible();
const localProjectId = await app.evaluate(() => (

View File

@@ -85,6 +85,15 @@ describe('AI Design Canvas page', () => {
initialized: true,
accessToken: 'token',
expiresAt: Date.now() + 60_000,
lastActiveAt: Date.now(),
canRefresh: true,
user: {
username: 'canvas-tester',
userId: 'canvas-user',
tenantId: null,
deptId: null,
authorities: [],
},
});
useImagePromptMuseumStore.setState({ pendingPrompt: null });
useImageWorkspaceStore.getState().reset();