From c059122f783a2bf5ab3469319a3686949ffb2862 Mon Sep 17 00:00:00 2001 From: YiJie Date: Thu, 10 Sep 2026 01:04:45 +0800 Subject: [PATCH 1/2] Use Host notifications for plugin operation feedback --- .agents/docs/notifications.md | 31 +++++++++ .gitignore | 2 + AGENTS.md | 16 +++++ README.md | 4 ++ notification-sdk-evidence.json | 50 ++++++++++++++ package-lock.json | 116 +++++++++------------------------ package.json | 9 ++- src/index.ts | 8 +-- src/provider-fleet-page.tsx | 8 ++- test/manifest.mjs | 2 +- 10 files changed, 148 insertions(+), 98 deletions(-) create mode 100644 .agents/docs/notifications.md create mode 100644 notification-sdk-evidence.json diff --git a/.agents/docs/notifications.md b/.agents/docs/notifications.md new file mode 100644 index 0000000..7d00d81 --- /dev/null +++ b/.agents/docs/notifications.md @@ -0,0 +1,31 @@ +# Operation notifications + +Provider requests use the Host `ctx.notifications.show()` service. Source icon/name, +card interactions, queue, expiry and suppression rules belong to Host. +Declare `notifications` in injection requirements. Field validation and persistent +business state stay beside the relevant control or object. Do not introduce a +custom Toast, page-wide operation error, or raw exception message. + +The [Host guide](https://github.com/cordisx/cordisx/blob/3158c0401a3f604727f623f1a8ac584017dd8540/.agents/docs/notifications.md) +owns usage and interaction guidance; the +[Protocol contract](https://github.com/cordisx/cordisx-protocol/blob/dfa2c5fa956184df11a97955b8e5c74a76cb8876/.agents/docs/notifications-v1.md) +owns the public API. This migration is an experimental candidate, not a release. + +## Reproduce the candidate SDK + +The local SDK archive is deliberately excluded from Git. Its exact Host commit, +Protocol source and hashes are recorded in [notification-sdk-evidence.json](../../notification-sdk-evidence.json). +From a Host checkout at `efbff656d84b482d51598bc5ba303d24134e0c62`, run the +[SDK builder](https://github.com/cordisx/cordisx/blob/main/.agents/docs/sdk-source-packaging.md) +into a fresh directory, then run from this package: + +```sh +mkdir -p .cache/sdk +cp /path/to/sdk/packages/cordisx-0.1.0-beta.2.tgz .cache/sdk/cordisx-efbff656d84b.tgz +npm ci --ignore-scripts +npm run check +``` + +Compare the archive SHA-256 with the evidence before installation. Use one shared +Protocol override; independent copies break branded public types. This explicit +SDK build avoids recursive Git prepare scripts and does not change the API contract. diff --git a/.gitignore b/.gitignore index 1eae0cf..edfe37a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ dist/ node_modules/ + +.cache/sdk/ diff --git a/AGENTS.md b/AGENTS.md index c1cebed..e86faf5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,3 +12,19 @@ - Read the organization [CSS ownership and maintenance rule](https://github.com/cordisx/cordisxmono/blob/main/.agents/rules/css.md) before changing CSS or a style-bearing DOM contract. + +## Operation notifications + +Use the public `ctx.notifications.show()` service for operation feedback and +require `notifications` in plugin injection. Do not create a custom Toast, +manually positioned alert, or page-wide success/error paragraph. Keep field +validation and durable business state beside the relevant object. Use stable +semantic `kind` values, localized safe text, and notification rules owned by Host; +never expose raw exceptions or notify on every polling attempt. +See the [Host notification guide](https://github.com/cordisx/cordisx/blob/3158c0401a3f604727f623f1a8ac584017dd8540/.agents/docs/notifications.md) +for the interaction contract and older-Host capability boundary. + +The notification migration currently uses exact feature-branch SDK/Protocol +revisions; it is not evidence of a formal release or a Mono pointer upgrade. + +Candidate setup: [notification migration](./.agents/docs/notifications.md). diff --git a/README.md b/README.md index 1d1f93e..f4938c9 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,7 @@ Desktop. The package remains `private`; use the explicit local source distributi [HISTORY.md](HISTORY.md) records the filtered owner history from the original Host-owned implementation. This repository is licensed under [AGPL-3.0-or-later](LICENSE). + +## Notification feedback + +See [operation notifications and candidate SDK setup](./.agents/docs/notifications.md). diff --git a/notification-sdk-evidence.json b/notification-sdk-evidence.json new file mode 100644 index 0000000..4bbcb09 --- /dev/null +++ b/notification-sdk-evidence.json @@ -0,0 +1,50 @@ +{ + "hostCommit": "efbff656d84b482d51598bc5ba303d24134e0c62", + "node": "v24.14.1", + "npm": "11.11.0", + "sources": [ + { + "location": "node_modules/@cordisx/channel", + "spec": "git+ssh://git@github.com/cordisx/plugin-channel.git#4cee12e3a92eeed557bc9de8cc4792710918327a" + }, + { + "location": "node_modules/@cordisx/eslint-config", + "spec": "git+ssh://git@github.com/cordisx/cordisxmono.git#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc" + }, + { + "location": "node_modules/@cordisx/plugin-cli-proxy-api", + "spec": "git+ssh://git@github.com/cordisx/plugin-cli-proxy-api.git#1428ee205aab31df2779398cc8491879b303d1d0" + }, + { + "location": "node_modules/@cordisx/protocol", + "spec": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#f3e18c925c34d90fdf203c158811cef10f7ebf57" + } + ], + "packages": [ + { + "filename": "cordisx-0.1.0-beta.2.tgz", + "sha256": "c3ea96b691a8e2e6b52ced3cf1a54fa29830e8b29538112312e036e5d3b5b42a", + "integrity": "sha512-f6wHDDz/2+71POc5WEaoiN7xsbHZJMpHob0pxnlH8YCpPAvU2uC8elNHOg7iasuwgry9QrAL5+hEOMRKc0nAgQ==" + }, + { + "filename": "cordisx-channel-0.1.0.tgz", + "sha256": "ca3fa6283bd5a6af41faf60d936373412246beba047dd652924f5b92060f09e5", + "integrity": "sha512-WqKvGxy72WwAUdwoLIHTBCG5/MAwVLKh2VmGK3tdSB+EMSUmuR+lAhxfdt9dYQRQL1Mh3t/w8SdYqps4mO0FkQ==" + }, + { + "filename": "cordisx-plugin-cli-proxy-api-0.1.0.tgz", + "sha256": "31d23ed0aa49372f2a8b77fcf74e8e80ba0cc8abf19aed8dc06305246f9d7830", + "integrity": "sha512-Otc61B3LTLweo0strMzH3XQH5I/P+HXAuFEFN+ynnnfvwscMj5BHovqAz2YS+JvPO79p+3WuCBTnEKh8DN/rkw==" + }, + { + "filename": "cordisx-protocol-0.1.0-alpha.0.tgz", + "sha256": "04e72b3c58ccb6722a6c56459da1e70c11d0162760eda29bb4846233ea8bb8fe", + "integrity": "sha512-o/YzvFs5gkrYsK0vijubLN/go2/oL04sixPz/Ks7N0eMLEHUL7qxD56Yf1ltW5dN9qfBIpgkHuiXgkSgOjj1bw==" + }, + { + "filename": "create-cordisx-plugin-0.1.0-beta.2.tgz", + "sha256": "3e4d16e315d4a911aabeff3cf6e3b21d64d3d4be7d9b9b07de610443027a5d30", + "integrity": "sha512-mdchmWwhZj/C938TpkiaNFjMhTFGzdYeG0bSk5AEhe+NdaoRmP3g0eUhu3DAfsvNNilp+vBbDmT4kWwcH9LwDg==" + } + ] +} diff --git a/package-lock.json b/package-lock.json index a296010..bc9e38b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-or-later", "devDependencies": { "@cordisx/eslint-config": "github:cordisx/cordisxmono#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "3.18.1", "@projectwallace/stylelint-plugin": "0.7.0", @@ -18,7 +18,7 @@ "@vitejs/plugin-react": "6.1.0", "ajv": "8.20.0", "ajv-formats": "3.0.1", - "cordisx": "github:cordisx/cordisx#152d55aa26527b23c5e70a752fb3f6562e944afc", + "cordisx": "file:.cache/sdk/cordisx-efbff656d84b.tgz", "dprint": "0.57.1", "esbuild": "0.28.2", "eslint": "9.39.4", @@ -129,16 +129,6 @@ "@keyv/serialize": "^1.1.1" } }, - "node_modules/@cordisx/channel": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/cordisx/plugin-channel.git#4cee12e3a92eeed557bc9de8cc4792710918327a", - "integrity": "sha512-uErxyAHsoKSQKASW8DZM/V6cQt6rPZ8jjE4vzQ8H1rFGIhuB8mE4Qy8PAnw7Y1sFafMsB+ENVqJDrLD5CwiGTA==", - "dev": true, - "license": "AGPL-3.0-or-later", - "engines": { - "node": ">=22.19" - } - }, "node_modules/@cordisx/eslint-config": { "version": "0.1.0", "resolved": "git+ssh://git@github.com/cordisx/cordisxmono.git#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc", @@ -153,8 +143,8 @@ }, "node_modules/@cordisx/protocol": { "version": "0.1.0-alpha.0", - "resolved": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", - "integrity": "sha512-m+/bdnP/tx0RbzISwUOfOcRVbjuarHTyNdHuX+IsrAETRmTwBTAhJI8S5Irx/2H+YZUrsU23JcUxMZCfcjFwxQ==", + "resolved": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#f3e18c925c34d90fdf203c158811cef10f7ebf57", + "integrity": "sha512-o/YzvFs5gkrYsK0vijubLN/go2/oL04sixPz/Ks7N0eMLEHUL7qxD56Yf1ltW5dN9qfBIpgkHuiXgkSgOjj1bw==", "dev": true, "license": "AGPL-3.0-or-later", "engines": { @@ -2706,21 +2696,20 @@ } }, "node_modules/cordisx": { - "name": "cordisx-monorepo", "version": "0.1.0-beta.2", - "resolved": "git+ssh://git@github.com/cordisx/cordisx.git#152d55aa26527b23c5e70a752fb3f6562e944afc", - "integrity": "sha512-xMLYyYDpH1nN22T7jLllh83s+hbvFpfv3h2aR8R2p2DG9+bKCnA1RFfw0W6c/h5QztGWQuIRrx0bg+gadcIbYg==", + "resolved": "file:.cache/sdk/cordisx-efbff656d84b.tgz", + "integrity": "sha512-f6wHDDz/2+71POc5WEaoiN7xsbHZJMpHob0pxnlH8YCpPAvU2uC8elNHOg7iasuwgry9QrAL5+hEOMRKc0nAgQ==", "bundleDependencies": [ - "@cordisx/schemastery-ui" + "@cordisx/schemastery-ui", + "@cordisx/channel", + "@cordisx/plugin-cli-proxy-api" ], "dev": true, "license": "AGPL-3.0-or-later", - "workspaces": [ - "packages/*" - ], "dependencies": { - "@cordisx/channel": "github:cordisx/plugin-channel#4cee12e3a92eeed557bc9de8cc4792710918327a", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", + "@cordisx/channel": "0.1.0", + "@cordisx/plugin-cli-proxy-api": "0.1.0", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", "@cordisx/schemastery-ui": "0.1.0-beta.2", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "^3.18.1", @@ -2730,6 +2719,7 @@ "@shikitor/core": "1.0.2", "@types/react": "19.2.18", "@types/react-dom": "19.2.5", + "@vitejs/plugin-react": "6.1.0", "debug": "4.4.3", "es-module-lexer": "1.7.0", "esbuild": "0.28.2", @@ -2752,17 +2742,27 @@ "swr": "2.5.1", "tar": "7.5.22", "tdesign-react": "1.18.2", + "vite": "8.2.2", "ws": "^8.18.3" }, "bin": { - "cordisx": "packages/cli/dist/src/cli.js" + "cordisx": "dist/src/cli.js" }, "engines": { "node": ">=22.19" } }, - "node_modules/cordisx/node_modules/@cordisx/schemastery-ui": { - "version": "0.1.0-beta.2", + "node_modules/cordisx/node_modules/@cordisx/channel": { + "version": "0.1.0", + "dev": true, + "inBundle": true, + "license": "AGPL-3.0-or-later", + "engines": { + "node": ">=22.19" + } + }, + "node_modules/cordisx/node_modules/@cordisx/plugin-cli-proxy-api": { + "version": "0.1.0", "dev": true, "inBundle": true, "license": "AGPL-3.0-or-later", @@ -2770,69 +2770,11 @@ "node": ">=22.19" } }, - "node_modules/cordisx/packages/cli": { - "name": "cordisx", + "node_modules/cordisx/node_modules/@cordisx/schemastery-ui": { "version": "0.1.0-beta.2", - "bundleDependencies": [ - "@cordisx/schemastery-ui" - ], - "extraneous": true, + "dev": true, + "inBundle": true, "license": "AGPL-3.0-or-later", - "dependencies": { - "@cordisx/channel": "github:cordisx/plugin-channel#4cee12e3a92eeed557bc9de8cc4792710918327a", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", - "@cordisx/schemastery-ui": "0.1.0-beta.2", - "@deepseek-ai/cordis": "4.0.1", - "@deepseek-ai/schemastery": "^3.18.1", - "@larksuiteoapi/node-sdk": "^1.73.0", - "@oneworks/avatar": "1.0.0-rc.8", - "@oneworks/avatar-react": "1.0.0-rc.8", - "@shikitor/core": "1.0.2", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.5", - "@vitejs/plugin-react": "6.1.0", - "debug": "4.4.3", - "es-module-lexer": "1.7.0", - "esbuild": "0.28.2", - "extend": "3.0.2", - "intl-messageformat": "11.2.14", - "lightningcss": "1.33.0", - "luna-console": "1.3.6", - "luna-data-grid": "1.6.5", - "luna-dom-viewer": "1.8.4", - "luna-object-viewer": "0.3.2", - "react": "19.2.8", - "react-dom": "19.2.8", - "react-markdown": "10.1.0", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "reicon": "1.2.1", - "remark-gfm": "4.0.1", - "shiki": "4.4.3", - "style-to-js": "1.1.21", - "swr": "2.5.1", - "tar": "7.5.22", - "tdesign-react": "1.18.2", - "vite": "8.2.2", - "ws": "^8.18.3" - }, - "bin": { - "cordisx": "dist/src/cli.js" - }, - "devDependencies": { - "@cordisx/channel-runtime": "file:../channel-runtime", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", - "@types/node": "^22.18.1", - "@types/react": "19.2.18", - "@types/react-dom": "19.2.5", - "@types/ws": "^8.18.1", - "ajv": "8.20.0", - "ajv-formats": "3.0.1", - "jsdom": "^26.1.0", - "tsx": "^4.20.5", - "typescript": "^5.9.2", - "vitest": "^3.2.4" - }, "engines": { "node": ">=22.19" } diff --git a/package.json b/package.json index 7aec840..5bb79df 100644 --- a/package.json +++ b/package.json @@ -38,13 +38,13 @@ }, "devDependencies": { "@cordisx/eslint-config": "github:cordisx/cordisxmono#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#c2f6f8e4bf4a638bf4627c9c567792f2fedbcfd6", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "3.18.1", "@projectwallace/stylelint-plugin": "0.7.0", "@typescript-eslint/parser": "8.69.0", "@vitejs/plugin-react": "6.1.0", - "cordisx": "github:cordisx/cordisx#152d55aa26527b23c5e70a752fb3f6562e944afc", + "cordisx": "file:.cache/sdk/cordisx-efbff656d84b.tgz", "dprint": "0.57.1", "eslint": "9.39.4", "stylelint": "17.15.0", @@ -64,5 +64,8 @@ "bugs": { "url": "https://github.com/cordisx/plugin-cli-proxy-api/issues" }, - "homepage": "https://github.com/cordisx/plugin-cli-proxy-api#readme" + "homepage": "https://github.com/cordisx/plugin-cli-proxy-api#readme", + "overrides": { + "@cordisx/protocol": "$@cordisx/protocol" + } } diff --git a/src/index.ts b/src/index.ts index 6569d2c..e48642e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,7 @@ import { createProviderFleetPage } from './provider-fleet-page.js' import { CLI_PROXY_ICON } from './icon.js' export const name = 'cli-proxy-api' -export const inject = ['i18n', 'slots', 'pages', 'routes', 'platform'] +export const inject = ['i18n', 'slots', 'pages', 'routes', 'platform', 'notifications'] export const icon = CLI_PROXY_ICON const capabilities = [ @@ -76,7 +76,7 @@ interface Messages { 'state.empty': undefined 'state.no-models': undefined 'state.select-session': undefined - 'state.error': { readonly message: string } + 'state.error': undefined 'session.provider': { readonly provider: string } 'session.model': { readonly model: string } 'permission.models.read': undefined @@ -185,7 +185,7 @@ export function apply(ctx: Context, config: Config = Config({})): void { 'state.empty': 'No matching sessions.', 'state.no-models': 'No provider models are available.', 'state.select-session': 'Select a provider session to inspect its content.', - 'state.error': 'Provider request failed: {message}', + 'state.error': 'Provider request failed. Check the connection and try again.', 'session.provider': 'Provider {provider}', 'session.model': 'Model {model}', 'permission.models.read': 'List models from configured external providers', @@ -230,7 +230,7 @@ export function apply(ctx: Context, config: Config = Config({})): void { 'state.empty': '没有匹配的会话。', 'state.no-models': '没有可用的 Provider 模型。', 'state.select-session': '选择一个 Provider 会话以查看内容。', - 'state.error': 'Provider 请求失败:{message}', + 'state.error': 'Provider 请求失败,请检查连接后重试', 'session.provider': 'Provider {provider}', 'session.model': '模型 {model}', 'permission.models.read': '读取已配置外部 Provider 的模型', diff --git a/src/provider-fleet-page.tsx b/src/provider-fleet-page.tsx index 5b0137a..a708607 100644 --- a/src/provider-fleet-page.tsx +++ b/src/provider-fleet-page.tsx @@ -37,7 +37,7 @@ interface Messages { 'state.empty': undefined 'state.no-models': undefined 'state.select-session': undefined - 'state.error': { readonly message: string } + 'state.error': undefined 'session.provider': { readonly provider: string } 'session.model': { readonly model: string } } @@ -78,8 +78,10 @@ export function createProviderFleetPage(ctx: Context, config: Config) { const [steer, setSteer] = useState('') const [status, setStatus] = useState('') - const showError = (error: { readonly message: string }) => - setStatus(props.t('state.error', { message: error.message })) + const showError = (_error: { readonly message: string }) => { + setStatus('') + ctx.notifications.show({ kind: 'provider.request-failed', type: 'error', message: props.t('state.error') }) + } const providerIds = provider === '' ? configuredProviders ?? [...new Set(models.map(item => item.ref.providerId))].sort() : [provider] diff --git a/test/manifest.mjs b/test/manifest.mjs index 5d20a80..d2f37d8 100644 --- a/test/manifest.mjs +++ b/test/manifest.mjs @@ -42,7 +42,7 @@ test('exports the CLIProxy renderer manifest through public Host contracts', () 'turns.control', ], ) - assert.deepEqual(plugin.inject, ['i18n', 'slots', 'pages', 'routes', 'platform']) + assert.deepEqual(plugin.inject, ['i18n', 'slots', 'pages', 'routes', 'platform', 'notifications']) }) test('registers one public page, route, and navigation contribution', () => { From e7496bb8c67a7d64c8ecf98fa0a9bc200645c832 Mon Sep 17 00:00:00 2001 From: YiJie Date: Thu, 10 Sep 2026 03:32:55 +0800 Subject: [PATCH 2/2] Use merged notification providers through normal Git dependencies --- .agents/docs/notifications.md | 26 ++++----- AGENTS.md | 7 +-- README.md | 2 +- notification-sdk-evidence.json | 50 ---------------- package-lock.json | 103 +++++++++++++++++++++++++-------- package.json | 4 +- 6 files changed, 94 insertions(+), 98 deletions(-) delete mode 100644 notification-sdk-evidence.json diff --git a/.agents/docs/notifications.md b/.agents/docs/notifications.md index 7d00d81..6777083 100644 --- a/.agents/docs/notifications.md +++ b/.agents/docs/notifications.md @@ -6,26 +6,22 @@ Declare `notifications` in injection requirements. Field validation and persiste business state stay beside the relevant control or object. Do not introduce a custom Toast, page-wide operation error, or raw exception message. -The [Host guide](https://github.com/cordisx/cordisx/blob/3158c0401a3f604727f623f1a8ac584017dd8540/.agents/docs/notifications.md) +The [Host guide](https://github.com/cordisx/cordisx/blob/3cfe370eb7abf33e16686fbd82659cd441247fbd/.agents/docs/notifications.md) owns usage and interaction guidance; the -[Protocol contract](https://github.com/cordisx/cordisx-protocol/blob/dfa2c5fa956184df11a97955b8e5c74a76cb8876/.agents/docs/notifications-v1.md) -owns the public API. This migration is an experimental candidate, not a release. +[Protocol contract](https://github.com/cordisx/cordisx-protocol/blob/f46dd21e15a949a26f05f89bf11dea339fc60c02/.agents/docs/notifications-v1.md) +owns the public API. Source merge and package publication are separate stages. -## Reproduce the candidate SDK +## Development dependencies -The local SDK archive is deliberately excluded from Git. Its exact Host commit, -Protocol source and hashes are recorded in [notification-sdk-evidence.json](../../notification-sdk-evidence.json). -From a Host checkout at `efbff656d84b482d51598bc5ba303d24134e0c62`, run the -[SDK builder](https://github.com/cordisx/cordisx/blob/main/.agents/docs/sdk-source-packaging.md) -into a fresh directory, then run from this package: +`package.json` and `package-lock.json` pin formally merged Host and Protocol +commits. Install through the repository's normal dependency flow: ```sh -mkdir -p .cache/sdk -cp /path/to/sdk/packages/cordisx-0.1.0-beta.2.tgz .cache/sdk/cordisx-efbff656d84b.tgz -npm ci --ignore-scripts +npm ci npm run check ``` -Compare the archive SHA-256 with the evidence before installation. Use one shared -Protocol override; independent copies break branded public types. This explicit -SDK build avoids recursive Git prepare scripts and does not change the API contract. +Keep the shared Protocol override so public branded types resolve to one copy. +A missing notification service requires a supported Host upgrade; do not recreate +notification UI as an older-Host fallback. The former local candidate SDK archive +is no longer an installation prerequisite. diff --git a/AGENTS.md b/AGENTS.md index e86faf5..a81460e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,10 +21,7 @@ manually positioned alert, or page-wide success/error paragraph. Keep field validation and durable business state beside the relevant object. Use stable semantic `kind` values, localized safe text, and notification rules owned by Host; never expose raw exceptions or notify on every polling attempt. -See the [Host notification guide](https://github.com/cordisx/cordisx/blob/3158c0401a3f604727f623f1a8ac584017dd8540/.agents/docs/notifications.md) +See the [Host notification guide](https://github.com/cordisx/cordisx/blob/3cfe370eb7abf33e16686fbd82659cd441247fbd/.agents/docs/notifications.md) for the interaction contract and older-Host capability boundary. -The notification migration currently uses exact feature-branch SDK/Protocol -revisions; it is not evidence of a formal release or a Mono pointer upgrade. - -Candidate setup: [notification migration](./.agents/docs/notifications.md). +Dependency setup: [notification migration](./.agents/docs/notifications.md). diff --git a/README.md b/README.md index f4938c9..1cb4517 100644 --- a/README.md +++ b/README.md @@ -42,4 +42,4 @@ Host-owned implementation. This repository is licensed under ## Notification feedback -See [operation notifications and candidate SDK setup](./.agents/docs/notifications.md). +See [operation notifications and development dependencies](./.agents/docs/notifications.md). diff --git a/notification-sdk-evidence.json b/notification-sdk-evidence.json deleted file mode 100644 index 4bbcb09..0000000 --- a/notification-sdk-evidence.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "hostCommit": "efbff656d84b482d51598bc5ba303d24134e0c62", - "node": "v24.14.1", - "npm": "11.11.0", - "sources": [ - { - "location": "node_modules/@cordisx/channel", - "spec": "git+ssh://git@github.com/cordisx/plugin-channel.git#4cee12e3a92eeed557bc9de8cc4792710918327a" - }, - { - "location": "node_modules/@cordisx/eslint-config", - "spec": "git+ssh://git@github.com/cordisx/cordisxmono.git#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc" - }, - { - "location": "node_modules/@cordisx/plugin-cli-proxy-api", - "spec": "git+ssh://git@github.com/cordisx/plugin-cli-proxy-api.git#1428ee205aab31df2779398cc8491879b303d1d0" - }, - { - "location": "node_modules/@cordisx/protocol", - "spec": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#f3e18c925c34d90fdf203c158811cef10f7ebf57" - } - ], - "packages": [ - { - "filename": "cordisx-0.1.0-beta.2.tgz", - "sha256": "c3ea96b691a8e2e6b52ced3cf1a54fa29830e8b29538112312e036e5d3b5b42a", - "integrity": "sha512-f6wHDDz/2+71POc5WEaoiN7xsbHZJMpHob0pxnlH8YCpPAvU2uC8elNHOg7iasuwgry9QrAL5+hEOMRKc0nAgQ==" - }, - { - "filename": "cordisx-channel-0.1.0.tgz", - "sha256": "ca3fa6283bd5a6af41faf60d936373412246beba047dd652924f5b92060f09e5", - "integrity": "sha512-WqKvGxy72WwAUdwoLIHTBCG5/MAwVLKh2VmGK3tdSB+EMSUmuR+lAhxfdt9dYQRQL1Mh3t/w8SdYqps4mO0FkQ==" - }, - { - "filename": "cordisx-plugin-cli-proxy-api-0.1.0.tgz", - "sha256": "31d23ed0aa49372f2a8b77fcf74e8e80ba0cc8abf19aed8dc06305246f9d7830", - "integrity": "sha512-Otc61B3LTLweo0strMzH3XQH5I/P+HXAuFEFN+ynnnfvwscMj5BHovqAz2YS+JvPO79p+3WuCBTnEKh8DN/rkw==" - }, - { - "filename": "cordisx-protocol-0.1.0-alpha.0.tgz", - "sha256": "04e72b3c58ccb6722a6c56459da1e70c11d0162760eda29bb4846233ea8bb8fe", - "integrity": "sha512-o/YzvFs5gkrYsK0vijubLN/go2/oL04sixPz/Ks7N0eMLEHUL7qxD56Yf1ltW5dN9qfBIpgkHuiXgkSgOjj1bw==" - }, - { - "filename": "create-cordisx-plugin-0.1.0-beta.2.tgz", - "sha256": "3e4d16e315d4a911aabeff3cf6e3b21d64d3d4be7d9b9b07de610443027a5d30", - "integrity": "sha512-mdchmWwhZj/C938TpkiaNFjMhTFGzdYeG0bSk5AEhe+NdaoRmP3g0eUhu3DAfsvNNilp+vBbDmT4kWwcH9LwDg==" - } - ] -} diff --git a/package-lock.json b/package-lock.json index bc9e38b..4a2def6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "AGPL-3.0-or-later", "devDependencies": { "@cordisx/eslint-config": "github:cordisx/cordisxmono#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f46dd21e15a949a26f05f89bf11dea339fc60c02", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "3.18.1", "@projectwallace/stylelint-plugin": "0.7.0", @@ -18,7 +18,7 @@ "@vitejs/plugin-react": "6.1.0", "ajv": "8.20.0", "ajv-formats": "3.0.1", - "cordisx": "file:.cache/sdk/cordisx-efbff656d84b.tgz", + "cordisx": "github:cordisx/cordisx#3cfe370eb7abf33e16686fbd82659cd441247fbd", "dprint": "0.57.1", "esbuild": "0.28.2", "eslint": "9.39.4", @@ -143,7 +143,7 @@ }, "node_modules/@cordisx/protocol": { "version": "0.1.0-alpha.0", - "resolved": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#f3e18c925c34d90fdf203c158811cef10f7ebf57", + "resolved": "git+ssh://git@github.com/cordisx/cordisx-protocol.git#f46dd21e15a949a26f05f89bf11dea339fc60c02", "integrity": "sha512-o/YzvFs5gkrYsK0vijubLN/go2/oL04sixPz/Ks7N0eMLEHUL7qxD56Yf1ltW5dN9qfBIpgkHuiXgkSgOjj1bw==", "dev": true, "license": "AGPL-3.0-or-later", @@ -2696,9 +2696,10 @@ } }, "node_modules/cordisx": { + "name": "cordisx-monorepo", "version": "0.1.0-beta.2", - "resolved": "file:.cache/sdk/cordisx-efbff656d84b.tgz", - "integrity": "sha512-f6wHDDz/2+71POc5WEaoiN7xsbHZJMpHob0pxnlH8YCpPAvU2uC8elNHOg7iasuwgry9QrAL5+hEOMRKc0nAgQ==", + "resolved": "git+ssh://git@github.com/cordisx/cordisx.git#3cfe370eb7abf33e16686fbd82659cd441247fbd", + "integrity": "sha512-k6IhNsliOoWBDU0PuaQJUWO/llUdJAlrcdV9ErjyjSK+kYK0MJzO9UWWSnTc3bJGwLJ/Osv1cNo+tGV7BPwhcA==", "bundleDependencies": [ "@cordisx/schemastery-ui", "@cordisx/channel", @@ -2706,10 +2707,13 @@ ], "dev": true, "license": "AGPL-3.0-or-later", + "workspaces": [ + "packages/*" + ], "dependencies": { - "@cordisx/channel": "0.1.0", - "@cordisx/plugin-cli-proxy-api": "0.1.0", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", + "@cordisx/channel": "github:cordisx/plugin-channel#4cee12e3a92eeed557bc9de8cc4792710918327a", + "@cordisx/plugin-cli-proxy-api": "github:cordisx/plugin-cli-proxy-api#1428ee205aab31df2779398cc8491879b303d1d0", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f46dd21e15a949a26f05f89bf11dea339fc60c02", "@cordisx/schemastery-ui": "0.1.0-beta.2", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "^3.18.1", @@ -2719,7 +2723,6 @@ "@shikitor/core": "1.0.2", "@types/react": "19.2.18", "@types/react-dom": "19.2.5", - "@vitejs/plugin-react": "6.1.0", "debug": "4.4.3", "es-module-lexer": "1.7.0", "esbuild": "0.28.2", @@ -2742,27 +2745,17 @@ "swr": "2.5.1", "tar": "7.5.22", "tdesign-react": "1.18.2", - "vite": "8.2.2", "ws": "^8.18.3" }, "bin": { - "cordisx": "dist/src/cli.js" + "cordisx": "packages/cli/dist/src/cli.js" }, "engines": { "node": ">=22.19" } }, - "node_modules/cordisx/node_modules/@cordisx/channel": { - "version": "0.1.0", - "dev": true, - "inBundle": true, - "license": "AGPL-3.0-or-later", - "engines": { - "node": ">=22.19" - } - }, - "node_modules/cordisx/node_modules/@cordisx/plugin-cli-proxy-api": { - "version": "0.1.0", + "node_modules/cordisx/node_modules/@cordisx/schemastery-ui": { + "version": "0.1.0-beta.2", "dev": true, "inBundle": true, "license": "AGPL-3.0-or-later", @@ -2770,11 +2763,71 @@ "node": ">=22.19" } }, - "node_modules/cordisx/node_modules/@cordisx/schemastery-ui": { + "node_modules/cordisx/packages/cli": { + "name": "cordisx", "version": "0.1.0-beta.2", - "dev": true, - "inBundle": true, + "bundleDependencies": [ + "@cordisx/schemastery-ui", + "@cordisx/channel", + "@cordisx/plugin-cli-proxy-api" + ], + "extraneous": true, "license": "AGPL-3.0-or-later", + "dependencies": { + "@cordisx/channel": "0.1.0", + "@cordisx/plugin-cli-proxy-api": "0.1.0", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f46dd21e15a949a26f05f89bf11dea339fc60c02", + "@cordisx/schemastery-ui": "0.1.0-beta.2", + "@deepseek-ai/cordis": "4.0.1", + "@deepseek-ai/schemastery": "^3.18.1", + "@larksuiteoapi/node-sdk": "^1.73.0", + "@oneworks/avatar": "1.0.0-rc.8", + "@oneworks/avatar-react": "1.0.0-rc.8", + "@shikitor/core": "1.0.2", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.5", + "@vitejs/plugin-react": "6.1.0", + "debug": "4.4.3", + "es-module-lexer": "1.7.0", + "esbuild": "0.28.2", + "extend": "3.0.2", + "intl-messageformat": "11.2.14", + "lightningcss": "1.33.0", + "luna-console": "1.3.6", + "luna-data-grid": "1.6.5", + "luna-dom-viewer": "1.8.4", + "luna-object-viewer": "0.3.2", + "react": "19.2.8", + "react-dom": "19.2.8", + "react-markdown": "10.1.0", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "reicon": "1.2.1", + "remark-gfm": "4.0.1", + "shiki": "4.4.3", + "style-to-js": "1.1.21", + "swr": "2.5.1", + "tar": "7.5.22", + "tdesign-react": "1.18.2", + "vite": "8.2.2", + "ws": "^8.18.3" + }, + "bin": { + "cordisx": "dist/src/cli.js" + }, + "devDependencies": { + "@cordisx/channel-runtime": "file:../channel-runtime", + "@types/node": "^22.18.1", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.5", + "@types/ws": "^8.18.1", + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "jsdom": "^26.1.0", + "tsx": "^4.20.5", + "typescript": "^5.9.2", + "vitest": "^3.2.4" + }, "engines": { "node": ">=22.19" } diff --git a/package.json b/package.json index 5bb79df..828c822 100644 --- a/package.json +++ b/package.json @@ -38,13 +38,13 @@ }, "devDependencies": { "@cordisx/eslint-config": "github:cordisx/cordisxmono#c63c2e8c2ba7e11502934a52ad2ce3734e804cdc", - "@cordisx/protocol": "github:cordisx/cordisx-protocol#f3e18c925c34d90fdf203c158811cef10f7ebf57", + "@cordisx/protocol": "github:cordisx/cordisx-protocol#f46dd21e15a949a26f05f89bf11dea339fc60c02", "@deepseek-ai/cordis": "4.0.1", "@deepseek-ai/schemastery": "3.18.1", "@projectwallace/stylelint-plugin": "0.7.0", "@typescript-eslint/parser": "8.69.0", "@vitejs/plugin-react": "6.1.0", - "cordisx": "file:.cache/sdk/cordisx-efbff656d84b.tgz", + "cordisx": "github:cordisx/cordisx#3cfe370eb7abf33e16686fbd82659cd441247fbd", "dprint": "0.57.1", "eslint": "9.39.4", "stylelint": "17.15.0",