Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b8fe14e
docs: 更新统一 Extension Release 组装契约引用
xiaoland Oct 13, 2026
fafa241
refactor(release): Web 原生产物消费统一 Extension 发布计划
xiaoland Oct 13, 2026
2f903c8
docs(shared): 更新独立分发与 Peer 参与契约
xiaoland Oct 13, 2026
55b85a4
feat(core): 将原生插件版本与启用意图下移到 Peer
xiaoland Oct 13, 2026
7f8e825
feat(extensions): 独立发布 MF 并按 Peer 管理原生版本
xiaoland Oct 13, 2026
6f751d8
docs(shared): 保留共享业务状态与旧配置来源边界
xiaoland Oct 13, 2026
f0f8b11
build(preview): 固定 Toolkit v2 包并验收原生分发静态目录
xiaoland Oct 13, 2026
1b87edc
fix(extensions): 安装时为目标 Peer 预选可用原生版本
xiaoland Oct 13, 2026
3865aaa
fix(twitter): 将授权 Peer 选择与共享采集任务区分
xiaoland Oct 13, 2026
64c5a83
test(extensions): 允许隔离 loopback Registry 验证并保留 HTTPS 边界
xiaoland Oct 13, 2026
02512e8
test(extensions): 对齐参与记录读路径并明确数据库错误
xiaoland Oct 13, 2026
3fbeee5
fix(client-web): retry cold content after native restore
xiaoland Oct 13, 2026
c375ff3
fix(extensions): scope restore completion to its host
xiaoland Oct 13, 2026
a2c5441
fix(core): release native resolver registrations by exact owner
xiaoland Oct 13, 2026
5a81d48
fix(extensions): release resolver classes on native disposal
xiaoland Oct 13, 2026
b9a0335
fix(client-web): keep native controls busy during initial restore
xiaoland Oct 13, 2026
3ef63c1
fix(client-web): read back intent after failed native commands
xiaoland Oct 13, 2026
55932ee
feat(core): 按原连接只读确认插件选择结果
xiaoland Oct 13, 2026
ceae824
fix(web): 收敛插件选择结果并保护 Peer 切换与恢复
xiaoland Oct 13, 2026
c833168
docs(shared): 同步插件意图与恢复契约
xiaoland Oct 13, 2026
6831906
fix(web): 旧选择读回不得关闭重新打开的窗口
xiaoland Oct 13, 2026
83cd267
test(web): 按当前浏览器标识验证切换后的 Host
xiaoland Oct 13, 2026
b6c967c
fix(web): 插件操作后读回状态不被迟到采样覆盖
xiaoland Oct 13, 2026
fb1dfb8
docs(shared): 消费已合并的独立分发契约
xiaoland Oct 13, 2026
424e082
build(web): 消费正式 Runtime 与 Toolkit 制品
xiaoland Oct 13, 2026
1468f3b
build(web): 准入 Core main 的精确 v2 制品
xiaoland Oct 13, 2026
32bfc43
docs: clarify browser maintenance during protocol upgrade
xiaoland Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .changeset/interaction-quality.md

This file was deleted.

10 changes: 0 additions & 10 deletions .changeset/schema-forms-tabs.md

This file was deleted.

9 changes: 6 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
run: go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.12 .github/workflows/*.yml

core-release:
name: Resolve stable core release
name: Resolve admitted Core release
runs-on: ubuntu-latest
outputs:
contract_revision: ${{ steps.release.outputs.contract_revision }}
Expand All @@ -64,7 +64,10 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Resolve stable once to an immutable release
- name: Verify canonical candidate admission boundaries
run: node --test scripts/test-core-release.mjs

- name: Resolve admitted Core once to an immutable release
id: release
run: node scripts/resolve-core-release.mjs

Expand Down Expand Up @@ -121,7 +124,7 @@ jobs:
--core-package packages/core/package.json
--artifact-directory extensions/twitter/dist/client-web

- name: Verify publication recovery over HTTP
- name: Verify independent MF publication
run: node --test scripts/test-extension-publication.mjs scripts/test-core-sdk-publication.mjs

peer-database:
Expand Down
9 changes: 5 additions & 4 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Repository Architecture

This monorepo implements three logical client-side units across shared packages, applications, and
independently versioned Extension producers.
independently built Extension producers.

```text
Vue web application -----------+
Expand Down Expand Up @@ -32,16 +32,17 @@ locations, not Unit boundaries.
inbound → non-delegating local implementation.
3. Content: `Block.getHydratedContent()` → exact Resolver → solved value or safe browser handle →
registered renderer.
4. Native Extension: durable enabled intent → exact Release and Host-range preflight → native
manifest → initialize/activate; disable reverses lifecycle before removing Peer intent.
4. Native Extension: exact Peer selection and enabled intent → exact Release and Host-range preflight →
native manifest → initialize/activate; disable first records false intent, then releases native
runtime resources.

## Realization Surfaces

- `packages/core/` - shared models, database access, Peer protocols, storage/Resolver mechanics,
configuration/authentication, and Extension Host.
- `apps/client-web/` - Vue SPA, graph/list surfaces, settings, and static Vite artifact.
- `apps/client-webext/` - WXT browser surfaces and content scripts.
- `extensions/` - independently versioned native Module Federation producers.
- `extensions/` - independently built native Module Federation producers.
- `packages/ext-dev-utils/` - producer development support consumed by applications.

The package graph is ESM-first. Workspace Vite and WXT applications consume `@inkcre/core` source
Expand Down
15 changes: 15 additions & 0 deletions apps/client-web/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# @inkcre/client-web

## 0.1.3

### Patch Changes

- 7307dda: 按任务精简 Settings、Peer 与 Extension 界面,统一页面和浏览器标题,补齐场景化加载、刷新失败保留、保存与取消的动作反馈。修正重复检索、任务不存在及日志读取失败的可观察结果,保留失败后的恢复入口。
- 插件配置与业务状态在部署内共享;精确分发版本和启用意图分别保存在每个 Peer。Client Web 在同一插件入口管理各 Peer 的安装、版本和运行状态,并采用 Extension management v2。

原生 SDK 不再提供全局插件版本与 enabled 数组。新版 MF 使用 0.4 SDK 的参与记录接口,历史 MF 需按其 SDK 范围运行或明确选择新版;不会自动改写旧版本选择。Python 与 MF 分别从自己的仓库发布,插件负责共享数据契约兼容。

- 7307dda: Source 与 Peer 配置使用可视化表单,保留完整 JSON 编辑模式;Peers 页面可确认删除离线 Peer 并清理其扩展启用记录。Extension 浏览与版本选择交由 Registry,Web 接收精确版本并确认安装;Web 与 Module Federation 扩展统一升级正式 UI 2.2.0,Peer AI 凭据在 schema 中标记为密码输入。
- Updated dependencies [7307dda]
- Updated dependencies
- Updated dependencies [7307dda]
- @inkcre/core@0.4.0

## 0.1.2

### Patch Changes
Expand Down
4 changes: 2 additions & 2 deletions apps/client-web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@inkcre/client-web",
"version": "0.1.2",
"version": "0.1.3",
"private": true,
"type": "module",
"scripts": {
Expand All @@ -12,7 +12,7 @@
},
"dependencies": {
"@inkcre/core": "workspace:*",
"@inkcre/extension-runtime-client-web": "github:InKCre/ext-reg#57dcd80289285620a1fd27a0a48027e56c4ce7b1&path:/runtimes/client-web",
"@inkcre/extension-runtime-client-web": "https://github.com/InKCre/ext-reg/releases/download/runtime-client-web-v0.4.0/inkcre-extension-runtime-client-web-0.4.0.tgz",
"@inkcre/ui-web": "2.2.1",
"@module-federation/runtime": "^0.21.4",
"@supabase/postgrest-js": "^2.84.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
# ExtensionCard

A component that displays an installed Extension and opens focused Peer selection for enablement changes.
Displays one deployment Extension and its independent native participation on each Peer.

## Props
The `extension` prop supplies shared identity and configuration; `participations` supplies exact
Peer/distribution/version selections and enabled intent. `peers`, `livePeerIds` and `currentPeerId`
identify operation targets and determine local runtime, remote management or offline intent routing.
`peerSelectionDisabled` prevents mutation while target discovery is unavailable.

- `extension` (InstalledExtension, required): the canonical installed row
- `peers` (Peer[], required): available Peers, including this browser
- `livePeerIds` (ReadonlySet<string>, required): server-evaluated online Peers used for management routing
- `currentPeerId` (string, required): identifies this browser's running Host
- `peerSelectionDisabled` (boolean): blocks actions while the Peer list is unavailable
Each Peer row keeps version selection, enablement, actual running version and errors together.
The component obtains actual runtime status from the host rather than inferring it from enabled
intent. A selection change affects only that row. Removing a disabled participation retains shared
configuration and business data. An unobserved remote Host is not assigned a format from its name.

## Emits
`updated` emits the shared configuration row after a successful save. `participationChanged` asks the
parent to reload native choices after a successful targeted mutation. The running browser module
can contribute its own setup dialog; disabling that browser closes its contribution first.

- `updated`: Emitted with the canonical row after Peer, configuration, or version changes
- `uninstalled`: Emitted after the canonical row is removed

## Features

- Display canonical Extension Name, exact version, and optional nickname
- Choose one or more eligible Peers in an enable or disable dialog. Each selected Peer uses the existing current Host, remote Host, or durable-intent path. Partial failures remain visible and trigger a fresh installed-row read; no batch rollback or automatic retry occurs.
- Mount an Extension-owned setup contribution from this browser's running Web Distribution
- Keep setup availability independent of the Peer selection dialog; disabling this browser closes its setup surface first
- Link the exact installed release's available global, Core, and Web documentation even when the extension is disabled or has no browser distribution; distinguish missing documentation from failed discovery
- Edit extension configuration via JSON editor in a dialog
- Select a published Registry Release and change the exact shared version only while every Peer is disabled
- Auto-formats configuration as JSON for easier editing
- Prevents uninstall while any Peer remains enabled
Configuration editing offers schemas with their exact Peer/distribution/version source, plus JSON
editing without a schema. Documentation opens for an explicitly selected participation and follows
Registry-returned links. Missing documentation does not block runtime operations.
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@
margin: 0;
}

&__peer-row {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: sys-var(space, sm);
padding-block: sys-var(space, sm);
border-top: 1px solid sys-var(color, border, subtle);
}

&__peer-options {
display: flex;
flex-direction: column;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { type PropType } from 'vue'
import type { InstalledExtension, Peer } from '@inkcre/core'
import type { InstalledExtension, ExtensionParticipation, Peer } from '@inkcre/core'

// --- Props ---
export const extensionCardProps = {
extension: { type: Object as PropType<InstalledExtension>, required: true },
participations: { type: Array as PropType<ExtensionParticipation[]>, required: true },
peers: { type: Array as PropType<Peer[]>, required: true },
livePeerIds: { type: Object as PropType<ReadonlySet<string>>, required: true },
currentPeerId: { type: String, required: true },
Expand All @@ -13,5 +14,5 @@ export const extensionCardProps = {
// --- Emits ---
export const extensionCardEmits = {
updated: (_extension: InstalledExtension) => true,
uninstalled: () => true,
participationChanged: () => true,
} as const
Loading
Loading