@hanamesh/dsh-app-host 0.6.12 → 0.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/client-ui.js +1 -1
- package/dist/library/catalog.js +42 -13
- package/dist/library/install.js +4 -4
- package/dist/library/service.js +2 -2
- package/dist/library/suite.js +4 -4
- package/docs/CONTRACT.md +7 -1
- package/docs/DSH_INTEGRATION.md +1 -1
- package/docs/LIBRARY.md +1 -1
- package/docs/LICENSES.json +1 -1
- package/docs/PROVENANCE.json +1 -1
- package/package.json +1 -1
- package/schemas/catalog-provider-page.schema.json +881 -6
package/README.md
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
0.6.14 候选:严格读取标准分发目录的精确 npm 三目标与 agentPlugins,保留历史固定 GitHub DTO;目录事实仅展示,不决定兼容或升级。R1-COMBO-01 原始 26 条目响应已纳入回归。
|
|
2
|
+
|
|
1
3
|
> I51 R1 返修(待复审):供应商指引跟随宿主中英菜单,默认正文只写用途和结果;实现解释、交接固定规则及具名设置默认值保留在技术详情。交接的保存操作与套件来源选择前置,自有字段按单列排列;设置值、默认值、权限、读写协议均不变。
|
|
4
|
+
|
|
5
|
+
0.6.13 候选只消费新 npm 三包身份;插件 id、服务与存储不变。新旧 Core/Usage/Brand 均受保护,Recommender 不属于套件。0.6.12 原件保持原行为。
|
|
2
6
|
>
|
|
3
7
|
> 已知限制 / Known limitations:官方 DSH rc.2 设置页在 390 CSS px 下仍保留固定侧栏,插件内容可用宽度受宿主挤压;本插件不改变客户端或全局 CSS,不能保证该宿主窄屏下标题、原生下拉选项及输入值完整可见。完整设置操作建议使用宽窗口。At 390 CSS px, the official DSH rc.2 settings sidebar leaves limited room for plugin content; titles, native select options and input values may remain constrained. Use a wider window for full settings operations. AppHost only controls its own content and does not modify the client or global CSS. 此限制按编排本次裁定披露,不报告整页390通过。Brand M01既有错误可见性限制仍开;静态profile peers check红流不改写为通过。
|
|
4
8
|
|
package/dist/client-ui.js
CHANGED
|
@@ -847,7 +847,7 @@ h('div',{className:'hm-source-add'},h('input',{value:draft,placeholder:'https://
|
|
|
847
847
|
const KIND_TEXT={application:t('应用'),plugin:t('插件'),listing:t('仅收录')};
|
|
848
848
|
const STATE_TEXT={registered:t('已安装'),installed:t('已安装'),'installed-not-loaded':t('需重启'),'uninstalled-not-unloaded':t('已卸载 · 需重启'),'runtime-missing':t('缺运行时'),invalid:t('包无效')};
|
|
849
849
|
// Mirrors PROTECTED_PACKAGES on the host: the suite is never offered an uninstall button (the host answers 403 anyway).
|
|
850
|
-
const PROTECTED=new Set(['@hanamesh/dsh-app-host','hanamesh-core','hanamesh-usage','hanamesh-brand','@hanamesh/dsh-core','@hanamesh/dsh-usage']);
|
|
850
|
+
const PROTECTED=new Set(['@hanamesh/core','@hanamesh/usage','@hanamesh/brand','@hanamesh/dsh-app-host','hanamesh-core','hanamesh-usage','hanamesh-brand','@hanamesh/dsh-core','@hanamesh/dsh-usage']);
|
|
851
851
|
function RestartNotice({reason}){useLocale();
|
|
852
852
|
return h('p',{role:'status',className:'hm-restart-notice','data-hanamesh-restart':'required'},h('strong',null,t('需重新打开客户端')),' ',reason??t('插件更改需要重新打开客户端后生效。'),' ',h('span',{className:'hm-restart-hint'},t('请完全退出 HanaMesh 客户端或 DSH 后重新打开;关闭窗口不等于退出。')));
|
|
853
853
|
}
|
package/dist/library/catalog.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
1
2
|
import { readFile } from 'node:fs/promises';
|
|
2
3
|
import { AppHostError, requireCondition } from '../errors.js';
|
|
3
4
|
|
|
@@ -62,26 +63,54 @@ function timestamp(value,utc=false){
|
|
|
62
63
|
return Number.isFinite(date.getTime())&&date.toISOString().slice(0,10)===value.slice(0,10);
|
|
63
64
|
}
|
|
64
65
|
// Display-only C-INDEXER-CATALOG SuitePresentationDTO; never an install/upgrade decision.
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
const suiteIdentities={
|
|
67
|
+
core:{names:['@hanamesh/core','hanamesh-core'],repo:'yzsnstotz/hanamesh-core'},
|
|
68
|
+
usage:{names:['@hanamesh/usage','hanamesh-usage'],repo:'yzsnstotz/hanamesh-usage'},
|
|
69
|
+
'app-host':{names:['@hanamesh/dsh-app-host'],repo:'yzsnstotz/hanamesh-plugin-app-host'},
|
|
70
|
+
brand:{names:['@hanamesh/brand','hanamesh-brand'],repo:'yzsnstotz/hanamesh-brand'},
|
|
71
|
+
};
|
|
72
|
+
const suiteComponent=value=>Object.hasOwn(suiteIdentities,value);
|
|
73
|
+
const exactVersion=value=>textWithin(value,128,true)&&!value.startsWith('v')&&Boolean(semver.valid(value))&&value.trim()===value;
|
|
74
|
+
const packageFact=fact=>fact&&suiteComponent(fact.component)&&suiteIdentities[fact.component].names.includes(fact.npmPackageName)&&suiteIdentities[fact.component].repo===fact.githubRepo;
|
|
75
|
+
const distinctComponents=(facts,count)=>Array.isArray(facts)&&facts.length===count&&new Set(facts.map(fact=>fact?.component)).size===count;
|
|
76
|
+
function suitePresentation(value,item){
|
|
77
|
+
if(!(own(value,['schemaVersion','id','role','component','canonicalHanaId','installable','installTargets','components','distributionVersion','agentPlugins'])&&
|
|
69
78
|
value.schemaVersion===1&&value.id==='hanamesh'&&['suite','component','client-only'].includes(value.role)&&suiteComponent(value.component)&&
|
|
70
|
-
(value.canonicalHanaId===null||plain(value.canonicalHanaId))&&typeof value.installable==='boolean'
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
(value.canonicalHanaId===null||plain(value.canonicalHanaId))&&typeof value.installable==='boolean'))return false;
|
|
80
|
+
const canonical=value.role==='suite'&&value.component==='usage'&&value.installable&&value.canonicalHanaId===item.id;
|
|
81
|
+
if(value.role!==(value.component==='usage'?'suite':value.component==='brand'?'client-only':'component')||value.installable!==canonical)return false;
|
|
82
|
+
if(value.distributionVersion!==undefined&&(!canonical||!exactVersion(value.distributionVersion)))return false;
|
|
83
|
+
if(value.components!==undefined&&(!canonical||!distinctComponents(value.components,4)||!value.components.every(fact=>
|
|
84
|
+
own(fact,['component','npmPackageName','githubRepo','version'])&&packageFact(fact)&&exactVersion(fact.version))))return false;
|
|
85
|
+
if(value.installTargets!==undefined){
|
|
86
|
+
if(!canonical||!distinctComponents(value.installTargets,3)||!value.installTargets.every(target=>{
|
|
87
|
+
if(!(own(target,['component','npmPackageName','githubRepo','version','source'])&&target.component!=='brand'&&packageFact(target)&&
|
|
88
|
+
(target.version===undefined||exactVersion(target.version))))return false;
|
|
89
|
+
const fact=value.components?.find(fact=>fact.component===target.component),source=target.source;
|
|
90
|
+
if(fact&&(fact.npmPackageName!==target.npmPackageName||fact.githubRepo!==target.githubRepo||
|
|
91
|
+
(target.version!==undefined&&fact.version!==target.version)))return false;
|
|
92
|
+
if(source?.source==='npm')return own(source,['source','name','version'])&&source.name===target.npmPackageName&&
|
|
93
|
+
exactVersion(source.version)&&source.version===target.version&&fact?.version===target.version;
|
|
94
|
+
// Approved standard distribution retains immutable historical Git DTOs, without choosing a fallback source.
|
|
95
|
+
return own(source,['source','repo','ref'])&&source.source==='github'&&source.repo===target.githubRepo&&
|
|
96
|
+
typeof source.ref==='string'&&/^[0-9a-f]{40}$/i.test(source.ref);
|
|
97
|
+
}))return false;
|
|
98
|
+
}
|
|
99
|
+
if(value.agentPlugins!==undefined){
|
|
100
|
+
const agents=value.agentPlugins;
|
|
101
|
+
if(!canonical||!Array.isArray(agents)||agents.length<1||agents.length>2||new Set(agents.map(agent=>agent?.host)).size!==agents.length||
|
|
102
|
+
!agents.every(agent=>own(agent,['host','pluginName','pluginId','marketplaceUrl','version'])&&['claude','codex'].includes(agent.host)&&
|
|
103
|
+
agent.pluginName==='hanamesh'&&agent.pluginId==='hanamesh@hanamesh'&&agent.marketplaceUrl==='https://github.com/yzsnstotz/hanamesh-plugins'&&
|
|
104
|
+
exactVersion(agent.version)&&agent.version===value.distributionVersion))return false;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
78
107
|
}
|
|
79
108
|
|
|
80
109
|
function validateHanaItem(item,maxSourceLinks){
|
|
81
110
|
const optionalText={description:5000,latestVersion:64,license:80};
|
|
82
111
|
const source=item?.source;
|
|
83
112
|
requireCondition(own(item,['id','itemId','packageName','name','displayName','summary','catalogKind','source','description','homepage','latestVersion','license','categories','keywords','repository','package','publisher','updatedAt','official','suite'])&&
|
|
84
|
-
(item.official===undefined||typeof item.official==='boolean')&&(item.suite===undefined||suitePresentation(item.suite))&&
|
|
113
|
+
(item.official===undefined||typeof item.official==='boolean')&&(item.suite===undefined||suitePresentation(item.suite,item))&&
|
|
85
114
|
plain(item.id)&&item.id===item.itemId&&
|
|
86
115
|
textWithin(item.name,160,true)&&textWithin(item.displayName,120,true)&&textWithin(item.summary,1000)&&
|
|
87
116
|
['application','plugin','entry'].includes(item.catalogKind)&&
|
package/dist/library/install.js
CHANGED
|
@@ -10,7 +10,7 @@ import { profileSnapshot, runtimeSnapshot, profileChecks, runtimeChecks, package
|
|
|
10
10
|
import {prepareSuiteUpgrade,readSuiteStatus,createCoreSuiteAdapter,SUITE_INSTALL_COMMAND} from './suite.js';
|
|
11
11
|
|
|
12
12
|
/** The HanaMesh suite itself (real names + the historical scoped spellings) is never installed or removed through the market. */
|
|
13
|
-
export const PROTECTED_PACKAGES=Object.freeze(['@hanamesh/dsh-app-host','hanamesh-core','hanamesh-usage','hanamesh-brand','@hanamesh/dsh-core','@hanamesh/dsh-usage']);
|
|
13
|
+
export const PROTECTED_PACKAGES=Object.freeze(['@hanamesh/core','@hanamesh/usage','@hanamesh/brand','@hanamesh/dsh-app-host','hanamesh-core','hanamesh-usage','hanamesh-brand','@hanamesh/dsh-core','@hanamesh/dsh-usage']);
|
|
14
14
|
const blocked=new Set(PROTECTED_PACKAGES);
|
|
15
15
|
const packageName=value=>typeof value==='string'&&/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(value);
|
|
16
16
|
const versionText=value=>typeof value==='string'&&/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(value);
|
|
@@ -161,16 +161,16 @@ export function createLibraryInstaller({profileDir,profileName,dataRoot,nodeBina
|
|
|
161
161
|
requireCondition(cliAvailable,'DSH_CLI_UNAVAILABLE','套件升级需客户端随附的官方 CLI;请恢复后重试。',{},503);
|
|
162
162
|
const executing=await prepareSuiteUpgrade({coreSuitePlan:suiteProvider});
|
|
163
163
|
requireCondition(identity(executing)===identity(confirmed),'SUITE_PLAN_CHANGED','执行前套件安装包来源或声明已变化,请重新查看并确认。',{},409);
|
|
164
|
-
emit({type:'library.install-started',itemId:'hanamesh:suite-upgrade',packageName:'hanamesh
|
|
164
|
+
emit({type:'library.install-started',itemId:'hanamesh:suite-upgrade',packageName:'@hanamesh/core',kind:'suite-upgrade'});
|
|
165
165
|
try{
|
|
166
166
|
await run(['add','--save-exact','--strict-peer-dependencies',`--registry=${fresh.registry??registry}`,...fresh.components.map(c=>`${c.name}@${c.to}`)]);
|
|
167
167
|
const actual=await readSuiteStatus(profileDir);
|
|
168
168
|
const saved=await json(join(profileDir,'package.json'));
|
|
169
169
|
requireCondition(actual.status==='installed'&&fresh.components.every((c,i)=>actual.components[i]?.version===c.to&&saved.dependencies?.[c.name]===c.to),'INSTALL_READBACK_MISMATCH','套件升级后的版本或启用状态不符,请完全退出后按补齐命令修复。',{},502);
|
|
170
|
-
return{status:'restart-required',kind:'suite-upgrade',packageName:'hanamesh
|
|
170
|
+
return{status:'restart-required',kind:'suite-upgrade',packageName:'@hanamesh/core',components:fresh.components,version:actual.version};
|
|
171
171
|
}catch(error){
|
|
172
172
|
error.details={...error.details,stage:'suite-upgrade',actual:await readSuiteStatus(profileDir),command:SUITE_INSTALL_COMMAND};
|
|
173
|
-
emit({type:'library.install-failed',packageName:'hanamesh
|
|
173
|
+
emit({type:'library.install-failed',packageName:'@hanamesh/core',code:error.code??'SUITE_UPGRADE_FAILED'});throw error;
|
|
174
174
|
}
|
|
175
175
|
});},
|
|
176
176
|
async install(item,context){
|
package/dist/library/service.js
CHANGED
|
@@ -62,7 +62,7 @@ export function createLibraryService({domain,host,config={},dataRoot,ledgerReade
|
|
|
62
62
|
requireCondition(packageName===undefined,'INVALID_INPUT','套件升级不接受包名或任意替换参数。');
|
|
63
63
|
requireCondition(typeof installer?.prepareSuiteUpgrade==='function','SUITE_UPGRADE_UNAVAILABLE','当前客户端还不支持安全套件升级,请使用补齐命令。',{},503);
|
|
64
64
|
const plan=await installer.prepareSuiteUpgrade();
|
|
65
|
-
return{contractVersion:'1',source:{kind:'suite',manifestUrl:'https://github.com/yzsnstotz'},item:{id:SUITE_TARGET,displayName:'HanaMesh 套件',kind:'suite-upgrade',package:{registry:'npm',name:'hanamesh
|
|
65
|
+
return{contractVersion:'1',source:{kind:'suite',manifestUrl:'https://github.com/yzsnstotz'},item:{id:SUITE_TARGET,displayName:'HanaMesh 套件',kind:'suite-upgrade',package:{registry:'npm',name:'@hanamesh/core'},latestVersion:plan.components[0].to,installed:{state:'installed',version:suiteStatus.version},upgradeAvailable:plan.available,suiteUpgrade:plan}};
|
|
66
66
|
}
|
|
67
67
|
requireCondition(itemId!==undefined||packageName!==undefined,'INVALID_INPUT','itemId or packageName is required.');
|
|
68
68
|
requireCondition(itemId===undefined||(text(itemId,160)&&!/[\u0000-\u001f\u007f]/.test(itemId)),'INVALID_INPUT','itemId is invalid.');
|
|
@@ -144,7 +144,7 @@ export function createLibraryService({domain,host,config={},dataRoot,ledgerReade
|
|
|
144
144
|
get live(){return Boolean(installer?.live);},
|
|
145
145
|
async upgradeSuite(input){requireInstaller('Suite upgrade is unavailable.');
|
|
146
146
|
requireCondition(input&&Object.keys(input).length===1&&typeof input.planId==='string','INVALID_INPUT','Only the current planId is accepted.');
|
|
147
|
-
return await operation('install',async()=>{try{const result=await installer.upgradeSuite(input);suiteStatus={...await suiteFacts(),restartRequired:true};return result;}catch(error){if(error.details?.stage!=='suite-upgrade')throw error;const actual=await readSuiteStatus(config.profileDir);suiteStatus={...await suiteFacts(),restartRequired:true,upgradeError:error.code??'SUITE_UPGRADE_FAILED'};error.details={...error.details,stage:'suite-upgrade',actual,command:SUITE_INSTALL_COMMAND};emit({type:'library.install-failed',packageName:'hanamesh
|
|
147
|
+
return await operation('install',async()=>{try{const result=await installer.upgradeSuite(input);suiteStatus={...await suiteFacts(),restartRequired:true};return result;}catch(error){if(error.details?.stage!=='suite-upgrade')throw error;const actual=await readSuiteStatus(config.profileDir);suiteStatus={...await suiteFacts(),restartRequired:true,upgradeError:error.code??'SUITE_UPGRADE_FAILED'};error.details={...error.details,stage:'suite-upgrade',actual,command:SUITE_INSTALL_COMMAND};emit({type:'library.install-failed',packageName:'@hanamesh/core',code:error.code??'SUITE_UPGRADE_FAILED',details:{stage:'suite-upgrade',actual,command:SUITE_INSTALL_COMMAND}});throw error;}});
|
|
148
148
|
},
|
|
149
149
|
async install(input){requireCondition(input?.itemId!==SUITE_TARGET,'SUITE_CONFIRMATION_REQUIRED','请在客户端确认完整升级计划。',{},403);requireInstaller('Install requires absolute profileDir, nodeBinary, dshBin and profileName.');const{item}=await resolveTarget(input??{});if(present(item.installed)&&!item.upgradeAvailable)return{status:'already-installed',itemId:item.id,packageName:item.package.name};return await installItem(item);},
|
|
150
150
|
async provision(input){requireInstaller('Runtime provision is unavailable.');
|
package/dist/library/suite.js
CHANGED
|
@@ -6,11 +6,11 @@ import {requireCondition} from '../errors.js';
|
|
|
6
6
|
|
|
7
7
|
export const SUITE_TARGET='hanamesh:suite-upgrade';
|
|
8
8
|
export const SUITE_PACKAGES=Object.freeze([
|
|
9
|
-
{name:'hanamesh
|
|
10
|
-
{name:'hanamesh
|
|
9
|
+
{name:'@hanamesh/core',label:'Core',repo:'hanamesh-core'},
|
|
10
|
+
{name:'@hanamesh/usage',label:'使用记录',repo:'hanamesh-usage'},
|
|
11
11
|
{name:'@hanamesh/dsh-app-host',label:'应用库',repo:'hanamesh-plugin-app-host'},
|
|
12
12
|
].map(Object.freeze));
|
|
13
|
-
export const SUITE_INSTALL_COMMAND="
|
|
13
|
+
export const SUITE_INSTALL_COMMAND="dsh plugin --profile desktop add --save-exact '@hanamesh/core@0.3.21' '@hanamesh/usage@0.3.0-rc.6' '@hanamesh/dsh-app-host@0.6.14'";
|
|
14
14
|
const json=async path=>JSON.parse(await readFile(path,'utf8'));
|
|
15
15
|
/** Physical inventory only, never a compatibility declaration or permission to upgrade. */
|
|
16
16
|
export async function readSuiteStatus(profileDir){
|
|
@@ -104,7 +104,7 @@ export function createCoreSuiteAdapter({core=()=>undefined,registry,suiteSourceM
|
|
|
104
104
|
Object.defineProperty(get,'unavailable',{get:()=>current()?null:CORE_SUITE_DECLARATION_MISSING});
|
|
105
105
|
get.readFacts=async()=>{
|
|
106
106
|
const declaration=await read();
|
|
107
|
-
return{status:declaration.completeness==='complete'?'installed':declaration.completeness,completeness:declaration.completeness,version:declaration.installed.find(row=>row.moduleName==='hanamesh
|
|
107
|
+
return{status:declaration.completeness==='complete'?'installed':declaration.completeness,completeness:declaration.completeness,version:declaration.installed.find(row=>row.moduleName==='@hanamesh/core').actualVersion,
|
|
108
108
|
components:declaration.installed.map(row=>({...row,name:row.moduleName,label:SUITE_PACKAGES.find(p=>p.name===row.moduleName).label,version:row.actualVersion})),blocked:declaration.blocked};
|
|
109
109
|
};
|
|
110
110
|
return get;
|
package/docs/CONTRACT.md
CHANGED
|
@@ -157,7 +157,9 @@ DSH 绑定必须提供同一个 `single` domain 的一次完整镜像 publish
|
|
|
157
157
|
| `/hanamesh/library/provision` | POST | `{appId, packageName, runtimeItem}` 三者必填 | 202;缺字段/非法 → 400 `INVALID_INPUT`(`LIB-PROVISION-INPUT`) |
|
|
158
158
|
| `/hanamesh/library/uninstall` | POST | `{appId, packageName, runtimeItem?}` | 202;缺字段/非法 → 400 `INVALID_INPUT` |
|
|
159
159
|
|
|
160
|
-
事件流 `library.install-*` 增加 `kind`;`install-done.result` 对插件为 `{status:'restart-required', kind:'plugin', packageName, version}
|
|
160
|
+
事件流 `library.install-*` 增加 `kind`;`install-done.result` 对插件为 `{status:'restart-required', kind:'plugin', packageName, version}`。受保护包(`@hanamesh/core`、`@hanamesh/usage`、`@hanamesh/brand`、`hanamesh-brand`、`hanamesh-core`、`hanamesh-usage`、`@hanamesh/dsh-app-host` 及旧写法 `@hanamesh/dsh-core`、`@hanamesh/dsh-usage`)任何路径都 `PACKAGE_DENIED`:`plugins/*` 在启动操作前同步答 403,目录条目路径在操作内以 `-failed` 事件给出。「需重启」判定只来自本进程启动时的 profile 依赖快照(钉版本内核不暴露已加载插件集合);快照不可读时一切已装计为已加载。客户端在壳内(`window.self !== window.top`)给 `hanamesh://restart` 深链,官方 DSH 直开时只提示文字;本包不重启 DSH。
|
|
161
|
+
|
|
162
|
+
0.6.13 候选:套件 npm 身份为 `@hanamesh/core`、`@hanamesh/usage`、`@hanamesh/dsh-app-host`;Core 声明的 `core.name`、`moduleName`、升级目标和返回的 `packageName` 按这些新名精确比较,旧名声明不当作新三包。插件 id、`hanameshMarket` 服务、路由与存储键保持;普通 Recommender 不受保护、不加入套件。首装/补齐精确命令见 LIBRARY.md;已发布 0.6.12 原件不包含该适配。
|
|
161
163
|
|
|
162
164
|
## 市场席位(rc.32,设计定案 2026-09-22 §4,T5)
|
|
163
165
|
|
|
@@ -246,3 +248,7 @@ B17 review repair(同0.6.8候选):`AppHost` 未注入 `runtimeLedgerReader
|
|
|
246
248
|
|
|
247
249
|
|
|
248
250
|
0.6.12:目录条目的展示/跳转链接(`sourceLinks.sourceUrl`、`homepage`、`repository.url`、`publisher.url`)接受 fragment 并原样保留;目录自身 attribution 展示链接亦保留 fragment。manifest 来源和 `transport.endpoint` 等请求 URL 校验不变。单条非法仍拒绝整个 provider page,不返回部分结果。
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
0.6.14 / R1-COMBO-01:HanaMesh view 的可选 suite.agentPlugins 接受 claude/codex 唯一渠道、hanamesh / hanamesh@hanamesh、公开 hanamesh-plugins HTTPS 市场及与 distributionVersion 相同的精确 SemVer。npm source 严格为 {source:'npm',name,version},name=目标 npmPackageName,source.version=目标 version=对应 components.version;三个不同目标限 Core/Usage/AppHost,Brand 仅组件事实。公开组件的新旧 npm 名均绑定原 GitHub 仓库,不猜发布版本。未知字段、范围/tag、缺件、重复件及不一致整页拒绝 INVALID_CATALOG_PAGE。
|
|
254
|
+
历史 GitHub DTO 按已审标准分发提议继续可读:source 只许 source/repo/ref,repo=目标 githubRepo,ref 为40位hex;可缺历史版本事实,不自动转换或选备用源。目录发布事实不作为 Core 兼容声明、安装授权或本机已装观察。随包 catalog/schema/page.json 同时描述默认和 HanaMesh 两视图,跨字段相等性由运行解码器检查。
|
package/docs/DSH_INTEGRATION.md
CHANGED
|
@@ -20,7 +20,7 @@ Review fixes. The install-target probe on the handoff listener answers only orig
|
|
|
20
20
|
plutil timeout); the remaining fixed rules are served as `rules` by `/hanamesh/library/handoff-settings` and listed on
|
|
21
21
|
the settings page. Expiry codes: `HANDOFF_NOT_PICKED_UP` (window never fetched it / fetched but no outcome) and
|
|
22
22
|
`HANDOFF_EXPIRED` (shown or confirmed, no answer); the client reports `failed` with `error.code` when the confirmation
|
|
23
|
-
cannot open (`HANDOFF_OPEN_FAILED`, `cause`). Live install results carry `restartBaseline`. `hanamesh-brand`
|
|
23
|
+
cannot open (`HANDOFF_OPEN_FAILED`, `cause`). Live install results carry `restartBaseline`. `@hanamesh/brand` and legacy `hanamesh-brand` are protected.
|
|
24
24
|
|
|
25
25
|
## 0.6.0 (2026-10-15)
|
|
26
26
|
|
package/docs/LIBRARY.md
CHANGED
|
@@ -59,7 +59,7 @@ Both SOURCE fixture sets and suites ship as `@hanamesh/dsh-app-host/catalog/suit
|
|
|
59
59
|
DSH 首次安装或缺组件时,完全退出客户端后执行同一行,再重新打开:
|
|
60
60
|
|
|
61
61
|
```sh
|
|
62
|
-
dsh plugin --profile desktop add --save-exact '
|
|
62
|
+
dsh plugin --profile desktop add --save-exact '@hanamesh/core@0.3.21' '@hanamesh/usage@0.3.0-rc.6' '@hanamesh/dsh-app-host@0.6.14'
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
套件版本范围、是否完整、候选来源及兼容/升级规则唯一属于 Core。App-host 只读物理安装版本,不能用它们推导兼容或安装许可;不自行读取 npm latest、计算组件组合、校验候选宿主 peers 或持有 Core 的版本范围副本。普通安装/卸载接口继续拒绝套件包。
|
package/docs/LICENSES.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": {
|
|
3
3
|
"name": "@hanamesh/dsh-app-host",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.14",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"source": "git+https://github.com/yzsnstotz/hanamesh-plugin-app-host.git",
|
|
7
7
|
"purpose": "Application ownership, view leases, Router forwarding, and application library for official DSH"
|
package/docs/PROVENANCE.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"currentCandidate": {
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.14",
|
|
4
4
|
"dshTarget": ">=0.2.0-rc.2 <0.3.0-0 || >=0.2.1-0 <0.3.0-0",
|
|
5
5
|
"vendorSha256VerifiedAtBuild": false,
|
|
6
6
|
"libProvisionDistribution": "随包分发、源仓不变; bundleDependencies; original LICENSE retained, no relicensing",
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "urn:dsh-community-market:schema:catalog-provider-page:1.1.0",
|
|
4
4
|
"title": "DSH Community Market standard provider page",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Default catalog-major-1 or explicit HanaMesh view. Both branches reject unknown fields; cross-field suite identity/version checks also run in the consumer.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"properties": {
|
|
14
14
|
"schemaVersion": {
|
|
15
15
|
"type": "string",
|
|
16
|
-
"pattern": "^1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)
|
|
16
|
+
"pattern": "^(?:hanamesh\\.catalog\\.v1|1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?)$(?![\\s\\S])",
|
|
17
17
|
"description": "Valid SemVer with major 1. Minor and patch additions preserve the validated shape; other majors are refused."
|
|
18
18
|
},
|
|
19
19
|
"generatedAt": {
|
|
@@ -28,9 +28,7 @@
|
|
|
28
28
|
"items": {
|
|
29
29
|
"type": "array",
|
|
30
30
|
"maxItems": 200,
|
|
31
|
-
"items": {
|
|
32
|
-
"$ref": "#/$defs/item"
|
|
33
|
-
}
|
|
31
|
+
"items": {}
|
|
34
32
|
},
|
|
35
33
|
"page": {
|
|
36
34
|
"$ref": "#/$defs/page"
|
|
@@ -373,6 +371,883 @@
|
|
|
373
371
|
]
|
|
374
372
|
}
|
|
375
373
|
]
|
|
374
|
+
},
|
|
375
|
+
"legacyPage": {
|
|
376
|
+
"type": "object",
|
|
377
|
+
"additionalProperties": false,
|
|
378
|
+
"required": [
|
|
379
|
+
"schemaVersion",
|
|
380
|
+
"items",
|
|
381
|
+
"page"
|
|
382
|
+
],
|
|
383
|
+
"properties": {
|
|
384
|
+
"schemaVersion": {
|
|
385
|
+
"type": "string",
|
|
386
|
+
"pattern": "^1\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$(?![\\s\\S])",
|
|
387
|
+
"description": "Valid SemVer with major 1. Minor and patch additions preserve the validated shape; other majors are refused."
|
|
388
|
+
},
|
|
389
|
+
"generatedAt": {
|
|
390
|
+
"type": "string",
|
|
391
|
+
"format": "date-time"
|
|
392
|
+
},
|
|
393
|
+
"revision": {
|
|
394
|
+
"type": "string",
|
|
395
|
+
"minLength": 1,
|
|
396
|
+
"maxLength": 160
|
|
397
|
+
},
|
|
398
|
+
"items": {
|
|
399
|
+
"type": "array",
|
|
400
|
+
"maxItems": 200,
|
|
401
|
+
"items": {
|
|
402
|
+
"$ref": "#/$defs/item"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"page": {
|
|
406
|
+
"$ref": "#/$defs/page"
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
"hana_identifier": {
|
|
411
|
+
"type": "string",
|
|
412
|
+
"minLength": 1,
|
|
413
|
+
"maxLength": 160,
|
|
414
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:/@+-]*$"
|
|
415
|
+
},
|
|
416
|
+
"hana_httpsUri": {
|
|
417
|
+
"type": "string",
|
|
418
|
+
"format": "uri",
|
|
419
|
+
"maxLength": 2048,
|
|
420
|
+
"pattern": "^https://(?![^/?#]*@)(?![^/?#]*:)[^/?#]+(?:[/?#].*)?$"
|
|
421
|
+
},
|
|
422
|
+
"hana_plainText": {
|
|
423
|
+
"type": "string",
|
|
424
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F-\\u009F\\u202A-\\u202E\\u2066-\\u2069]*$"
|
|
425
|
+
},
|
|
426
|
+
"hana_page": {
|
|
427
|
+
"oneOf": [
|
|
428
|
+
{
|
|
429
|
+
"type": "object",
|
|
430
|
+
"additionalProperties": false,
|
|
431
|
+
"maxProperties": 0
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"type": "object",
|
|
435
|
+
"additionalProperties": false,
|
|
436
|
+
"required": [
|
|
437
|
+
"nextCursor",
|
|
438
|
+
"total"
|
|
439
|
+
],
|
|
440
|
+
"properties": {
|
|
441
|
+
"nextCursor": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"minLength": 1,
|
|
444
|
+
"maxLength": 2048
|
|
445
|
+
},
|
|
446
|
+
"total": {
|
|
447
|
+
"type": "integer",
|
|
448
|
+
"minimum": 0
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
]
|
|
453
|
+
},
|
|
454
|
+
"hana_repository": {
|
|
455
|
+
"type": "object",
|
|
456
|
+
"additionalProperties": false,
|
|
457
|
+
"required": [
|
|
458
|
+
"url"
|
|
459
|
+
],
|
|
460
|
+
"properties": {
|
|
461
|
+
"url": {
|
|
462
|
+
"$ref": "#/$defs/hana_httpsUri",
|
|
463
|
+
"description": "GitHub repository only; runtime validates hostname and owner/repository path."
|
|
464
|
+
},
|
|
465
|
+
"subdirectory": {
|
|
466
|
+
"type": "string",
|
|
467
|
+
"minLength": 1,
|
|
468
|
+
"maxLength": 240,
|
|
469
|
+
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\\\]+$"
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"hana_package": {
|
|
474
|
+
"type": "object",
|
|
475
|
+
"additionalProperties": false,
|
|
476
|
+
"required": [
|
|
477
|
+
"registry",
|
|
478
|
+
"name"
|
|
479
|
+
],
|
|
480
|
+
"properties": {
|
|
481
|
+
"registry": {
|
|
482
|
+
"const": "npm"
|
|
483
|
+
},
|
|
484
|
+
"name": {
|
|
485
|
+
"type": "string",
|
|
486
|
+
"minLength": 1,
|
|
487
|
+
"maxLength": 214,
|
|
488
|
+
"pattern": "^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$"
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
},
|
|
492
|
+
"hana_publisher": {
|
|
493
|
+
"type": "object",
|
|
494
|
+
"additionalProperties": false,
|
|
495
|
+
"required": [
|
|
496
|
+
"name"
|
|
497
|
+
],
|
|
498
|
+
"properties": {
|
|
499
|
+
"name": {
|
|
500
|
+
"allOf": [
|
|
501
|
+
{
|
|
502
|
+
"$ref": "#/$defs/hana_plainText"
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
"type": "string",
|
|
506
|
+
"minLength": 1,
|
|
507
|
+
"maxLength": 120
|
|
508
|
+
}
|
|
509
|
+
]
|
|
510
|
+
},
|
|
511
|
+
"url": {
|
|
512
|
+
"$ref": "#/$defs/hana_httpsUri"
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
},
|
|
516
|
+
"hana_categoryId": {
|
|
517
|
+
"type": "string",
|
|
518
|
+
"minLength": 1,
|
|
519
|
+
"maxLength": 64,
|
|
520
|
+
"pattern": "^[a-z0-9][a-z0-9._:-]*$"
|
|
521
|
+
},
|
|
522
|
+
"hana_item": {
|
|
523
|
+
"type": "object",
|
|
524
|
+
"additionalProperties": false,
|
|
525
|
+
"required": [
|
|
526
|
+
"id",
|
|
527
|
+
"name",
|
|
528
|
+
"displayName",
|
|
529
|
+
"summary",
|
|
530
|
+
"itemId",
|
|
531
|
+
"packageName",
|
|
532
|
+
"catalogKind",
|
|
533
|
+
"source"
|
|
534
|
+
],
|
|
535
|
+
"properties": {
|
|
536
|
+
"id": {
|
|
537
|
+
"$ref": "#/$defs/hana_identifier"
|
|
538
|
+
},
|
|
539
|
+
"name": {
|
|
540
|
+
"allOf": [
|
|
541
|
+
{
|
|
542
|
+
"$ref": "#/$defs/hana_plainText"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"type": "string",
|
|
546
|
+
"minLength": 1,
|
|
547
|
+
"maxLength": 160
|
|
548
|
+
}
|
|
549
|
+
]
|
|
550
|
+
},
|
|
551
|
+
"displayName": {
|
|
552
|
+
"allOf": [
|
|
553
|
+
{
|
|
554
|
+
"$ref": "#/$defs/hana_plainText"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"type": "string",
|
|
558
|
+
"minLength": 1,
|
|
559
|
+
"maxLength": 120
|
|
560
|
+
}
|
|
561
|
+
]
|
|
562
|
+
},
|
|
563
|
+
"summary": {
|
|
564
|
+
"allOf": [
|
|
565
|
+
{
|
|
566
|
+
"$ref": "#/$defs/hana_plainText"
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
"type": "string",
|
|
570
|
+
"maxLength": 1000
|
|
571
|
+
}
|
|
572
|
+
]
|
|
573
|
+
},
|
|
574
|
+
"description": {
|
|
575
|
+
"allOf": [
|
|
576
|
+
{
|
|
577
|
+
"$ref": "#/$defs/hana_plainText"
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"type": "string",
|
|
581
|
+
"maxLength": 5000
|
|
582
|
+
}
|
|
583
|
+
]
|
|
584
|
+
},
|
|
585
|
+
"homepage": {
|
|
586
|
+
"$ref": "#/$defs/hana_httpsUri"
|
|
587
|
+
},
|
|
588
|
+
"latestVersion": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"minLength": 1,
|
|
591
|
+
"maxLength": 64
|
|
592
|
+
},
|
|
593
|
+
"license": {
|
|
594
|
+
"type": "string",
|
|
595
|
+
"minLength": 1,
|
|
596
|
+
"maxLength": 80
|
|
597
|
+
},
|
|
598
|
+
"categories": {
|
|
599
|
+
"type": "array",
|
|
600
|
+
"maxItems": 32,
|
|
601
|
+
"uniqueItems": true,
|
|
602
|
+
"items": {
|
|
603
|
+
"$ref": "#/$defs/hana_categoryId"
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
"keywords": {
|
|
607
|
+
"type": "array",
|
|
608
|
+
"maxItems": 64,
|
|
609
|
+
"uniqueItems": true,
|
|
610
|
+
"items": {
|
|
611
|
+
"type": "string",
|
|
612
|
+
"minLength": 1,
|
|
613
|
+
"maxLength": 64
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
"repository": {
|
|
617
|
+
"$ref": "#/$defs/hana_repository"
|
|
618
|
+
},
|
|
619
|
+
"package": {
|
|
620
|
+
"$ref": "#/$defs/hana_package"
|
|
621
|
+
},
|
|
622
|
+
"publisher": {
|
|
623
|
+
"$ref": "#/$defs/hana_publisher"
|
|
624
|
+
},
|
|
625
|
+
"updatedAt": {
|
|
626
|
+
"type": "string",
|
|
627
|
+
"format": "date-time"
|
|
628
|
+
},
|
|
629
|
+
"itemId": {
|
|
630
|
+
"$ref": "#/$defs/hana_identifier"
|
|
631
|
+
},
|
|
632
|
+
"packageName": {
|
|
633
|
+
"anyOf": [
|
|
634
|
+
{
|
|
635
|
+
"type": "null"
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"type": "string",
|
|
639
|
+
"minLength": 1,
|
|
640
|
+
"maxLength": 214,
|
|
641
|
+
"pattern": "^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$"
|
|
642
|
+
}
|
|
643
|
+
]
|
|
644
|
+
},
|
|
645
|
+
"catalogKind": {
|
|
646
|
+
"enum": [
|
|
647
|
+
"application",
|
|
648
|
+
"plugin",
|
|
649
|
+
"entry"
|
|
650
|
+
]
|
|
651
|
+
},
|
|
652
|
+
"source": {
|
|
653
|
+
"$ref": "#/$defs/hana_source"
|
|
654
|
+
},
|
|
655
|
+
"official": {
|
|
656
|
+
"type": "boolean",
|
|
657
|
+
"description": "Mirrored official marker from the source; absent when unknown. Does not grant authorization."
|
|
658
|
+
},
|
|
659
|
+
"suite": {
|
|
660
|
+
"$ref": "#/$defs/hana_suite"
|
|
661
|
+
}
|
|
662
|
+
},
|
|
663
|
+
"allOf": [
|
|
664
|
+
{
|
|
665
|
+
"if": {
|
|
666
|
+
"properties": {
|
|
667
|
+
"packageName": {
|
|
668
|
+
"type": "null"
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
"then": {
|
|
673
|
+
"not": {
|
|
674
|
+
"required": [
|
|
675
|
+
"package"
|
|
676
|
+
]
|
|
677
|
+
}
|
|
678
|
+
},
|
|
679
|
+
"else": {
|
|
680
|
+
"required": [
|
|
681
|
+
"package"
|
|
682
|
+
]
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
]
|
|
686
|
+
},
|
|
687
|
+
"hana_sourceLink": {
|
|
688
|
+
"type": "object",
|
|
689
|
+
"additionalProperties": false,
|
|
690
|
+
"required": [
|
|
691
|
+
"sourceId",
|
|
692
|
+
"sourceRef",
|
|
693
|
+
"sourceUrl",
|
|
694
|
+
"firstSeenAt",
|
|
695
|
+
"lastSeenAt"
|
|
696
|
+
],
|
|
697
|
+
"properties": {
|
|
698
|
+
"sourceId": {
|
|
699
|
+
"type": "string",
|
|
700
|
+
"minLength": 1,
|
|
701
|
+
"maxLength": 120,
|
|
702
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F-\\u009F\\u202A-\\u202E\\u2066-\\u2069]*$"
|
|
703
|
+
},
|
|
704
|
+
"sourceRef": {
|
|
705
|
+
"type": "string",
|
|
706
|
+
"minLength": 1,
|
|
707
|
+
"maxLength": 512,
|
|
708
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F-\\u009F\\u202A-\\u202E\\u2066-\\u2069]*$"
|
|
709
|
+
},
|
|
710
|
+
"sourceUrl": {
|
|
711
|
+
"$ref": "#/$defs/hana_httpsUri"
|
|
712
|
+
},
|
|
713
|
+
"firstSeenAt": {
|
|
714
|
+
"type": "string",
|
|
715
|
+
"format": "date-time"
|
|
716
|
+
},
|
|
717
|
+
"lastSeenAt": {
|
|
718
|
+
"type": "string",
|
|
719
|
+
"format": "date-time"
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
"hana_source": {
|
|
724
|
+
"type": "object",
|
|
725
|
+
"additionalProperties": false,
|
|
726
|
+
"required": [
|
|
727
|
+
"sourceId",
|
|
728
|
+
"sourceRef",
|
|
729
|
+
"sourceLinks"
|
|
730
|
+
],
|
|
731
|
+
"properties": {
|
|
732
|
+
"sourceId": {
|
|
733
|
+
"type": "string",
|
|
734
|
+
"minLength": 1,
|
|
735
|
+
"maxLength": 120,
|
|
736
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F-\\u009F\\u202A-\\u202E\\u2066-\\u2069]*$"
|
|
737
|
+
},
|
|
738
|
+
"sourceRef": {
|
|
739
|
+
"type": "string",
|
|
740
|
+
"minLength": 1,
|
|
741
|
+
"maxLength": 512,
|
|
742
|
+
"pattern": "^[^\\u0000-\\u001F\\u007F-\\u009F\\u202A-\\u202E\\u2066-\\u2069]*$"
|
|
743
|
+
},
|
|
744
|
+
"sourceLinks": {
|
|
745
|
+
"type": "array",
|
|
746
|
+
"maxItems": 500,
|
|
747
|
+
"items": {
|
|
748
|
+
"$ref": "#/$defs/hana_sourceLink"
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
},
|
|
753
|
+
"hana_suite": {
|
|
754
|
+
"type": "object",
|
|
755
|
+
"additionalProperties": false,
|
|
756
|
+
"required": [
|
|
757
|
+
"schemaVersion",
|
|
758
|
+
"id",
|
|
759
|
+
"role",
|
|
760
|
+
"component",
|
|
761
|
+
"canonicalHanaId",
|
|
762
|
+
"installable"
|
|
763
|
+
],
|
|
764
|
+
"properties": {
|
|
765
|
+
"schemaVersion": {
|
|
766
|
+
"const": 1
|
|
767
|
+
},
|
|
768
|
+
"id": {
|
|
769
|
+
"const": "hanamesh"
|
|
770
|
+
},
|
|
771
|
+
"role": {
|
|
772
|
+
"enum": [
|
|
773
|
+
"suite",
|
|
774
|
+
"component",
|
|
775
|
+
"client-only"
|
|
776
|
+
]
|
|
777
|
+
},
|
|
778
|
+
"component": {
|
|
779
|
+
"enum": [
|
|
780
|
+
"core",
|
|
781
|
+
"usage",
|
|
782
|
+
"app-host",
|
|
783
|
+
"brand"
|
|
784
|
+
]
|
|
785
|
+
},
|
|
786
|
+
"canonicalHanaId": {
|
|
787
|
+
"type": [
|
|
788
|
+
"string",
|
|
789
|
+
"null"
|
|
790
|
+
],
|
|
791
|
+
"pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$"
|
|
792
|
+
},
|
|
793
|
+
"installable": {
|
|
794
|
+
"type": "boolean"
|
|
795
|
+
},
|
|
796
|
+
"installTargets": {
|
|
797
|
+
"type": "array",
|
|
798
|
+
"minItems": 3,
|
|
799
|
+
"maxItems": 3,
|
|
800
|
+
"items": {
|
|
801
|
+
"type": "object",
|
|
802
|
+
"additionalProperties": false,
|
|
803
|
+
"required": [
|
|
804
|
+
"component",
|
|
805
|
+
"npmPackageName",
|
|
806
|
+
"githubRepo",
|
|
807
|
+
"source"
|
|
808
|
+
],
|
|
809
|
+
"properties": {
|
|
810
|
+
"component": {
|
|
811
|
+
"enum": [
|
|
812
|
+
"core",
|
|
813
|
+
"usage",
|
|
814
|
+
"app-host"
|
|
815
|
+
]
|
|
816
|
+
},
|
|
817
|
+
"npmPackageName": {
|
|
818
|
+
"type": "string",
|
|
819
|
+
"maxLength": 214,
|
|
820
|
+
"pattern": "^(?:@[a-z0-9-]+/)?[a-z0-9][a-z0-9._-]*$"
|
|
821
|
+
},
|
|
822
|
+
"githubRepo": {
|
|
823
|
+
"type": "string",
|
|
824
|
+
"pattern": "^[A-Za-z0-9.-]+/[A-Za-z0-9._-]+$"
|
|
825
|
+
},
|
|
826
|
+
"source": {
|
|
827
|
+
"oneOf": [
|
|
828
|
+
{
|
|
829
|
+
"type": "object",
|
|
830
|
+
"additionalProperties": false,
|
|
831
|
+
"required": [
|
|
832
|
+
"source",
|
|
833
|
+
"repo",
|
|
834
|
+
"ref"
|
|
835
|
+
],
|
|
836
|
+
"properties": {
|
|
837
|
+
"source": {
|
|
838
|
+
"const": "github"
|
|
839
|
+
},
|
|
840
|
+
"repo": {
|
|
841
|
+
"type": "string"
|
|
842
|
+
},
|
|
843
|
+
"ref": {
|
|
844
|
+
"type": "string",
|
|
845
|
+
"pattern": "^[a-f0-9]{40}$"
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
"type": "object",
|
|
851
|
+
"additionalProperties": false,
|
|
852
|
+
"required": [
|
|
853
|
+
"source",
|
|
854
|
+
"name",
|
|
855
|
+
"version"
|
|
856
|
+
],
|
|
857
|
+
"properties": {
|
|
858
|
+
"source": {
|
|
859
|
+
"const": "npm"
|
|
860
|
+
},
|
|
861
|
+
"name": {
|
|
862
|
+
"type": "string",
|
|
863
|
+
"maxLength": 214,
|
|
864
|
+
"pattern": "^(?:@[a-z0-9-]+/)?[a-z0-9][a-z0-9._-]*$"
|
|
865
|
+
},
|
|
866
|
+
"version": {
|
|
867
|
+
"$ref": "#/$defs/hana_semver"
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
]
|
|
872
|
+
},
|
|
873
|
+
"version": {
|
|
874
|
+
"$ref": "#/$defs/hana_semver"
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
"allOf": [
|
|
878
|
+
{
|
|
879
|
+
"$ref": "#/$defs/hana_officialSuiteIdentity"
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
"if": {
|
|
883
|
+
"properties": {
|
|
884
|
+
"source": {
|
|
885
|
+
"properties": {
|
|
886
|
+
"source": {
|
|
887
|
+
"const": "npm"
|
|
888
|
+
}
|
|
889
|
+
},
|
|
890
|
+
"type": "object"
|
|
891
|
+
}
|
|
892
|
+
},
|
|
893
|
+
"type": "object"
|
|
894
|
+
},
|
|
895
|
+
"then": {
|
|
896
|
+
"required": [
|
|
897
|
+
"version"
|
|
898
|
+
]
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
]
|
|
902
|
+
}
|
|
903
|
+
},
|
|
904
|
+
"distributionVersion": {
|
|
905
|
+
"$ref": "#/$defs/hana_semver"
|
|
906
|
+
},
|
|
907
|
+
"components": {
|
|
908
|
+
"type": "array",
|
|
909
|
+
"minItems": 4,
|
|
910
|
+
"maxItems": 4,
|
|
911
|
+
"items": {
|
|
912
|
+
"type": "object",
|
|
913
|
+
"additionalProperties": false,
|
|
914
|
+
"required": [
|
|
915
|
+
"component",
|
|
916
|
+
"npmPackageName",
|
|
917
|
+
"githubRepo",
|
|
918
|
+
"version"
|
|
919
|
+
],
|
|
920
|
+
"properties": {
|
|
921
|
+
"component": {
|
|
922
|
+
"enum": [
|
|
923
|
+
"core",
|
|
924
|
+
"usage",
|
|
925
|
+
"app-host",
|
|
926
|
+
"brand"
|
|
927
|
+
]
|
|
928
|
+
},
|
|
929
|
+
"npmPackageName": {
|
|
930
|
+
"type": "string"
|
|
931
|
+
},
|
|
932
|
+
"githubRepo": {
|
|
933
|
+
"type": "string"
|
|
934
|
+
},
|
|
935
|
+
"version": {
|
|
936
|
+
"$ref": "#/$defs/hana_semver"
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
"allOf": [
|
|
940
|
+
{
|
|
941
|
+
"$ref": "#/$defs/hana_officialSuiteIdentity"
|
|
942
|
+
}
|
|
943
|
+
]
|
|
944
|
+
},
|
|
945
|
+
"allOf": [
|
|
946
|
+
{
|
|
947
|
+
"contains": {
|
|
948
|
+
"type": "object",
|
|
949
|
+
"required": [
|
|
950
|
+
"component"
|
|
951
|
+
],
|
|
952
|
+
"properties": {
|
|
953
|
+
"component": {
|
|
954
|
+
"const": "core"
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
"contains": {
|
|
961
|
+
"type": "object",
|
|
962
|
+
"required": [
|
|
963
|
+
"component"
|
|
964
|
+
],
|
|
965
|
+
"properties": {
|
|
966
|
+
"component": {
|
|
967
|
+
"const": "usage"
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"contains": {
|
|
974
|
+
"type": "object",
|
|
975
|
+
"required": [
|
|
976
|
+
"component"
|
|
977
|
+
],
|
|
978
|
+
"properties": {
|
|
979
|
+
"component": {
|
|
980
|
+
"const": "app-host"
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"contains": {
|
|
987
|
+
"type": "object",
|
|
988
|
+
"required": [
|
|
989
|
+
"component"
|
|
990
|
+
],
|
|
991
|
+
"properties": {
|
|
992
|
+
"component": {
|
|
993
|
+
"const": "brand"
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
]
|
|
999
|
+
},
|
|
1000
|
+
"agentPlugins": {
|
|
1001
|
+
"type": "array",
|
|
1002
|
+
"minItems": 1,
|
|
1003
|
+
"maxItems": 2,
|
|
1004
|
+
"uniqueItems": true,
|
|
1005
|
+
"items": {
|
|
1006
|
+
"type": "object",
|
|
1007
|
+
"additionalProperties": false,
|
|
1008
|
+
"required": [
|
|
1009
|
+
"host",
|
|
1010
|
+
"pluginName",
|
|
1011
|
+
"pluginId",
|
|
1012
|
+
"marketplaceUrl",
|
|
1013
|
+
"version"
|
|
1014
|
+
],
|
|
1015
|
+
"properties": {
|
|
1016
|
+
"host": {
|
|
1017
|
+
"enum": [
|
|
1018
|
+
"claude",
|
|
1019
|
+
"codex"
|
|
1020
|
+
]
|
|
1021
|
+
},
|
|
1022
|
+
"pluginName": {
|
|
1023
|
+
"type": "string",
|
|
1024
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$"
|
|
1025
|
+
},
|
|
1026
|
+
"pluginId": {
|
|
1027
|
+
"type": "string",
|
|
1028
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,119}@[A-Za-z0-9][A-Za-z0-9._-]{0,119}$"
|
|
1029
|
+
},
|
|
1030
|
+
"marketplaceUrl": {
|
|
1031
|
+
"type": "string",
|
|
1032
|
+
"format": "uri",
|
|
1033
|
+
"pattern": "^https://"
|
|
1034
|
+
},
|
|
1035
|
+
"version": {
|
|
1036
|
+
"$ref": "#/$defs/hana_semver"
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
},
|
|
1042
|
+
"description": "Validated Indexer declaration. Optional versions are provider-supplied SemVer, never inferred from another component. Worker enforces role/component relationships, canonical self UUID for installation, distinct official components, source.repo=githubRepo and matching component/target versions when both are supplied. npm targets require source.name=npmPackageName and source.version=target.version=component.version; agent targets bind the distribution version. Cross-field checks also run in the Worker.",
|
|
1043
|
+
"allOf": [
|
|
1044
|
+
{
|
|
1045
|
+
"if": {
|
|
1046
|
+
"anyOf": [
|
|
1047
|
+
{
|
|
1048
|
+
"required": [
|
|
1049
|
+
"components"
|
|
1050
|
+
]
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
"required": [
|
|
1054
|
+
"distributionVersion"
|
|
1055
|
+
]
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
"required": [
|
|
1059
|
+
"agentPlugins"
|
|
1060
|
+
]
|
|
1061
|
+
}
|
|
1062
|
+
]
|
|
1063
|
+
},
|
|
1064
|
+
"then": {
|
|
1065
|
+
"properties": {
|
|
1066
|
+
"role": {
|
|
1067
|
+
"const": "suite"
|
|
1068
|
+
},
|
|
1069
|
+
"component": {
|
|
1070
|
+
"const": "usage"
|
|
1071
|
+
},
|
|
1072
|
+
"installable": {
|
|
1073
|
+
"const": true
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
]
|
|
1079
|
+
},
|
|
1080
|
+
"hana_officialSuiteIdentity": {
|
|
1081
|
+
"description": "Public Indexer official component identities; shared by Web validation for mirrored rows and install targets. Ref commits remain provider supplied. Scoped identities and their explicit historical npm names share the same component/GitHub binding.",
|
|
1082
|
+
"oneOf": [
|
|
1083
|
+
{
|
|
1084
|
+
"type": "object",
|
|
1085
|
+
"required": [
|
|
1086
|
+
"npmPackageName",
|
|
1087
|
+
"githubRepo"
|
|
1088
|
+
],
|
|
1089
|
+
"properties": {
|
|
1090
|
+
"component": {
|
|
1091
|
+
"const": "core"
|
|
1092
|
+
},
|
|
1093
|
+
"npmPackageName": {
|
|
1094
|
+
"enum": [
|
|
1095
|
+
"@hanamesh/core",
|
|
1096
|
+
"hanamesh-core"
|
|
1097
|
+
]
|
|
1098
|
+
},
|
|
1099
|
+
"githubRepo": {
|
|
1100
|
+
"const": "yzsnstotz/hanamesh-core"
|
|
1101
|
+
},
|
|
1102
|
+
"suite": {
|
|
1103
|
+
"type": "object",
|
|
1104
|
+
"properties": {
|
|
1105
|
+
"component": {
|
|
1106
|
+
"const": "core"
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
},
|
|
1112
|
+
{
|
|
1113
|
+
"type": "object",
|
|
1114
|
+
"required": [
|
|
1115
|
+
"npmPackageName",
|
|
1116
|
+
"githubRepo"
|
|
1117
|
+
],
|
|
1118
|
+
"properties": {
|
|
1119
|
+
"component": {
|
|
1120
|
+
"const": "usage"
|
|
1121
|
+
},
|
|
1122
|
+
"npmPackageName": {
|
|
1123
|
+
"enum": [
|
|
1124
|
+
"@hanamesh/usage",
|
|
1125
|
+
"hanamesh-usage"
|
|
1126
|
+
]
|
|
1127
|
+
},
|
|
1128
|
+
"githubRepo": {
|
|
1129
|
+
"const": "yzsnstotz/hanamesh-usage"
|
|
1130
|
+
},
|
|
1131
|
+
"suite": {
|
|
1132
|
+
"type": "object",
|
|
1133
|
+
"properties": {
|
|
1134
|
+
"component": {
|
|
1135
|
+
"const": "usage"
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
"type": "object",
|
|
1143
|
+
"required": [
|
|
1144
|
+
"npmPackageName",
|
|
1145
|
+
"githubRepo"
|
|
1146
|
+
],
|
|
1147
|
+
"properties": {
|
|
1148
|
+
"component": {
|
|
1149
|
+
"const": "app-host"
|
|
1150
|
+
},
|
|
1151
|
+
"npmPackageName": {
|
|
1152
|
+
"enum": [
|
|
1153
|
+
"@hanamesh/dsh-app-host"
|
|
1154
|
+
]
|
|
1155
|
+
},
|
|
1156
|
+
"githubRepo": {
|
|
1157
|
+
"const": "yzsnstotz/hanamesh-plugin-app-host"
|
|
1158
|
+
},
|
|
1159
|
+
"suite": {
|
|
1160
|
+
"type": "object",
|
|
1161
|
+
"properties": {
|
|
1162
|
+
"component": {
|
|
1163
|
+
"const": "app-host"
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
"type": "object",
|
|
1171
|
+
"required": [
|
|
1172
|
+
"npmPackageName",
|
|
1173
|
+
"githubRepo"
|
|
1174
|
+
],
|
|
1175
|
+
"properties": {
|
|
1176
|
+
"component": {
|
|
1177
|
+
"const": "brand"
|
|
1178
|
+
},
|
|
1179
|
+
"npmPackageName": {
|
|
1180
|
+
"enum": [
|
|
1181
|
+
"@hanamesh/brand",
|
|
1182
|
+
"hanamesh-brand"
|
|
1183
|
+
]
|
|
1184
|
+
},
|
|
1185
|
+
"githubRepo": {
|
|
1186
|
+
"const": "yzsnstotz/hanamesh-brand"
|
|
1187
|
+
},
|
|
1188
|
+
"suite": {
|
|
1189
|
+
"type": "object",
|
|
1190
|
+
"properties": {
|
|
1191
|
+
"component": {
|
|
1192
|
+
"const": "brand"
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
]
|
|
1199
|
+
},
|
|
1200
|
+
"hana_semver": {
|
|
1201
|
+
"type": "string",
|
|
1202
|
+
"maxLength": 128,
|
|
1203
|
+
"pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$(?![\\s\\S])"
|
|
1204
|
+
},
|
|
1205
|
+
"hanaPage": {
|
|
1206
|
+
"title": "HanaMesh opt-in full catalog page",
|
|
1207
|
+
"description": "C-WEB-CATALOG version 1 public allowlist. Runtime additionally enforces id=itemId, npm package equality, classification, source safety and actual UTF-8 response byte limits.",
|
|
1208
|
+
"type": "object",
|
|
1209
|
+
"additionalProperties": false,
|
|
1210
|
+
"required": [
|
|
1211
|
+
"schemaVersion",
|
|
1212
|
+
"items",
|
|
1213
|
+
"page"
|
|
1214
|
+
],
|
|
1215
|
+
"properties": {
|
|
1216
|
+
"schemaVersion": {
|
|
1217
|
+
"const": "hanamesh.catalog.v1"
|
|
1218
|
+
},
|
|
1219
|
+
"generatedAt": {
|
|
1220
|
+
"type": "string",
|
|
1221
|
+
"format": "date-time"
|
|
1222
|
+
},
|
|
1223
|
+
"items": {
|
|
1224
|
+
"type": "array",
|
|
1225
|
+
"maxItems": 200,
|
|
1226
|
+
"items": {
|
|
1227
|
+
"$ref": "#/$defs/hana_item"
|
|
1228
|
+
}
|
|
1229
|
+
},
|
|
1230
|
+
"page": {
|
|
1231
|
+
"$ref": "#/$defs/hana_page"
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
},
|
|
1236
|
+
"allOf": [
|
|
1237
|
+
{
|
|
1238
|
+
"if": {
|
|
1239
|
+
"properties": {
|
|
1240
|
+
"schemaVersion": {
|
|
1241
|
+
"const": "hanamesh.catalog.v1"
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
},
|
|
1245
|
+
"then": {
|
|
1246
|
+
"$ref": "#/$defs/hanaPage"
|
|
1247
|
+
},
|
|
1248
|
+
"else": {
|
|
1249
|
+
"$ref": "#/$defs/legacyPage"
|
|
1250
|
+
}
|
|
376
1251
|
}
|
|
377
|
-
|
|
1252
|
+
]
|
|
378
1253
|
}
|