@kanyun-ai-infra/band-cli 0.1.0 → 0.2.0
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/bundled/examples/aitutor-tool/band/views/release/package.json +1 -1
- package/bundled/examples/aitutor-tool/band/views/tool-preview/package.json +1 -1
- package/bundled/examples/analysis/band/views/intake/package.json +1 -1
- package/bundled/examples/compliance/band/views/compliance/package.json +1 -1
- package/bundled/examples/content-review/band/views/checklist/package.json +1 -1
- package/bundled/examples/rush-site/band/views/rush-db/package.json +1 -1
- package/bundled/examples/rush-site/band/views/rush-deploy/package.json +1 -1
- package/bundled/examples/video/band/views/timeline/package.json +1 -1
- package/bundled/kernel/fixture.js +1 -1
- package/bundled/kernel/index.js +1 -1
- package/bundled/official/activity/package.json +4 -4
- package/bundled/official/approval/package.json +4 -4
- package/bundled/official/artifacts/package.json +4 -4
- package/bundled/official/chat/package.json +4 -4
- package/bundled/official/chunks/chunk-DIL5YSVK.js +1 -0
- package/bundled/official/comment/dist/index.js +2 -2
- package/bundled/official/comment/package.json +4 -4
- package/bundled/official/header/package.json +4 -4
- package/bundled/official/home/package.json +4 -4
- package/bundled/official/layouts/package.json +4 -4
- package/bundled/official/library/dist/index.js +1 -1
- package/bundled/official/library/package.json +4 -4
- package/bundled/official/members/dist/index.js +1 -1
- package/bundled/official/members/package.json +4 -4
- package/bundled/official/memory/dist/index.js +2 -2
- package/bundled/official/memory/package.json +4 -4
- package/bundled/official/native/package.json +2 -2
- package/bundled/official/params-form/package.json +4 -4
- package/bundled/official/plugins/package.json +4 -4
- package/bundled/official/project/dist/index.js +1 -1
- package/bundled/official/project/package.json +4 -4
- package/bundled/official/queue/package.json +4 -4
- package/bundled/official/settings/dist/index.js +1 -1
- package/bundled/official/settings/package.json +4 -4
- package/bundled/official/settings/plugin.yaml +7 -0
- package/bundled/official/shell/dist/index.js +1 -1
- package/bundled/official/shell/package.json +4 -4
- package/bundled/official/stages/package.json +4 -4
- package/bundled/official/threads/package.json +4 -4
- package/bundled/official/turn-bar/package.json +4 -4
- package/bundled/official/turn-trace/package.json +4 -4
- package/bundled/official/version-switch/dist/index.js +1 -1
- package/bundled/official/version-switch/package.json +4 -4
- package/bundled/official/viewer-entity/package.json +2 -2
- package/bundled/official/viewer-external/package.json +2 -2
- package/bundled/official/viewer-image/package.json +2 -2
- package/bundled/official/viewer-media/index.js +2 -2
- package/bundled/official/viewer-media/package.json +2 -2
- package/bundled/official/viewer-storyboard/index.js +2 -2
- package/bundled/official/viewer-storyboard/package.json +2 -2
- package/bundled/official/viewer-text/dist/index.js +2 -2
- package/bundled/official/viewer-text/package.json +4 -4
- package/bundled/official/viewer-tool/package.json +2 -2
- package/bundled/official/viewer-web/package.json +2 -2
- package/bundled/official/viewer-web-app/package.json +2 -2
- package/bundled/official/workshops/dist/index.js +2 -2
- package/bundled/official/workshops/package.json +4 -4
- package/bundled/official/workshops/plugin.yaml +2 -2
- package/bundled/skills/band-plugin/SKILL.md +20 -273
- package/bundled/skills/band-plugin/references/code.md +58 -0
- package/bundled/skills/band-plugin/references/dev.md +37 -0
- package/bundled/skills/band-plugin/references/execution.md +26 -0
- package/bundled/skills/band-plugin/references/manifest.md +65 -0
- package/bundled/skills/band-plugin/references/placement.md +34 -0
- package/bundled/skills/band-plugin/references/reuse.md +38 -0
- package/bundled/skills/band-plugin/references/rules.md +13 -0
- package/bundled/skills/band-plugin/references/shape.md +17 -0
- package/bundled/skills/band-plugin/references/testing-publish.md +35 -0
- package/bundled/skills/band-plugin/references/viewer-comments.md +25 -0
- package/bundled/skills/band-plugin/templates/dev/fixture.ts +15 -0
- package/bundled/skills/band-plugin/templates/dev/resources.ts +6 -0
- package/bundled/skills/band-plugin/templates/panel/index.ts +24 -0
- package/bundled/skills/band-plugin/templates/panel/package.json +12 -0
- package/bundled/skills/band-plugin/templates/panel/plugin.yaml +5 -0
- package/bundled/skills/band-plugin/templates/toolbar-dock/plugin.yaml +11 -0
- package/dev-host/Inspector.tsx +28 -10
- package/dev-host/app.tsx +11 -6
- package/dev-host/host.css +11 -0
- package/dev-host/main.tsx +5 -0
- package/dist/bin.js +3 -3
- package/dist/build-plugin.d.ts +1 -1
- package/dist/build-plugin.js +1 -1
- package/dist/{chunk-TN7Z3OF6.js → chunk-LGYGWMSY.js} +19 -17
- package/dist/{chunk-VVJNG5GV.js → chunk-Q2XJXNVH.js} +22 -15
- package/dist/{chunk-RAD6MMSL.js → chunk-XPLYTHNX.js} +1 -1
- package/dist/{dev-server-RAZQ32W7.js → dev-server-Q7NTJ3QD.js} +116 -11
- package/dist/fixture.d.ts +11 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +2 -2
- package/dist/{workshop-repo-CO6YMDee.d.ts → workshop-repo-DqoVdcGu.d.ts} +10 -10
- package/package.json +10 -7
- package/src/dev-managers.ts +16 -0
- package/src/inspector-plugins.ts +18 -0
- package/bundled/official/chunks/chunk-JI6ZNGOE.js +0 -1
package/bundled/kernel/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var createStoreImpl=createState=>{let state;const listeners2=new Set;const setState=(partial,replace)=>{const nextState=typeof partial==="function"?partial(state):partial;if(!Object.is(nextState,state)){const previousState=state;state=(replace!=null?replace:typeof nextState!=="object"||nextState===null)?nextState:Object.assign({},state,nextState);listeners2.forEach(listener=>listener(state,previousState))}};const getState=()=>state;const getInitialState=()=>initialState;const subscribe=listener=>{listeners2.add(listener);return()=>listeners2.delete(listener)};const destroy=()=>{if((import.meta.env?import.meta.env.MODE:void 0)!=="production"){console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.")}listeners2.clear()};const api={setState,getState,getInitialState,subscribe,destroy};const initialState=state=createState(setState,getState,api);return api};var createStore=createState=>createState?createStoreImpl(createState):createStoreImpl;var subscribeWithSelectorImpl=fn=>(set2,get,api)=>{const origSubscribe=api.subscribe;api.subscribe=(selector,optListener,options)=>{let listener=selector;if(optListener){const equalityFn=(options==null?void 0:options.equalityFn)||Object.is;let currentSlice=selector(api.getState());listener=state=>{const nextSlice=selector(state);if(!equalityFn(currentSlice,nextSlice)){const previousSlice=currentSlice;optListener(currentSlice=nextSlice,previousSlice)}};if(options==null?void 0:options.fireImmediately){optListener(currentSlice,currentSlice)}}return origSubscribe(listener)};const initialState=fn(set2,get,api);return initialState};var subscribeWithSelector=subscribeWithSelectorImpl;function shallow$1(objA,objB){if(Object.is(objA,objB)){return true}if(typeof objA!=="object"||objA===null||typeof objB!=="object"||objB===null){return false}if(objA instanceof Map&&objB instanceof Map){if(objA.size!==objB.size)return false;for(const[key,value]of objA){if(!Object.is(value,objB.get(key))){return false}}return true}if(objA instanceof Set&&objB instanceof Set){if(objA.size!==objB.size)return false;for(const value of objA){if(!objB.has(value)){return false}}return true}const keysA=Object.keys(objA);if(keysA.length!==Object.keys(objB).length){return false}for(const keyA of keysA){if(!Object.prototype.hasOwnProperty.call(objB,keyA)||!Object.is(objA[keyA],objB[keyA])){return false}}return true}var NOTHING=Symbol.for("immer-nothing");var DRAFTABLE=Symbol.for("immer-draftable");var DRAFT_STATE=Symbol.for("immer-state");function die(error,...args){if(false){const e=errors[error];const msg=typeof e==="function"?e.apply(null,args):e;throw new Error(`[Immer] ${msg}`)}throw new Error(`[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`)}var getPrototypeOf=Object.getPrototypeOf;function isDraft(value){return!!value&&!!value[DRAFT_STATE]}function isDraftable(value){if(!value)return false;return isPlainObject(value)||Array.isArray(value)||!!value[DRAFTABLE]||!!value.constructor?.[DRAFTABLE]||isMap(value)||isSet(value)}var objectCtorString=Object.prototype.constructor.toString();var cachedCtorStrings=new WeakMap;function isPlainObject(value){if(!value||typeof value!=="object")return false;const proto=Object.getPrototypeOf(value);if(proto===null||proto===Object.prototype)return true;const Ctor=Object.hasOwnProperty.call(proto,"constructor")&&proto.constructor;if(Ctor===Object)return true;if(typeof Ctor!=="function")return false;let ctorString=cachedCtorStrings.get(Ctor);if(ctorString===void 0){ctorString=Function.toString.call(Ctor);cachedCtorStrings.set(Ctor,ctorString)}return ctorString===objectCtorString}function each(obj,iter,strict=true){if(getArchtype(obj)===0){const keys=strict?Reflect.ownKeys(obj):Object.keys(obj);keys.forEach(key=>{iter(key,obj[key],obj)})}else{obj.forEach((entry,index)=>iter(index,entry,obj))}}function getArchtype(thing){const state=thing[DRAFT_STATE];return state?state.type_:Array.isArray(thing)?1:isMap(thing)?2:isSet(thing)?3:0}function has(thing,prop){return getArchtype(thing)===2?thing.has(prop):Object.prototype.hasOwnProperty.call(thing,prop)}function set(thing,propOrOldValue,value){const t=getArchtype(thing);if(t===2)thing.set(propOrOldValue,value);else if(t===3){thing.add(value)}else thing[propOrOldValue]=value}function is(x,y){if(x===y){return x!==0||1/x===1/y}else{return x!==x&&y!==y}}function isMap(target){return target instanceof Map}function isSet(target){return target instanceof Set}function latest(state){return state.copy_||state.base_}function shallowCopy(base,strict){if(isMap(base)){return new Map(base)}if(isSet(base)){return new Set(base)}if(Array.isArray(base))return Array.prototype.slice.call(base);const isPlain=isPlainObject(base);if(strict===true||strict==="class_only"&&!isPlain){const descriptors=Object.getOwnPropertyDescriptors(base);delete descriptors[DRAFT_STATE];let keys=Reflect.ownKeys(descriptors);for(let i=0;i<keys.length;i++){const key=keys[i];const desc=descriptors[key];if(desc.writable===false){desc.writable=true;desc.configurable=true}if(desc.get||desc.set)descriptors[key]={configurable:true,writable:true,enumerable:desc.enumerable,value:base[key]}}return Object.create(getPrototypeOf(base),descriptors)}else{const proto=getPrototypeOf(base);if(proto!==null&&isPlain){return{...base}}const obj=Object.create(proto);return Object.assign(obj,base)}}function freeze(obj,deep=false){if(isFrozen(obj)||isDraft(obj)||!isDraftable(obj))return obj;if(getArchtype(obj)>1){Object.defineProperties(obj,{set:dontMutateMethodOverride,add:dontMutateMethodOverride,clear:dontMutateMethodOverride,delete:dontMutateMethodOverride})}Object.freeze(obj);if(deep)Object.values(obj).forEach(value=>freeze(value,true));return obj}function dontMutateFrozenCollections(){die(2)}var dontMutateMethodOverride={value:dontMutateFrozenCollections};function isFrozen(obj){if(obj===null||typeof obj!=="object")return true;return Object.isFrozen(obj)}var plugins={};function getPlugin(pluginKey){const plugin=plugins[pluginKey];if(!plugin){die(0,pluginKey)}return plugin}var currentScope;function getCurrentScope(){return currentScope}function createScope(parent_,immer_){return{drafts_:[],parent_,immer_,canAutoFreeze_:true,unfinalizedDrafts_:0}}function usePatchesInScope(scope,patchListener){if(patchListener){getPlugin("Patches");scope.patches_=[];scope.inversePatches_=[];scope.patchListener_=patchListener}}function revokeScope(scope){leaveScope(scope);scope.drafts_.forEach(revokeDraft);scope.drafts_=null}function leaveScope(scope){if(scope===currentScope){currentScope=scope.parent_}}function enterScope(immer2){return currentScope=createScope(currentScope,immer2)}function revokeDraft(draft){const state=draft[DRAFT_STATE];if(state.type_===0||state.type_===1)state.revoke_();else state.revoked_=true}function processResult(result,scope){scope.unfinalizedDrafts_=scope.drafts_.length;const baseDraft=scope.drafts_[0];const isReplaced=result!==void 0&&result!==baseDraft;if(isReplaced){if(baseDraft[DRAFT_STATE].modified_){revokeScope(scope);die(4)}if(isDraftable(result)){result=finalize(scope,result);if(!scope.parent_)maybeFreeze(scope,result)}if(scope.patches_){getPlugin("Patches").generateReplacementPatches_(baseDraft[DRAFT_STATE].base_,result,scope.patches_,scope.inversePatches_)}}else{result=finalize(scope,baseDraft,[])}revokeScope(scope);if(scope.patches_){scope.patchListener_(scope.patches_,scope.inversePatches_)}return result!==NOTHING?result:void 0}function finalize(rootScope,value,path){if(isFrozen(value))return value;const useStrictIteration=rootScope.immer_.shouldUseStrictIteration();const state=value[DRAFT_STATE];if(!state){each(value,(key,childValue)=>finalizeProperty(rootScope,state,value,key,childValue,path),useStrictIteration);return value}if(state.scope_!==rootScope)return value;if(!state.modified_){maybeFreeze(rootScope,state.base_,true);return state.base_}if(!state.finalized_){state.finalized_=true;state.scope_.unfinalizedDrafts_--;const result=state.copy_;let resultEach=result;let isSet2=false;if(state.type_===3){resultEach=new Set(result);result.clear();isSet2=true}each(resultEach,(key,childValue)=>finalizeProperty(rootScope,state,result,key,childValue,path,isSet2),useStrictIteration);maybeFreeze(rootScope,result,false);if(path&&rootScope.patches_){getPlugin("Patches").generatePatches_(state,path,rootScope.patches_,rootScope.inversePatches_)}}return state.copy_}function finalizeProperty(rootScope,parentState,targetObject,prop,childValue,rootPath,targetIsSet){if(childValue==null){return}if(typeof childValue!=="object"&&!targetIsSet){return}const childIsFrozen=isFrozen(childValue);if(childIsFrozen&&!targetIsSet){return}if(false)die(5);if(isDraft(childValue)){const path=rootPath&&parentState&&parentState.type_!==3&&!has(parentState.assigned_,prop)?rootPath.concat(prop):void 0;const res=finalize(rootScope,childValue,path);set(targetObject,prop,res);if(isDraft(res)){rootScope.canAutoFreeze_=false}else return}else if(targetIsSet){targetObject.add(childValue)}if(isDraftable(childValue)&&!childIsFrozen){if(!rootScope.immer_.autoFreeze_&&rootScope.unfinalizedDrafts_<1){return}if(parentState&&parentState.base_&&parentState.base_[prop]===childValue&&childIsFrozen){return}finalize(rootScope,childValue);if((!parentState||!parentState.scope_.parent_)&&typeof prop!=="symbol"&&(isMap(targetObject)?targetObject.has(prop):Object.prototype.propertyIsEnumerable.call(targetObject,prop)))maybeFreeze(rootScope,childValue)}}function maybeFreeze(scope,value,deep=false){if(!scope.parent_&&scope.immer_.autoFreeze_&&scope.canAutoFreeze_){freeze(value,deep)}}function createProxyProxy(base,parent){const isArray=Array.isArray(base);const state={type_:isArray?1:0,scope_:parent?parent.scope_:getCurrentScope(),modified_:false,finalized_:false,assigned_:{},parent_:parent,base_:base,draft_:null,copy_:null,revoke_:null,isManual_:false};let target=state;let traps=objectTraps;if(isArray){target=[state];traps=arrayTraps}const{revoke,proxy}=Proxy.revocable(target,traps);state.draft_=proxy;state.revoke_=revoke;return proxy}var objectTraps={get(state,prop){if(prop===DRAFT_STATE)return state;const source=latest(state);if(!has(source,prop)){return readPropFromProto(state,source,prop)}const value=source[prop];if(state.finalized_||!isDraftable(value)){return value}if(value===peek(state.base_,prop)){prepareCopy(state);return state.copy_[prop]=createProxy(value,state)}return value},has(state,prop){return prop in latest(state)},ownKeys(state){return Reflect.ownKeys(latest(state))},set(state,prop,value){const desc=getDescriptorFromProto(latest(state),prop);if(desc?.set){desc.set.call(state.draft_,value);return true}if(!state.modified_){const current2=peek(latest(state),prop);const currentState=current2?.[DRAFT_STATE];if(currentState&¤tState.base_===value){state.copy_[prop]=value;state.assigned_[prop]=false;return true}if(is(value,current2)&&(value!==void 0||has(state.base_,prop)))return true;prepareCopy(state);markChanged(state)}if(state.copy_[prop]===value&&(value!==void 0||prop in state.copy_)||Number.isNaN(value)&&Number.isNaN(state.copy_[prop]))return true;state.copy_[prop]=value;state.assigned_[prop]=true;return true},deleteProperty(state,prop){if(peek(state.base_,prop)!==void 0||prop in state.base_){state.assigned_[prop]=false;prepareCopy(state);markChanged(state)}else{delete state.assigned_[prop]}if(state.copy_){delete state.copy_[prop]}return true},getOwnPropertyDescriptor(state,prop){const owner=latest(state);const desc=Reflect.getOwnPropertyDescriptor(owner,prop);if(!desc)return desc;return{writable:true,configurable:state.type_!==1||prop!=="length",enumerable:desc.enumerable,value:owner[prop]}},defineProperty(){die(11)},getPrototypeOf(state){return getPrototypeOf(state.base_)},setPrototypeOf(){die(12)}};var arrayTraps={};each(objectTraps,(key,fn)=>{arrayTraps[key]=function(){arguments[0]=arguments[0][0];return fn.apply(this,arguments)}});arrayTraps.deleteProperty=function(state,prop){if(false)die(13);return arrayTraps.set.call(this,state,prop,void 0)};arrayTraps.set=function(state,prop,value){if(false)die(14);return objectTraps.set.call(this,state[0],prop,value,state[0])};function peek(draft,prop){const state=draft[DRAFT_STATE];const source=state?latest(state):draft;return source[prop]}function readPropFromProto(state,source,prop){const desc=getDescriptorFromProto(source,prop);return desc?`value`in desc?desc.value:desc.get?.call(state.draft_):void 0}function getDescriptorFromProto(source,prop){if(!(prop in source))return void 0;let proto=getPrototypeOf(source);while(proto){const desc=Object.getOwnPropertyDescriptor(proto,prop);if(desc)return desc;proto=getPrototypeOf(proto)}return void 0}function markChanged(state){if(!state.modified_){state.modified_=true;if(state.parent_){markChanged(state.parent_)}}}function prepareCopy(state){if(!state.copy_){state.copy_=shallowCopy(state.base_,state.scope_.immer_.useStrictShallowCopy_)}}var Immer2=class{constructor(config){this.autoFreeze_=true;this.useStrictShallowCopy_=false;this.useStrictIteration_=true;this.produce=(base,recipe,patchListener)=>{if(typeof base==="function"&&typeof recipe!=="function"){const defaultBase=recipe;recipe=base;const self=this;return function curriedProduce(base2=defaultBase,...args){return self.produce(base2,draft=>recipe.call(this,draft,...args))}}if(typeof recipe!=="function")die(6);if(patchListener!==void 0&&typeof patchListener!=="function")die(7);let result;if(isDraftable(base)){const scope=enterScope(this);const proxy=createProxy(base,void 0);let hasError=true;try{result=recipe(proxy);hasError=false}finally{if(hasError)revokeScope(scope);else leaveScope(scope)}usePatchesInScope(scope,patchListener);return processResult(result,scope)}else if(!base||typeof base!=="object"){result=recipe(base);if(result===void 0)result=base;if(result===NOTHING)result=void 0;if(this.autoFreeze_)freeze(result,true);if(patchListener){const p=[];const ip=[];getPlugin("Patches").generateReplacementPatches_(base,result,p,ip);patchListener(p,ip)}return result}else die(1,base)};this.produceWithPatches=(base,recipe)=>{if(typeof base==="function"){return(state,...args)=>this.produceWithPatches(state,draft=>base(draft,...args))}let patches,inversePatches;const result=this.produce(base,recipe,(p,ip)=>{patches=p;inversePatches=ip});return[result,patches,inversePatches]};if(typeof config?.autoFreeze==="boolean")this.setAutoFreeze(config.autoFreeze);if(typeof config?.useStrictShallowCopy==="boolean")this.setUseStrictShallowCopy(config.useStrictShallowCopy);if(typeof config?.useStrictIteration==="boolean")this.setUseStrictIteration(config.useStrictIteration)}createDraft(base){if(!isDraftable(base))die(8);if(isDraft(base))base=current(base);const scope=enterScope(this);const proxy=createProxy(base,void 0);proxy[DRAFT_STATE].isManual_=true;leaveScope(scope);return proxy}finishDraft(draft,patchListener){const state=draft&&draft[DRAFT_STATE];if(!state||!state.isManual_)die(9);const{scope_:scope}=state;usePatchesInScope(scope,patchListener);return processResult(void 0,scope)}setAutoFreeze(value){this.autoFreeze_=value}setUseStrictShallowCopy(value){this.useStrictShallowCopy_=value}setUseStrictIteration(value){this.useStrictIteration_=value}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(base,patches){let i;for(i=patches.length-1;i>=0;i--){const patch=patches[i];if(patch.path.length===0&&patch.op==="replace"){base=patch.value;break}}if(i>-1){patches=patches.slice(i+1)}const applyPatchesImpl=getPlugin("Patches").applyPatches_;if(isDraft(base)){return applyPatchesImpl(base,patches)}return this.produce(base,draft=>applyPatchesImpl(draft,patches))}};function createProxy(value,parent){const draft=isMap(value)?getPlugin("MapSet").proxyMap_(value,parent):isSet(value)?getPlugin("MapSet").proxySet_(value,parent):createProxyProxy(value,parent);const scope=parent?parent.scope_:getCurrentScope();scope.drafts_.push(draft);return draft}function current(value){if(!isDraft(value))die(10,value);return currentImpl(value)}function currentImpl(value){if(!isDraftable(value)||isFrozen(value))return value;const state=value[DRAFT_STATE];let copy;let strict=true;if(state){if(!state.modified_)return state.base_;state.finalized_=true;copy=shallowCopy(value,state.scope_.immer_.useStrictShallowCopy_);strict=state.scope_.immer_.shouldUseStrictIteration()}else{copy=shallowCopy(value,true)}each(copy,(key,childValue)=>{set(copy,key,currentImpl(childValue))},strict);if(state){state.finalized_=false}return copy}var immer=new Immer2;var produce=immer.produce;import{ANCHOR_CHOICES,AnchorKindSchema,DEFAULT_AGENT,DeliverInputSchema,ManualStageSubmitSchema,SHOT_LIST_PATH,ThreadIntentSchema,checkAnchorChoice,checkAnchorPayload,clampAnchorPoint,memoryProblem,pickAnchorProblem}from"@kanyun-ai-infra/band-contracts";import{LIVE_PREVIEW_POLL_MS as LIVE_PREVIEW_POLL_MS2}from"@kanyun-ai-infra/band-contracts/api";import{HandoffRejectedError,ResourceDeniedError,StorageLimitError,classifyResourceRequest,isOfficialName,pluginStorageProblem}from"@kanyun-ai-infra/band-plugin-sdk";import{ATTACHMENT_LIMITS,attachmentLimitFor,attachmentSizeProblem,formatByteSize}from"@kanyun-ai-infra/band-contracts";import{AttachmentRejectedError}from"@kanyun-ai-infra/band-plugin-sdk";import{shortName,withImeGuard}from"@kanyun-ai-infra/band-plugin-sdk";import{LIVE_PREVIEW_POLL_MS}from"@kanyun-ai-infra/band-contracts/api";import{DEFAULT_AGENT as DEFAULT_AGENT2}from"@kanyun-ai-infra/band-contracts";import{WORKSHOP_PAGE_SEGMENT,WORKSHOP_PARAM,buildRoute,checkConfig,isOfficialName as isOfficialName2,matchRoute,resolveKey,withConfigDefaults,workshopOf}from"@kanyun-ai-infra/band-plugin-sdk";function withDisplayDefaults(t){const listVersions=async artifactId=>labelled(await t.listVersions(artifactId));const listArtifacts=async()=>{const list=await t.listArtifacts();return Promise.all(list.map(a=>withLatestLabel(a,listVersions)))};return new Proxy(t,{get(target,key){if(key==="listVersions")return listVersions;if(key==="listArtifacts")return listArtifacts;return Reflect.get(target,key)}})}function labelOf(v){const label=v?.meta?.label;return typeof label==="string"?label:void 0}function labelled(versions){const number=new Map([...versions].sort((a,b)=>a.createdAt.localeCompare(b.createdAt)).map((v,i)=>[v.id,i+1]));return versions.map(v=>labelOf(v)!==void 0?v:{...v,meta:{...v.meta,label:`v${number.get(v.id)}`}})}async function withLatestLabel(a,listVersions){const latest2=a.latest;if(!latest2)return a;const same=labelOf((await listVersions(a.id)).find(v=>v.id===latest2.versionId));const label=same??latest2.label??(latest2.number!==void 0?`v${latest2.number}`:void 0);return label===void 0||label===latest2.label?a:{...a,latest:{...latest2,label}}}function notifySubscribers(listeners2,label,...args){for(const listener of[...listeners2]){try{listener(...args)}catch(error){console.error(`${label} subscriber failed:`,error)}}}function shallowEqual(a,b){return shallow$1(a,b)}function rafBatch(notify){const schedule=typeof requestAnimationFrame==="function"?fn=>{requestAnimationFrame(()=>{fn()})}:fn=>{queueMicrotask(fn)};let scheduled=false;return()=>{if(scheduled)return;scheduled=true;schedule(()=>{scheduled=false;notify()})}}function createSnapshotStore(init,opts){const withSelector=subscribeWithSelector(()=>init);const api=createStore()(withSelector);if(opts?.persist)attachPersistence(api,opts.persist.name);let subscribe=fn=>api.subscribe(()=>{notifySubscribers([fn],"[client-store]")});if(opts?.flush==="raf"){const listeners2=new Set;const flush=rafBatch(()=>{notifySubscribers(listeners2,"[client-store]")});api.subscribe(flush);subscribe=fn=>{listeners2.add(fn);return()=>{listeners2.delete(fn)}}}return{getSnapshot:()=>api.getState(),subscribe:fn=>subscribe(fn),update:mutator=>{api.setState(produce(api.getState(),draft=>{mutator(draft)}),true)},set:next=>{api.setState(devFreeze(next),true)}}}function attachPersistence(api,name){if(typeof localStorage==="undefined")return;try{const raw=localStorage.getItem(name);if(raw!==null){api.setState(devFreeze(JSON.parse(raw)),true)}}catch(error){console.error(`snapshot store '${name}' rehydration failed:`,error)}api.subscribe(state=>{try{localStorage.setItem(name,JSON.stringify(state))}catch(error){console.error(`snapshot store '${name}' persistence failed:`,error)}})}function devFreeze(value){if(true)return value;return freeze(value,true)}function defineStore(decl){return{spec:decl,create(scopeKey){const persistKey=decl.persist===void 0?void 0:scopeKey===void 0?decl.persist:`${decl.persist}.${scopeKey}`;const store=createSnapshotStore(decl.init(),persistKey!==void 0?{persist:{name:persistKey}}:void 0);const actions={};for(const key of Object.keys(decl.actions)){const mutate=decl.actions[key];actions[key]=(...params)=>{store.update(draft=>{mutate(draft,...params)})}}return{actions,getSnapshot:()=>store.getSnapshot(),subscribe:fn=>store.subscribe(fn),store,clearPersisted:()=>{if(persistKey===void 0||typeof localStorage==="undefined")return;try{localStorage.removeItem(persistKey)}catch{}}}}}}var IMAGE_COMPRESSION={longEdge:2560,qualities:[.85,.75,.65,.55,.45]};var browserImageCodec={async open(file){if(typeof createImageBitmap!=="function")return null;let bitmap;try{bitmap=await createImageBitmap(file)}catch{return null}return{async encode(longEdge,quality){const scale=Math.min(1,longEdge/Math.max(bitmap.width,bitmap.height));const w=Math.max(1,Math.round(bitmap.width*scale));const h=Math.max(1,Math.round(bitmap.height*scale));if(typeof OffscreenCanvas==="function"){const canvas2=new OffscreenCanvas(w,h);paint(canvas2.getContext("2d"),bitmap,w,h);return canvas2.convertToBlob({type:"image/jpeg",quality})}const canvas=document.createElement("canvas");canvas.width=w;canvas.height=h;paint(canvas.getContext("2d"),bitmap,w,h);return new Promise((resolve,reject)=>canvas.toBlob(b=>b?resolve(b):reject(new Error("\u56FE\u7247\u6CA1\u7F16\u7801\u51FA\u6765")),"image/jpeg",quality))},close:()=>bitmap.close()}}};function paint(ctx,bitmap,w,h){if(!ctx)throw new Error("\u6CA1\u6709 2D \u753B\u5E03");ctx.fillStyle="#fff";ctx.fillRect(0,0,w,h);ctx.drawImage(bitmap,0,0,w,h)}function compressedName(name){const dot=name.lastIndexOf(".");return`${dot>0?name.slice(0,dot):name}.jpg`}async function compressImage(file,maxBytes,codec,signal){const image=await codec.open(file);if(!image)return null;try{for(const quality of IMAGE_COMPRESSION.qualities){signal?.throwIfAborted();const out=await image.encode(IMAGE_COMPRESSION.longEdge,quality);if(out.size<=maxBytes)return out}return null}finally{image.close()}}async function prepareAttachment(file,o={}){const problem=attachmentSizeProblem({name:file.name,mime:file.type,size:file.size});if(problem===null)return file;if(file.size<=0)throw new AttachmentRejectedError(file.name,"empty",problem);const limit=attachmentLimitFor({mime:file.type});if(!limit.compress||file.size>ATTACHMENT_LIMITS.maxFileBytes){throw new AttachmentRejectedError(file.name,"too-large",limit.compress?`\u300C${file.name}\u300D\u8D85\u8FC7\u6587\u4EF6\u4E0A\u9650 ${formatByteSize(ATTACHMENT_LIMITS.maxFileBytes)}\uFF0C\u592A\u5927\u538B\u7F29\u4E0D\u4E86\uFF08\u73B0\u5728 ${formatByteSize(file.size)}\uFF09`:problem)}const out=await compressImage(file,limit.maxBytes,o.codec??browserImageCodec,o.signal);if(!out){throw new AttachmentRejectedError(file.name,"too-large",`\u300C${file.name}\u300D\u8D85\u8FC7\u56FE\u7247\u4E0A\u9650 ${formatByteSize(limit.maxBytes)}\uFF0C\u538B\u7F29\u540E\u4ECD\u653E\u4E0D\u4E0B\u6216\u8FD9\u91CC\u538B\u7F29\u4E0D\u4E86\uFF08\u73B0\u5728 ${formatByteSize(file.size)}\uFF09`)}return new File([out],compressedName(file.name),{type:"image/jpeg"})}function topLayerElement(){const all=document.querySelectorAll("[data-band-layer]");return all[all.length-1]??null}var SVG_NS="http://www.w3.org/2000/svg";function closeIcon(){const svg=document.createElementNS(SVG_NS,"svg");svg.setAttribute("viewBox","0 0 16 16");svg.setAttribute("width","16");svg.setAttribute("height","16");svg.setAttribute("aria-hidden","true");const path=document.createElementNS(SVG_NS,"path");path.setAttribute("d","M4 4l8 8M12 4l-8 8");path.setAttribute("stroke","currentColor");path.setAttribute("stroke-width","1.5");path.setAttribute("stroke-linecap","round");path.setAttribute("fill","none");svg.append(path);return svg}var titleSeq=0;function createLayerStack(o={}){let pendingConfirms=0;let open=0;let savedOverflow=null;const lockScroll=()=>{if(open===0){savedOverflow=document.documentElement.style.overflow;document.documentElement.style.overflow="hidden"}open+=1};const unlockScroll=()=>{open-=1;if(open===0){document.documentElement.style.overflow=savedOverflow??"";savedOverflow=null}};return{confirmStarted(){pendingConfirms+=1;let done=false;return()=>{if(done)return;done=true;pendingConfirms-=1}},open(source,opts,render,track){if(typeof document==="undefined")throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u80FD\u5F00\u6D6E\u5C42");if(pendingConfirms>0){throw new Error(`\u63D2\u4EF6 ${source}\uFF1A\u6709\u4E00\u4E2A\u5199\u7EBF\u4E0A\u786E\u8BA4\u5728\u7B49\uFF0C\u5904\u7406\u5B8C\u518D\u5F00\u6D6E\u5C42`)}if(typeof render!=="function")throw new Error(`\u63D2\u4EF6 ${source}\uFF1Alayers.open \u8981\u7ED9\u753B\u6CD5`);const dismissable=opts.dismissable!==false;const opener=document.activeElement;const dialog=document.createElement("dialog");dialog.className="band-layer";dialog.dataset.bandLayer="plugin";dialog.dataset.size=opts.size==="full"?"full":"sheet";dialog.dataset.source=source;const titleId=`band-layer-title-${++titleSeq}`;dialog.setAttribute("aria-labelledby",titleId);const frame=document.createElement("div");frame.className="band-layer-frame";const head=document.createElement("div");head.className="band-layer-head";const heading=document.createElement("h2");heading.className="band-layer-title";heading.id=titleId;const from=document.createElement("span");from.className="band-layer-source";from.textContent=shortName(source);heading.append(from);if(opts.title){const text=document.createElement("span");text.className="band-layer-text";text.textContent=opts.title;heading.append(text)}const closeBtn=document.createElement("button");closeBtn.type="button";closeBtn.className="band-layer-close";closeBtn.setAttribute("aria-label","\u5173\u95ED");closeBtn.title="\u5173\u95ED";closeBtn.append(closeIcon());head.append(heading,closeBtn);const body=document.createElement("div");body.className="band-layer-body";body.tabIndex=-1;frame.append(head,body);dialog.append(frame);let closed=false;let cleanup;const tracked={};const onKey=withImeGuard(e=>{if(e.key!=="Escape"||e.defaultPrevented)return;if(topLayerElement()!==dialog)return;e.preventDefault();if(dismissable)handle.close()});const handle={get closed(){return closed},close(){if(closed)return;closed=true;window.removeEventListener("keydown",onKey);if(cleanup){try{cleanup()}catch(error){console.error(`[band-kernel layers] ${source} \u7684\u6D6E\u5C42\u6E05\u7406\u51FA\u9519`,error)}}if(dialog.open&&typeof dialog.close==="function")dialog.close();dialog.remove();unlockScroll();if(opener instanceof HTMLElement&&opener.isConnected)opener.focus();tracked.release?.()}};dialog.addEventListener("cancel",e=>e.preventDefault());dialog.addEventListener("close",()=>handle.close());closeBtn.addEventListener("click",()=>handle.close());let downOnBackdrop=false;dialog.addEventListener("mousedown",e=>{downOnBackdrop=e.target===dialog});dialog.addEventListener("click",e=>{if(dismissable&&downOnBackdrop&&e.target===dialog)handle.close();downOnBackdrop=false});o.onOpen?.();document.body.append(dialog);lockScroll();if(typeof dialog.showModal==="function")dialog.showModal();else dialog.setAttribute("open","");window.addEventListener("keydown",onKey);tracked.release=track(()=>handle.close());if(closed)return handle;try{const ret=render(body);if(typeof ret==="function"){if(closed)ret();else cleanup=ret}}catch(error){handle.close();throw error}if(!closed&&!body.contains(document.activeElement))body.focus();return handle}}}var defaultTimers={setTimeout:(fn,ms)=>globalThis.setTimeout(fn,ms),clearTimeout:h=>globalThis.clearTimeout(h)};function createLiveController(fetch,opts={}){const timers=opts.timers??defaultTimers;let url=null;let status="starting";let everReady=false;let timer=null;let alive=true;let started=false;const listeners2=new Set;const set2=(nextUrl,next)=>{if(nextUrl===url&&next===status)return;url=nextUrl;status=next;for(const fn of[...listeners2])fn()};const apply=p=>{if(p===null){everReady=false;return set2(null,"stopped")}if(p.url===null){everReady=false;return set2(null,"starting")}if(p.url!==url)everReady=false;if(p.ready){everReady=true;return set2(p.url,"ready")}set2(p.url,everReady?"error":"starting")};const schedule=()=>{if(!alive)return;const ms=status==="ready"||status==="stopped"?LIVE_PREVIEW_POLL_MS.embedded:LIVE_PREVIEW_POLL_MS.starting;timer=timers.setTimeout(tick,ms)};async function tick(){timer=null;try{const p=await fetch();if(!alive)return;apply(p)}catch{if(!alive)return;timer=timers.setTimeout(tick,LIVE_PREVIEW_POLL_MS.starting);return}schedule()}if(opts.initial!==void 0)apply(opts.initial);const start=()=>{if(started||!alive)return;started=true;void tick()};return{url:()=>{start();return url},status:()=>{start();return status},subscribe(fn){start();listeners2.add(fn);return()=>listeners2.delete(fn)},dispose(){alive=false;listeners2.clear();if(timer!==null)timers.clearTimeout(timer);timer=null}}}var ANCHOR_RESOLVE_TIMEOUT_MS=5e3;var BARE_HOST_GRACE_MS=300;var EDIT_FLUSH_TIMEOUT_MS=1e4;var EditFlushError=class extends Error{constructor(reason){super(reason==="timeout"?"\u76F4\u63A5\u7F16\u8F91\u7684\u5199\u56DE 10 \u79D2\u5185\u6CA1\u5B8C\u6210\uFF0C\u5148\u4E0D\u53D1\u4FEE\u6539\u8BF7\u6C42":"\u76F4\u63A5\u7F16\u8F91\u7684\u5199\u56DE\u5931\u8D25\u4E86\uFF0C\u5148\u4E0D\u53D1\u4FEE\u6539\u8BF7\u6C42");this.reason=reason;this.name="EditFlushError"}reason};var HANDOFF_POLL_MS=1e3;var BUILTIN_ANCHORS=new Set(AnchorKindSchema.options);var LATE_BUILTIN_ANCHORS=new Set(["shot"]);var POINT_CLAMP_WARN=.05;function checkedCandidates(plugin,raw){if(!raw)return null;const anchors={};for(const choice of ANCHOR_CHOICES){const anchor=raw.anchors[choice];if(!anchor)continue;const problem=checkAnchorChoice(choice,anchor);if(problem)console.warn(`[band] ${plugin}\uFF1A\u951A\u70B9\u5019\u9009 ${problem}\uFF0C\u5DF2\u4E22\u6389`);else anchors[choice]=anchor}const preferred=raw.preferred!=="shot"&&anchors[raw.preferred]?raw.preferred:"moment";return anchors[preferred]?{anchors,preferred}:null}var ANCHOR_ID=/^[a-z][a-z0-9-]*$/;function canReadThreadsOf(access,given){return(access??"member")==="member"||given===true}function createProjectServices(opts){const{member}=opts;const transport=withDisplayDefaults(opts.transport);const canReadThreads=canReadThreadsOf(opts.access,opts.canReadThreads);const agent=opts.agent??DEFAULT_AGENT;const newId=opts.newId??(()=>`anc_${Math.random().toString(36).slice(2,12)}`);const anchorTypes=new Map;const handlers=new Map;const eventListeners=new Set;let hosts=[];const hostListeners=new Set;let annotating=false;const annotatingListeners=new Set;let annotatingBy=null;const setAnnotating=on=>{if(!on)annotatingBy=null;if(annotating===on)return;annotating=on;notifySubscribers(annotatingListeners,"[band-kernel annotating]",on)};const addHost=entry=>{hosts=[...hosts,entry];notifySubscribers(hostListeners,"[band-kernel anchors]")};const dropHost=entry=>{if(!hosts.includes(entry))return false;hosts=hosts.filter(h=>h!==entry);notifySubscribers(hostListeners,"[band-kernel anchors]");return true};const layerStack=createLayerStack({onOpen:()=>setAnnotating(false)});let unsubscribeTransport;const inFlight=new Set;const flushTimeout=opts.editFlushTimeoutMs??EDIT_FLUSH_TIMEOUT_MS;const anchorTimeout=opts.anchorResolveTimeoutMs??ANCHOR_RESOLVE_TIMEOUT_MS;function trackEdit(p){inFlight.add(p);const done=()=>inFlight.delete(p);p.then(done,done);return p}async function flushEdits(){if(inFlight.size===0)return;let timer;const timeout=new Promise(resolve=>{timer=setTimeout(()=>resolve("timeout"),flushTimeout)});const settled=Promise.allSettled([...inFlight]).then(rs=>rs.some(r=>r.status==="rejected"||isFailedResult(r.value))?"failed":"ok");const outcome=await Promise.race([settled,timeout]);clearTimeout(timer);if(outcome!=="ok")throw new EditFlushError(outcome)}function addEventListener(fn){eventListeners.add(fn);if(!unsubscribeTransport){unsubscribeTransport=transport.subscribe(e=>{notifySubscribers(eventListeners,"[band-kernel events]",e)})}return()=>{eventListeners.delete(fn);if(eventListeners.size===0&&unsubscribeTransport){unsubscribeTransport();unsubscribeTransport=void 0}}}function request(r){const h=handlers.get(r.type);if(!h)throw new Error(`\u6CA1\u6709\u9501\u5B9A\u63D2\u4EF6\u8BA4\u9886 ${r.type} \u8BF7\u6C42\uFF08\u9875\u9762\u4E0A\u7F3A\u8BC4\u8BBA\u6846\u6216\u6279\u51C6\u9762\u677F\uFF09`);h.fn(r)}const focuses=new Set;function createFocus(){const currentVersion2=createSnapshotStore({v:null});let following=null;let stopFollowing;function publish(f){const v=f.shown&&f.shown.artifactId===f.artifactId?f.shown:f.latest;if(v?.id===currentVersion2.getSnapshot().v?.id)return;currentVersion2.set({v:v===null?null:structuredClone(v)})}function showVersion(f,v){if(v&&v.artifactId!==f.artifactId)focusOn(f,v.artifactId);f.shown=v;publish(f)}function focusOn(f,artifactId){if(f.artifactId===artifactId)return;f.artifactId=artifactId;f.shown=null;void loadLatest(f)}async function loadLatest(f){const id=f.artifactId;const n=++f.seq;if(id===null)return;let list;try{list=await transport.listVersions(id)}catch{return}if(n!==f.seq||following!==f)return;const previous=f.latest?.artifactId===id?f.latest:null;f.latest=list.at(-1)??null;if(f.shown&&(f.shown.id===previous?.id||f.shown.id===f.latest?.id))f.shown=null;publish(f)}const self={currentVersion:currentVersion2,setCurrentVersion(v){if(following){showVersion(following,v);return}currentVersion2.set({v:v===null?null:structuredClone(v)})},follow(artifactId){if(following)return;const f={artifactId:null,shown:null,latest:null,seq:0};following=f;const pickInitial=()=>opts.transport.listArtifacts().then(list=>{const deliverables=list.filter(a=>!a.unused&&a.role!=="process");const candidates=deliverables.length>0?deliverables:list;const first=candidates.reduce((best,a)=>!best||a.latest&&(!best.latest||Date.parse(a.latest.at)>Date.parse(best.latest.at))?a:best,void 0);if(following===f&&f.artifactId===null&&first)focusOn(f,first.id)},()=>{});stopFollowing=addEventListener(e=>{if(!e.type.startsWith("version."))return;if(f.artifactId===null)void pickInitial();else void loadLatest(f)});if(artifactId!==void 0)focusOn(f,artifactId);else void pickInitial()},focus(artifactId){if(following)focusOn(following,artifactId)},dispose(){following=null;stopFollowing?.();stopFollowing=void 0;focuses.delete(self)}};focuses.add(self);return self}const projectFocus=createFocus();const currentVersion=projectFocus.currentVersion;const setCurrentVersion=v=>projectFocus.setCurrentVersion(v);let lastPreview=null;function liveFor(track){const preview=transport.preview?.bind(transport);if(!preview)return void 0;const recent=lastPreview&&Date.now()-lastPreview.at<LIVE_PREVIEW_POLL_MS2.embedded?{initial:lastPreview.value}:{};const live=createLiveController(async()=>{const value=await preview();lastPreview={at:Date.now(),value};return value},recent);track(()=>live.dispose());return{url:live.url,status:live.status,subscribe:live.subscribe}}function bareHost(name,o,track){const{mount,version}=o;if(!mount||!version)return{own:()=>{}};let owned=0;let ended=false;let entry=null;let timer;const schedule=()=>{clearTimeout(timer);timer=setTimeout(()=>{if(ended||owned>0||entry)return;entry={plugin:name,mount,version,kinds:Object.freeze([]),locate:()=>({at:"none"}),reveal:async()=>false,onLayout:()=>()=>{}};addHost(entry)},BARE_HOST_GRACE_MS)};schedule();track(()=>{ended=true;clearTimeout(timer);if(entry)dropHost(entry)});return{own(delta){owned+=delta;if(owned>0&&entry){dropHost(entry);entry=null}else if(owned===0&&!ended){schedule()}}}}async function resolveAnchor(anchor,version){if(BUILTIN_ANCHORS.has(anchor.kind))return anchor.payload;const t=anchorTypes.get(anchor.kind);if(!t)return void 0;let timer;const timeout=new Promise(done=>{timer=setTimeout(()=>done(null),anchorTimeout)});try{const resolved=Promise.resolve(t.impl.resolve(anchor.payload,version,path=>transport.readFile(version.id,path)));return await Promise.race([resolved,timeout])}catch{return null}finally{clearTimeout(timer)}}function notifyFor(via){const n=()=>{if(!transport.notify)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u901A\u77E5\u51FA\u53E3");return transport.notify};const call=fn=>Promise.resolve().then(fn);return{list:()=>call(()=>n().list()),add:(type,config)=>call(()=>n().add(via,type,config)),remove:channelId=>call(()=>n().remove(via,channelId)),get:()=>call(()=>n().get()),set:webhook=>call(()=>n().set(via,webhook))}}function storageFor(via){const t=()=>{if(!transport.storage)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u63D2\u4EF6\u5B58\u50A8");return transport.storage};const call=fn=>Promise.resolve().then(fn);const checkKey=key=>{const problem=pluginStorageProblem(key,null);if(problem)throw new StorageLimitError(key,problem.limit,problem.message)};return{get:key=>call(async()=>{checkKey(key);return(await t().get(via,key))?.value}),set:(key,value)=>call(()=>{const problem=pluginStorageProblem(key,value);if(problem)throw new StorageLimitError(key,problem.limit,problem.message);return t().set(via,key,JSON.parse(JSON.stringify(value)))}),remove:key=>call(()=>{checkKey(key);return t().remove(via,key)}),list:()=>call(()=>t().list(via))}}function memoryFor(via){const m=()=>{if(!transport.memory)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9879\u76EE\u8BB0\u5FC6");return transport.memory};const call=fn=>Promise.resolve().then(fn);return{current:()=>call(()=>m().current()),versions:()=>call(()=>m().versions()),version:v=>call(()=>m().version(v)),save:input=>call(async()=>{const t=m();const files=[...input.files??[]];const removed=[...input.removed??[]];const problem=memoryProblem(files);if(problem)return{ok:false,code:"INVALID",message:problem};return t.save(via,{baseVersion:input.baseVersion,files,removed})}),revert:v=>call(()=>m().revert(via,v)),restore:v=>call(()=>m().restore(via,v))}}function handoffApi(via,decl,track){const t=()=>{if(!decl?.read&&!decl?.write)throw new HandoffRejectedError("NOT_DECLARED",`${via} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E agent`);if(!transport.handoffs)throw new HandoffRejectedError("NOT_DECLARED","\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u4EA4\u7ED9 agent");return transport.handoffs};const call=fn=>{try{return fn()}catch(e){return Promise.reject(e)}};return{handoff:request2=>call(()=>{const kind=request2.write===true?"write":"read";if(!decl?.[kind])throw new HandoffRejectedError("NOT_DECLARED",`${via} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E agent.${kind}`);return t().create(via,request2)}),get:id=>call(()=>t().get(id)),events:(id,opts2)=>call(()=>t().events(id,opts2?.after??0)),cancel:id=>call(()=>t().cancel(via,id)),conversations:{list:(filter={})=>call(()=>t().conversations(filter)),get:id=>call(()=>t().conversation(id))},subscribe(id,fn,opts2={}){let stopped=false;let after=opts2.after??0;let timer;const tick=async()=>{timer=void 0;if(stopped)return;try{const page=await t().events(id,after);if(stopped)return;if("cursorReset"in page){opts2.onReset?.(page.snapshot);after=page.snapshot.seq}for(const e of page.events){if(e.seq<=after)continue;after=e.seq;fn(e);if(e.type==="end")stopped=true}if("cursorReset"in page&&page.snapshot.end!==void 0)stopped=true}catch(e){opts2.onError?.(e);if(e instanceof HandoffRejectedError&&e.reason!=="RATE_LIMITED")stopped=true}if(!stopped)timer=setTimeout(tick,HANDOFF_POLL_MS)};void tick();return track(()=>{stopped=true;if(timer!==void 0)clearTimeout(timer)})}}}function api(caller,o){const{name}=caller;const via=caller.via??name;const{track}=o;const pinned=o.version;const focus=o.focus??projectFocus;const version=()=>pinned??focus.currentVersion.getSnapshot().v;const versionOrThrow=()=>{const v=version();if(!v)throw new Error(`\u63D2\u4EF6 ${name}\uFF1A\u5F53\u524D\u6CA1\u6709\u7248\u672C`);return v};const ownKind=kind=>`plugin:${name}/${kind}`;const fullKind=kind=>{if(kind.startsWith("plugin:"))return kind;if(LATE_BUILTIN_ANCHORS.has(kind)&&anchorTypes.get(ownKind(kind))?.plugin===name){return ownKind(kind)}return BUILTIN_ANCHORS.has(kind)?kind:ownKind(kind)};const resourceManifest=caller.resources?{resources:caller.resources}:{};const annotatingToken={};let annotatingTracked=false;const bare=bareHost(name,o,track);const hasMaterialVersions=transport.materialVersions!==void 0;const hasReplaceMaterial=transport.replaceMaterial!==void 0;const ctx={version:{current:version,subscribe:fn=>pinned?()=>{}:track(focus.currentVersion.subscribe(()=>fn(focus.currentVersion.getSnapshot().v))),list:artifactId=>transport.listVersions(artifactId),readFile:(path,at)=>transport.readFile(at?.versionId??versionOrThrow().id,path),objectUrl:(path,at)=>transport.objectUrl(at?.versionId??versionOrThrow().id,path)},anchors:{register(kind,impl){if(!ANCHOR_ID.test(kind)){throw new Error(`\u951A\u70B9\u7C7B\u578B ${kind} \u53EA\u80FD\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26`)}if(!caller.anchors.includes(kind)){throw new Error(`\u63D2\u4EF6 ${name} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E\u951A\u70B9\u7C7B\u578B ${kind}`)}const full=LATE_BUILTIN_ANCHORS.has(kind)?ownKind(kind):fullKind(kind);if(anchorTypes.has(full))throw new Error(`\u951A\u70B9\u7C7B\u578B ${full} \u5DF2\u6CE8\u518C`);const entry={plugin:name,impl};anchorTypes.set(full,entry);track(()=>{if(anchorTypes.get(full)===entry)anchorTypes.delete(full)});return full},make(kind,payload,snapshot){const full=fullKind(kind);if(full==="project")throw new Error("\u9879\u76EE\u7EA7\u951A\u70B9\uFF08kind: project\uFF09\u4E0D\u7531\u63D2\u4EF6\u9020");if(!BUILTIN_ANCHORS.has(full)&&!anchorTypes.has(full)){throw new Error(`\u951A\u70B9\u7C7B\u578B ${full} \u6CA1\u6709\u6CE8\u518C`)}const current2=versionOrThrow();const stored=BUILTIN_ANCHORS.has(full)?clampAnchorPoint(full,payload):payload;if(stored!==payload){const point=payload.point;for(const axis of["x","y"]){const from=point?.[axis];if(typeof from!=="number"||!Number.isFinite(from))continue;if(from>=-POINT_CLAMP_WARN&&from<=1+POINT_CLAMP_WARN)continue;console.warn(`[band] ${name}\uFF1A\u843D\u70B9\u7684${axis==="x"?"\u6A2A\u5411":"\u7EB5\u5411"}\u4F4D\u7F6E\u660E\u663E\u8D85\u51FA 0\u20131\uFF0C\u5DF2\u5939\u5230\u8303\u56F4\u5185`)}}if(full==="shot"){const problem=checkAnchorPayload("shot",stored);if(problem)throw new Error(problem);if(!current2.entries.some(e=>e.path===SHOT_LIST_PATH)){throw new Error(`\u8FD9\u4E00\u7248\u6CA1\u6709\u955C\u5934\u8868 ${SHOT_LIST_PATH}\uFF0C\u9020\u4E0D\u4E86 shot \u951A\u70B9`)}}else if(BUILTIN_ANCHORS.has(full)){const problem=checkAnchorPayload(full,stored);if(problem)console.warn(`[band] ${name}\uFF1A${problem}\uFF082.0 \u8D77\u4F1A\u62A5\u9519\uFF09`)}const versionId=current2.id;return{id:newId(),versionId,kind:full,payload:stored,...snapshot!==void 0?{snapshot}:{}}},host(impl){const mount=o.mount;if(!mount)throw new Error(`\u63D2\u4EF6 ${name}\uFF1Aanchors.host \u53EA\u80FD\u5728\u6302\u8F7D\u9762\u91CC\u8C03`);const entry={plugin:name,mount,version:version(),kinds:Object.freeze(impl.kinds.map(fullKind)),locate:a=>impl.locate(a),reveal:a=>impl.reveal(a),onLayout:fn=>impl.onLayout(fn),...impl.annotate?{annotate:true}:{},...impl.thumbnail?{thumbnail:a=>impl.thumbnail?.(a)??Promise.resolve(null)}:{},...impl.candidates?{candidates:()=>checkedCandidates(name,impl.candidates?.()??null)}:{}};bare.own(1);addHost(entry);return track(()=>{if(dropHost(entry))bare.own(-1)})},annotating:{get:()=>annotating,set(on){if(on&&!annotatingTracked){annotatingTracked=true;const token=annotatingToken;track(()=>{if(annotatingBy===token)setAnnotating(false)})}if(on)annotatingBy=annotatingToken;setAnnotating(on)},subscribe:fn=>{annotatingListeners.add(fn);return track(()=>annotatingListeners.delete(fn))}}},threads:{list:filter=>transport.listThreads(filter??{}),comments:threadId=>transport.listComments(threadId),commentsOf:async threadIds=>{const ids=[...new Set(threadIds)];const lists=await Promise.all(ids.map(id=>transport.listComments(id)));return Object.fromEntries(ids.map((id,i)=>[id,lists[i]??[]]))},open:threadId=>request({type:"thread.open",from:via,threadId}),quote:(threadId,commentId)=>request({type:"thread.quote",from:via,threadId,commentId}),quoteAnchor:anchor=>request({type:"anchor.quote",from:via,anchor}),undoPick:threadId=>request({type:"pick.undo",from:via,threadId}),openAt:(anchor,a)=>{if(a?.intent!==void 0&&!ThreadIntentSchema.safeParse(a.intent).success){throw new Error(`threads.openAt \u7684 intent \u53EA\u80FD\u662F ${ThreadIntentSchema.options.join(" / ")}`)}if(a?.intent==="pick"){const problem=pickAnchorProblem(anchor);if(problem)throw new Error(`threads.openAt\uFF1A${problem}`)}request({type:"thread.openAt",from:via,anchor,...a})}},gate:{state:stage=>transport.gateState(stage),open:(stage,key)=>request({type:"gate.open",from:via,stage,...key!==void 0?{key}:{}})},propose:{async changeRequest(ids){await flushEdits();return transport.changeRequest(via,ids)},humanVersion:patch=>trackEdit(transport.humanVersion(via,patch)),async deliver(input,o2={}){const{putObject,deliver}=transport;if(!putObject||!deliver)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u4EA7\u7269\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4EA4\u4ED8");const checked=DeliverInputSchema.safeParse({artifactId:input.artifactId,baseVersion:input.baseVersion,files:input.files.map(f=>({path:f.path,objectId:"0".repeat(64)}))});if(!checked.success){throw new Error(checked.error.issues.map(i=>i.message).join("\uFF1B"))}const total=input.files.reduce((n,f)=>n+f.data.size,0);let done=0;const files=[];for(const f of input.files){const obj=await putObject.call(transport,via,f.data,{...o2.signal?{signal:o2.signal}:{},onProgress:p=>o2.onProgress?.(total===0?1:(done+p*f.data.size)/total)});done+=f.data.size;files.push({path:f.path,objectId:obj.objectId})}o2.signal?.throwIfAborted();return deliver.call(transport,via,{artifactId:input.artifactId,baseVersion:input.baseVersion,files})}},stages:{list:()=>transport.listStages(),get:stage=>transport.stage(stage),start:(stage,params)=>member.permissions.includes("submit-change")?transport.startStage(via,stage,params??{}):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u5F00\u5DE5\u9636\u6BB5 ${stage}`)),rerun:(stage,versionId)=>member.permissions.includes("submit-change")?transport.rerunStage(via,stage,versionId):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u91CD\u8DD1\u9636\u6BB5 ${stage}`)),rerunWith:(stage,message)=>member.permissions.includes("submit-change")?transport.rerunStageWith(via,stage,message):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u91CD\u8DD1\u9636\u6BB5 ${stage}`)),async repair(stage,artifacts,o2={}){if(!member.permissions.includes("submit-change"))throw new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u624B\u52A8\u4EA4\u9636\u6BB5 ${stage} \u7684\u7B2C\u4E00\u7248`);const{putObject,repairStage}=transport;if(!putObject||!repairStage)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u4EA7\u7269\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4EA4\u4ED8");const checked=ManualStageSubmitSchema.safeParse({artifacts:artifacts.map(a=>({type:a.type,...a.key!==void 0?{key:a.key}:{},files:a.files.map(f=>({path:f.path,objectId:"0".repeat(64)}))}))});if(!checked.success){throw new Error(checked.error.issues.map(i=>i.message).join("\uFF1B"))}const all=artifacts.flatMap(a=>a.files);const total=all.reduce((n,f)=>n+f.data.size,0);let done=0;const uploaded=[];for(const a of artifacts){const files=[];for(const f of a.files){const obj=await putObject.call(transport,via,f.data,{...o2.signal?{signal:o2.signal}:{},onProgress:p=>o2.onProgress?.(total===0?1:(done+p*f.data.size)/total)});done+=f.data.size;files.push({path:f.path,objectId:obj.objectId})}uploaded.push({type:a.type,...a.key!==void 0?{key:a.key}:{},files})}o2.signal?.throwIfAborted();await repairStage.call(transport,via,stage,uploaded)}},members:{list:()=>transport.listMembers(),usage:()=>transport.projectUsage()},artifacts:{list:()=>transport.listArtifacts()},activity:{list:a=>transport.listActivity(a?.limit??50)},turns:{state:()=>transport.turnState()},params:opts.params??{},attachments:{...transport.importExternal?{importExternal:transport.importExternal.bind(transport,via)}:{},get available(){return transport.uploadAttachment!==void 0},async upload(file,o2={}){const ready=await prepareAttachment(file,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o2.signal?{signal:o2.signal}:{}});if(!transport.uploadAttachment)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4E0A\u4F20\u6587\u4EF6");return transport.uploadAttachment(via,ready,o2)},url(id,o2={}){if(!transport.attachmentUrl){return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8"))}return transport.attachmentUrl(id,o2)},list:(o2={})=>!canReadThreads?Promise.reject(new Error("\u6CA1\u6709\u8BFB\u610F\u89C1\u7684\u6743\u9650\uFF0C\u770B\u4E0D\u5230\u9644\u4EF6")):transport.listAttachments?.(o2)??Promise.resolve([]),remove(id){if(!transport.deleteAttachment){return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8\uFF0C\u4E0D\u80FD\u5220\u9664\u6587\u4EF6"))}return transport.deleteAttachment(via,id)},...hasMaterialVersions?{versions:artifactId=>{const impl=transport.materialVersions;if(!impl)return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u7D20\u6750\u7248\u672C"));return impl.call(transport,artifactId)}}:{},...hasReplaceMaterial?{replace:async(artifactId,source,o2)=>{const ready="sha256"in source?source:await prepareAttachment(source,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o2.signal?{signal:o2.signal}:{}});const impl=transport.replaceMaterial;if(!impl)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u7D20\u6750\u7248\u672C\uFF0C\u4E0D\u80FD\u66FF\u6362\u6587\u4EF6");return impl.call(transport,via,artifactId,ready,o2)}}:{}},storage:storageFor(via),agent:{capabilities:()=>transport.capabilities?.()??Promise.resolve([]),connectors:()=>transport.connectors?.()??Promise.resolve([]),...handoffApi(via,caller.agent,track)},resources:{async fetch(key,path,init){const method=(init?.method??"GET").toUpperCase();const level=classifyResourceRequest(resourceManifest,key,method,path);if(level==="deny")throw new ResourceDeniedError(key,method,path,"undeclared");if(level==="prod"){const ok=await new Promise(answer=>{const h=handlers.get("resource.confirm");if(!h)return answer(false);let answered=false;const settled=layerStack.confirmStarted();try{h.fn({type:"resource.confirm",from:via,key,method,path,answer(yes){if(answered)return;answered=true;settled();answer(yes)}})}catch(error){settled();throw error}});if(!ok)throw new ResourceDeniedError(key,method,path,"not-confirmed")}return transport.proxy({via,key,api:caller.resources?.[key]?.api??"",method,path,body:init?.body,level,confirmed:level==="prod"})}},events:{subscribe(type,fn){return track(addEventListener(e=>{if(matchEvent(type,e.type))fn(e)}))}},member:{id:member.id,displayName:member.displayName,roles:[...member.roles],can:permission=>member.permissions.includes(permission)},tokens:opts.tokens??{}};if(o.live){const live=liveFor(track);if(live)ctx.live=live}ctx.threads.react=(commentId,emoji,on)=>{if(!transport.react)return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u8868\u60C5\u56DE\u5E94"));return transport.react(via,commentId,emoji,on)};ctx.memory=memoryFor(via);ctx.layers={open:(layerOpts,render)=>layerStack.open(via,layerOpts,render,track)};if(isOfficialName(via)){ctx.notify=notifyFor(via);ctx.turns.requestStop=changeRequestId=>new Promise((resolve,reject)=>{let settled=false;request({type:"turn.stop",from:via,changeRequestId,done(error){if(settled)return;settled=true;if(error===void 0)resolve();else reject(new Error(error))}})});const members=()=>{if(!transport.memberSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u7BA1\u7406\u9879\u76EE\u6210\u5458");return transport.memberSettings};ctx.memberSettings={get:async()=>members().get(),set:async input=>members().set(via,input),remove:async userId=>members().remove(via,userId),searchUsers:async q=>members().searchUsers(q)};ctx.approvalSettings={async get(){if(!transport.approvalSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u81EA\u6279\u8BBE\u7F6E");return transport.approvalSettings.get()},async set(roles){if(!transport.approvalSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u81EA\u6279\u8BBE\u7F6E");return transport.approvalSettings.set(via,roles)}};const archiveUrl=transport.archiveUrl;if(archiveUrl)ctx.version.archiveUrl=versionId=>archiveUrl(versionId);const shares=transport.artifactShares;if(shares){ctx.artifactShares=Object.freeze({list:artifactId=>shares.list(artifactId),create:(artifactId,input)=>shares.create(via,artifactId,input),revoke:(artifactId,shareId)=>shares.revoke(via,artifactId,shareId)})}ctx.visibilitySettings=Object.freeze({async get(){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.get()},async set(input){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.set(via,input)},async searchUsers(q){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.searchUsers(q)}})}const materialDiscussions=transport.materialDiscussions;if(materialDiscussions&&canReadThreads){ctx.materialDiscussions={available:async()=>handlers.has("material.discussions.open")&&await materialDiscussions.available(),read:version2=>materialDiscussions.read(version2),async open(version2){if(!handlers.has("material.discussions.open")||!await materialDiscussions.available())throw new Error("\u5F53\u524D\u8BC4\u8BBA\u7EC4\u4EF6\u6216\u670D\u52A1\u4E0D\u652F\u6301\u7D20\u6750\u610F\u89C1");request({type:"material.discussions.open",from:via,version:version2})}}}if(!caller.locked)return ctx;const collab={...materialDiscussions&&caller.materialDiscussionWriter?{materialDiscussions:{create:(version2,input)=>materialDiscussions.create(via,version2,input),comment:(threadId,body)=>materialDiscussions.comment(via,threadId,body),close:threadId=>materialDiscussions.close(via,threadId),reopen:threadId=>materialDiscussions.reopen(via,threadId)}}:{},async createThread(input){if(input.handToAgent)await flushEdits();return transport.createThread(via,input)},async createProjectThread(input){if(input.handToAgent)await flushEdits();return transport.createProjectThread(via,input)},undoPick:id=>transport.undoPick(via,id),settlePick:id=>transport.settlePick(via,id),comment:(id,body,extras)=>{const[ex,mentions]=splitMentions(extras);return transport.comment(via,id,body,ex,mentions)},confirm:id=>transport.confirm(via,id),reject:(id,body,extras)=>{const[ex,mentions]=splitMentions(extras);return transport.reject(via,id,body,ex,mentions)},withdraw:id=>transport.withdraw(via,id),stopTurn:id=>transport.stopTurn(via,id),close:id=>transport.close(via,id),reopen:id=>transport.reopen(via,id),approve:(stage,input)=>transport.approve(via,stage,input),revoke:(stage,input)=>transport.revoke(via,stage,input?.key),showVersion:v=>focus.setCurrentVersion(v),anchors:{hosts:()=>hosts,subscribe:fn=>{hostListeners.add(fn);return track(()=>hostListeners.delete(fn))},resolve:(anchor,v)=>resolveAnchor(anchor,v)},requests:{handle(type,fn){if(type==="material.discussions.open"&&!caller.materialDiscussionWriter)throw new Error("\u53EA\u6709\u58F0\u660E\u7D20\u6750\u80FD\u529B\u7684\u9501\u5B9A\u8BC4\u8BBA\u63D2\u4EF6\u80FD\u8BA4\u9886\u7D20\u6750\u610F\u89C1");const held=handlers.get(type);if(held)throw new Error(`${type} \u8BF7\u6C42\u5DF2\u7531\u9501\u5B9A\u63D2\u4EF6 ${held.plugin} \u8BA4\u9886`);const entry={plugin:via,fn};handlers.set(type,entry);return track(()=>{if(handlers.get(type)===entry)handlers.delete(type)})}}};return{...ctx,collab}}return{api,access:opts.access??"member",canReadThreads,agent,...opts.info?{info:opts.info}:{},...opts.shared?{shared:opts.shared}:{},...opts.notices?{notices:opts.notices}:{},...opts.upgrade?{upgrade:opts.upgrade}:{},...opts.deleted?{deleted:opts.deleted}:{},status:async()=>await transport.projectStatus?.()??"active",currentVersion,setCurrentVersion,follow:()=>projectFocus.follow(),focus:artifactId=>projectFocus.focus(artifactId),openFocus(initial={}){const f=createFocus();f.follow(initial.version?.artifactId??initial.artifactId);if(initial.version)f.setCurrentVersion(initial.version);return f},request,resolveAnchor,dispose(){for(const f of[...focuses])f.dispose();unsubscribeTransport?.();unsubscribeTransport=void 0;eventListeners.clear()}}}function isFailedResult(v){return typeof v==="object"&&v!==null&&"ok"in v&&v.ok===false}function splitMentions(extras){if(!extras)return[void 0,void 0];const{mentions,...rest}=extras;return[rest,mentions?.length?mentions:void 0]}function matchEvent(pattern,type){if(pattern==="*")return true;if(pattern.endsWith(".*"))return type.startsWith(pattern.slice(0,-1));return pattern===type}var listeners=new Set;var failures=new WeakMap;function markDiagnosticFailure(error,failure){if(error!==null&&(typeof error==="object"||typeof error==="function")){failures.set(error,failure)}}function diagnosticFailure(error){return error!==null&&(typeof error==="object"||typeof error==="function")?failures.get(error):void 0}function subscribeRuntimeDiagnostics(listener){listeners.add(listener);return()=>{listeners.delete(listener)}}var PEER_RANGE=/要求 \S+@(.+?),装配里是 (\S+)$/;var RANGE_CHARS=/^[0-9xX.^~<>=|* -]{1,48}$/;var VERSION_CHARS=/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.]{1,24})?$/;function peerRangeFacts(message){const m=message?PEER_RANGE.exec(message):null;const requires=m?.[1];const installed=m?.[2];return requires&&installed&&RANGE_CHARS.test(requires)&&VERSION_CHARS.test(installed)?{requires,installed}:void 0}function publishRuntimeDiagnostic(diagnostic,failure){const hash=diagnostic.set?.match(/@([a-f0-9]{64})$/)?.[1];const peer=peerRangeFacts(diagnostic.message);const code=failure?.code??(peer?"peer-range":void 0);const event={pluginId:diagnostic.plugin??"kernel",...hash?{snapshotHash:hash}:{},failureCategory:failure?.failureCategory??(diagnostic.phase==="assembly"?"validation":diagnostic.phase==="load"?"load":"exception"),durationMs:Math.max(0,Math.min(36e5,Math.round(failure?.durationMs??0))),...code?{code}:{},...peer??{}};for(const listener of listeners){try{listener(event)}catch{}}}var INITIALIZING=Symbol("initializing");var RuntimeError=class extends Error{constructor(message){super(message);this.name="RuntimeError"}};var DEFAULT_LOAD_TIMEOUT_MS=3e4;function createRuntime(opts){const{assembly}=opts;const diagnostics=[];for(const view of[assembly.global,...Object.values(assembly.workshops)]){for(const[plugin,message]of Object.entries(view.failed)){if(view!==assembly.global&&assembly.global.failed[plugin]===message)continue;diagnostics.push({plugin,set:view.id,phase:"assembly",message});publishRuntimeDiagnostic({plugin,set:view.id,phase:"assembly",message})}}const diagListeners=new Set;const routeListeners=new Set;const slotListeners=new Map;const moduleFailed=new Map;const invalidModules=new Set;const reported=new Set;const modules=new Map;const settled=new Set;const projects=new Map;const workshopSets=new Map;let route={page:null,params:{},path:"/"};const currentSets=new Map;const pageMounts=new Set;const resolving=new Map;let docWorkshop;let disposed=false;const member=Object.freeze({...opts.member??{id:"anonymous",displayName:"\u533F\u540D",title:""}});const data=opts.data??emptyData();const app={cancellation:new AbortController,kind:"app",view:assembly.global,services:new Map,failed:new Map,disposers:[],refs:1,selection:{value:null,listeners:new Set},states:new Map,closed:false,ready:Promise.resolve(),views:new Set,mounts:new Set};function diagnose(d,set2,failure2){diagnostics.push(d);publishRuntimeDiagnostic({...d,set:set2??d.set},failure2);for(const fn of[...diagListeners])fn()}function guardSubscriber(p,fn){return(...args)=>{try{fn(...args)}catch(e){const message=errorMessage(e);const once=`subscriber|${p.name}|${message.replace(/\d+/g,"#").slice(0,200)}`;if(reported.has(once))return;reported.add(once);diagnose({plugin:p.name,phase:"report",message},p.set)}}}function slotChanged(){for(const set2 of slotListeners.values())for(const fn of[...set2])fn()}function isOptionalPeer(p,as){const meta=p.package.peerDependenciesMeta;return meta?.[as]?.optional===true}function failure(scope,p){const own=moduleFailed.get(moduleKey(p));if(own!==void 0)return own;for(let s=scope;s;s=s.parent){const why=s.failed.get(p.name);if(why!==void 0)return why}for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&failure(scope,q)!==null)return`\u4F9D\u8D56 ${d} \u6CA1\u88C5\u4E0A`}return null}function isFailed(scope,p){return failure(scope,p)!==null}function failPlugin(scope,p,phase,message,detail){if(phase==="load")moduleFailed.set(moduleKey(p),message);else{scope.failed.set(p.name,message);dropStates(scope,p)}const once=`view|${p.name}|${phase}|${message}`;if(scope.kind!=="view"||!reported.has(once)){if(scope.kind==="view")reported.add(once);diagnose({plugin:p.name,phase,message},p.set,detail)}for(const q of scope.view.plugins){if(!q.deps.includes(p.as))continue;if(isOptionalPeer(q,p.as))continue;const note=`${q.name}|${p.name}`;if(reported.has(note))continue;reported.add(note);diagnose({plugin:q.name,phase,message:`\u4F9D\u8D56 ${p.as} \u6CA1\u88C5\u4E0A`},q.set)}slotChanged()}function forgetViewFailures(p){const prefix=`view|${p.name}|`;for(const k of reported)if(k.startsWith(prefix))reported.delete(k)}function forgetFailure(scope,p){const visit=q=>{const key=moduleKey(q);if(moduleFailed.has(key)){moduleFailed.delete(key);modules.delete(key)}for(let t=scope;t;t=t.parent){if(t.failed.delete(q.name))t.active?.delete(q.name)}for(const d of q.deps){const r=findPlugin(scope.view,d);if(r)visit(r)}};visit(p)}function moduleKey(p){return`${p.set}:${p.name}`}function loadModule(view,p){const key=moduleKey(p);let pending=modules.get(key);if(!pending){pending=new Promise((resolve,reject)=>{const timer=setTimeout(()=>reject(new RuntimeError("\u63D2\u4EF6\u4EE3\u7801\u52A0\u8F7D\u8D85\u65F6")),opts.loadTimeoutMs??DEFAULT_LOAD_TIMEOUT_MS);opts.load(p).then(m=>{clearTimeout(timer);settled.add(key);const problem=checkModule(view,p,m);if(problem){invalidModules.add(key);reject(new RuntimeError(problem));return}resolve(m)},e=>{clearTimeout(timer);reject(e)})});modules.set(key,pending);const current2=pending;void current2.catch(()=>{if(modules.get(key)===current2)modules.delete(key)})}return pending}async function ensureLoaded(scope,p){if(scope.cancellation.signal.aborted)return null;if(isFailed(scope,p))return null;const started=performance.now();try{return await inScope(scope,loadModule(scope.view,p))}catch(e){if(scope.cancellation.signal.aborted)return null;if(!moduleFailed.has(moduleKey(p)))failPlugin(scope,p,"load",errorMessage(e),{failureCategory:invalidModules.has(moduleKey(p))?"validation":diagnosticFailure(e)?.failureCategory??"load",durationMs:performance.now()-started});return null}}function openLedger(){return{disposers:[],closed:false}}function closeLedger(l){if(l.closed)return;l.closed=true;for(const d of l.disposers.splice(0).reverse())safely(d)}function track(l,d){if(l.closed){safely(d);return()=>{}}let done=false;const once=()=>{if(done)return;done=true;const i=l.disposers.indexOf(once);if(i>=0)l.disposers.splice(i,1);d()};l.disposers.push(once);return once}function findPlugin(view,as){return view.plugins.find(p=>p.as===as)}function makeAppCtx(p,scope,ledger){return{plugin:p.as,scope:scope.kind,app:{member,data:appDataFor(p,ledger),attachments:appAttachmentsFor(p),navigate:to=>navigate(to.page,to.params??{}),route:()=>route,subscribeRoute:fn=>{const safe=guardSubscriber(p,fn);routeListeners.add(safe);return track(ledger,()=>routeListeners.delete(safe))},diagnostics:()=>diagnostics,subscribeDiagnostics:fn=>{const safe=()=>{try{fn()}catch(e){console.error("[band] \u63D2\u4EF6\u8BCA\u65AD\u76D1\u542C\u629B\u9519",e)}};diagListeners.add(safe);return track(ledger,()=>diagListeners.delete(safe))}},slots:{entries:slot=>entriesFor(p,scope,slot),subscribe:(slot,fn)=>{ownSlot(p,scope,slot);const set2=slotListeners.get(slot)??new Set;const safe=guardSubscriber(p,fn);set2.add(safe);slotListeners.set(slot,set2);return track(ledger,()=>set2.delete(safe))},mount:(el,slot,o)=>track(ledger,mountSlot(p,scope,el,slot,o))},services:{provide:(id,impl)=>track(ledger,provide(p,scope,id,impl)),get:name=>{const s=lookupService(p,scope,name);if(s===void 0)throw new RuntimeError(`\u670D\u52A1 ${name} \u7684\u63D0\u4F9B\u65B9\u4E0D\u5728\u573A`);return s},find:name=>lookupService(p,scope,name)},report:error=>diagnose({plugin:p.name,phase:"report",message:errorMessage(error)},p.set),scopeState:(key,init,dispose)=>scopeState(p,scope,key,init,dispose)}}function appAttachmentsFor(p){const stage=p.origin==="workshop"?void 0:opts.stageAttachment;const external=p.origin==="workshop"?void 0:opts.stageExternalImport;return Object.freeze({available:stage!==void 0,...external?{importExternal:input=>external(input,p.name)}:{},async upload(file,o={}){const ready=await prepareAttachment(file,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o.signal?{signal:o.signal}:{}});if(!stage)throw new Error("\u8FD9\u91CC\u4E0D\u80FD\u5728\u5EFA\u9879\u76EE\u524D\u4E0A\u4F20\u6587\u4EF6");return stage(ready,o)}})}function appDataFor(p,ledger){if(p.origin==="workshop")return workshopDataFor(p,ledger);const read={workshops:f=>data.workshops(f),workshop:id=>data.workshop(id),projects:f=>data.projects(f),inbox:f=>data.inbox(f),myArtifacts:query=>data.myArtifacts(query),search:(q,f)=>data.search(q,f),plugins:query=>data.plugins(query),plugin:name=>data.plugin(name),subscribe:fn=>track(ledger,data.subscribe(fn))};const w=data.write;if(!w)return Object.freeze(read);const platformTokens=w.platformTokens;const personalConnections=w.personalConnections;const userSettings=w.userSettings;const guide=w.guide;const artifactFavorites=w.artifactFavorites;const teamConnections=w.teamConnections;const betaMembers=w.betaMembers;const feedback=w.feedback;const feedbackAdmin=w.feedbackAdmin;const create=w.createWorkshop?.bind(w);const createWorkshop=create&&(input=>create(input));const start=w.startProject?.bind(w);const startProject=start&&(input=>start(input));const workshopMaintainers=w.workshopMaintainers;const transferOwner=workshopMaintainers?.transfer?.bind(workshopMaintainers);const workshopUpgrade=w.workshopUpgrade;const workshopEdit=w.workshopEdit;const agentUpgrade=w.agentUpgrade;const followRuns=w.followRuns;const trialProjects=w.trialProjects;const pluginYank=w.pluginYank;const workshopVisibility=w.workshopVisibility;const workshopModel=w.workshopModel;const workshopSecrets=w.workshopSecrets;const modelCredentials=w.modelCredentials;const projectAgentModels=w.projectAgentModels;const confirmProvisionUse=projectAgentModels?.confirmProvisionUse?.bind(projectAgentModels);const markReboundRead=projectAgentModels?.markReboundRead?.bind(projectAgentModels);const netCredentials=w.netCredentials;const release=w.releaseWorkshop?.bind(w);const releaseWorkshop=release&&(input=>release(input));return Object.freeze({...read,write:Object.freeze({...trialProjects?{trialProjects:Object.freeze({workshop:workshop=>trialProjects.workshop(workshop),create:input=>trialProjects.create(input),status:project=>trialProjects.status(project),end:project=>trialProjects.end(project)})}:{},...platformTokens?{platformTokens:Object.freeze({list:()=>platformTokens.list(),issue:input=>platformTokens.issue(input),revoke:id=>platformTokens.revoke(id)})}:{},...teamConnections?{teamConnections:Object.freeze({isDeploymentAdmin:()=>teamConnections.isDeploymentAdmin(),options:(...args)=>teamConnections.options(...args),list:(...args)=>teamConnections.list(...args),connect:(...args)=>teamConnections.connect(...args),rotate:(...args)=>teamConnections.rotate(...args),disconnect:(...args)=>teamConnections.disconnect(...args)})}:{},...feedback?{feedback:Object.freeze({mine:()=>feedback.mine(),submit:input=>feedback.submit(input),markReplySeen:id=>feedback.markReplySeen(id)})}:{},...betaMembers?{betaMembers:Object.freeze({isAdmin:()=>betaMembers.isAdmin(),list:()=>betaMembers.list(),add:ldaps=>betaMembers.add(ldaps),remove:ldap=>betaMembers.remove(ldap)})}:{},...feedbackAdmin?{feedbackAdmin:Object.freeze({isAdmin:()=>feedbackAdmin.isAdmin(),list:(...args)=>feedbackAdmin.list(...args),patch:(...args)=>feedbackAdmin.patch(...args)})}:{},...userSettings?{userSettings:Object.freeze({get:()=>userSettings.get(),set:patch=>userSettings.set(patch)})}:{},...guide?{guide:Object.freeze({get:()=>guide.get(),set:action=>guide.set(action)})}:{},...artifactFavorites?{artifactFavorites:Object.freeze({set:(artifactId,on)=>artifactFavorites.set(artifactId,on)})}:{},...personalConnections?{personalConnections:Object.freeze({list:()=>personalConnections.list(),connect:input=>personalConnections.connect(input),disconnect:()=>personalConnections.disconnect()})}:{},createProject:input=>w.createProject(input),markRead:commentId=>w.markRead(commentId),...createWorkshop?{createWorkshop}:{},...startProject?{startProject}:{},...releaseWorkshop?{releaseWorkshop}:{},...workshopMaintainers?{workshopMaintainers:Object.freeze({get:workshop=>workshopMaintainers.get(workshop),add:(workshop,userId)=>workshopMaintainers.add(workshop,userId),remove:(workshop,userId)=>workshopMaintainers.remove(workshop,userId),...transferOwner?{transfer:(workshop,userId)=>transferOwner(workshop,userId)}:{},searchUsers:q=>workshopMaintainers.searchUsers(q)})}:{},...pluginYank?{pluginYank:Object.freeze({yank:(name,version,reason)=>pluginYank.yank(name,version,reason),unyank:(name,version)=>pluginYank.unyank(name,version)})}:{},...workshopUpgrade?{workshopUpgrade:Object.freeze({status:workshop=>workshopUpgrade.status(workshop),run:workshop=>workshopUpgrade.run(workshop)})}:{},...workshopEdit?{workshopEdit:Object.freeze({get:workshop=>workshopEdit.get(workshop),start:(workshop,input)=>workshopEdit.start(workshop,input),send:(workshop,sessionId,input)=>workshopEdit.send(workshop,sessionId,input),stop:(workshop,sessionId)=>workshopEdit.stop(workshop,sessionId),end:(workshop,sessionId)=>workshopEdit.end(workshop,sessionId)})}:{},...agentUpgrade?{agentUpgrade:Object.freeze({advice:workshop=>agentUpgrade.advice(workshop)})}:{},...followRuns?{followRuns:Object.freeze({list:workshop=>followRuns.list(workshop)})}:{},...workshopVisibility?{workshopVisibility:Object.freeze({get:workshop=>workshopVisibility.get(workshop),set:(workshop,input)=>workshopVisibility.set(workshop,input),searchUsers:q=>workshopVisibility.searchUsers(q)})}:{},...workshopModel?{workshopModel:Object.freeze({deployment:()=>workshopModel.deployment(),get:workshop=>workshopModel.get(workshop),configure:(workshop,input)=>workshopModel.configure(workshop,input),retryProvision:workshop=>workshopModel.retryProvision(workshop)})}:{},...workshopSecrets?{workshopSecrets:Object.freeze({get:workshop=>workshopSecrets.get(workshop),set:(workshop,name,value)=>workshopSecrets.set(workshop,name,value)})}:{},...modelCredentials?{modelCredentials:Object.freeze({list:()=>modelCredentials.list(),save:input=>modelCredentials.save(input),replaceKey:(id,key)=>modelCredentials.replaceKey(id,key),setDefault:id=>modelCredentials.setDefault(id),remove:id=>modelCredentials.remove(id),...modelCredentials.provision?{provision:()=>modelCredentials.provision?.()}:{},...modelCredentials.listProviderModels?{listProviderModels:input=>modelCredentials.listProviderModels?.(input)}:{},...modelCredentials.listCredentialModels?{listCredentialModels:id=>modelCredentials.listCredentialModels?.(id)}:{},...modelCredentials.updateModelCredentialModels?{updateModelCredentialModels:(id,input)=>modelCredentials.updateModelCredentialModels?.(id,input)}:{}})}:{},...projectAgentModels?{projectAgentModels:Object.freeze({...confirmProvisionUse?{confirmProvisionUse}:{},...markReboundRead?{markReboundRead}:{},list:projectId=>projectAgentModels.list(projectId),select:(...a)=>projectAgentModels.select(...a),clear:(...a)=>projectAgentModels.clear(...a)})}:{},...netCredentials?{netCredentials:Object.freeze({list:()=>netCredentials.list(),listProject:projectId=>netCredentials.listProject(projectId),save:(...a)=>netCredentials.save(...a),saveMany:(...a)=>netCredentials.saveMany(...a),update:(...a)=>netCredentials.update(...a),replaceKey:(...a)=>netCredentials.replaceKey(...a),remove:(...a)=>netCredentials.remove(...a)})}:{}})})}function workshopDataFor(p,ledger){const own=assembly.workshops[p.set]?.workshop;const pin=asked=>{if(own===void 0)throw new RuntimeError(`${p.name} \u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u5DE5\u574A\uFF0C\u8BFB\u4E0D\u4E86\u5E94\u7528\u6570\u636E`);if(asked!==void 0&&asked!==own){throw new RuntimeError(`${p.name} \u662F\u5DE5\u574A ${own} \u7684\u63D2\u4EF6\uFF0C\u4E0D\u80FD\u8BFB\u5DE5\u574A ${asked} \u7684\u6570\u636E`)}return own};const ownProjects=async workshop=>(await data.projects({workshop})).filter(s=>s.workshop.id===workshop);return Object.freeze({workshops:async f=>{const workshop=pin(f?.workshop);return(await data.workshops({workshop})).filter(w=>w.id===workshop)},workshop:async id=>{if(id!==pin(void 0))return null;const w=await data.workshop(id);return w&&w.id===id?w:null},projects:async f=>ownProjects(pin(f?.workshop)),myArtifacts:async query=>{const workshop=pin(query?.workshop);const[joined,mine,review,starred]=await Promise.all([data.myArtifacts({...query,workshop,tab:"joined"}),data.myArtifacts({...query,workshop,tab:"mine"}),data.myArtifacts({...query,workshop,tab:"review"}),data.myArtifacts({...query,workshop,tab:"starred"})]);const rowsOf=r=>r.rows.filter(row=>row.project.workshop.id===workshop);const kept=[...rowsOf(joined),...rowsOf(mine),...rowsOf(review),...rowsOf(starred)];const tab=query?.tab??"joined";return{query:{...query??{},workshop},counts:{joined:rowsOf(joined).length,mine:rowsOf(mine).length,review:rowsOf(review).length,starred:rowsOf(starred).length},facets:{workshops:joined.facets.workshops.filter(w=>w.id===workshop),projects:joined.facets.projects.filter(p2=>p2.workshop.id===workshop),types:joined.facets.types.filter(t=>kept.some(row=>row.type===t))},rows:rowsOf(tab==="mine"?mine:tab==="review"?review:tab==="starred"?starred:joined)}},inbox:async f=>{const workshop=pin(f?.workshop);const[r,projects2]=await Promise.all([data.inbox({workshop}),ownProjects(workshop)]);const ids=new Set(projects2.map(s=>s.project.id));const workshops=r.workshops?.filter(w=>w.workshopId===workshop);const copyBlocked=r.workshopCopyBlocked?.filter(i=>i.workshopId===workshop);return{needsYou:r.needsYou.filter(i=>ids.has(i.projectId)),inProgress:r.inProgress.filter(i=>ids.has(i.projectId)),...workshops&&workshops.length>0?{workshops}:{},...copyBlocked&©Blocked.length>0?{workshopCopyBlocked:copyBlocked}:{}}},search:async(q,f)=>{const workshop=pin(f?.workshop);const[r,projects2]=await Promise.all([data.search(q,{workshop}),ownProjects(workshop)]);const hits=r.projects.filter(s=>s.workshop.id===workshop);const ids=new Set([...projects2,...hits].map(s=>s.project.id));return{projects:hits,workshops:r.workshops.filter(w=>w.id===workshop),threads:r.threads.filter(t=>ids.has(t.projectId))}},plugins:async query=>{if(query?.workshop!==void 0)pin(query.workshop);return(await data.plugins(query)).filter(c=>c.source!=="workshop"||own!==void 0&&c.workshop?.id===own)},plugin:name=>data.plugin(name),subscribe:fn=>track(ledger,data.subscribe(fn))})}function scopeState(p,scope,key,init,dispose){if(scope.closed)throw new RuntimeError("\u4F5C\u7528\u57DF\u5DF2\u5173\u95ED\uFF0C\u4E0D\u80FD\u518D\u53D6\u4F5C\u7528\u57DF\u72B6\u6001");if(isFailed(scope,p))throw new RuntimeError("\u63D2\u4EF6\u5728\u8FD9\u4E2A\u4F5C\u7528\u57DF\u91CC\u6CA1\u88C5\u4E0A\uFF0C\u4E0D\u80FD\u53D6\u4F5C\u7528\u57DF\u72B6\u6001");let own=scope.states.get(p.name);if(!own){own=new Map;scope.states.set(p.name,own)}const found=own.get(key);if(found===INITIALIZING)throw new RuntimeError("\u4F5C\u7528\u57DF\u72B6\u6001\u7684 init \u91CC\u53C8\u53D6\u4E86\u540C\u4E00\u4EFD\u72B6\u6001");if(found)return found.value;const states=own;states.set(key,INITIALIZING);const ledger=openLedger();let value;try{value=init(ctxFor(p,scope,ledger))}catch(e){states.delete(key);closeLedger(ledger);throw e}if(dispose)track(ledger,()=>dispose(value));const close=()=>{states.delete(key);closeLedger(ledger)};states.set(key,{value,close});scope.disposers.push(close);return value}function dropStates(scope,p){const own=scope.states.get(p.name);if(!own)return;for(const e of[...own.values()].reverse())if(e!==INITIALIZING)safely(e.close);scope.states.delete(p.name)}function makeProjectCtx(p,scope,ledger,situation={}){const base=makeAppCtx(p,scope,ledger);const locked=p.roles.length>0;const{collab,...rest}=scope.host?.api({plugin:p,projectId:scope.projectId,locked,track:d=>track(ledger,d),...situation.version?{version:situation.version}:{},...situation.live?{live:true}:{},...situation.mount?{mount:situation.mount}:{},...scope.focus?{focus:scope.focus}:{}})??{};const api=locked&&collab!==void 0?{...rest,collab}:rest;const sel=scope.selection;const official=isOfficialName2(p.name);const ctx={...api,...base,project:{id:scope.projectId,slug:scope.host?.slug??scope.projectId,...scope.view.workshop?{workshop:scope.view.workshop}:{},views:scope.view.views??{},access:scope.host?.access??"member",canReadThreads:canReadThreadsOf(scope.host?.access,scope.host?.canReadThreads),agent:scope.host?.agent??DEFAULT_AGENT2,...projectInfoOf(scope.projectId,scope.host?.info),status:()=>scope.host?.status?.()??Promise.resolve("active"),...official&&scope.host?.shared?{shared:scope.host.shared}:{},...official&&scope.host?.notices?{notices:scope.host.notices}:{},...scope.host?.deleted?{deleted:Object.freeze(official&&scope.host.deleted.restore?{restoreUntil:scope.host.deleted.restoreUntil,restore:scope.host.deleted.restore}:{restoreUntil:scope.host.deleted.restoreUntil})}:{},...official&&scope.host?.upgrade?{upgrade:Object.freeze({status:()=>scope.host?.upgrade?.status(),run:()=>scope.host?.upgrade?.run(),subscribe:fn=>api.events.subscribe("project.upgraded",()=>fn())})}:{}},selection:{get:()=>sel.value,set:value=>{if(JSON.stringify(sel.value)===JSON.stringify(value))return;const copy=value===null?null:structuredClone(value);sel.value=copy;if(scope.focus)scope.focus.focus(copy);else if(!scope.ownFocus)scope.host?.focus?.(copy);for(const fn of[...sel.listeners])fn({value:copy,source:p.as})},subscribe:fn=>{const safe=guardSubscriber(p,fn);sel.listeners.add(safe);return track(ledger,()=>sel.listeners.delete(safe))}}};return ctx}function ctxFor(p,scope,ledger,situation){if(scope.kind==="app"||scope.kind==="workshop")return makeAppCtx(p,scope,ledger);const ctx=makeProjectCtx(p,scope,ledger,situation);if(scope.kind==="project")return ctx;return{...ctx,view:{...scope.viewOf}}}function provide(p,scope,id,impl){const decl=p.manifest.provides?.[id];if(!decl)throw new RuntimeError(`${p.as} \u6CA1\u6709\u5728\u6E05\u5355\u91CC\u58F0\u660E\u670D\u52A1 ${id}`);if(decl.scope!==scope.kind&&!legacyAppHere(p,scope,decl.scope)){throw new RuntimeError(`\u670D\u52A1 ${id} \u58F0\u660E\u4E3A ${decl.scope} \u7EA7\uFF0C\u4E0D\u80FD\u5728 ${scope.kind} \u4F5C\u7528\u57DF\u91CC\u63D0\u4F9B`)}const name=`${p.as}/${id}`;if(scope.services.has(name))throw new RuntimeError(`\u670D\u52A1 ${name} \u5DF2\u7ECF\u63D0\u4F9B\u8FC7\u4E86`);scope.services.set(name,impl);return()=>{if(scope.services.get(name)===impl)scope.services.delete(name)}}function lookupService(p,scope,name){const slash=name.lastIndexOf("/");const provider=name.slice(0,slash);if(provider!==p.as&&!(provider in p.package.peerDependencies)){throw new RuntimeError(`${p.as} \u7528\u670D\u52A1 ${name} \u8981\u5728 peerDependencies \u91CC\u5199 ${provider}`)}for(let s=scope;s;s=s.parent){if(s.services.has(name))return s.services.get(name)}return void 0}function legacyAppHere(p,scope,kind){return kind==="app"&&scope.kind==="workshop"&&p.set===scope.view.id}function missingServices(p,scope,kind){return Object.entries(p.manifest.provides??{}).filter(([id,d])=>d.scope===kind&&!scope.services.has(`${p.as}/${id}`)).map(([id])=>id)}function needsHook(p,kind){return(p.manifest.activation??[]).includes(kind)||Object.values(p.manifest.provides??{}).some(s=>s.scope===kind)}async function activateAll(plugins2,scope,kind=scope.kind){const loadedMods=await Promise.all(plugins2.map(p=>ensureLoaded(scope,p)));if(scope.closed)return;for(const[i,p]of plugins2.entries()){if(scope.cancellation.signal.aborted)return;const m=loadedMods[i];if(!m||isFailed(scope,p))continue;const hook=kind==="app"?m.activate:m.scopes?.[kind];const ledger=openLedger();const started=performance.now();try{const ctx=ctxFor(p,scope,ledger);const ret=hook?.call(m,ctx);if(typeof ret==="function")ledger.disposers.push(ret);if(scope.cancellation.signal.aborted){closeLedger(ledger);return}const missing=missingServices(p,scope,kind);if(missing.length>0)throw new RuntimeError(`\u58F0\u660E\u4E86\u670D\u52A1 ${missing.join("\u3001")} \u5374\u6CA1\u6709\u63D0\u4F9B`);scope.disposers.push(()=>closeLedger(ledger));if(kind==="view")forgetViewFailures(p)}catch(e){closeLedger(ledger);if(scope.cancellation.signal.aborted)return;failPlugin(scope,p,"activate",errorMessage(e),{failureCategory:"exception",durationMs:performance.now()-started})}}}function closeScope(scope){if(scope.closed)return;scope.closed=true;scope.cancellation.abort();scope.active?.clear();for(const v of[...scope.views].reverse())closeScope(v);scope.parent?.views.delete(scope);for(const d of[...scope.mounts].reverse())safely(d);scope.mounts.clear();for(const d of scope.disposers.splice(0).reverse())safely(d);scope.services.clear();if(scope.kind!=="view"||scope.ownFocus)scope.selection.listeners.clear();if(scope.ownFocus){const f=scope.focus;scope.focus=void 0;if(f)safely(()=>f.dispose())}}function openView(parent,slot,key,own){const v=newScope("view",parent.view,parent);v.projectId=parent.projectId;if(parent.host)v.host=parent.host;if(own){v.selection.value=own.selection===null?null:structuredClone(own.selection);const f=parent.host?.openFocus?.(own);if(f)v.focus=f;v.ownFocus=true}else{v.selection=parent.selection;if(parent.focus)v.focus=parent.focus}v.viewOf={slot,key};v.active=new Map;parent.views.add(v);return v}function ensureActive(scope,p){const active=scope.active;if(!active)return Promise.resolve();const own=active.get(p.name);if(own)return own;const fresh=new Set;const waits=[];const seen=new Set;const visit=q=>{if(seen.has(q.name))return;seen.add(q.name);const pending=active.get(q.name);if(pending){waits.push(pending);return}for(const d of q.deps){const r=findPlugin(scope.view,d);if(r)visit(r)}fresh.add(q)};visit(p);const order=scope.view.plugins.filter(q=>fresh.has(q)&&needsHook(q,"view"));const done=(async()=>{await inScope(scope,Promise.all(waits));await activateAll(order,scope)})().then(()=>{for(const q of fresh)if(isFailed(scope,q)&&active.get(q.name)===done)active.delete(q.name)}).catch(error=>{for(const q of fresh)if(active.get(q.name)===done)active.delete(q.name);throw error});for(const q of fresh)active.set(q.name,done);return done}function newScope(kind,view,parent){const s={cancellation:new AbortController,kind,view,services:new Map,failed:new Map,disposers:[],refs:0,selection:{value:null,listeners:new Set},states:new Map,closed:false,ready:Promise.resolve(),views:new Set,mounts:new Set};if(parent){s.parent=parent;const abort=()=>closeScope(s);if(parent.cancellation.signal.aborted)abort();else{parent.cancellation.signal.addEventListener("abort",abort,{once:true});s.disposers.push(()=>parent.cancellation.signal.removeEventListener("abort",abort))}}return s}function inScope(scope,pending){const signal=scope.cancellation.signal;return new Promise((resolve,reject)=>{const aborted=()=>reject(scopeClosedError());if(signal.aborted){void pending.catch(()=>{});aborted();return}signal.addEventListener("abort",aborted,{once:true});void pending.then(resolve,reject).finally(()=>signal.removeEventListener("abort",aborted))})}function scopeClosedError(){return new RuntimeError(disposed?"\u8FD0\u884C\u65F6\u5DF2\u5173\u95ED":"\u4F5C\u7528\u57DF\u5DF2\u53D6\u6D88")}async function retainWorkshopSet(setId,view,requester){let ws=workshopSets.get(setId);if(!ws){const scope=newScope("workshop",view,app);const own=view.plugins.filter(p=>p.set===setId&&needsHook(p,"app"));const hooked=view.plugins.filter(p=>needsHook(p,"workshop"));const ready=(async()=>{await activateAll(own,scope,"app");await activateAll(hooked,scope)})();ws={refs:0,scope,ready};workshopSets.set(setId,ws)}ws.refs++;try{await inScope(requester,ws.ready);return ws.scope}catch(error){releaseWorkshopSet(setId);throw error}}function releaseWorkshopSet(setId){const ws=workshopSets.get(setId);if(!ws||--ws.refs>0)return;workshopSets.delete(setId);closeScope(ws.scope)}async function inspectProjectPlugins(projectId,setId,host,signal){const view=assembly.workshops[setId];if(!view||disposed||signal?.aborted){host?.dispose?.();throw scopeClosedError()}const visible2=projects.get(projectId);const own=host!==void 0;const scope=own?newScope("project",view,app):visible2;if(!scope||scope.closed||!own&&scope.view!==view)throw scopeClosedError();const cancel=()=>{if(own)closeScope(scope)};signal?.addEventListener("abort",cancel,{once:true});try{if(own){scope.projectId=projectId;scope.host=host;track(scope,()=>host?.dispose?.());scope.parent=await retainWorkshopSet(setId,view,scope);track(scope,()=>releaseWorkshopSet(setId))}await Promise.all(view.plugins.map(p=>ensureLoaded(scope,p)));if(own)await activateAll(view.plugins.filter(p=>needsHook(p,"project")),scope);if(scope.cancellation.signal.aborted||signal?.aborted)throw scopeClosedError();const failed=new Map(Object.keys(view.failed).map(name=>[name,"assembly"]));for(const p of view.plugins)if(isFailed(scope,p))failed.set(p.name,moduleFailed.has(moduleKey(p))||invalidModules.has(moduleKey(p))?"load":"assembly");return{loaded:view.plugins.filter(p=>!failed.has(p.name)).map(p=>p.name),failed:[...failed].map(([plugin,phase])=>({plugin,phase}))}}finally{signal?.removeEventListener("abort",cancel);if(own)closeScope(scope)}}function acquireProject(projectId){if(disposed)throw new RuntimeError("\u8FD0\u884C\u65F6\u5DF2\u5173\u95ED");let scope=projects.get(projectId);if(!scope){const created=newScope("project",assembly.global,app);created.projectId=projectId;created.ready=(async()=>{const setId=await inScope(created,opts.resolveProject(projectId));if(created.cancellation.signal.aborted)throw scopeClosedError();const view=setId!==void 0?assembly.workshops[setId]:void 0;const host=opts.projectHost?.(projectId,view?setId:void 0);if(host){created.host=host;track(created,()=>host.dispose?.())}if(setId!==void 0&&view){created.view=view;created.parent=await retainWorkshopSet(setId,view,created);track(created,()=>releaseWorkshopSet(setId));if(created.cancellation.signal.aborted)throw scopeClosedError()}const hooked=created.view.plugins.filter(p=>needsHook(p,"project"));await activateAll(hooked,created);if(created.cancellation.signal.aborted)throw scopeClosedError();await opts.onProjectReady?.({projectId,...setId!==void 0?{setId}:{},signal:created.cancellation.signal});if(created.cancellation.signal.aborted)throw scopeClosedError();slotChanged()})().catch(e=>{if(projects.get(projectId)===created)projects.delete(projectId);closeScope(created);throw e});scope=created;projects.set(projectId,scope)}scope.refs++;const s=scope;let released=false;const release=()=>{if(released)return;released=true;if(--s.refs>0)return;if(projects.get(projectId)===s)projects.delete(projectId);closeScope(s)};const ready=s.ready.then(()=>({host:s.host,ctxFor:plugin=>{if(released||disposed)throw new RuntimeError(`\u9879\u76EE ${projectId} \u7684\u8FD9\u6B21\u5F15\u7528\u5DF2\u7ECF\u91CA\u653E`);const p=findPlugin(s.view,plugin);if(!p)throw new RuntimeError(`\u9879\u76EE ${projectId} \u7684\u89C6\u56FE\u91CC\u6CA1\u6709 ${plugin}`);const ledger=openLedger();s.disposers.push(()=>closeLedger(ledger));return makeProjectCtx(p,s,ledger)},release})).catch(error=>{release();throw error});return{ready,release}}async function openProject(projectId){return acquireProject(projectId).ready}function ownSlot(p,scope,slot){const s=scope.view.slots[slot];if(!s)throw new RuntimeError(`\u63D2\u69FD ${slot} \u4E0D\u5B58\u5728\uFF08\u672A\u58F0\u660E\u6216\u58F0\u660E\u8005\u6CA1\u88C5\u4E0A\uFF09`);if(slot==="root"?p!==null:s.owner!==p?.as){throw new RuntimeError(`${p?.as??"\u5BBF\u4E3B"} \u4E0D\u80FD\u6E32\u67D3 ${slot}\uFF1A\u53EA\u6709\u58F0\u660E\u8005\u80FD\u6E32\u67D3\u81EA\u5DF1\u7684\u63D2\u69FD`)}return s}function alive(scope,c){const p=findPlugin(scope.view,c.plugin);return p!==void 0&&!gone(scope,p)}function gone(scope,p){for(let s=scope;s;s=s.parent){if(s.failed.has(p.name))return true}if(invalidModules.has(moduleKey(p)))return true;for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&gone(scope,q))return true}return false}function invalidChain(scope,p){if(invalidModules.has(moduleKey(p)))return true;for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&invalidChain(scope,q))return true}return false}const frozenConfigs=new WeakMap;function toEntry(c){const entry={key:c.key,id:c.id,plugin:c.plugin,meta:c.meta,order:c.order,priority:c.priority};if(c.route!==void 0)entry.route=c.route;const config=frozenConfig(c);if(config)entry.config=config;return entry}function frozenConfig(c){if(!c.config)return void 0;const hit=frozenConfigs.get(c);if(hit)return hit;const copy={};for(const[k,f]of Object.entries(c.config)){const field={...f};if(f.enum)field.enum=Object.freeze([...f.enum]);if(f.enumNames)field.enumNames=Object.freeze([...f.enumNames]);if(f.confirmOn)field.confirmOn=Object.freeze([...f.confirmOn]);copy[k]=Object.freeze(field)}const out=Object.freeze(copy);frozenConfigs.set(c,out);return out}function visible(scope,slot){const own=(scope.view.contributions[slot]??[]).filter(c=>alive(scope,c));if(scope!==app||!scope.view.slots[slot]?.decl.routes)return own;return[...own,...workshopPages(slot)]}function workshopPages(slot){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);const view=setId?assembly.workshops[setId]:void 0;if(!setId||!view)return[];const held=workshopSets.get(setId)?.scope;return(view.contributions[slot]??[]).filter(c=>{const p=findPlugin(view,c.plugin);if(!p||!view.routes?.some(r=>r.page===c.key))return false;return held?!gone(held,p):!invalidModules.has(moduleKey(p))})}function pageSetOf(slot,c){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);const view=setId?assembly.workshops[setId]:void 0;return setId&&view?.contributions[slot]?.includes(c)&&view.routes?.some(r=>r.page===c.key)?setId:void 0}function entriesFor(p,scope,slot){ownSlot(p,scope,slot);return visible(scope,slot).map(toEntry)}function mountSlot(p,scope,el,slot,o){const s=ownSlot(p,scope,slot);const decl=s.decl;if(decl.mount===false)throw new RuntimeError(`${slot} \u7684\u8D21\u732E\u53EA\u662F\u6570\u636E\uFF0C\u7528 entries \u8BFB\uFF0C\u4E0D\u80FD\u6302\u8F7D`);if(decl.opens!=="project"&&rank(scope.kind)<rank(decl.scope)){throw new RuntimeError(`${slot} \u662F ${decl.scope} \u7EA7\u63D2\u69FD\uFF0C\u4E0D\u80FD\u5728 ${scope.kind} \u4F5C\u7528\u57DF\u91CC\u6E32\u67D3`)}if(decl.opens==="view"&&rank(scope.kind)===0){throw new RuntimeError(`${slot} \u6253\u5F00\u89C6\u56FE\u4F5C\u7528\u57DF\uFF0C\u53EA\u80FD\u5728\u9879\u76EE\u6216\u89C6\u56FE\u4F5C\u7528\u57DF\u91CC\u6E32\u67D3`)}if(decl.kind==="keyed"&&o.key===void 0)throw new RuntimeError(`${slot} \u662F keyed \u63D2\u69FD\uFF0C\u8981\u7ED9 key`);if(o.focus&&decl.focus!=="own")throw new RuntimeError(`${slot} \u6CA1\u6709\u58F0\u660E focus: own\uFF0C\u6302\u8F7D\u65F6\u4E0D\u80FD\u7ED9\u7126\u70B9\u521D\u503C`);const initialArtifact=o.focus?.selection?.kind==="artifact"?o.focus.selection.artifactId:void 0;if(o.focus?.version&&initialArtifact!==void 0&&initialArtifact!==o.focus.version.artifactId)throw new RuntimeError(`${slot} \u7684\u7126\u70B9\u521D\u503C\u91CC\uFF0C\u9009\u4E2D\u7684\u4EA7\u7269\u548C\u7248\u672C\u6240\u5C5E\u7684\u4EA7\u7269\u4E0D\u4E00\u81F4`);if(decl.kind==="list"&&o.key===void 0)throw new RuntimeError(`${slot} \u662F list \u63D2\u69FD\uFF0C\u4E00\u6761\u4E00\u6761\u6302\uFF0C\u8981\u7ED9 key`);let cancelled=false;let inner;const release=[];let cardTitle;let forget;const hold=d=>{if(cancelled){safely(d);return false}release.push(d);return true};const run=async()=>{let target=scope;const slotProject=decl.opens==="project"?o.owner?.projectId:void 0;if(decl.opens==="project"&&!slotProject){throw new RuntimeError(`${slot} \u6253\u5F00\u9879\u76EE\u4F5C\u7528\u57DF\uFF0Cowner \u8981\u5E26 projectId`)}let chosen=slotProject===void 0?await choose(scope,slot,o):null;if(cancelled)return;cardTitle=chosen!==null&&typeof chosen.meta.title==="string"?chosen.meta.title:void 0;const pageProject=chosen?.opens==="project"?o.owner?.params?.project:void 0;if(chosen?.opens==="project"&&!pageProject){throw new RuntimeError(`\u9875\u9762 ${chosen.key} \u6253\u5F00\u9879\u76EE\u4F5C\u7528\u57DF\uFF0Cowner.params \u8981\u5E26 project`)}const pageSet=chosen!==null&&scope===app&&decl.routes?pageSetOf(slot,chosen):void 0;if(pageSet!==void 0){const view=assembly.workshops[pageSet];const held=await retainWorkshopSet(pageSet,view,app);if(!hold(()=>releaseWorkshopSet(pageSet)))return;if(disposed)return;const watch=()=>{if(currentSets.get(view.workshop)!==pageSet)restart()};pageMounts.add(watch);hold(()=>pageMounts.delete(watch));if(currentSets.get(view.workshop)!==pageSet){again=true;return}target=held}const openId=slotProject??pageProject;if(openId!==void 0){const request=acquireProject(openId);hold(request.release);await request.ready;if(cancelled||disposed)return;target=projects.get(openId);if(pageProject!==void 0&&chosen){if(canonicalize(chosen.key,pageProject,target.view.workshop)==="handover")return}chosen=await choose(target,slot,o);if(cancelled)return}if(!chosen){inner=o.fallback?.(el)??void 0;return}cardTitle=typeof chosen.meta.title==="string"?chosen.meta.title:void 0;if(decl.opens==="view"){const own=decl.focus==="own"?{selection:o.focus?.selection??null,...o.focus?.version?{version:o.focus.version}:{}}:void 0;const v=openView(target,slot,chosen.key,own);if(!hold(()=>closeScope(v)))return;target=v}const owner=findPlugin(target.view,chosen.plugin);const[m]=owner&&!isFailed(target,owner)?await Promise.all([ensureLoaded(target,owner),ensureActive(target,owner)]):[null];if(cancelled||target.closed)return;if(!owner||!m||isFailed(target,owner)){const name=owner?.name??chosen.plugin;const why=(owner&&failure(target,owner))??"\u6CA1\u88C5\u4E0A";if(!owner||invalidChain(target,owner)){inner=opts.renderError(el,{plugin:name,message:why})??void 0;return}const failed=owner;const failedIn=target;forget=()=>forgetFailure(failedIn,failed);inner=opts.renderError(el,{plugin:name,message:why,...cardTitle!==void 0?{title:cardTitle}:{},load:true,retry:remount})??void 0;return}if((o.version||o.live)&&rank(target.kind)===0){throw new RuntimeError(`${slot} \u6302\u5728\u5E94\u7528\u4F5C\u7528\u57DF\u91CC\uFF0C\u9489\u4E0D\u4E86\u7248\u672C\u3001\u5F00\u4E0D\u4E86\u5B9E\u65F6\u9884\u89C8\uFF08\u53EA\u5728\u9879\u76EE\u4F5C\u7528\u57DF\u91CC\u6709\u610F\u4E49\uFF09`)}const surface=m.surfaces?.[chosen.id];if(!surface)throw new RuntimeError(`${owner.as} \u6CA1\u6709\u7ED9\u8D21\u732E ${chosen.id} \u7684\u6302\u8F7D\u51FD\u6570`);const given=o.config??{};const configProblems=checkConfig(chosen.config,given);if(configProblems.length>0){const why=configProblems.map(p2=>p2.message).join("\uFF1B");throw new RuntimeError(`${chosen.key} \u6536\u5230\u7684\u914D\u7F6E\u4E0D\u5408\u5B83\u58F0\u660E\u7684\u914D\u7F6E schema\uFF1A${why}\uFF08\u662F\u5B83\u8981\u6536\u7684\u914D\u7F6E\uFF0C\u5C31\u5728 ${owner.name} \u7684 plugin.yaml \u91CC\u7ED9\u8D21\u732E ${chosen.id} \u58F0\u660E config\uFF09`)}const config=withConfigDefaults(chosen.config,given);const entry=toEntry(chosen);const title=typeof chosen.meta.title==="string"?chosen.meta.title:void 0;const scopeOf=target;const attach=()=>{const ledger=openLedger();const unmount=()=>closeLedger(ledger);release.push(()=>{scopeOf.mounts.delete(unmount);unmount()});if(scopeOf.kind==="view")scopeOf.mounts.add(unmount);try{const situation={mount:el};if(o.version)situation.version=o.version;if(o.live)situation.live=true;const ret=surface(ctxFor(owner,scopeOf,ledger,situation),el,{owner:o.owner,config,matched:chosen.matched,entry});if(typeof ret==="function")ledger.disposers.push(ret)}catch(e){closeLedger(ledger);if(cancelled||scopeOf.cancellation.signal.aborted)return;diagnose({plugin:owner.name,phase:"mount",message:errorMessage(e)},owner.set);inner=opts.renderError(el,{plugin:owner.name,message:errorMessage(e),error:e,...title!==void 0?{title}:{},retry:()=>{if(cancelled||disposed||scopeOf.closed)return;if(inner)safely(inner);inner=void 0;attach()}})??void 0}};attach()};const drawFailure=e=>{if(cancelled||disposed||scope.cancellation.signal.aborted)return;diagnose({plugin:p?.name,phase:"mount",message:errorMessage(e)},p?.set);forget=void 0;inner=opts.renderError(el,{...p?.name!==void 0?{plugin:p.name}:{},message:errorMessage(e),error:e,...cardTitle!==void 0?{title:cardTitle}:{},load:true,retry:remount})??void 0};let running=true;let again=false;const settle=()=>{running=false;if(again){again=false;remount()}};const restart=()=>{if(running)again=true;else remount()};const remount=()=>{if(cancelled||disposed||running)return;running=true;forget?.();forget=void 0;if(inner)safely(inner);inner=void 0;for(const d of release.splice(0).reverse())safely(d);void run().catch(drawFailure).finally(settle)};void run().catch(drawFailure).finally(settle);return()=>{cancelled=true;if(inner)safely(inner);inner=void 0;for(const d of release.splice(0).reverse())safely(d)}}async function choose(scope,slot,o){await scope.ready;const decl=scope.view.slots[slot]?.decl;const list=visible(scope,slot);switch(decl?.kind){case"single":return list[0]??null;case"keyed":{const key=resolveKey({...scope.view,contributions:{[slot]:list}},slot,o.key);return list.find(c=>c.key===key)??null}case"list":return list.find(c=>c.key===o.key||c.id===o.key)??null;case"chain":{for(const c of list){const owner=findPlugin(scope.view,c.plugin);const m=await ensureLoaded(scope,owner);const select=m?.select?.[c.id];if(!select)continue;let matched;try{matched=select(o.owner)}catch(e){diagnose({plugin:owner.name,phase:"mount",message:errorMessage(e)},owner.set);continue}if(matched!==null&&matched!==void 0)return{...c,matched}}return null}default:return null}}function workshopRoutes(){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);return setId&&assembly.workshops[setId]?.routes||[]}function navigate(page,params){const byShort=table=>{const hits=table.filter(r=>r.page.endsWith(`/${page}`));if(hits.length>1)throw new RuntimeError(`\u9875\u9762 ${page} \u6709\u6B67\u4E49\uFF0C\u5199\u5168\u540D\uFF1A${hits.map(h=>h.page).join("\u3001")}`);return hits[0]};const local=workshopRoutes();const entry=assembly.routes.find(r=>r.page===page)??local.find(r=>r.page===page)??byShort(assembly.routes)??byShort(local);if(!entry)throw new RuntimeError(`\u6CA1\u6709\u9875\u9762 ${page}`);const path=pathFor(entry,params);if(crossesWorkshop(path)&&handOver(path))return;opts.onNavigate?.(path);setLocation(path)}function targetWorkshop(path){const page=workshopPageOf(path);if(page!==void 0)return page;const m=matchRoute(assembly.routes,path);if(!m)return void 0;const workshop=workshopOf(m.pattern,m.params);if(workshop!==void 0)return workshop;return m.params.project!==void 0?"unknown":void 0}function handOver(path){if(opts.onCrossWorkshop?.(path))return true;docWorkshop=void 0;return false}function crossesWorkshop(path){if(docWorkshop===void 0)return false;const target=targetWorkshop(path);return target!=="unknown"&&target!==docWorkshop}function pathFor(entry,params){const wantsWorkshop=workshopOf(entry.pattern,{[WORKSHOP_PARAM]:"?"})!==void 0;const withWorkshop=wantsWorkshop&¶ms[WORKSHOP_PARAM]===void 0&&route.workshop!==void 0?{...params,[WORKSHOP_PARAM]:route.workshop}:params;const exact=exactPath(entry,withWorkshop);if(exact)return exact;let first;for(const pattern of[entry.pattern,...entry.aliases]){try{return buildRoute(pattern,withWorkshop)}catch(e){first??=e}}throw first}function workshopPageRoute(path,workshop){const setId=currentSets.get(workshop);const m=setId?matchRoute(assembly.workshops[setId]?.routes??[],path):null;if(m)return{page:m.page,params:m.params,path,workshop};if(setId===void 0&&opts.resolveWorkshop&&!disposed)return{page:null,params:{[WORKSHOP_PARAM]:workshop},path,workshop};return{page:null,params:{},path}}function refreshWorkshop(workshop){const resolve=opts.resolveWorkshop;if(!resolve)return;if(resolving.has(workshop))return;const asking=resolve(workshop).then(set2=>set2!==void 0&&assembly.workshops[set2]?set2:null,e=>{diagnose({phase:"load",message:`\u5DE5\u574A ${workshop} \u7684\u5F53\u524D\u5FEB\u7167\u6CA1\u8BFB\u5230\uFF1A${errorMessage(e)}`});return currentSets.get(workshop)??null}).then(set2=>{resolving.delete(workshop);if(disposed)return;const before=currentSets.get(workshop);currentSets.set(workshop,set2);if(before===set2)return;if(workshopPageOf(route.path)===workshop)setLocation(route.path);if(route.workshop===workshop)slotChanged();for(const fn of[...pageMounts])fn()});resolving.set(workshop,asking)}function setLocation(path){const before=route.workshop;const pageWorkshop=workshopPageOf(path);const m=pageWorkshop===void 0?matchRoute(assembly.routes,path):null;if(pageWorkshop!==void 0)route=workshopPageRoute(path,pageWorkshop);else{const params=m?.params??{};const workshop2=m?workshopOf(m.pattern,params):void 0;route={page:m?.page??null,params,path,...workshop2?{workshop:workshop2}:{}}}const workshop=route.workshop;if(workshop!==void 0&&(docWorkshop===void 0||!opts.onCrossWorkshop))docWorkshop=workshop;if(workshop!==void 0&&workshop!==before)refreshWorkshop(workshop);if(m?.alias){const entry=assembly.routes.find(r=>r.page===m.page);const better=entry&&exactPath(entry,m.params);if(better&&better!==path&&better!==path.replace(/\/+$/,"")){replaceLocation(better);if(route.workshop!==before)slotChanged();return}}for(const fn of[...routeListeners])fn(route);if(route.workshop!==before)slotChanged()}function replaceLocation(path){opts.onNavigate?.(path,{replace:true});setLocation(path)}function canonicalize(page,projectId,workshop){if(workshop===void 0||route.page!==page||route.params.project!==projectId)return"stay";const entry=assembly.routes.find(r=>r.page===page);const path=entry&&exactPath(entry,{...route.params,[WORKSHOP_PARAM]:workshop});if(docWorkshop!==void 0&&docWorkshop!==workshop&&path&&handOver(path))return"handover";docWorkshop=workshop;if(route.workshop===workshop)return"stay";if(path&&path!==route.path){replaceLocation(path);return"rewrote"}return"stay"}return{async start(){const hooked=assembly.global.plugins.filter(p=>needsHook(p,"app"));await activateAll(hooked,app)},mountRoot(el){const hasRoot=visible(app,"root").length>0;if(!hasRoot){diagnose({phase:"mount",message:"\u6CA1\u6709\u63D2\u4EF6\u5360 root\uFF08\u5916\u58F3\u6CA1\u88C5\u4E0A\uFF09"});return opts.renderError(el,{message:`\u5916\u58F3\u6CA1\u88C5\u4E0A\uFF1A${diagnostics.at(-1)?.message??""}`})??(()=>{})}return mountSlot(null,app,el,"root",{owner:{},fallback:target=>opts.renderError(target,{message:"\u5916\u58F3\u6CA1\u88C5\u4E0A"})})},openProject,inspectProjectPlugins,setLocation,crossesWorkshop,route:()=>route,diagnostics:()=>diagnostics,loaded:()=>[...settled].map(k=>k.slice(k.indexOf(":")+1)),dispose(){if(disposed)return;disposed=true;for(const s of[...projects.values()])closeScope(s);projects.clear();for(const ws of[...workshopSets.values()])closeScope(ws.scope);workshopSets.clear();closeScope(app)}}}function workshopPageOf(path){const parts=path.replace(/\/+$/,"").replace(/^\/+/,"").split("/");if(parts.length<3||parts[0]!=="w"||parts[2]!==WORKSHOP_PAGE_SEGMENT||!parts[1])return void 0;try{return decodeURIComponent(parts[1])}catch{return void 0}}function checkModule(view,p,m){const activation=p.manifest.activation??[];if(activation.includes("app")!==(typeof m.activate==="function")){return activation.includes("app")?"\u6E05\u5355\u5199\u4E86 activation: app\uFF0C\u6A21\u5757\u6CA1\u6709 activate":"\u6A21\u5757\u6709 activate\uFF0C\u6E05\u5355\u7684 activation \u6CA1\u5199 app"}for(const kind of["workshop","project","view"]){const has2=typeof m.scopes?.[kind]==="function";if(activation.includes(kind)!==has2){return has2?`\u6A21\u5757\u6709 scopes.${kind}\uFF0C\u6E05\u5355\u7684 activation \u6CA1\u5199 ${kind}`:`\u6E05\u5355\u5199\u4E86 activation: ${kind}\uFF0C\u6A21\u5757\u6CA1\u6709 scopes.${kind}`}}const wanted=new Set;const chains=new Set;for(const c of p.manifest.contributes??[]){const decl=view.slots[c.slot]?.decl;if(!decl)continue;if(decl.mount!==false)wanted.add(c.id);if(decl.kind==="chain")chains.add(c.id)}const given=new Set(Object.keys(m.surfaces??{}));const missing=[...wanted].filter(id=>!given.has(id));if(missing.length>0)return`\u7F3A\u6302\u8F7D\u51FD\u6570\uFF1A${missing.join("\u3001")}`;const extra=[...given].filter(id=>!(p.manifest.contributes??[]).some(c=>c.id===id));if(extra.length>0)return`\u6302\u8F7D\u51FD\u6570 ${extra.join("\u3001")} \u5728\u6E05\u5355\u91CC\u6CA1\u6709\u5BF9\u5E94\u7684\u8D21\u732E`;const noSelect=[...chains].filter(id=>typeof m.select?.[id]!=="function");if(noSelect.length>0)return`chain \u8D21\u732E\u7F3A select\uFF1A${noSelect.join("\u3001")}`;return null}function rank(kind){return{app:0,workshop:0,project:1,view:2}[kind]}function exactPath(entry,params){const want=Object.keys(params).sort().join("/");for(const pattern of[entry.pattern,...entry.aliases]){const names=pattern.split("/").filter(s=>s.startsWith(":")).map(s=>s.slice(1)).sort().join("/");if(names===want)return buildRoute(pattern,params)}return null}function emptyData(){return{workshops:async()=>[],workshop:async()=>null,projects:async()=>[],inbox:async()=>({needsYou:[],inProgress:[]}),myArtifacts:async(query={})=>({query,counts:{joined:0,mine:0,review:0,starred:0},facets:{workshops:[],projects:[],types:[]},rows:[]}),search:async()=>({projects:[],workshops:[],threads:[]}),plugins:async()=>[],plugin:async()=>null,subscribe:()=>()=>{}}}function errorMessage(e){return e instanceof Error?e.message:String(e)}function safely(fn){try{fn()}catch{}}function projectInfoOf(id,info){if(!info)return{name:id};return{name:info.name,...info.branch!==void 0?{branch:info.branch}:{},...info.workshopName!==void 0?{workshopName:info.workshopName}:{},...info.workshopIcon!==void 0?{workshopIcon:info.workshopIcon}:{}}}function hostFor(services){services.follow();const owned=new WeakMap;return{services,access:services.access,canReadThreads:services.canReadThreads,agent:services.agent,...services.info?{info:services.info}:{},...services.shared?{shared:services.shared}:{},...services.notices?{notices:services.notices}:{},...services.upgrade?{upgrade:services.upgrade}:{},...services.deleted?{deleted:services.deleted}:{},status:()=>services.status(),focus:selection=>{const id=focusOf(selection);if(id!==void 0)services.focus(id)},openFocus:({selection,version})=>{const artifactId=focusOf(selection);const own=services.openFocus({...artifactId!==void 0?{artifactId}:{},...version?{version}:{}});const handle={focus:sel=>{const id=focusOf(sel);if(id!==void 0)own.focus(id)},dispose:()=>own.dispose()};owned.set(handle,own);return handle},api:({plugin,locked,track,version,live,mount,focus})=>services.api({name:plugin.as,via:plugin.name,anchors:plugin.manifest.anchors??[],resources:plugin.manifest.resources,...plugin.manifest.agent?{agent:plugin.manifest.agent}:{},locked,materialDiscussionWriter:locked&&plugin.roles.includes("comment")&&(plugin.manifest.collabFeatures?.includes("material-discussions")??false)},{track,...version?{version}:{},...live?{live:true}:{},...mount?{mount}:{},...focus&&owned.has(focus)?{focus:owned.get(focus)}:{}}),dispose:()=>services.dispose()}}function focusOf(selection){return selection?.kind==="artifact"?selection.artifactId:void 0}function surfaceErrorReason(message){const line=message.split("\n",1)[0]?.trim()||"\u51FA\u4E86\u70B9\u95EE\u9898";return line.length>160?`${line.slice(0,160)}\u2026`:line}function surfaceTitle(title){return title?.trim()?title:void 0}function renderSurfaceError(el,info){const host=el;const who=info.plugin??"\u5BBF\u4E3B";if(!info.retry){const p=document.createElement("p");p.className="band-surface-error";p.textContent=`${who}\uFF1A${info.message}`;host.appendChild(p);return()=>p.remove()}const retry=info.retry;const verb=info.load?"\u6CA1\u52A0\u8F7D\u51FA\u6765":"\u6CA1\u663E\u793A\u51FA\u6765";console.error(`[band] ${who} \u8FD9\u4E00\u5757${verb}`,info.error??info.message);const card=document.createElement("div");card.className="band-surface-error band-surface-failed";card.setAttribute("role","alert");const name=surfaceTitle(info.title);const title=document.createElement("p");title.className="band-surface-failed-title";title.textContent=`${name?`\u300C${name}\u300D`:"\u8FD9\u4E00\u5757"}${verb}`;const reason=document.createElement("p");reason.className="band-surface-failed-reason";reason.textContent=surfaceErrorReason(info.message);const button=document.createElement("button");button.type="button";button.className="btn sm";button.textContent="\u91CD\u8BD5";button.addEventListener("click",()=>retry());card.append(title,reason,button);host.appendChild(card);return()=>card.remove()}function assemble(o){const modules=new Map;const nameOf=input=>input.packageJson.name;for(const p of o.plugins)modules.set(`global:${nameOf(p.input)}`,p.module);const workshops=(o.workshops??[]).map(w=>({id:w.id,workshop:w.workshop,...w.locked?{locked:w.locked}:{},...w.views?{views:w.views}:{},...w.replace&&Object.keys(w.replace).length>0?{replace:w.replace}:{},plugins:w.plugins.map(p=>{modules.set(`${w.id}:${nameOf(p.input)}`,p.module);return p.input})}));return{input:{profile:{plugins:o.plugins.map(p=>p.input),locked:{...o.locked}},workshops},modules}}export{ANCHOR_RESOLVE_TIMEOUT_MS,BARE_HOST_GRACE_MS,EDIT_FLUSH_TIMEOUT_MS,EditFlushError,RuntimeError,assemble,canReadThreadsOf,createProjectServices,createRuntime,createSnapshotStore,defineStore,hostFor,markDiagnosticFailure,matchEvent,publishRuntimeDiagnostic,renderSurfaceError,shallowEqual,subscribeRuntimeDiagnostics,surfaceErrorReason,surfaceTitle,withDisplayDefaults};
|
|
1
|
+
var createStoreImpl=createState=>{let state;const listeners2=new Set;const setState=(partial,replace)=>{const nextState=typeof partial==="function"?partial(state):partial;if(!Object.is(nextState,state)){const previousState=state;state=(replace!=null?replace:typeof nextState!=="object"||nextState===null)?nextState:Object.assign({},state,nextState);listeners2.forEach(listener=>listener(state,previousState))}};const getState=()=>state;const getInitialState=()=>initialState;const subscribe=listener=>{listeners2.add(listener);return()=>listeners2.delete(listener)};const destroy=()=>{if((import.meta.env?import.meta.env.MODE:void 0)!=="production"){console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.")}listeners2.clear()};const api={setState,getState,getInitialState,subscribe,destroy};const initialState=state=createState(setState,getState,api);return api};var createStore=createState=>createState?createStoreImpl(createState):createStoreImpl;var subscribeWithSelectorImpl=fn=>(set2,get,api)=>{const origSubscribe=api.subscribe;api.subscribe=(selector,optListener,options)=>{let listener=selector;if(optListener){const equalityFn=(options==null?void 0:options.equalityFn)||Object.is;let currentSlice=selector(api.getState());listener=state=>{const nextSlice=selector(state);if(!equalityFn(currentSlice,nextSlice)){const previousSlice=currentSlice;optListener(currentSlice=nextSlice,previousSlice)}};if(options==null?void 0:options.fireImmediately){optListener(currentSlice,currentSlice)}}return origSubscribe(listener)};const initialState=fn(set2,get,api);return initialState};var subscribeWithSelector=subscribeWithSelectorImpl;function shallow$1(objA,objB){if(Object.is(objA,objB)){return true}if(typeof objA!=="object"||objA===null||typeof objB!=="object"||objB===null){return false}if(objA instanceof Map&&objB instanceof Map){if(objA.size!==objB.size)return false;for(const[key,value]of objA){if(!Object.is(value,objB.get(key))){return false}}return true}if(objA instanceof Set&&objB instanceof Set){if(objA.size!==objB.size)return false;for(const value of objA){if(!objB.has(value)){return false}}return true}const keysA=Object.keys(objA);if(keysA.length!==Object.keys(objB).length){return false}for(const keyA of keysA){if(!Object.prototype.hasOwnProperty.call(objB,keyA)||!Object.is(objA[keyA],objB[keyA])){return false}}return true}var NOTHING=Symbol.for("immer-nothing");var DRAFTABLE=Symbol.for("immer-draftable");var DRAFT_STATE=Symbol.for("immer-state");function die(error,...args){if(false){const e=errors[error];const msg=typeof e==="function"?e.apply(null,args):e;throw new Error(`[Immer] ${msg}`)}throw new Error(`[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`)}var getPrototypeOf=Object.getPrototypeOf;function isDraft(value){return!!value&&!!value[DRAFT_STATE]}function isDraftable(value){if(!value)return false;return isPlainObject(value)||Array.isArray(value)||!!value[DRAFTABLE]||!!value.constructor?.[DRAFTABLE]||isMap(value)||isSet(value)}var objectCtorString=Object.prototype.constructor.toString();var cachedCtorStrings=new WeakMap;function isPlainObject(value){if(!value||typeof value!=="object")return false;const proto=Object.getPrototypeOf(value);if(proto===null||proto===Object.prototype)return true;const Ctor=Object.hasOwnProperty.call(proto,"constructor")&&proto.constructor;if(Ctor===Object)return true;if(typeof Ctor!=="function")return false;let ctorString=cachedCtorStrings.get(Ctor);if(ctorString===void 0){ctorString=Function.toString.call(Ctor);cachedCtorStrings.set(Ctor,ctorString)}return ctorString===objectCtorString}function each(obj,iter,strict=true){if(getArchtype(obj)===0){const keys=strict?Reflect.ownKeys(obj):Object.keys(obj);keys.forEach(key=>{iter(key,obj[key],obj)})}else{obj.forEach((entry,index)=>iter(index,entry,obj))}}function getArchtype(thing){const state=thing[DRAFT_STATE];return state?state.type_:Array.isArray(thing)?1:isMap(thing)?2:isSet(thing)?3:0}function has(thing,prop){return getArchtype(thing)===2?thing.has(prop):Object.prototype.hasOwnProperty.call(thing,prop)}function set(thing,propOrOldValue,value){const t=getArchtype(thing);if(t===2)thing.set(propOrOldValue,value);else if(t===3){thing.add(value)}else thing[propOrOldValue]=value}function is(x,y){if(x===y){return x!==0||1/x===1/y}else{return x!==x&&y!==y}}function isMap(target){return target instanceof Map}function isSet(target){return target instanceof Set}function latest(state){return state.copy_||state.base_}function shallowCopy(base,strict){if(isMap(base)){return new Map(base)}if(isSet(base)){return new Set(base)}if(Array.isArray(base))return Array.prototype.slice.call(base);const isPlain=isPlainObject(base);if(strict===true||strict==="class_only"&&!isPlain){const descriptors=Object.getOwnPropertyDescriptors(base);delete descriptors[DRAFT_STATE];let keys=Reflect.ownKeys(descriptors);for(let i=0;i<keys.length;i++){const key=keys[i];const desc=descriptors[key];if(desc.writable===false){desc.writable=true;desc.configurable=true}if(desc.get||desc.set)descriptors[key]={configurable:true,writable:true,enumerable:desc.enumerable,value:base[key]}}return Object.create(getPrototypeOf(base),descriptors)}else{const proto=getPrototypeOf(base);if(proto!==null&&isPlain){return{...base}}const obj=Object.create(proto);return Object.assign(obj,base)}}function freeze(obj,deep=false){if(isFrozen(obj)||isDraft(obj)||!isDraftable(obj))return obj;if(getArchtype(obj)>1){Object.defineProperties(obj,{set:dontMutateMethodOverride,add:dontMutateMethodOverride,clear:dontMutateMethodOverride,delete:dontMutateMethodOverride})}Object.freeze(obj);if(deep)Object.values(obj).forEach(value=>freeze(value,true));return obj}function dontMutateFrozenCollections(){die(2)}var dontMutateMethodOverride={value:dontMutateFrozenCollections};function isFrozen(obj){if(obj===null||typeof obj!=="object")return true;return Object.isFrozen(obj)}var plugins={};function getPlugin(pluginKey){const plugin=plugins[pluginKey];if(!plugin){die(0,pluginKey)}return plugin}var currentScope;function getCurrentScope(){return currentScope}function createScope(parent_,immer_){return{drafts_:[],parent_,immer_,canAutoFreeze_:true,unfinalizedDrafts_:0}}function usePatchesInScope(scope,patchListener){if(patchListener){getPlugin("Patches");scope.patches_=[];scope.inversePatches_=[];scope.patchListener_=patchListener}}function revokeScope(scope){leaveScope(scope);scope.drafts_.forEach(revokeDraft);scope.drafts_=null}function leaveScope(scope){if(scope===currentScope){currentScope=scope.parent_}}function enterScope(immer2){return currentScope=createScope(currentScope,immer2)}function revokeDraft(draft){const state=draft[DRAFT_STATE];if(state.type_===0||state.type_===1)state.revoke_();else state.revoked_=true}function processResult(result,scope){scope.unfinalizedDrafts_=scope.drafts_.length;const baseDraft=scope.drafts_[0];const isReplaced=result!==void 0&&result!==baseDraft;if(isReplaced){if(baseDraft[DRAFT_STATE].modified_){revokeScope(scope);die(4)}if(isDraftable(result)){result=finalize(scope,result);if(!scope.parent_)maybeFreeze(scope,result)}if(scope.patches_){getPlugin("Patches").generateReplacementPatches_(baseDraft[DRAFT_STATE].base_,result,scope.patches_,scope.inversePatches_)}}else{result=finalize(scope,baseDraft,[])}revokeScope(scope);if(scope.patches_){scope.patchListener_(scope.patches_,scope.inversePatches_)}return result!==NOTHING?result:void 0}function finalize(rootScope,value,path){if(isFrozen(value))return value;const useStrictIteration=rootScope.immer_.shouldUseStrictIteration();const state=value[DRAFT_STATE];if(!state){each(value,(key,childValue)=>finalizeProperty(rootScope,state,value,key,childValue,path),useStrictIteration);return value}if(state.scope_!==rootScope)return value;if(!state.modified_){maybeFreeze(rootScope,state.base_,true);return state.base_}if(!state.finalized_){state.finalized_=true;state.scope_.unfinalizedDrafts_--;const result=state.copy_;let resultEach=result;let isSet2=false;if(state.type_===3){resultEach=new Set(result);result.clear();isSet2=true}each(resultEach,(key,childValue)=>finalizeProperty(rootScope,state,result,key,childValue,path,isSet2),useStrictIteration);maybeFreeze(rootScope,result,false);if(path&&rootScope.patches_){getPlugin("Patches").generatePatches_(state,path,rootScope.patches_,rootScope.inversePatches_)}}return state.copy_}function finalizeProperty(rootScope,parentState,targetObject,prop,childValue,rootPath,targetIsSet){if(childValue==null){return}if(typeof childValue!=="object"&&!targetIsSet){return}const childIsFrozen=isFrozen(childValue);if(childIsFrozen&&!targetIsSet){return}if(false)die(5);if(isDraft(childValue)){const path=rootPath&&parentState&&parentState.type_!==3&&!has(parentState.assigned_,prop)?rootPath.concat(prop):void 0;const res=finalize(rootScope,childValue,path);set(targetObject,prop,res);if(isDraft(res)){rootScope.canAutoFreeze_=false}else return}else if(targetIsSet){targetObject.add(childValue)}if(isDraftable(childValue)&&!childIsFrozen){if(!rootScope.immer_.autoFreeze_&&rootScope.unfinalizedDrafts_<1){return}if(parentState&&parentState.base_&&parentState.base_[prop]===childValue&&childIsFrozen){return}finalize(rootScope,childValue);if((!parentState||!parentState.scope_.parent_)&&typeof prop!=="symbol"&&(isMap(targetObject)?targetObject.has(prop):Object.prototype.propertyIsEnumerable.call(targetObject,prop)))maybeFreeze(rootScope,childValue)}}function maybeFreeze(scope,value,deep=false){if(!scope.parent_&&scope.immer_.autoFreeze_&&scope.canAutoFreeze_){freeze(value,deep)}}function createProxyProxy(base,parent){const isArray=Array.isArray(base);const state={type_:isArray?1:0,scope_:parent?parent.scope_:getCurrentScope(),modified_:false,finalized_:false,assigned_:{},parent_:parent,base_:base,draft_:null,copy_:null,revoke_:null,isManual_:false};let target=state;let traps=objectTraps;if(isArray){target=[state];traps=arrayTraps}const{revoke,proxy}=Proxy.revocable(target,traps);state.draft_=proxy;state.revoke_=revoke;return proxy}var objectTraps={get(state,prop){if(prop===DRAFT_STATE)return state;const source=latest(state);if(!has(source,prop)){return readPropFromProto(state,source,prop)}const value=source[prop];if(state.finalized_||!isDraftable(value)){return value}if(value===peek(state.base_,prop)){prepareCopy(state);return state.copy_[prop]=createProxy(value,state)}return value},has(state,prop){return prop in latest(state)},ownKeys(state){return Reflect.ownKeys(latest(state))},set(state,prop,value){const desc=getDescriptorFromProto(latest(state),prop);if(desc?.set){desc.set.call(state.draft_,value);return true}if(!state.modified_){const current2=peek(latest(state),prop);const currentState=current2?.[DRAFT_STATE];if(currentState&¤tState.base_===value){state.copy_[prop]=value;state.assigned_[prop]=false;return true}if(is(value,current2)&&(value!==void 0||has(state.base_,prop)))return true;prepareCopy(state);markChanged(state)}if(state.copy_[prop]===value&&(value!==void 0||prop in state.copy_)||Number.isNaN(value)&&Number.isNaN(state.copy_[prop]))return true;state.copy_[prop]=value;state.assigned_[prop]=true;return true},deleteProperty(state,prop){if(peek(state.base_,prop)!==void 0||prop in state.base_){state.assigned_[prop]=false;prepareCopy(state);markChanged(state)}else{delete state.assigned_[prop]}if(state.copy_){delete state.copy_[prop]}return true},getOwnPropertyDescriptor(state,prop){const owner=latest(state);const desc=Reflect.getOwnPropertyDescriptor(owner,prop);if(!desc)return desc;return{writable:true,configurable:state.type_!==1||prop!=="length",enumerable:desc.enumerable,value:owner[prop]}},defineProperty(){die(11)},getPrototypeOf(state){return getPrototypeOf(state.base_)},setPrototypeOf(){die(12)}};var arrayTraps={};each(objectTraps,(key,fn)=>{arrayTraps[key]=function(){arguments[0]=arguments[0][0];return fn.apply(this,arguments)}});arrayTraps.deleteProperty=function(state,prop){if(false)die(13);return arrayTraps.set.call(this,state,prop,void 0)};arrayTraps.set=function(state,prop,value){if(false)die(14);return objectTraps.set.call(this,state[0],prop,value,state[0])};function peek(draft,prop){const state=draft[DRAFT_STATE];const source=state?latest(state):draft;return source[prop]}function readPropFromProto(state,source,prop){const desc=getDescriptorFromProto(source,prop);return desc?`value`in desc?desc.value:desc.get?.call(state.draft_):void 0}function getDescriptorFromProto(source,prop){if(!(prop in source))return void 0;let proto=getPrototypeOf(source);while(proto){const desc=Object.getOwnPropertyDescriptor(proto,prop);if(desc)return desc;proto=getPrototypeOf(proto)}return void 0}function markChanged(state){if(!state.modified_){state.modified_=true;if(state.parent_){markChanged(state.parent_)}}}function prepareCopy(state){if(!state.copy_){state.copy_=shallowCopy(state.base_,state.scope_.immer_.useStrictShallowCopy_)}}var Immer2=class{constructor(config){this.autoFreeze_=true;this.useStrictShallowCopy_=false;this.useStrictIteration_=true;this.produce=(base,recipe,patchListener)=>{if(typeof base==="function"&&typeof recipe!=="function"){const defaultBase=recipe;recipe=base;const self=this;return function curriedProduce(base2=defaultBase,...args){return self.produce(base2,draft=>recipe.call(this,draft,...args))}}if(typeof recipe!=="function")die(6);if(patchListener!==void 0&&typeof patchListener!=="function")die(7);let result;if(isDraftable(base)){const scope=enterScope(this);const proxy=createProxy(base,void 0);let hasError=true;try{result=recipe(proxy);hasError=false}finally{if(hasError)revokeScope(scope);else leaveScope(scope)}usePatchesInScope(scope,patchListener);return processResult(result,scope)}else if(!base||typeof base!=="object"){result=recipe(base);if(result===void 0)result=base;if(result===NOTHING)result=void 0;if(this.autoFreeze_)freeze(result,true);if(patchListener){const p=[];const ip=[];getPlugin("Patches").generateReplacementPatches_(base,result,p,ip);patchListener(p,ip)}return result}else die(1,base)};this.produceWithPatches=(base,recipe)=>{if(typeof base==="function"){return(state,...args)=>this.produceWithPatches(state,draft=>base(draft,...args))}let patches,inversePatches;const result=this.produce(base,recipe,(p,ip)=>{patches=p;inversePatches=ip});return[result,patches,inversePatches]};if(typeof config?.autoFreeze==="boolean")this.setAutoFreeze(config.autoFreeze);if(typeof config?.useStrictShallowCopy==="boolean")this.setUseStrictShallowCopy(config.useStrictShallowCopy);if(typeof config?.useStrictIteration==="boolean")this.setUseStrictIteration(config.useStrictIteration)}createDraft(base){if(!isDraftable(base))die(8);if(isDraft(base))base=current(base);const scope=enterScope(this);const proxy=createProxy(base,void 0);proxy[DRAFT_STATE].isManual_=true;leaveScope(scope);return proxy}finishDraft(draft,patchListener){const state=draft&&draft[DRAFT_STATE];if(!state||!state.isManual_)die(9);const{scope_:scope}=state;usePatchesInScope(scope,patchListener);return processResult(void 0,scope)}setAutoFreeze(value){this.autoFreeze_=value}setUseStrictShallowCopy(value){this.useStrictShallowCopy_=value}setUseStrictIteration(value){this.useStrictIteration_=value}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(base,patches){let i;for(i=patches.length-1;i>=0;i--){const patch=patches[i];if(patch.path.length===0&&patch.op==="replace"){base=patch.value;break}}if(i>-1){patches=patches.slice(i+1)}const applyPatchesImpl=getPlugin("Patches").applyPatches_;if(isDraft(base)){return applyPatchesImpl(base,patches)}return this.produce(base,draft=>applyPatchesImpl(draft,patches))}};function createProxy(value,parent){const draft=isMap(value)?getPlugin("MapSet").proxyMap_(value,parent):isSet(value)?getPlugin("MapSet").proxySet_(value,parent):createProxyProxy(value,parent);const scope=parent?parent.scope_:getCurrentScope();scope.drafts_.push(draft);return draft}function current(value){if(!isDraft(value))die(10,value);return currentImpl(value)}function currentImpl(value){if(!isDraftable(value)||isFrozen(value))return value;const state=value[DRAFT_STATE];let copy;let strict=true;if(state){if(!state.modified_)return state.base_;state.finalized_=true;copy=shallowCopy(value,state.scope_.immer_.useStrictShallowCopy_);strict=state.scope_.immer_.shouldUseStrictIteration()}else{copy=shallowCopy(value,true)}each(copy,(key,childValue)=>{set(copy,key,currentImpl(childValue))},strict);if(state){state.finalized_=false}return copy}var immer=new Immer2;var produce=immer.produce;import{ANCHOR_CHOICES,AnchorKindSchema,DEFAULT_AGENT,DeliverInputSchema,ManualStageSubmitSchema,SHOT_LIST_PATH,ThreadIntentSchema,checkAnchorChoice,checkAnchorPayload,clampAnchorPoint,memoryProblem,pickAnchorProblem}from"@kanyun-ai-infra/band-contracts";import{LIVE_PREVIEW_POLL_MS as LIVE_PREVIEW_POLL_MS2}from"@kanyun-ai-infra/band-contracts/api";import{HandoffRejectedError,ResourceDeniedError,StorageLimitError,classifyResourceRequest,isOfficialName,pluginStorageProblem}from"@kanyun-ai-infra/band-plugin-sdk";import{ATTACHMENT_LIMITS,attachmentLimitFor,attachmentSizeProblem,formatByteSize}from"@kanyun-ai-infra/band-contracts";import{AttachmentRejectedError}from"@kanyun-ai-infra/band-plugin-sdk";import{shortName,withImeGuard}from"@kanyun-ai-infra/band-plugin-sdk";import{LIVE_PREVIEW_POLL_MS}from"@kanyun-ai-infra/band-contracts/api";import{DEFAULT_AGENT as DEFAULT_AGENT2}from"@kanyun-ai-infra/band-contracts";import{WORKSHOP_PAGE_SEGMENT,WORKSHOP_PARAM,buildRoute,checkConfig,isOfficialName as isOfficialName2,matchRoute,resolveKey,withConfigDefaults,workshopOf}from"@kanyun-ai-infra/band-plugin-sdk";function withDisplayDefaults(t){const listVersions=async artifactId=>labelled(await t.listVersions(artifactId));const listArtifacts=async()=>{const list=await t.listArtifacts();return Promise.all(list.map(a=>withLatestLabel(a,listVersions)))};return new Proxy(t,{get(target,key){if(key==="listVersions")return listVersions;if(key==="listArtifacts")return listArtifacts;return Reflect.get(target,key)}})}function labelOf(v){const label=v?.meta?.label;return typeof label==="string"?label:void 0}function labelled(versions){const number=new Map([...versions].sort((a,b)=>a.createdAt.localeCompare(b.createdAt)).map((v,i)=>[v.id,i+1]));return versions.map(v=>labelOf(v)!==void 0?v:{...v,meta:{...v.meta,label:`v${number.get(v.id)}`}})}async function withLatestLabel(a,listVersions){const latest2=a.latest;if(!latest2)return a;const same=labelOf((await listVersions(a.id)).find(v=>v.id===latest2.versionId));const label=same??latest2.label??(latest2.number!==void 0?`v${latest2.number}`:void 0);return label===void 0||label===latest2.label?a:{...a,latest:{...latest2,label}}}function notifySubscribers(listeners2,label,...args){for(const listener of[...listeners2]){try{listener(...args)}catch(error){console.error(`${label} subscriber failed:`,error)}}}function shallowEqual(a,b){return shallow$1(a,b)}function rafBatch(notify){const schedule=typeof requestAnimationFrame==="function"?fn=>{requestAnimationFrame(()=>{fn()})}:fn=>{queueMicrotask(fn)};let scheduled=false;return()=>{if(scheduled)return;scheduled=true;schedule(()=>{scheduled=false;notify()})}}function createSnapshotStore(init,opts){const withSelector=subscribeWithSelector(()=>init);const api=createStore()(withSelector);if(opts?.persist)attachPersistence(api,opts.persist.name);let subscribe=fn=>api.subscribe(()=>{notifySubscribers([fn],"[client-store]")});if(opts?.flush==="raf"){const listeners2=new Set;const flush=rafBatch(()=>{notifySubscribers(listeners2,"[client-store]")});api.subscribe(flush);subscribe=fn=>{listeners2.add(fn);return()=>{listeners2.delete(fn)}}}return{getSnapshot:()=>api.getState(),subscribe:fn=>subscribe(fn),update:mutator=>{api.setState(produce(api.getState(),draft=>{mutator(draft)}),true)},set:next=>{api.setState(devFreeze(next),true)}}}function attachPersistence(api,name){if(typeof localStorage==="undefined")return;try{const raw=localStorage.getItem(name);if(raw!==null){api.setState(devFreeze(JSON.parse(raw)),true)}}catch(error){console.error(`snapshot store '${name}' rehydration failed:`,error)}api.subscribe(state=>{try{localStorage.setItem(name,JSON.stringify(state))}catch(error){console.error(`snapshot store '${name}' persistence failed:`,error)}})}function devFreeze(value){if(true)return value;return freeze(value,true)}function defineStore(decl){return{spec:decl,create(scopeKey){const persistKey=decl.persist===void 0?void 0:scopeKey===void 0?decl.persist:`${decl.persist}.${scopeKey}`;const store=createSnapshotStore(decl.init(),persistKey!==void 0?{persist:{name:persistKey}}:void 0);const actions={};for(const key of Object.keys(decl.actions)){const mutate=decl.actions[key];actions[key]=(...params)=>{store.update(draft=>{mutate(draft,...params)})}}return{actions,getSnapshot:()=>store.getSnapshot(),subscribe:fn=>store.subscribe(fn),store,clearPersisted:()=>{if(persistKey===void 0||typeof localStorage==="undefined")return;try{localStorage.removeItem(persistKey)}catch{}}}}}}var IMAGE_COMPRESSION={longEdge:2560,qualities:[.85,.75,.65,.55,.45]};var browserImageCodec={async open(file){if(typeof createImageBitmap!=="function")return null;let bitmap;try{bitmap=await createImageBitmap(file)}catch{return null}return{async encode(longEdge,quality){const scale=Math.min(1,longEdge/Math.max(bitmap.width,bitmap.height));const w=Math.max(1,Math.round(bitmap.width*scale));const h=Math.max(1,Math.round(bitmap.height*scale));if(typeof OffscreenCanvas==="function"){const canvas2=new OffscreenCanvas(w,h);paint(canvas2.getContext("2d"),bitmap,w,h);return canvas2.convertToBlob({type:"image/jpeg",quality})}const canvas=document.createElement("canvas");canvas.width=w;canvas.height=h;paint(canvas.getContext("2d"),bitmap,w,h);return new Promise((resolve,reject)=>canvas.toBlob(b=>b?resolve(b):reject(new Error("\u56FE\u7247\u6CA1\u7F16\u7801\u51FA\u6765")),"image/jpeg",quality))},close:()=>bitmap.close()}}};function paint(ctx,bitmap,w,h){if(!ctx)throw new Error("\u6CA1\u6709 2D \u753B\u5E03");ctx.fillStyle="#fff";ctx.fillRect(0,0,w,h);ctx.drawImage(bitmap,0,0,w,h)}function compressedName(name){const dot=name.lastIndexOf(".");return`${dot>0?name.slice(0,dot):name}.jpg`}async function compressImage(file,maxBytes,codec,signal){const image=await codec.open(file);if(!image)return null;try{for(const quality of IMAGE_COMPRESSION.qualities){signal?.throwIfAborted();const out=await image.encode(IMAGE_COMPRESSION.longEdge,quality);if(out.size<=maxBytes)return out}return null}finally{image.close()}}async function prepareAttachment(file,o={}){const problem=attachmentSizeProblem({name:file.name,mime:file.type,size:file.size});if(problem===null)return file;if(file.size<=0)throw new AttachmentRejectedError(file.name,"empty",problem);const limit=attachmentLimitFor({mime:file.type});if(!limit.compress||file.size>ATTACHMENT_LIMITS.maxFileBytes){throw new AttachmentRejectedError(file.name,"too-large",limit.compress?`\u300C${file.name}\u300D\u8D85\u8FC7\u6587\u4EF6\u4E0A\u9650 ${formatByteSize(ATTACHMENT_LIMITS.maxFileBytes)}\uFF0C\u592A\u5927\u538B\u7F29\u4E0D\u4E86\uFF08\u73B0\u5728 ${formatByteSize(file.size)}\uFF09`:problem)}const out=await compressImage(file,limit.maxBytes,o.codec??browserImageCodec,o.signal);if(!out){throw new AttachmentRejectedError(file.name,"too-large",`\u300C${file.name}\u300D\u8D85\u8FC7\u56FE\u7247\u4E0A\u9650 ${formatByteSize(limit.maxBytes)}\uFF0C\u538B\u7F29\u540E\u4ECD\u653E\u4E0D\u4E0B\u6216\u8FD9\u91CC\u538B\u7F29\u4E0D\u4E86\uFF08\u73B0\u5728 ${formatByteSize(file.size)}\uFF09`)}return new File([out],compressedName(file.name),{type:"image/jpeg"})}function topLayerElement(){const all=document.querySelectorAll("[data-band-layer]");return all[all.length-1]??null}var SVG_NS="http://www.w3.org/2000/svg";function closeIcon(){const svg=document.createElementNS(SVG_NS,"svg");svg.setAttribute("viewBox","0 0 16 16");svg.setAttribute("width","16");svg.setAttribute("height","16");svg.setAttribute("aria-hidden","true");const path=document.createElementNS(SVG_NS,"path");path.setAttribute("d","M4 4l8 8M12 4l-8 8");path.setAttribute("stroke","currentColor");path.setAttribute("stroke-width","1.5");path.setAttribute("stroke-linecap","round");path.setAttribute("fill","none");svg.append(path);return svg}var titleSeq=0;function createLayerStack(o={}){let pendingConfirms=0;let open=0;let savedOverflow=null;const lockScroll=()=>{if(open===0){savedOverflow=document.documentElement.style.overflow;document.documentElement.style.overflow="hidden"}open+=1};const unlockScroll=()=>{open-=1;if(open===0){document.documentElement.style.overflow=savedOverflow??"";savedOverflow=null}};return{confirmStarted(){pendingConfirms+=1;let done=false;return()=>{if(done)return;done=true;pendingConfirms-=1}},open(source,opts,render,track){if(typeof document==="undefined")throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u80FD\u5F00\u6D6E\u5C42");if(pendingConfirms>0){throw new Error(`\u63D2\u4EF6 ${source}\uFF1A\u6709\u4E00\u4E2A\u5199\u7EBF\u4E0A\u786E\u8BA4\u5728\u7B49\uFF0C\u5904\u7406\u5B8C\u518D\u5F00\u6D6E\u5C42`)}if(typeof render!=="function")throw new Error(`\u63D2\u4EF6 ${source}\uFF1Alayers.open \u8981\u7ED9\u753B\u6CD5`);const dismissable=opts.dismissable!==false;const opener=document.activeElement;const dialog=document.createElement("dialog");dialog.className="band-layer";dialog.dataset.bandLayer="plugin";dialog.dataset.size=opts.size==="full"?"full":"sheet";dialog.dataset.source=source;const titleId=`band-layer-title-${++titleSeq}`;dialog.setAttribute("aria-labelledby",titleId);const frame=document.createElement("div");frame.className="band-layer-frame";const head=document.createElement("div");head.className="band-layer-head";const heading=document.createElement("h2");heading.className="band-layer-title";heading.id=titleId;const from=document.createElement("span");from.className="band-layer-source";from.textContent=shortName(source);heading.append(from);if(opts.title){const text=document.createElement("span");text.className="band-layer-text";text.textContent=opts.title;heading.append(text)}const closeBtn=document.createElement("button");closeBtn.type="button";closeBtn.className="band-layer-close";closeBtn.setAttribute("aria-label","\u5173\u95ED");closeBtn.title="\u5173\u95ED";closeBtn.append(closeIcon());head.append(heading,closeBtn);const body=document.createElement("div");body.className="band-layer-body";body.tabIndex=-1;frame.append(head,body);dialog.append(frame);let closed=false;let cleanup;const tracked={};const onKey=withImeGuard(e=>{if(e.key!=="Escape"||e.defaultPrevented)return;if(topLayerElement()!==dialog)return;e.preventDefault();if(dismissable)handle.close()});const handle={get closed(){return closed},close(){if(closed)return;closed=true;window.removeEventListener("keydown",onKey);if(cleanup){try{cleanup()}catch(error){console.error(`[band-kernel layers] ${source} \u7684\u6D6E\u5C42\u6E05\u7406\u51FA\u9519`,error)}}if(dialog.open&&typeof dialog.close==="function")dialog.close();dialog.remove();unlockScroll();if(opener instanceof HTMLElement&&opener.isConnected)opener.focus();tracked.release?.()}};dialog.addEventListener("cancel",e=>e.preventDefault());dialog.addEventListener("close",()=>handle.close());closeBtn.addEventListener("click",()=>handle.close());let downOnBackdrop=false;dialog.addEventListener("mousedown",e=>{downOnBackdrop=e.target===dialog});dialog.addEventListener("click",e=>{if(dismissable&&downOnBackdrop&&e.target===dialog)handle.close();downOnBackdrop=false});o.onOpen?.();document.body.append(dialog);lockScroll();if(typeof dialog.showModal==="function")dialog.showModal();else dialog.setAttribute("open","");window.addEventListener("keydown",onKey);tracked.release=track(()=>handle.close());if(closed)return handle;try{const ret=render(body);if(typeof ret==="function"){if(closed)ret();else cleanup=ret}}catch(error){handle.close();throw error}if(!closed&&!body.contains(document.activeElement))body.focus();return handle}}}var defaultTimers={setTimeout:(fn,ms)=>globalThis.setTimeout(fn,ms),clearTimeout:h=>globalThis.clearTimeout(h)};function createLiveController(fetch,opts={}){const timers=opts.timers??defaultTimers;let url=null;let status="starting";let everReady=false;let timer=null;let alive=true;let started=false;const listeners2=new Set;const set2=(nextUrl,next)=>{if(nextUrl===url&&next===status)return;url=nextUrl;status=next;for(const fn of[...listeners2])fn()};const apply=p=>{if(p===null){everReady=false;return set2(null,"stopped")}if(p.url===null){everReady=false;return set2(null,"starting")}if(p.url!==url)everReady=false;if(p.ready){everReady=true;return set2(p.url,"ready")}set2(p.url,everReady?"error":"starting")};const schedule=()=>{if(!alive)return;const ms=status==="ready"||status==="stopped"?LIVE_PREVIEW_POLL_MS.embedded:LIVE_PREVIEW_POLL_MS.starting;timer=timers.setTimeout(tick,ms)};async function tick(){timer=null;try{const p=await fetch();if(!alive)return;apply(p)}catch{if(!alive)return;timer=timers.setTimeout(tick,LIVE_PREVIEW_POLL_MS.starting);return}schedule()}if(opts.initial!==void 0)apply(opts.initial);const start=()=>{if(started||!alive)return;started=true;void tick()};return{url:()=>{start();return url},status:()=>{start();return status},subscribe(fn){start();listeners2.add(fn);return()=>listeners2.delete(fn)},dispose(){alive=false;listeners2.clear();if(timer!==null)timers.clearTimeout(timer);timer=null}}}var ANCHOR_RESOLVE_TIMEOUT_MS=5e3;var BARE_HOST_GRACE_MS=300;var EDIT_FLUSH_TIMEOUT_MS=1e4;var EditFlushError=class extends Error{constructor(reason){super(reason==="timeout"?"\u76F4\u63A5\u7F16\u8F91\u7684\u5199\u56DE 10 \u79D2\u5185\u6CA1\u5B8C\u6210\uFF0C\u5148\u4E0D\u53D1\u4FEE\u6539\u8BF7\u6C42":"\u76F4\u63A5\u7F16\u8F91\u7684\u5199\u56DE\u5931\u8D25\u4E86\uFF0C\u5148\u4E0D\u53D1\u4FEE\u6539\u8BF7\u6C42");this.reason=reason;this.name="EditFlushError"}reason};var HANDOFF_POLL_MS=1e3;var BUILTIN_ANCHORS=new Set(AnchorKindSchema.options);var LATE_BUILTIN_ANCHORS=new Set(["shot"]);var POINT_CLAMP_WARN=.05;function checkedCandidates(plugin,raw){if(!raw)return null;const anchors={};for(const choice of ANCHOR_CHOICES){const anchor=raw.anchors[choice];if(!anchor)continue;const problem=checkAnchorChoice(choice,anchor);if(problem)console.warn(`[band] ${plugin}\uFF1A\u951A\u70B9\u5019\u9009 ${problem}\uFF0C\u5DF2\u4E22\u6389`);else anchors[choice]=anchor}const preferred=raw.preferred!=="shot"&&anchors[raw.preferred]?raw.preferred:"moment";return anchors[preferred]?{anchors,preferred}:null}var ANCHOR_ID=/^[a-z][a-z0-9-]*$/;function canReadThreadsOf(access,given){return(access??"member")==="member"||given===true}function createProjectServices(opts){const{member}=opts;const transport=withDisplayDefaults(opts.transport);const canReadThreads=canReadThreadsOf(opts.access,opts.canReadThreads);const agent=opts.agent??DEFAULT_AGENT;const newId=opts.newId??(()=>`anc_${Math.random().toString(36).slice(2,12)}`);const anchorTypes=new Map;const handlers=new Map;const eventListeners=new Set;let hosts=[];const hostListeners=new Set;let annotating=false;const annotatingListeners=new Set;let annotatingBy=null;const setAnnotating=on=>{if(!on)annotatingBy=null;if(annotating===on)return;annotating=on;notifySubscribers(annotatingListeners,"[band-kernel annotating]",on)};const addHost=entry=>{hosts=[...hosts,entry];notifySubscribers(hostListeners,"[band-kernel anchors]")};const dropHost=entry=>{if(!hosts.includes(entry))return false;hosts=hosts.filter(h=>h!==entry);notifySubscribers(hostListeners,"[band-kernel anchors]");return true};const layerStack=createLayerStack({onOpen:()=>setAnnotating(false)});let unsubscribeTransport;const inFlight=new Set;const flushTimeout=opts.editFlushTimeoutMs??EDIT_FLUSH_TIMEOUT_MS;const anchorTimeout=opts.anchorResolveTimeoutMs??ANCHOR_RESOLVE_TIMEOUT_MS;function trackEdit(p){inFlight.add(p);const done=()=>inFlight.delete(p);p.then(done,done);return p}async function flushEdits(){if(inFlight.size===0)return;let timer;const timeout=new Promise(resolve=>{timer=setTimeout(()=>resolve("timeout"),flushTimeout)});const settled=Promise.allSettled([...inFlight]).then(rs=>rs.some(r=>r.status==="rejected"||isFailedResult(r.value))?"failed":"ok");const outcome=await Promise.race([settled,timeout]);clearTimeout(timer);if(outcome!=="ok")throw new EditFlushError(outcome)}function addEventListener(fn){eventListeners.add(fn);if(!unsubscribeTransport){unsubscribeTransport=transport.subscribe(e=>{notifySubscribers(eventListeners,"[band-kernel events]",e)})}return()=>{eventListeners.delete(fn);if(eventListeners.size===0&&unsubscribeTransport){unsubscribeTransport();unsubscribeTransport=void 0}}}function request(r){const h=handlers.get(r.type);if(!h)throw new Error(`\u6CA1\u6709\u9501\u5B9A\u63D2\u4EF6\u8BA4\u9886 ${r.type} \u8BF7\u6C42\uFF08\u9875\u9762\u4E0A\u7F3A\u8BC4\u8BBA\u6846\u6216\u6279\u51C6\u9762\u677F\uFF09`);h.fn(r)}const focuses=new Set;function createFocus(){const currentVersion2=createSnapshotStore({v:null});let following=null;let stopFollowing;function publish(f){const v=f.shown&&f.shown.artifactId===f.artifactId?f.shown:f.latest;if(v?.id===currentVersion2.getSnapshot().v?.id)return;currentVersion2.set({v:v===null?null:structuredClone(v)})}function showVersion(f,v){if(v&&v.artifactId!==f.artifactId)focusOn(f,v.artifactId);f.shown=v;publish(f)}function focusOn(f,artifactId){if(f.artifactId===artifactId)return;f.artifactId=artifactId;f.shown=null;void loadLatest(f)}async function loadLatest(f){const id=f.artifactId;const n=++f.seq;if(id===null)return;let list;try{list=await transport.listVersions(id)}catch{return}if(n!==f.seq||following!==f)return;const previous=f.latest?.artifactId===id?f.latest:null;f.latest=list.at(-1)??null;if(f.shown&&(f.shown.id===previous?.id||f.shown.id===f.latest?.id))f.shown=null;publish(f)}const self={currentVersion:currentVersion2,setCurrentVersion(v){if(following){showVersion(following,v);return}currentVersion2.set({v:v===null?null:structuredClone(v)})},follow(artifactId){if(following)return;const f={artifactId:null,shown:null,latest:null,seq:0};following=f;const pickInitial=()=>opts.transport.listArtifacts().then(list=>{const deliverables=list.filter(a=>!a.unused&&a.role!=="process");const candidates=deliverables.length>0?deliverables:list;const first=candidates.reduce((best,a)=>!best||a.latest&&(!best.latest||Date.parse(a.latest.at)>Date.parse(best.latest.at))?a:best,void 0);if(following===f&&f.artifactId===null&&first)focusOn(f,first.id)},()=>{});stopFollowing=addEventListener(e=>{if(!e.type.startsWith("version."))return;if(f.artifactId===null)void pickInitial();else void loadLatest(f)});if(artifactId!==void 0)focusOn(f,artifactId);else void pickInitial()},focus(artifactId){if(following)focusOn(following,artifactId)},dispose(){following=null;stopFollowing?.();stopFollowing=void 0;focuses.delete(self)}};focuses.add(self);return self}const projectFocus=createFocus();const currentVersion=projectFocus.currentVersion;const setCurrentVersion=v=>projectFocus.setCurrentVersion(v);let lastPreview=null;function liveFor(track){const preview=transport.preview?.bind(transport);if(!preview)return void 0;const recent=lastPreview&&Date.now()-lastPreview.at<LIVE_PREVIEW_POLL_MS2.embedded?{initial:lastPreview.value}:{};const live=createLiveController(async()=>{const value=await preview();lastPreview={at:Date.now(),value};return value},recent);track(()=>live.dispose());return{url:live.url,status:live.status,subscribe:live.subscribe}}function bareHost(name,o,track){const{mount,version}=o;if(!mount||!version)return{own:()=>{}};let owned=0;let ended=false;let entry=null;let timer;const schedule=()=>{clearTimeout(timer);timer=setTimeout(()=>{if(ended||owned>0||entry)return;entry={plugin:name,mount,version,kinds:Object.freeze([]),locate:()=>({at:"none"}),reveal:async()=>false,onLayout:()=>()=>{}};addHost(entry)},BARE_HOST_GRACE_MS)};schedule();track(()=>{ended=true;clearTimeout(timer);if(entry)dropHost(entry)});return{own(delta){owned+=delta;if(owned>0&&entry){dropHost(entry);entry=null}else if(owned===0&&!ended){schedule()}}}}async function resolveAnchor(anchor,version){if(BUILTIN_ANCHORS.has(anchor.kind))return anchor.payload;const t=anchorTypes.get(anchor.kind);if(!t)return void 0;let timer;const timeout=new Promise(done=>{timer=setTimeout(()=>done(null),anchorTimeout)});try{const resolved=Promise.resolve(t.impl.resolve(anchor.payload,version,path=>transport.readFile(version.id,path)));return await Promise.race([resolved,timeout])}catch{return null}finally{clearTimeout(timer)}}function notifyFor(via){const n=()=>{if(!transport.notify)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u901A\u77E5\u51FA\u53E3");return transport.notify};const call=fn=>Promise.resolve().then(fn);return{list:()=>call(()=>n().list()),add:(type,config)=>call(()=>n().add(via,type,config)),remove:channelId=>call(()=>n().remove(via,channelId)),get:()=>call(()=>n().get()),set:webhook=>call(()=>n().set(via,webhook))}}function storageFor(via){const t=()=>{if(!transport.storage)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u63D2\u4EF6\u5B58\u50A8");return transport.storage};const call=fn=>Promise.resolve().then(fn);const checkKey=key=>{const problem=pluginStorageProblem(key,null);if(problem)throw new StorageLimitError(key,problem.limit,problem.message)};return{get:key=>call(async()=>{checkKey(key);return(await t().get(via,key))?.value}),set:(key,value)=>call(()=>{const problem=pluginStorageProblem(key,value);if(problem)throw new StorageLimitError(key,problem.limit,problem.message);return t().set(via,key,JSON.parse(JSON.stringify(value)))}),remove:key=>call(()=>{checkKey(key);return t().remove(via,key)}),list:()=>call(()=>t().list(via))}}function memoryFor(via){const m=()=>{if(!transport.memory)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9879\u76EE\u8BB0\u5FC6");return transport.memory};const call=fn=>Promise.resolve().then(fn);return{current:()=>call(()=>m().current()),versions:()=>call(()=>m().versions()),version:v=>call(()=>m().version(v)),save:input=>call(async()=>{const t=m();const files=[...input.files??[]];const removed=[...input.removed??[]];const problem=memoryProblem(files);if(problem)return{ok:false,code:"INVALID",message:problem};return t.save(via,{baseVersion:input.baseVersion,files,removed})}),revert:v=>call(()=>m().revert(via,v)),restore:v=>call(()=>m().restore(via,v))}}function handoffApi(via,decl,track){const t=()=>{if(!decl?.read&&!decl?.write)throw new HandoffRejectedError("NOT_DECLARED",`${via} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E agent`);if(!transport.handoffs)throw new HandoffRejectedError("NOT_DECLARED","\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u4EA4\u7ED9 agent");return transport.handoffs};const call=fn=>{try{return fn()}catch(e){return Promise.reject(e)}};return{handoff:request2=>call(()=>{const kind=request2.write===true?"write":"read";if(!decl?.[kind])throw new HandoffRejectedError("NOT_DECLARED",`${via} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E agent.${kind}`);return t().create(via,request2)}),get:id=>call(()=>t().get(id)),events:(id,opts2)=>call(()=>t().events(id,opts2?.after??0)),cancel:id=>call(()=>t().cancel(via,id)),conversations:{list:(filter={})=>call(()=>t().conversations(filter)),get:id=>call(()=>t().conversation(id))},subscribe(id,fn,opts2={}){let stopped=false;let after=opts2.after??0;let timer;const tick=async()=>{timer=void 0;if(stopped)return;try{const page=await t().events(id,after);if(stopped)return;if("cursorReset"in page){opts2.onReset?.(page.snapshot);after=page.snapshot.seq}for(const e of page.events){if(e.seq<=after)continue;after=e.seq;fn(e);if(e.type==="end")stopped=true}if("cursorReset"in page&&page.snapshot.end!==void 0)stopped=true}catch(e){opts2.onError?.(e);if(e instanceof HandoffRejectedError&&e.reason!=="RATE_LIMITED")stopped=true}if(!stopped)timer=setTimeout(tick,HANDOFF_POLL_MS)};void tick();return track(()=>{stopped=true;if(timer!==void 0)clearTimeout(timer)})}}}function api(caller,o){const{name}=caller;const via=caller.via??name;const{track}=o;const pinned=o.version;const focus=o.focus??projectFocus;const version=()=>pinned??focus.currentVersion.getSnapshot().v;const versionOrThrow=()=>{const v=version();if(!v)throw new Error(`\u63D2\u4EF6 ${name}\uFF1A\u5F53\u524D\u6CA1\u6709\u7248\u672C`);return v};const ownKind=kind=>`plugin:${name}/${kind}`;const fullKind=kind=>{if(kind.startsWith("plugin:"))return kind;if(LATE_BUILTIN_ANCHORS.has(kind)&&anchorTypes.get(ownKind(kind))?.plugin===name){return ownKind(kind)}return BUILTIN_ANCHORS.has(kind)?kind:ownKind(kind)};const resourceManifest=caller.resources?{resources:caller.resources}:{};const annotatingToken={};let annotatingTracked=false;const bare=bareHost(name,o,track);const hasMaterialVersions=transport.materialVersions!==void 0;const hasReplaceMaterial=transport.replaceMaterial!==void 0;const ctx={version:{current:version,subscribe:fn=>pinned?()=>{}:track(focus.currentVersion.subscribe(()=>fn(focus.currentVersion.getSnapshot().v))),list:artifactId=>transport.listVersions(artifactId),readFile:(path,at)=>transport.readFile(at?.versionId??versionOrThrow().id,path),objectUrl:(path,at)=>transport.objectUrl(at?.versionId??versionOrThrow().id,path)},anchors:{register(kind,impl){if(!ANCHOR_ID.test(kind)){throw new Error(`\u951A\u70B9\u7C7B\u578B ${kind} \u53EA\u80FD\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26`)}if(!caller.anchors.includes(kind)){throw new Error(`\u63D2\u4EF6 ${name} \u7684\u6E05\u5355\u6CA1\u6709\u58F0\u660E\u951A\u70B9\u7C7B\u578B ${kind}`)}const full=LATE_BUILTIN_ANCHORS.has(kind)?ownKind(kind):fullKind(kind);if(anchorTypes.has(full))throw new Error(`\u951A\u70B9\u7C7B\u578B ${full} \u5DF2\u6CE8\u518C`);const entry={plugin:name,impl};anchorTypes.set(full,entry);track(()=>{if(anchorTypes.get(full)===entry)anchorTypes.delete(full)});return full},make(kind,payload,snapshot){const full=fullKind(kind);if(full==="project")throw new Error("\u9879\u76EE\u7EA7\u951A\u70B9\uFF08kind: project\uFF09\u4E0D\u7531\u63D2\u4EF6\u9020");if(!BUILTIN_ANCHORS.has(full)&&!anchorTypes.has(full)){throw new Error(`\u951A\u70B9\u7C7B\u578B ${full} \u6CA1\u6709\u6CE8\u518C`)}const current2=versionOrThrow();const stored=BUILTIN_ANCHORS.has(full)?clampAnchorPoint(full,payload):payload;if(stored!==payload){const point=payload.point;for(const axis of["x","y"]){const from=point?.[axis];if(typeof from!=="number"||!Number.isFinite(from))continue;if(from>=-POINT_CLAMP_WARN&&from<=1+POINT_CLAMP_WARN)continue;console.warn(`[band] ${name}\uFF1A\u843D\u70B9\u7684${axis==="x"?"\u6A2A\u5411":"\u7EB5\u5411"}\u4F4D\u7F6E\u660E\u663E\u8D85\u51FA 0\u20131\uFF0C\u5DF2\u5939\u5230\u8303\u56F4\u5185`)}}if(full==="shot"){const problem=checkAnchorPayload("shot",stored);if(problem)throw new Error(problem);if(!current2.entries.some(e=>e.path===SHOT_LIST_PATH)){throw new Error(`\u8FD9\u4E00\u7248\u6CA1\u6709\u955C\u5934\u8868 ${SHOT_LIST_PATH}\uFF0C\u9020\u4E0D\u4E86 shot \u951A\u70B9`)}}else if(BUILTIN_ANCHORS.has(full)){const problem=checkAnchorPayload(full,stored);if(problem)console.warn(`[band] ${name}\uFF1A${problem}\uFF08\u4EE5\u540E\u7684\u534F\u8BAE\u5927\u7248\u672C\u4F1A\u6539\u6210\u62A5\u9519\uFF09`)}const versionId=current2.id;return{id:newId(),versionId,kind:full,payload:stored,...snapshot!==void 0?{snapshot}:{}}},host(impl){const mount=o.mount;if(!mount)throw new Error(`\u63D2\u4EF6 ${name}\uFF1Aanchors.host \u53EA\u80FD\u5728\u6302\u8F7D\u9762\u91CC\u8C03`);const entry={plugin:name,mount,version:version(),kinds:Object.freeze(impl.kinds.map(fullKind)),locate:a=>impl.locate(a),reveal:a=>impl.reveal(a),onLayout:fn=>impl.onLayout(fn),...impl.annotate?{annotate:true}:{},...impl.thumbnail?{thumbnail:a=>impl.thumbnail?.(a)??Promise.resolve(null)}:{},...impl.candidates?{candidates:()=>checkedCandidates(name,impl.candidates?.()??null)}:{}};bare.own(1);addHost(entry);return track(()=>{if(dropHost(entry))bare.own(-1)})},annotating:{get:()=>annotating,set(on){if(on&&!annotatingTracked){annotatingTracked=true;const token=annotatingToken;track(()=>{if(annotatingBy===token)setAnnotating(false)})}if(on)annotatingBy=annotatingToken;setAnnotating(on)},subscribe:fn=>{annotatingListeners.add(fn);return track(()=>annotatingListeners.delete(fn))}}},threads:{list:filter=>transport.listThreads(filter??{}),comments:threadId=>transport.listComments(threadId),commentsOf:async threadIds=>{const ids=[...new Set(threadIds)];const lists=await Promise.all(ids.map(id=>transport.listComments(id)));return Object.fromEntries(ids.map((id,i)=>[id,lists[i]??[]]))},open:threadId=>request({type:"thread.open",from:via,threadId}),quote:(threadId,commentId)=>request({type:"thread.quote",from:via,threadId,commentId}),quoteAnchor:anchor=>request({type:"anchor.quote",from:via,anchor}),undoPick:threadId=>request({type:"pick.undo",from:via,threadId}),openAt:(anchor,a)=>{if(a?.intent!==void 0&&!ThreadIntentSchema.safeParse(a.intent).success){throw new Error(`threads.openAt \u7684 intent \u53EA\u80FD\u662F ${ThreadIntentSchema.options.join(" / ")}`)}if(a?.intent==="pick"){const problem=pickAnchorProblem(anchor);if(problem)throw new Error(`threads.openAt\uFF1A${problem}`)}request({type:"thread.openAt",from:via,anchor,...a})}},gate:{state:stage=>transport.gateState(stage),open:(stage,key)=>request({type:"gate.open",from:via,stage,...key!==void 0?{key}:{}})},propose:{async changeRequest(ids){await flushEdits();return transport.changeRequest(via,ids)},humanVersion:patch=>trackEdit(transport.humanVersion(via,patch)),async deliver(input,o2={}){const{putObject,deliver}=transport;if(!putObject||!deliver)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u4EA7\u7269\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4EA4\u4ED8");const checked=DeliverInputSchema.safeParse({artifactId:input.artifactId,baseVersion:input.baseVersion,files:input.files.map(f=>({path:f.path,objectId:"0".repeat(64)}))});if(!checked.success){throw new Error(checked.error.issues.map(i=>i.message).join("\uFF1B"))}const total=input.files.reduce((n,f)=>n+f.data.size,0);let done=0;const files=[];for(const f of input.files){const obj=await putObject.call(transport,via,f.data,{...o2.signal?{signal:o2.signal}:{},onProgress:p=>o2.onProgress?.(total===0?1:(done+p*f.data.size)/total)});done+=f.data.size;files.push({path:f.path,objectId:obj.objectId})}o2.signal?.throwIfAborted();return deliver.call(transport,via,{artifactId:input.artifactId,baseVersion:input.baseVersion,files})}},stages:{list:()=>transport.listStages(),get:stage=>transport.stage(stage),start:(stage,params)=>member.permissions.includes("submit-change")?transport.startStage(via,stage,params??{}):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u5F00\u5DE5\u9636\u6BB5 ${stage}`)),rerun:(stage,versionId)=>member.permissions.includes("submit-change")?transport.rerunStage(via,stage,versionId):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u91CD\u8DD1\u9636\u6BB5 ${stage}`)),rerunWith:(stage,message)=>member.permissions.includes("submit-change")?transport.rerunStageWith(via,stage,message):Promise.reject(new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u91CD\u8DD1\u9636\u6BB5 ${stage}`)),async repair(stage,artifacts,o2={}){if(!member.permissions.includes("submit-change"))throw new Error(`\u6CA1\u6709 submit-change \u6743\u9650\uFF0C\u4E0D\u80FD\u624B\u52A8\u4EA4\u9636\u6BB5 ${stage} \u7684\u7B2C\u4E00\u7248`);const{putObject,repairStage}=transport;if(!putObject||!repairStage)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u4EA7\u7269\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4EA4\u4ED8");const checked=ManualStageSubmitSchema.safeParse({artifacts:artifacts.map(a=>({type:a.type,...a.key!==void 0?{key:a.key}:{},files:a.files.map(f=>({path:f.path,objectId:"0".repeat(64)}))}))});if(!checked.success){throw new Error(checked.error.issues.map(i=>i.message).join("\uFF1B"))}const all=artifacts.flatMap(a=>a.files);const total=all.reduce((n,f)=>n+f.data.size,0);let done=0;const uploaded=[];for(const a of artifacts){const files=[];for(const f of a.files){const obj=await putObject.call(transport,via,f.data,{...o2.signal?{signal:o2.signal}:{},onProgress:p=>o2.onProgress?.(total===0?1:(done+p*f.data.size)/total)});done+=f.data.size;files.push({path:f.path,objectId:obj.objectId})}uploaded.push({type:a.type,...a.key!==void 0?{key:a.key}:{},files})}o2.signal?.throwIfAborted();await repairStage.call(transport,via,stage,uploaded)}},members:{list:()=>transport.listMembers(),usage:()=>transport.projectUsage()},artifacts:{list:()=>transport.listArtifacts()},activity:{list:a=>transport.listActivity(a?.limit??50)},turns:{state:()=>transport.turnState()},params:opts.params??{},attachments:{...transport.importExternal?{importExternal:transport.importExternal.bind(transport,via)}:{},get available(){return transport.uploadAttachment!==void 0},async upload(file,o2={}){const ready=await prepareAttachment(file,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o2.signal?{signal:o2.signal}:{}});if(!transport.uploadAttachment)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8\uFF0C\u4E0D\u80FD\u4E0A\u4F20\u6587\u4EF6");return transport.uploadAttachment(via,ready,o2)},url(id,o2={}){if(!transport.attachmentUrl){return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8"))}return transport.attachmentUrl(id,o2)},list:(o2={})=>!canReadThreads?Promise.reject(new Error("\u6CA1\u6709\u8BFB\u610F\u89C1\u7684\u6743\u9650\uFF0C\u770B\u4E0D\u5230\u9644\u4EF6")):transport.listAttachments?.(o2)??Promise.resolve([]),remove(id){if(!transport.deleteAttachment){return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u9644\u4EF6\u5B58\u50A8\uFF0C\u4E0D\u80FD\u5220\u9664\u6587\u4EF6"))}return transport.deleteAttachment(via,id)},...hasMaterialVersions?{versions:artifactId=>{const impl=transport.materialVersions;if(!impl)return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u7D20\u6750\u7248\u672C"));return impl.call(transport,artifactId)}}:{},...hasReplaceMaterial?{replace:async(artifactId,source,o2)=>{const ready="sha256"in source?source:await prepareAttachment(source,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o2.signal?{signal:o2.signal}:{}});const impl=transport.replaceMaterial;if(!impl)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u7D20\u6750\u7248\u672C\uFF0C\u4E0D\u80FD\u66FF\u6362\u6587\u4EF6");return impl.call(transport,via,artifactId,ready,o2)}}:{}},storage:storageFor(via),agent:{capabilities:()=>transport.capabilities?.()??Promise.resolve([]),connectors:()=>transport.connectors?.()??Promise.resolve([]),...handoffApi(via,caller.agent,track)},resources:{async fetch(key,path,init){const method=(init?.method??"GET").toUpperCase();const level=classifyResourceRequest(resourceManifest,key,method,path);if(level==="deny")throw new ResourceDeniedError(key,method,path,"undeclared");if(level==="prod"){const ok=await new Promise(answer=>{const h=handlers.get("resource.confirm");if(!h)return answer(false);let answered=false;const settled=layerStack.confirmStarted();try{h.fn({type:"resource.confirm",from:via,key,method,path,answer(yes){if(answered)return;answered=true;settled();answer(yes)}})}catch(error){settled();throw error}});if(!ok)throw new ResourceDeniedError(key,method,path,"not-confirmed")}return transport.proxy({via,key,api:caller.resources?.[key]?.api??"",method,path,body:init?.body,level,confirmed:level==="prod"})}},events:{subscribe(type,fn){return track(addEventListener(e=>{if(matchEvent(type,e.type))fn(e)}))}},member:{id:member.id,displayName:member.displayName,roles:[...member.roles],can:permission=>member.permissions.includes(permission)},tokens:opts.tokens??{}};if(o.live){const live=liveFor(track);if(live)ctx.live=live}ctx.threads.react=(commentId,emoji,on)=>{if(!transport.react)return Promise.reject(new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u8868\u60C5\u56DE\u5E94"));return transport.react(via,commentId,emoji,on)};ctx.memory=memoryFor(via);ctx.layers={open:(layerOpts,render)=>layerStack.open(via,layerOpts,render,track)};if(isOfficialName(via)){ctx.notify=notifyFor(via);ctx.turns.requestStop=changeRequestId=>new Promise((resolve,reject)=>{let settled=false;request({type:"turn.stop",from:via,changeRequestId,done(error){if(settled)return;settled=true;if(error===void 0)resolve();else reject(new Error(error))}})});const members=()=>{if(!transport.memberSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u7BA1\u7406\u9879\u76EE\u6210\u5458");return transport.memberSettings};ctx.memberSettings={get:async()=>members().get(),set:async input=>members().set(via,input),remove:async userId=>members().remove(via,userId),searchUsers:async q=>members().searchUsers(q)};ctx.approvalSettings={async get(){if(!transport.approvalSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u81EA\u6279\u8BBE\u7F6E");return transport.approvalSettings.get()},async set(roles){if(!transport.approvalSettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u81EA\u6279\u8BBE\u7F6E");return transport.approvalSettings.set(via,roles)}};const archiveUrl=transport.archiveUrl;if(archiveUrl)ctx.version.archiveUrl=versionId=>archiveUrl(versionId);const shares=transport.artifactShares;if(shares){ctx.artifactShares=Object.freeze({list:artifactId=>shares.list(artifactId),create:(artifactId,input)=>shares.create(via,artifactId,input),revoke:(artifactId,shareId)=>shares.revoke(via,artifactId,shareId)})}ctx.visibilitySettings=Object.freeze({async get(){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.get()},async set(input){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.set(via,input)},async searchUsers(q){if(!transport.visibilitySettings)throw new Error("\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u652F\u6301\u9879\u76EE\u53EF\u89C1\u8303\u56F4\u8BBE\u7F6E");return transport.visibilitySettings.searchUsers(q)}})}const materialDiscussions=transport.materialDiscussions;if(materialDiscussions&&canReadThreads){ctx.materialDiscussions={available:async()=>handlers.has("material.discussions.open")&&await materialDiscussions.available(),read:version2=>materialDiscussions.read(version2),async open(version2){if(!handlers.has("material.discussions.open")||!await materialDiscussions.available())throw new Error("\u5F53\u524D\u8BC4\u8BBA\u7EC4\u4EF6\u6216\u670D\u52A1\u4E0D\u652F\u6301\u7D20\u6750\u610F\u89C1");request({type:"material.discussions.open",from:via,version:version2})}}}if(!caller.locked)return ctx;const collab={...materialDiscussions&&caller.materialDiscussionWriter?{materialDiscussions:{create:(version2,input)=>materialDiscussions.create(via,version2,input),comment:(threadId,body)=>materialDiscussions.comment(via,threadId,body),close:threadId=>materialDiscussions.close(via,threadId),reopen:threadId=>materialDiscussions.reopen(via,threadId)}}:{},async createThread(input){if(input.handToAgent)await flushEdits();return transport.createThread(via,input)},async createProjectThread(input){if(input.handToAgent)await flushEdits();return transport.createProjectThread(via,input)},undoPick:id=>transport.undoPick(via,id),settlePick:id=>transport.settlePick(via,id),comment:(id,body,extras)=>{const[ex,mentions]=splitMentions(extras);return transport.comment(via,id,body,ex,mentions)},confirm:id=>transport.confirm(via,id),reject:(id,body,extras)=>{const[ex,mentions]=splitMentions(extras);return transport.reject(via,id,body,ex,mentions)},withdraw:id=>transport.withdraw(via,id),stopTurn:id=>transport.stopTurn(via,id),close:id=>transport.close(via,id),reopen:id=>transport.reopen(via,id),approve:(stage,input)=>transport.approve(via,stage,input),revoke:(stage,input)=>transport.revoke(via,stage,input?.key),showVersion:v=>focus.setCurrentVersion(v),anchors:{hosts:()=>hosts,subscribe:fn=>{hostListeners.add(fn);return track(()=>hostListeners.delete(fn))},resolve:(anchor,v)=>resolveAnchor(anchor,v)},requests:{handle(type,fn){if(type==="material.discussions.open"&&!caller.materialDiscussionWriter)throw new Error("\u53EA\u6709\u58F0\u660E\u7D20\u6750\u80FD\u529B\u7684\u9501\u5B9A\u8BC4\u8BBA\u63D2\u4EF6\u80FD\u8BA4\u9886\u7D20\u6750\u610F\u89C1");const held=handlers.get(type);if(held)throw new Error(`${type} \u8BF7\u6C42\u5DF2\u7531\u9501\u5B9A\u63D2\u4EF6 ${held.plugin} \u8BA4\u9886`);const entry={plugin:via,fn};handlers.set(type,entry);return track(()=>{if(handlers.get(type)===entry)handlers.delete(type)})}}};return{...ctx,collab}}return{api,access:opts.access??"member",canReadThreads,agent,...opts.info?{info:opts.info}:{},...opts.shared?{shared:opts.shared}:{},...opts.notices?{notices:opts.notices}:{},...opts.upgrade?{upgrade:opts.upgrade}:{},...opts.deleted?{deleted:opts.deleted}:{},...opts.remove?{remove:opts.remove}:{},status:async()=>await transport.projectStatus?.()??"active",currentVersion,setCurrentVersion,follow:()=>projectFocus.follow(),focus:artifactId=>projectFocus.focus(artifactId),openFocus(initial={}){const f=createFocus();f.follow(initial.version?.artifactId??initial.artifactId);if(initial.version)f.setCurrentVersion(initial.version);return f},request,resolveAnchor,dispose(){for(const f of[...focuses])f.dispose();unsubscribeTransport?.();unsubscribeTransport=void 0;eventListeners.clear()}}}function isFailedResult(v){return typeof v==="object"&&v!==null&&"ok"in v&&v.ok===false}function splitMentions(extras){if(!extras)return[void 0,void 0];const{mentions,...rest}=extras;return[rest,mentions?.length?mentions:void 0]}function matchEvent(pattern,type){if(pattern==="*")return true;if(pattern.endsWith(".*"))return type.startsWith(pattern.slice(0,-1));return pattern===type}var listeners=new Set;var failures=new WeakMap;function markDiagnosticFailure(error,failure){if(error!==null&&(typeof error==="object"||typeof error==="function")){failures.set(error,failure)}}function diagnosticFailure(error){return error!==null&&(typeof error==="object"||typeof error==="function")?failures.get(error):void 0}function subscribeRuntimeDiagnostics(listener){listeners.add(listener);return()=>{listeners.delete(listener)}}var PEER_RANGE=/要求 \S+@(.+?),装配里是 (\S+)$/;var RANGE_CHARS=/^[0-9xX.^~<>=|* -]{1,48}$/;var VERSION_CHARS=/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.]{1,24})?$/;function peerRangeFacts(message){const m=message?PEER_RANGE.exec(message):null;const requires=m?.[1];const installed=m?.[2];return requires&&installed&&RANGE_CHARS.test(requires)&&VERSION_CHARS.test(installed)?{requires,installed}:void 0}function publishRuntimeDiagnostic(diagnostic,failure){const hash=diagnostic.set?.match(/@([a-f0-9]{64})$/)?.[1];const peer=peerRangeFacts(diagnostic.message);const code=failure?.code??(peer?"peer-range":void 0);const event={pluginId:diagnostic.plugin??"kernel",...hash?{snapshotHash:hash}:{},failureCategory:failure?.failureCategory??(diagnostic.phase==="assembly"?"validation":diagnostic.phase==="load"?"load":"exception"),durationMs:Math.max(0,Math.min(36e5,Math.round(failure?.durationMs??0))),...code?{code}:{},...peer??{}};for(const listener of listeners){try{listener(event)}catch{}}}var INITIALIZING=Symbol("initializing");var RuntimeError=class extends Error{constructor(message){super(message);this.name="RuntimeError"}};var DEFAULT_LOAD_TIMEOUT_MS=3e4;function createRuntime(opts){const{assembly}=opts;const diagnostics=[];for(const view of[assembly.global,...Object.values(assembly.workshops)]){for(const[plugin,message]of Object.entries(view.failed)){if(view!==assembly.global&&assembly.global.failed[plugin]===message)continue;diagnostics.push({plugin,set:view.id,phase:"assembly",message});publishRuntimeDiagnostic({plugin,set:view.id,phase:"assembly",message})}}const diagListeners=new Set;const routeListeners=new Set;const slotListeners=new Map;const moduleFailed=new Map;const invalidModules=new Set;const reported=new Set;const modules=new Map;const settled=new Set;const projects=new Map;const workshopSets=new Map;let route={page:null,params:{},path:"/"};const currentSets=new Map;const pageMounts=new Set;const resolving=new Map;let docWorkshop;let disposed=false;const member=Object.freeze({...opts.member??{id:"anonymous",displayName:"\u533F\u540D",title:""}});const data=opts.data??emptyData();const app={cancellation:new AbortController,kind:"app",view:assembly.global,services:new Map,failed:new Map,disposers:[],refs:1,selection:{value:null,listeners:new Set},states:new Map,closed:false,ready:Promise.resolve(),views:new Set,mounts:new Set};function diagnose(d,set2,failure2){diagnostics.push(d);publishRuntimeDiagnostic({...d,set:set2??d.set},failure2);for(const fn of[...diagListeners])fn()}function guardSubscriber(p,fn){return(...args)=>{try{fn(...args)}catch(e){const message=errorMessage(e);const once=`subscriber|${p.name}|${message.replace(/\d+/g,"#").slice(0,200)}`;if(reported.has(once))return;reported.add(once);diagnose({plugin:p.name,phase:"report",message},p.set)}}}function slotChanged(){for(const set2 of slotListeners.values())for(const fn of[...set2])fn()}function isOptionalPeer(p,as){const meta=p.package.peerDependenciesMeta;return meta?.[as]?.optional===true}function failure(scope,p){const own=moduleFailed.get(moduleKey(p));if(own!==void 0)return own;for(let s=scope;s;s=s.parent){const why=s.failed.get(p.name);if(why!==void 0)return why}for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&failure(scope,q)!==null)return`\u4F9D\u8D56 ${d} \u6CA1\u88C5\u4E0A`}return null}function isFailed(scope,p){return failure(scope,p)!==null}function failPlugin(scope,p,phase,message,detail){if(phase==="load")moduleFailed.set(moduleKey(p),message);else{scope.failed.set(p.name,message);dropStates(scope,p)}const once=`view|${p.name}|${phase}|${message}`;if(scope.kind!=="view"||!reported.has(once)){if(scope.kind==="view")reported.add(once);diagnose({plugin:p.name,phase,message},p.set,detail)}for(const q of scope.view.plugins){if(!q.deps.includes(p.as))continue;if(isOptionalPeer(q,p.as))continue;const note=`${q.name}|${p.name}`;if(reported.has(note))continue;reported.add(note);diagnose({plugin:q.name,phase,message:`\u4F9D\u8D56 ${p.as} \u6CA1\u88C5\u4E0A`},q.set)}slotChanged()}function forgetViewFailures(p){const prefix=`view|${p.name}|`;for(const k of reported)if(k.startsWith(prefix))reported.delete(k)}function forgetFailure(scope,p){const visit=q=>{const key=moduleKey(q);if(moduleFailed.has(key)){moduleFailed.delete(key);modules.delete(key)}for(let t=scope;t;t=t.parent){if(t.failed.delete(q.name))t.active?.delete(q.name)}for(const d of q.deps){const r=findPlugin(scope.view,d);if(r)visit(r)}};visit(p)}function moduleKey(p){return`${p.set}:${p.name}`}function loadModule(view,p){const key=moduleKey(p);let pending=modules.get(key);if(!pending){pending=new Promise((resolve,reject)=>{const timer=setTimeout(()=>reject(new RuntimeError("\u63D2\u4EF6\u4EE3\u7801\u52A0\u8F7D\u8D85\u65F6")),opts.loadTimeoutMs??DEFAULT_LOAD_TIMEOUT_MS);opts.load(p).then(m=>{clearTimeout(timer);settled.add(key);const problem=checkModule(view,p,m);if(problem){invalidModules.add(key);reject(new RuntimeError(problem));return}resolve(m)},e=>{clearTimeout(timer);reject(e)})});modules.set(key,pending);const current2=pending;void current2.catch(()=>{if(modules.get(key)===current2)modules.delete(key)})}return pending}async function ensureLoaded(scope,p){if(scope.cancellation.signal.aborted)return null;if(isFailed(scope,p))return null;const started=performance.now();try{return await inScope(scope,loadModule(scope.view,p))}catch(e){if(scope.cancellation.signal.aborted)return null;if(!moduleFailed.has(moduleKey(p)))failPlugin(scope,p,"load",errorMessage(e),{failureCategory:invalidModules.has(moduleKey(p))?"validation":diagnosticFailure(e)?.failureCategory??"load",durationMs:performance.now()-started});return null}}function openLedger(){return{disposers:[],closed:false}}function closeLedger(l){if(l.closed)return;l.closed=true;for(const d of l.disposers.splice(0).reverse())safely(d)}function track(l,d){if(l.closed){safely(d);return()=>{}}let done=false;const once=()=>{if(done)return;done=true;const i=l.disposers.indexOf(once);if(i>=0)l.disposers.splice(i,1);d()};l.disposers.push(once);return once}function findPlugin(view,as){return view.plugins.find(p=>p.as===as)}function makeAppCtx(p,scope,ledger){return{plugin:p.as,scope:scope.kind,app:{member,data:appDataFor(p,ledger),attachments:appAttachmentsFor(p),navigate:to=>navigate(to.page,to.params??{}),route:()=>route,subscribeRoute:fn=>{const safe=guardSubscriber(p,fn);routeListeners.add(safe);return track(ledger,()=>routeListeners.delete(safe))},diagnostics:()=>diagnostics,subscribeDiagnostics:fn=>{const safe=()=>{try{fn()}catch(e){console.error("[band] \u63D2\u4EF6\u8BCA\u65AD\u76D1\u542C\u629B\u9519",e)}};diagListeners.add(safe);return track(ledger,()=>diagListeners.delete(safe))}},slots:{entries:slot=>entriesFor(p,scope,slot),subscribe:(slot,fn)=>{ownSlot(p,scope,slot);const set2=slotListeners.get(slot)??new Set;const safe=guardSubscriber(p,fn);set2.add(safe);slotListeners.set(slot,set2);return track(ledger,()=>set2.delete(safe))},mount:(el,slot,o)=>track(ledger,mountSlot(p,scope,el,slot,o))},services:{provide:(id,impl)=>track(ledger,provide(p,scope,id,impl)),get:name=>{const s=lookupService(p,scope,name);if(s===void 0)throw new RuntimeError(`\u670D\u52A1 ${name} \u7684\u63D0\u4F9B\u65B9\u4E0D\u5728\u573A`);return s},find:name=>lookupService(p,scope,name)},...peopleFor(p),report:error=>diagnose({plugin:p.name,phase:"report",message:errorMessage(error)},p.set),scopeState:(key,init,dispose)=>scopeState(p,scope,key,init,dispose)}}function peopleFor(p){const people=opts.people;if(p.origin!=="official"||!people)return{};return{people:Object.freeze({search:q=>people.search(q),org:(id,o)=>people.org(id,o),members:(orgId,o)=>people.members(orgId,o),resolve:ids=>people.resolve(ids)})}}function appAttachmentsFor(p){const stage=p.origin==="workshop"?void 0:opts.stageAttachment;const external=p.origin==="workshop"?void 0:opts.stageExternalImport;return Object.freeze({available:stage!==void 0,...external?{importExternal:input=>external(input,p.name)}:{},async upload(file,o={}){const ready=await prepareAttachment(file,{...opts.imageCodec?{codec:opts.imageCodec}:{},...o.signal?{signal:o.signal}:{}});if(!stage)throw new Error("\u8FD9\u91CC\u4E0D\u80FD\u5728\u5EFA\u9879\u76EE\u524D\u4E0A\u4F20\u6587\u4EF6");return stage(ready,o)}})}function appDataFor(p,ledger){if(p.origin==="workshop")return workshopDataFor(p,ledger);const read={workshops:f=>data.workshops(f),workshop:id=>data.workshop(id),projects:f=>data.projects(f),inbox:f=>data.inbox(f),myArtifacts:query=>data.myArtifacts(query),search:(q,f)=>data.search(q,f),plugins:query=>data.plugins(query),plugin:name=>data.plugin(name),subscribe:fn=>track(ledger,data.subscribe(fn))};const w=data.write;if(!w)return Object.freeze(read);const platformTokens=w.platformTokens;const personalConnections=w.personalConnections;const userSettings=w.userSettings;const guide=w.guide;const artifactFavorites=w.artifactFavorites;const teamConnections=w.teamConnections;const betaMembers=w.betaMembers;const feedback=w.feedback;const feedbackAdmin=w.feedbackAdmin;const create=w.createWorkshop?.bind(w);const createWorkshop=create&&(input=>create(input));const start=w.startProject?.bind(w);const startProject=start&&(input=>start(input));const workshopMaintainers=w.workshopMaintainers;const transferOwner=workshopMaintainers?.transfer?.bind(workshopMaintainers);const workshopUpgrade=w.workshopUpgrade;const workshopEdit=w.workshopEdit;const workshopEditRevert=workshopEdit?.revert?.bind(workshopEdit);const workshopEditTrial=workshopEdit?.trial?.bind(workshopEdit);const workshopEditTicket=workshopEdit?.previewTicket?.bind(workshopEdit);const agentUpgrade=w.agentUpgrade;const followRuns=w.followRuns;const workshopPlugins=w.workshopPlugins;const copyPlugins=w.copyPlugins?.bind(w);const trialProjects=w.trialProjects;const pluginYank=w.pluginYank;const workshopVisibility=w.workshopVisibility;const workshopArchive=w.workshopArchive;const workshopModel=w.workshopModel;const workshopSecrets=w.workshopSecrets;const modelCredentials=w.modelCredentials;const projectAgentModels=w.projectAgentModels;const confirmProvisionUse=projectAgentModels?.confirmProvisionUse?.bind(projectAgentModels);const markReboundRead=projectAgentModels?.markReboundRead?.bind(projectAgentModels);const netCredentials=w.netCredentials;const release=w.releaseWorkshop?.bind(w);const releaseWorkshop=release&&(input=>release(input));return Object.freeze({...read,write:Object.freeze({...trialProjects?{trialProjects:Object.freeze({workshop:workshop=>trialProjects.workshop(workshop),create:input=>trialProjects.create(input),status:project=>trialProjects.status(project),end:project=>trialProjects.end(project)})}:{},...platformTokens?{platformTokens:Object.freeze({list:()=>platformTokens.list(),issue:input=>platformTokens.issue(input),revoke:id=>platformTokens.revoke(id)})}:{},...teamConnections?{teamConnections:Object.freeze({isDeploymentAdmin:()=>teamConnections.isDeploymentAdmin(),options:(...args)=>teamConnections.options(...args),list:(...args)=>teamConnections.list(...args),connect:(...args)=>teamConnections.connect(...args),rotate:(...args)=>teamConnections.rotate(...args),disconnect:(...args)=>teamConnections.disconnect(...args)})}:{},...feedback?{feedback:Object.freeze({mine:()=>feedback.mine(),submit:input=>feedback.submit(input),markReplySeen:id=>feedback.markReplySeen(id)})}:{},...betaMembers?{betaMembers:Object.freeze({isAdmin:()=>betaMembers.isAdmin(),list:()=>betaMembers.list(),add:ldaps=>betaMembers.add(ldaps),remove:ldap=>betaMembers.remove(ldap)})}:{},...feedbackAdmin?{feedbackAdmin:Object.freeze({isAdmin:()=>feedbackAdmin.isAdmin(),list:(...args)=>feedbackAdmin.list(...args),patch:(...args)=>feedbackAdmin.patch(...args)})}:{},...userSettings?{userSettings:Object.freeze({get:()=>userSettings.get(),set:patch=>userSettings.set(patch)})}:{},...guide?{guide:Object.freeze({get:()=>guide.get(),set:action=>guide.set(action)})}:{},...artifactFavorites?{artifactFavorites:Object.freeze({set:(artifactId,on)=>artifactFavorites.set(artifactId,on)})}:{},...personalConnections?{personalConnections:Object.freeze({list:()=>personalConnections.list(),connect:input=>personalConnections.connect(input),disconnect:()=>personalConnections.disconnect()})}:{},createProject:input=>w.createProject(input),markRead:commentId=>w.markRead(commentId),...createWorkshop?{createWorkshop}:{},...startProject?{startProject}:{},...releaseWorkshop?{releaseWorkshop}:{},...workshopMaintainers?{workshopMaintainers:Object.freeze({get:workshop=>workshopMaintainers.get(workshop),add:(workshop,userId)=>workshopMaintainers.add(workshop,userId),remove:(workshop,userId)=>workshopMaintainers.remove(workshop,userId),...transferOwner?{transfer:(workshop,userId)=>transferOwner(workshop,userId)}:{},searchUsers:q=>workshopMaintainers.searchUsers(q)})}:{},...pluginYank?{pluginYank:Object.freeze({yank:(name,version,reason)=>pluginYank.yank(name,version,reason),unyank:(name,version)=>pluginYank.unyank(name,version)})}:{},...workshopUpgrade?{workshopUpgrade:Object.freeze({status:workshop=>workshopUpgrade.status(workshop),run:workshop=>workshopUpgrade.run(workshop)})}:{},...workshopEdit?{workshopEdit:Object.freeze({...workshopEditRevert?{revert:(workshop,input)=>workshopEditRevert(workshop,input)}:{},get:workshop=>workshopEdit.get(workshop),file:(workshop,path)=>workshopEdit.file(workshop,path),start:(workshop,input)=>workshopEdit.start(workshop,input),send:(workshop,sessionId,input)=>workshopEdit.send(workshop,sessionId,input),stop:(workshop,sessionId)=>workshopEdit.stop(workshop,sessionId),end:(workshop,sessionId)=>workshopEdit.end(workshop,sessionId),...workshopEditTicket?{previewTicket:(workshop,sessionId)=>workshopEditTicket(workshop,sessionId)}:{},...workshopEditTrial?{trial:(workshop,sessionId,input)=>workshopEditTrial(workshop,sessionId,input)}:{}})}:{},...agentUpgrade?{agentUpgrade:Object.freeze({advice:workshop=>agentUpgrade.advice(workshop)})}:{},...followRuns?{followRuns:Object.freeze({list:workshop=>followRuns.list(workshop)})}:{},...workshopPlugins?{workshopPlugins:Object.freeze({list:workshop=>workshopPlugins.list(workshop),detach:(workshop,names)=>workshopPlugins.detach(workshop,[...names]),refollow:(workshop,names)=>workshopPlugins.refollow(workshop,[...names])})}:{},...copyPlugins?{copyPlugins:workshop=>copyPlugins(workshop)}:{},...workshopVisibility?{workshopVisibility:Object.freeze({get:workshop=>workshopVisibility.get(workshop),set:(workshop,input)=>workshopVisibility.set(workshop,input),searchUsers:q=>workshopVisibility.searchUsers(q)})}:{},...workshopArchive?{workshopArchive:Object.freeze({set:(workshop,archived)=>workshopArchive.set(workshop,archived)})}:{},...workshopModel?{workshopModel:Object.freeze({deployment:()=>workshopModel.deployment(),get:workshop=>workshopModel.get(workshop),configure:(workshop,input)=>workshopModel.configure(workshop,input),retryProvision:workshop=>workshopModel.retryProvision(workshop)})}:{},...workshopSecrets?{workshopSecrets:Object.freeze({get:workshop=>workshopSecrets.get(workshop),set:(workshop,name,value)=>workshopSecrets.set(workshop,name,value)})}:{},...modelCredentials?{modelCredentials:Object.freeze({list:()=>modelCredentials.list(),save:input=>modelCredentials.save(input),replaceKey:(id,key)=>modelCredentials.replaceKey(id,key),setDefault:id=>modelCredentials.setDefault(id),remove:id=>modelCredentials.remove(id),...modelCredentials.provision?{provision:()=>modelCredentials.provision?.()}:{},...modelCredentials.listProviderModels?{listProviderModels:input=>modelCredentials.listProviderModels?.(input)}:{},...modelCredentials.listCredentialModels?{listCredentialModels:id=>modelCredentials.listCredentialModels?.(id)}:{},...modelCredentials.updateModelCredentialModels?{updateModelCredentialModels:(id,input)=>modelCredentials.updateModelCredentialModels?.(id,input)}:{}})}:{},...projectAgentModels?{projectAgentModels:Object.freeze({...confirmProvisionUse?{confirmProvisionUse}:{},...markReboundRead?{markReboundRead}:{},list:projectId=>projectAgentModels.list(projectId),select:(...a)=>projectAgentModels.select(...a),clear:(...a)=>projectAgentModels.clear(...a)})}:{},...netCredentials?{netCredentials:Object.freeze({list:()=>netCredentials.list(),listProject:projectId=>netCredentials.listProject(projectId),save:(...a)=>netCredentials.save(...a),saveMany:(...a)=>netCredentials.saveMany(...a),update:(...a)=>netCredentials.update(...a),replaceKey:(...a)=>netCredentials.replaceKey(...a),remove:(...a)=>netCredentials.remove(...a)})}:{}})})}function workshopDataFor(p,ledger){const own=assembly.workshops[p.set]?.workshop;const pin=asked=>{if(own===void 0)throw new RuntimeError(`${p.name} \u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u5DE5\u574A\uFF0C\u8BFB\u4E0D\u4E86\u5E94\u7528\u6570\u636E`);if(asked!==void 0&&asked!==own){throw new RuntimeError(`${p.name} \u662F\u5DE5\u574A ${own} \u7684\u63D2\u4EF6\uFF0C\u4E0D\u80FD\u8BFB\u5DE5\u574A ${asked} \u7684\u6570\u636E`)}return own};const ownProjects=async workshop=>(await data.projects({workshop})).filter(s=>s.workshop.id===workshop);return Object.freeze({workshops:async f=>{const workshop=pin(f?.workshop);return(await data.workshops({workshop})).filter(w=>w.id===workshop)},workshop:async id=>{if(id!==pin(void 0))return null;const w=await data.workshop(id);return w&&w.id===id?w:null},projects:async f=>ownProjects(pin(f?.workshop)),myArtifacts:async query=>{const workshop=pin(query?.workshop);const[joined,mine,review,starred]=await Promise.all([data.myArtifacts({...query,workshop,tab:"joined"}),data.myArtifacts({...query,workshop,tab:"mine"}),data.myArtifacts({...query,workshop,tab:"review"}),data.myArtifacts({...query,workshop,tab:"starred"})]);const rowsOf=r=>r.rows.filter(row=>row.project.workshop.id===workshop);const kept=[...rowsOf(joined),...rowsOf(mine),...rowsOf(review),...rowsOf(starred)];const tab=query?.tab??"joined";return{query:{...query??{},workshop},counts:{joined:rowsOf(joined).length,mine:rowsOf(mine).length,review:rowsOf(review).length,starred:rowsOf(starred).length},facets:{workshops:joined.facets.workshops.filter(w=>w.id===workshop),projects:joined.facets.projects.filter(p2=>p2.workshop.id===workshop),types:joined.facets.types.filter(t=>kept.some(row=>row.type===t))},rows:rowsOf(tab==="mine"?mine:tab==="review"?review:tab==="starred"?starred:joined)}},inbox:async f=>{const workshop=pin(f?.workshop);const[r,projects2]=await Promise.all([data.inbox({workshop}),ownProjects(workshop)]);const ids=new Set(projects2.map(s=>s.project.id));const workshops=r.workshops?.filter(w=>w.workshopId===workshop);const copyBlocked=r.workshopCopyBlocked?.filter(i=>i.workshopId===workshop);return{needsYou:r.needsYou.filter(i=>ids.has(i.projectId)),inProgress:r.inProgress.filter(i=>ids.has(i.projectId)),...workshops&&workshops.length>0?{workshops}:{},...copyBlocked&©Blocked.length>0?{workshopCopyBlocked:copyBlocked}:{}}},search:async(q,f)=>{const workshop=pin(f?.workshop);const[r,projects2]=await Promise.all([data.search(q,{workshop}),ownProjects(workshop)]);const hits=r.projects.filter(s=>s.workshop.id===workshop);const ids=new Set([...projects2,...hits].map(s=>s.project.id));return{projects:hits,workshops:r.workshops.filter(w=>w.id===workshop),threads:r.threads.filter(t=>ids.has(t.projectId))}},plugins:async query=>{if(query?.workshop!==void 0)pin(query.workshop);return(await data.plugins(query)).filter(c=>c.source!=="workshop"||own!==void 0&&c.workshop?.id===own)},plugin:name=>data.plugin(name),subscribe:fn=>track(ledger,data.subscribe(fn))})}function scopeState(p,scope,key,init,dispose){if(scope.closed)throw new RuntimeError("\u4F5C\u7528\u57DF\u5DF2\u5173\u95ED\uFF0C\u4E0D\u80FD\u518D\u53D6\u4F5C\u7528\u57DF\u72B6\u6001");if(isFailed(scope,p))throw new RuntimeError("\u63D2\u4EF6\u5728\u8FD9\u4E2A\u4F5C\u7528\u57DF\u91CC\u6CA1\u88C5\u4E0A\uFF0C\u4E0D\u80FD\u53D6\u4F5C\u7528\u57DF\u72B6\u6001");let own=scope.states.get(p.name);if(!own){own=new Map;scope.states.set(p.name,own)}const found=own.get(key);if(found===INITIALIZING)throw new RuntimeError("\u4F5C\u7528\u57DF\u72B6\u6001\u7684 init \u91CC\u53C8\u53D6\u4E86\u540C\u4E00\u4EFD\u72B6\u6001");if(found)return found.value;const states=own;states.set(key,INITIALIZING);const ledger=openLedger();let value;try{value=init(ctxFor(p,scope,ledger))}catch(e){states.delete(key);closeLedger(ledger);throw e}if(dispose)track(ledger,()=>dispose(value));const close=()=>{states.delete(key);closeLedger(ledger)};states.set(key,{value,close});scope.disposers.push(close);return value}function dropStates(scope,p){const own=scope.states.get(p.name);if(!own)return;for(const e of[...own.values()].reverse())if(e!==INITIALIZING)safely(e.close);scope.states.delete(p.name)}function makeProjectCtx(p,scope,ledger,situation={}){const base=makeAppCtx(p,scope,ledger);const locked=p.roles.length>0;const{collab,...rest}=scope.host?.api({plugin:p,projectId:scope.projectId,locked,track:d=>track(ledger,d),...situation.version?{version:situation.version}:{},...situation.live?{live:true}:{},...situation.mount?{mount:situation.mount}:{},...scope.focus?{focus:scope.focus}:{}})??{};const api=locked&&collab!==void 0?{...rest,collab}:rest;const sel=scope.selection;const official=isOfficialName2(p.name);const ctx={...api,...base,project:{id:scope.projectId,slug:scope.host?.slug??scope.projectId,...scope.view.workshop?{workshop:scope.view.workshop}:{},views:scope.view.views??{},access:scope.host?.access??"member",canReadThreads:canReadThreadsOf(scope.host?.access,scope.host?.canReadThreads),agent:scope.host?.agent??DEFAULT_AGENT2,...projectInfoOf(scope.projectId,scope.host?.info),status:()=>scope.host?.status?.()??Promise.resolve("active"),...official&&scope.host?.shared?{shared:scope.host.shared}:{},...official&&scope.host?.notices?{notices:scope.host.notices}:{},...scope.host?.deleted?{deleted:Object.freeze(official&&scope.host.deleted.restore?{restoreUntil:scope.host.deleted.restoreUntil,restore:scope.host.deleted.restore}:{restoreUntil:scope.host.deleted.restoreUntil})}:{},...official&&scope.host?.remove?{remove:scope.host.remove}:{},...official&&scope.host?.upgrade?{upgrade:Object.freeze({status:()=>scope.host?.upgrade?.status(),run:()=>scope.host?.upgrade?.run(),subscribe:fn=>api.events.subscribe("project.upgraded",()=>fn())})}:{}},selection:{get:()=>sel.value,set:value=>{if(JSON.stringify(sel.value)===JSON.stringify(value))return;const copy=value===null?null:structuredClone(value);sel.value=copy;if(scope.focus)scope.focus.focus(copy);else if(!scope.ownFocus)scope.host?.focus?.(copy);for(const fn of[...sel.listeners])fn({value:copy,source:p.as})},subscribe:fn=>{const safe=guardSubscriber(p,fn);sel.listeners.add(safe);return track(ledger,()=>sel.listeners.delete(safe))}}};return ctx}function ctxFor(p,scope,ledger,situation){if(scope.kind==="app"||scope.kind==="workshop")return makeAppCtx(p,scope,ledger);const ctx=makeProjectCtx(p,scope,ledger,situation);if(scope.kind==="project")return ctx;return{...ctx,view:{...scope.viewOf}}}function provide(p,scope,id,impl){const decl=p.manifest.provides?.[id];if(!decl)throw new RuntimeError(`${p.as} \u6CA1\u6709\u5728\u6E05\u5355\u91CC\u58F0\u660E\u670D\u52A1 ${id}`);if(decl.scope!==scope.kind&&!legacyAppHere(p,scope,decl.scope)){throw new RuntimeError(`\u670D\u52A1 ${id} \u58F0\u660E\u4E3A ${decl.scope} \u7EA7\uFF0C\u4E0D\u80FD\u5728 ${scope.kind} \u4F5C\u7528\u57DF\u91CC\u63D0\u4F9B`)}const name=`${p.as}/${id}`;if(scope.services.has(name))throw new RuntimeError(`\u670D\u52A1 ${name} \u5DF2\u7ECF\u63D0\u4F9B\u8FC7\u4E86`);scope.services.set(name,impl);return()=>{if(scope.services.get(name)===impl)scope.services.delete(name)}}function lookupService(p,scope,name){const slash=name.lastIndexOf("/");const provider=name.slice(0,slash);if(provider!==p.as&&!(provider in p.package.peerDependencies)){throw new RuntimeError(`${p.as} \u7528\u670D\u52A1 ${name} \u8981\u5728 peerDependencies \u91CC\u5199 ${provider}`)}for(let s=scope;s;s=s.parent){if(s.services.has(name))return s.services.get(name)}return void 0}function legacyAppHere(p,scope,kind){return kind==="app"&&scope.kind==="workshop"&&p.set===scope.view.id}function missingServices(p,scope,kind){return Object.entries(p.manifest.provides??{}).filter(([id,d])=>d.scope===kind&&!scope.services.has(`${p.as}/${id}`)).map(([id])=>id)}function needsHook(p,kind){return(p.manifest.activation??[]).includes(kind)||Object.values(p.manifest.provides??{}).some(s=>s.scope===kind)}async function activateAll(plugins2,scope,kind=scope.kind){const loadedMods=await Promise.all(plugins2.map(p=>ensureLoaded(scope,p)));if(scope.closed)return;for(const[i,p]of plugins2.entries()){if(scope.cancellation.signal.aborted)return;const m=loadedMods[i];if(!m||isFailed(scope,p))continue;const hook=kind==="app"?m.activate:m.scopes?.[kind];const ledger=openLedger();const started=performance.now();try{const ctx=ctxFor(p,scope,ledger);const ret=hook?.call(m,ctx);if(typeof ret==="function")ledger.disposers.push(ret);if(scope.cancellation.signal.aborted){closeLedger(ledger);return}const missing=missingServices(p,scope,kind);if(missing.length>0)throw new RuntimeError(`\u58F0\u660E\u4E86\u670D\u52A1 ${missing.join("\u3001")} \u5374\u6CA1\u6709\u63D0\u4F9B`);scope.disposers.push(()=>closeLedger(ledger));if(kind==="view")forgetViewFailures(p)}catch(e){closeLedger(ledger);if(scope.cancellation.signal.aborted)return;failPlugin(scope,p,"activate",errorMessage(e),{failureCategory:"exception",durationMs:performance.now()-started})}}}function closeScope(scope){if(scope.closed)return;scope.closed=true;scope.cancellation.abort();scope.active?.clear();for(const v of[...scope.views].reverse())closeScope(v);scope.parent?.views.delete(scope);for(const d of[...scope.mounts].reverse())safely(d);scope.mounts.clear();for(const d of scope.disposers.splice(0).reverse())safely(d);scope.services.clear();if(scope.kind!=="view"||scope.ownFocus)scope.selection.listeners.clear();if(scope.ownFocus){const f=scope.focus;scope.focus=void 0;if(f)safely(()=>f.dispose())}}function openView(parent,slot,key,own){const v=newScope("view",parent.view,parent);v.projectId=parent.projectId;if(parent.host)v.host=parent.host;if(own){v.selection.value=own.selection===null?null:structuredClone(own.selection);const f=parent.host?.openFocus?.(own);if(f)v.focus=f;v.ownFocus=true}else{v.selection=parent.selection;if(parent.focus)v.focus=parent.focus}v.viewOf={slot,key};v.active=new Map;parent.views.add(v);return v}function ensureActive(scope,p){const active=scope.active;if(!active)return Promise.resolve();const own=active.get(p.name);if(own)return own;const fresh=new Set;const waits=[];const seen=new Set;const visit=q=>{if(seen.has(q.name))return;seen.add(q.name);const pending=active.get(q.name);if(pending){waits.push(pending);return}for(const d of q.deps){const r=findPlugin(scope.view,d);if(r)visit(r)}fresh.add(q)};visit(p);const order=scope.view.plugins.filter(q=>fresh.has(q)&&needsHook(q,"view"));const done=(async()=>{await inScope(scope,Promise.all(waits));await activateAll(order,scope)})().then(()=>{for(const q of fresh)if(isFailed(scope,q)&&active.get(q.name)===done)active.delete(q.name)}).catch(error=>{for(const q of fresh)if(active.get(q.name)===done)active.delete(q.name);throw error});for(const q of fresh)active.set(q.name,done);return done}function newScope(kind,view,parent){const s={cancellation:new AbortController,kind,view,services:new Map,failed:new Map,disposers:[],refs:0,selection:{value:null,listeners:new Set},states:new Map,closed:false,ready:Promise.resolve(),views:new Set,mounts:new Set};if(parent){s.parent=parent;const abort=()=>closeScope(s);if(parent.cancellation.signal.aborted)abort();else{parent.cancellation.signal.addEventListener("abort",abort,{once:true});s.disposers.push(()=>parent.cancellation.signal.removeEventListener("abort",abort))}}return s}function inScope(scope,pending){const signal=scope.cancellation.signal;return new Promise((resolve,reject)=>{const aborted=()=>reject(scopeClosedError());if(signal.aborted){void pending.catch(()=>{});aborted();return}signal.addEventListener("abort",aborted,{once:true});void pending.then(resolve,reject).finally(()=>signal.removeEventListener("abort",aborted))})}function scopeClosedError(){return new RuntimeError(disposed?"\u8FD0\u884C\u65F6\u5DF2\u5173\u95ED":"\u4F5C\u7528\u57DF\u5DF2\u53D6\u6D88")}async function retainWorkshopSet(setId,view,requester){let ws=workshopSets.get(setId);if(!ws){const scope=newScope("workshop",view,app);const own=view.plugins.filter(p=>p.set===setId&&needsHook(p,"app"));const hooked=view.plugins.filter(p=>needsHook(p,"workshop"));const ready=(async()=>{await activateAll(own,scope,"app");await activateAll(hooked,scope)})();ws={refs:0,scope,ready};workshopSets.set(setId,ws)}ws.refs++;try{await inScope(requester,ws.ready);return ws.scope}catch(error){releaseWorkshopSet(setId);throw error}}function releaseWorkshopSet(setId){const ws=workshopSets.get(setId);if(!ws||--ws.refs>0)return;workshopSets.delete(setId);closeScope(ws.scope)}async function inspectProjectPlugins(projectId,setId,host,signal){const view=assembly.workshops[setId];if(!view||disposed||signal?.aborted){host?.dispose?.();throw scopeClosedError()}const visible2=projects.get(projectId);const own=host!==void 0;const scope=own?newScope("project",view,app):visible2;if(!scope||scope.closed||!own&&scope.view!==view)throw scopeClosedError();const cancel=()=>{if(own)closeScope(scope)};signal?.addEventListener("abort",cancel,{once:true});try{if(own){scope.projectId=projectId;scope.host=host;track(scope,()=>host?.dispose?.());scope.parent=await retainWorkshopSet(setId,view,scope);track(scope,()=>releaseWorkshopSet(setId))}await Promise.all(view.plugins.map(p=>ensureLoaded(scope,p)));if(own)await activateAll(view.plugins.filter(p=>needsHook(p,"project")),scope);if(scope.cancellation.signal.aborted||signal?.aborted)throw scopeClosedError();const failed=new Map(Object.keys(view.failed).map(name=>[name,"assembly"]));for(const p of view.plugins)if(isFailed(scope,p))failed.set(p.name,moduleFailed.has(moduleKey(p))||invalidModules.has(moduleKey(p))?"load":"assembly");return{loaded:view.plugins.filter(p=>!failed.has(p.name)).map(p=>p.name),failed:[...failed].map(([plugin,phase])=>({plugin,phase}))}}finally{signal?.removeEventListener("abort",cancel);if(own)closeScope(scope)}}function acquireProject(projectId){if(disposed)throw new RuntimeError("\u8FD0\u884C\u65F6\u5DF2\u5173\u95ED");let scope=projects.get(projectId);if(!scope){const created=newScope("project",assembly.global,app);created.projectId=projectId;created.ready=(async()=>{const setId=await inScope(created,opts.resolveProject(projectId));if(created.cancellation.signal.aborted)throw scopeClosedError();const view=setId!==void 0?assembly.workshops[setId]:void 0;const host=opts.projectHost?.(projectId,view?setId:void 0);if(host){created.host=host;track(created,()=>host.dispose?.())}if(setId!==void 0&&view){created.view=view;created.parent=await retainWorkshopSet(setId,view,created);track(created,()=>releaseWorkshopSet(setId));if(created.cancellation.signal.aborted)throw scopeClosedError()}const hooked=created.view.plugins.filter(p=>needsHook(p,"project"));await activateAll(hooked,created);if(created.cancellation.signal.aborted)throw scopeClosedError();await opts.onProjectReady?.({projectId,...setId!==void 0?{setId}:{},signal:created.cancellation.signal});if(created.cancellation.signal.aborted)throw scopeClosedError();slotChanged()})().catch(e=>{if(projects.get(projectId)===created)projects.delete(projectId);closeScope(created);throw e});scope=created;projects.set(projectId,scope)}scope.refs++;const s=scope;let released=false;const release=()=>{if(released)return;released=true;if(--s.refs>0)return;if(projects.get(projectId)===s)projects.delete(projectId);closeScope(s)};const ready=s.ready.then(()=>({host:s.host,ctxFor:plugin=>{if(released||disposed)throw new RuntimeError(`\u9879\u76EE ${projectId} \u7684\u8FD9\u6B21\u5F15\u7528\u5DF2\u7ECF\u91CA\u653E`);const p=findPlugin(s.view,plugin);if(!p)throw new RuntimeError(`\u9879\u76EE ${projectId} \u7684\u89C6\u56FE\u91CC\u6CA1\u6709 ${plugin}`);const ledger=openLedger();s.disposers.push(()=>closeLedger(ledger));return makeProjectCtx(p,s,ledger)},release})).catch(error=>{release();throw error});return{ready,release}}async function openProject(projectId){return acquireProject(projectId).ready}function ownSlot(p,scope,slot){const s=scope.view.slots[slot];if(!s)throw new RuntimeError(`\u63D2\u69FD ${slot} \u4E0D\u5B58\u5728\uFF08\u672A\u58F0\u660E\u6216\u58F0\u660E\u8005\u6CA1\u88C5\u4E0A\uFF09`);if(slot==="root"?p!==null:s.owner!==p?.as){throw new RuntimeError(`${p?.as??"\u5BBF\u4E3B"} \u4E0D\u80FD\u6E32\u67D3 ${slot}\uFF1A\u53EA\u6709\u58F0\u660E\u8005\u80FD\u6E32\u67D3\u81EA\u5DF1\u7684\u63D2\u69FD`)}return s}function alive(scope,c){const p=findPlugin(scope.view,c.plugin);return p!==void 0&&!gone(scope,p)}function gone(scope,p){for(let s=scope;s;s=s.parent){if(s.failed.has(p.name))return true}if(invalidModules.has(moduleKey(p)))return true;for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&gone(scope,q))return true}return false}function invalidChain(scope,p){if(invalidModules.has(moduleKey(p)))return true;for(const d of p.deps){const q=findPlugin(scope.view,d);if(q&&!isOptionalPeer(p,d)&&invalidChain(scope,q))return true}return false}const frozenConfigs=new WeakMap;function toEntry(c){const entry={key:c.key,id:c.id,plugin:c.plugin,meta:c.meta,order:c.order,priority:c.priority};if(c.route!==void 0)entry.route=c.route;const config=frozenConfig(c);if(config)entry.config=config;return entry}function frozenConfig(c){if(!c.config)return void 0;const hit=frozenConfigs.get(c);if(hit)return hit;const copy={};for(const[k,f]of Object.entries(c.config)){const field={...f};if(f.enum)field.enum=Object.freeze([...f.enum]);if(f.enumNames)field.enumNames=Object.freeze([...f.enumNames]);if(f.confirmOn)field.confirmOn=Object.freeze([...f.confirmOn]);copy[k]=Object.freeze(field)}const out=Object.freeze(copy);frozenConfigs.set(c,out);return out}function visible(scope,slot){const own=(scope.view.contributions[slot]??[]).filter(c=>alive(scope,c));if(scope!==app||!scope.view.slots[slot]?.decl.routes)return own;return[...own,...workshopPages(slot)]}function workshopPages(slot){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);const view=setId?assembly.workshops[setId]:void 0;if(!setId||!view)return[];const held=workshopSets.get(setId)?.scope;return(view.contributions[slot]??[]).filter(c=>{const p=findPlugin(view,c.plugin);if(!p||!view.routes?.some(r=>r.page===c.key))return false;return held?!gone(held,p):!invalidModules.has(moduleKey(p))})}function pageSetOf(slot,c){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);const view=setId?assembly.workshops[setId]:void 0;return setId&&view?.contributions[slot]?.includes(c)&&view.routes?.some(r=>r.page===c.key)?setId:void 0}function entriesFor(p,scope,slot){ownSlot(p,scope,slot);return visible(scope,slot).map(toEntry)}function mountSlot(p,scope,el,slot,o){const s=ownSlot(p,scope,slot);const decl=s.decl;if(decl.mount===false)throw new RuntimeError(`${slot} \u7684\u8D21\u732E\u53EA\u662F\u6570\u636E\uFF0C\u7528 entries \u8BFB\uFF0C\u4E0D\u80FD\u6302\u8F7D`);if(decl.opens!=="project"&&rank(scope.kind)<rank(decl.scope)){throw new RuntimeError(`${slot} \u662F ${decl.scope} \u7EA7\u63D2\u69FD\uFF0C\u4E0D\u80FD\u5728 ${scope.kind} \u4F5C\u7528\u57DF\u91CC\u6E32\u67D3`)}if(decl.opens==="view"&&rank(scope.kind)===0){throw new RuntimeError(`${slot} \u6253\u5F00\u89C6\u56FE\u4F5C\u7528\u57DF\uFF0C\u53EA\u80FD\u5728\u9879\u76EE\u6216\u89C6\u56FE\u4F5C\u7528\u57DF\u91CC\u6E32\u67D3`)}if(decl.kind==="keyed"&&o.key===void 0)throw new RuntimeError(`${slot} \u662F keyed \u63D2\u69FD\uFF0C\u8981\u7ED9 key`);if(o.focus&&decl.focus!=="own")throw new RuntimeError(`${slot} \u6CA1\u6709\u58F0\u660E focus: own\uFF0C\u6302\u8F7D\u65F6\u4E0D\u80FD\u7ED9\u7126\u70B9\u521D\u503C`);const initialArtifact=o.focus?.selection?.kind==="artifact"?o.focus.selection.artifactId:void 0;if(o.focus?.version&&initialArtifact!==void 0&&initialArtifact!==o.focus.version.artifactId)throw new RuntimeError(`${slot} \u7684\u7126\u70B9\u521D\u503C\u91CC\uFF0C\u9009\u4E2D\u7684\u4EA7\u7269\u548C\u7248\u672C\u6240\u5C5E\u7684\u4EA7\u7269\u4E0D\u4E00\u81F4`);if(decl.kind==="list"&&o.key===void 0)throw new RuntimeError(`${slot} \u662F list \u63D2\u69FD\uFF0C\u4E00\u6761\u4E00\u6761\u6302\uFF0C\u8981\u7ED9 key`);let cancelled=false;let inner;const release=[];let cardTitle;let forget;const hold=d=>{if(cancelled){safely(d);return false}release.push(d);return true};const run=async()=>{let target=scope;const slotProject=decl.opens==="project"?o.owner?.projectId:void 0;if(decl.opens==="project"&&!slotProject){throw new RuntimeError(`${slot} \u6253\u5F00\u9879\u76EE\u4F5C\u7528\u57DF\uFF0Cowner \u8981\u5E26 projectId`)}let chosen=slotProject===void 0?await choose(scope,slot,o):null;if(cancelled)return;cardTitle=chosen!==null&&typeof chosen.meta.title==="string"?chosen.meta.title:void 0;const pageProject=chosen?.opens==="project"?o.owner?.params?.project:void 0;if(chosen?.opens==="project"&&!pageProject){throw new RuntimeError(`\u9875\u9762 ${chosen.key} \u6253\u5F00\u9879\u76EE\u4F5C\u7528\u57DF\uFF0Cowner.params \u8981\u5E26 project`)}const pageSet=chosen!==null&&scope===app&&decl.routes?pageSetOf(slot,chosen):void 0;if(pageSet!==void 0){const view=assembly.workshops[pageSet];const held=await retainWorkshopSet(pageSet,view,app);if(!hold(()=>releaseWorkshopSet(pageSet)))return;if(disposed)return;const watch=()=>{if(currentSets.get(view.workshop)!==pageSet)restart()};pageMounts.add(watch);hold(()=>pageMounts.delete(watch));if(currentSets.get(view.workshop)!==pageSet){again=true;return}target=held}const openId=slotProject??pageProject;if(openId!==void 0){const request=acquireProject(openId);hold(request.release);await request.ready;if(cancelled||disposed)return;target=projects.get(openId);if(pageProject!==void 0&&chosen){if(canonicalize(chosen.key,pageProject,target.view.workshop)==="handover")return}chosen=await choose(target,slot,o);if(cancelled)return}if(!chosen){inner=o.fallback?.(el)??void 0;return}cardTitle=typeof chosen.meta.title==="string"?chosen.meta.title:void 0;if(decl.opens==="view"){const own=decl.focus==="own"?{selection:o.focus?.selection??null,...o.focus?.version?{version:o.focus.version}:{}}:void 0;const v=openView(target,slot,chosen.key,own);if(!hold(()=>closeScope(v)))return;target=v}const owner=findPlugin(target.view,chosen.plugin);const[m]=owner&&!isFailed(target,owner)?await Promise.all([ensureLoaded(target,owner),ensureActive(target,owner)]):[null];if(cancelled||target.closed)return;if(!owner||!m||isFailed(target,owner)){const name=owner?.name??chosen.plugin;const why=(owner&&failure(target,owner))??"\u6CA1\u88C5\u4E0A";if(!owner||invalidChain(target,owner)){inner=opts.renderError(el,{plugin:name,message:why})??void 0;return}const failed=owner;const failedIn=target;forget=()=>forgetFailure(failedIn,failed);inner=opts.renderError(el,{plugin:name,message:why,...cardTitle!==void 0?{title:cardTitle}:{},load:true,retry:remount})??void 0;return}if((o.version||o.live)&&rank(target.kind)===0){throw new RuntimeError(`${slot} \u6302\u5728\u5E94\u7528\u4F5C\u7528\u57DF\u91CC\uFF0C\u9489\u4E0D\u4E86\u7248\u672C\u3001\u5F00\u4E0D\u4E86\u5B9E\u65F6\u9884\u89C8\uFF08\u53EA\u5728\u9879\u76EE\u4F5C\u7528\u57DF\u91CC\u6709\u610F\u4E49\uFF09`)}const surface=m.surfaces?.[chosen.id];if(!surface)throw new RuntimeError(`${owner.as} \u6CA1\u6709\u7ED9\u8D21\u732E ${chosen.id} \u7684\u6302\u8F7D\u51FD\u6570`);const given=o.config??{};const configProblems=checkConfig(chosen.config,given);if(configProblems.length>0){const why=configProblems.map(p2=>p2.message).join("\uFF1B");throw new RuntimeError(`${chosen.key} \u6536\u5230\u7684\u914D\u7F6E\u4E0D\u5408\u5B83\u58F0\u660E\u7684\u914D\u7F6E schema\uFF1A${why}\uFF08\u662F\u5B83\u8981\u6536\u7684\u914D\u7F6E\uFF0C\u5C31\u5728 ${owner.name} \u7684 plugin.yaml \u91CC\u7ED9\u8D21\u732E ${chosen.id} \u58F0\u660E config\uFF09`)}const config=withConfigDefaults(chosen.config,given);const entry=toEntry(chosen);const title=typeof chosen.meta.title==="string"?chosen.meta.title:void 0;const scopeOf=target;const attach=()=>{const ledger=openLedger();const unmount=()=>closeLedger(ledger);release.push(()=>{scopeOf.mounts.delete(unmount);unmount()});if(scopeOf.kind==="view")scopeOf.mounts.add(unmount);try{const situation={mount:el};if(o.version)situation.version=o.version;if(o.live)situation.live=true;const ret=surface(ctxFor(owner,scopeOf,ledger,situation),el,{owner:o.owner,config,matched:chosen.matched,entry});if(typeof ret==="function")ledger.disposers.push(ret)}catch(e){closeLedger(ledger);if(cancelled||scopeOf.cancellation.signal.aborted)return;diagnose({plugin:owner.name,phase:"mount",message:errorMessage(e)},owner.set);inner=opts.renderError(el,{plugin:owner.name,message:errorMessage(e),error:e,...title!==void 0?{title}:{},retry:()=>{if(cancelled||disposed||scopeOf.closed)return;if(inner)safely(inner);inner=void 0;attach()}})??void 0}};attach()};const drawFailure=e=>{if(cancelled||disposed||scope.cancellation.signal.aborted)return;diagnose({plugin:p?.name,phase:"mount",message:errorMessage(e)},p?.set);forget=void 0;inner=opts.renderError(el,{...p?.name!==void 0?{plugin:p.name}:{},message:errorMessage(e),error:e,...cardTitle!==void 0?{title:cardTitle}:{},load:true,retry:remount})??void 0};let running=true;let again=false;const settle=()=>{running=false;if(again){again=false;remount()}};const restart=()=>{if(running)again=true;else remount()};const remount=()=>{if(cancelled||disposed||running)return;running=true;forget?.();forget=void 0;if(inner)safely(inner);inner=void 0;for(const d of release.splice(0).reverse())safely(d);void run().catch(drawFailure).finally(settle)};void run().catch(drawFailure).finally(settle);return()=>{cancelled=true;if(inner)safely(inner);inner=void 0;for(const d of release.splice(0).reverse())safely(d)}}async function choose(scope,slot,o){await scope.ready;const decl=scope.view.slots[slot]?.decl;const list=visible(scope,slot);switch(decl?.kind){case"single":return list[0]??null;case"keyed":{const key=resolveKey({...scope.view,contributions:{[slot]:list}},slot,o.key);return list.find(c=>c.key===key)??null}case"list":return list.find(c=>c.key===o.key||c.id===o.key)??null;case"chain":{for(const c of list){const owner=findPlugin(scope.view,c.plugin);const m=await ensureLoaded(scope,owner);const select=m?.select?.[c.id];if(!select)continue;let matched;try{matched=select(o.owner)}catch(e){diagnose({plugin:owner.name,phase:"mount",message:errorMessage(e)},owner.set);continue}if(matched!==null&&matched!==void 0)return{...c,matched}}return null}default:return null}}function workshopRoutes(){const setId=route.workshop===void 0?void 0:currentSets.get(route.workshop);return setId&&assembly.workshops[setId]?.routes||[]}function navigate(page,params){const byShort=table=>{const hits=table.filter(r=>r.page.endsWith(`/${page}`));if(hits.length>1)throw new RuntimeError(`\u9875\u9762 ${page} \u6709\u6B67\u4E49\uFF0C\u5199\u5168\u540D\uFF1A${hits.map(h=>h.page).join("\u3001")}`);return hits[0]};const local=workshopRoutes();const entry=assembly.routes.find(r=>r.page===page)??local.find(r=>r.page===page)??byShort(assembly.routes)??byShort(local);if(!entry)throw new RuntimeError(`\u6CA1\u6709\u9875\u9762 ${page}`);const path=pathFor(entry,params);if(crossesWorkshop(path)&&handOver(path))return;opts.onNavigate?.(path);setLocation(path)}function targetWorkshop(path){const page=workshopPageOf(path);if(page!==void 0)return page;const m=matchRoute(assembly.routes,path);if(!m)return void 0;const workshop=workshopOf(m.pattern,m.params);if(workshop!==void 0)return workshop;return m.params.project!==void 0?"unknown":void 0}function handOver(path){if(opts.onCrossWorkshop?.(path))return true;docWorkshop=void 0;return false}function crossesWorkshop(path){if(docWorkshop===void 0)return false;const target=targetWorkshop(path);return target!=="unknown"&&target!==docWorkshop}function pathFor(entry,params){const wantsWorkshop=workshopOf(entry.pattern,{[WORKSHOP_PARAM]:"?"})!==void 0;const withWorkshop=wantsWorkshop&¶ms[WORKSHOP_PARAM]===void 0&&route.workshop!==void 0?{...params,[WORKSHOP_PARAM]:route.workshop}:params;const exact=exactPath(entry,withWorkshop);if(exact)return exact;let first;for(const pattern of[entry.pattern,...entry.aliases]){try{return buildRoute(pattern,withWorkshop)}catch(e){first??=e}}throw first}function workshopPageRoute(path,workshop){const setId=currentSets.get(workshop);const m=setId?matchRoute(assembly.workshops[setId]?.routes??[],path):null;if(m)return{page:m.page,params:m.params,path,workshop};if(setId===void 0&&opts.resolveWorkshop&&!disposed)return{page:null,params:{[WORKSHOP_PARAM]:workshop},path,workshop};return{page:null,params:{},path}}function refreshWorkshop(workshop){const resolve=opts.resolveWorkshop;if(!resolve)return;if(resolving.has(workshop))return;const asking=resolve(workshop).then(set2=>set2!==void 0&&assembly.workshops[set2]?set2:null,e=>{diagnose({phase:"load",message:`\u5DE5\u574A ${workshop} \u7684\u5F53\u524D\u5FEB\u7167\u6CA1\u8BFB\u5230\uFF1A${errorMessage(e)}`});return currentSets.get(workshop)??null}).then(set2=>{resolving.delete(workshop);if(disposed)return;const before=currentSets.get(workshop);currentSets.set(workshop,set2);if(before===set2)return;if(workshopPageOf(route.path)===workshop)setLocation(route.path);if(route.workshop===workshop)slotChanged();for(const fn of[...pageMounts])fn()});resolving.set(workshop,asking)}function setLocation(path){const before=route.workshop;const pageWorkshop=workshopPageOf(path);const m=pageWorkshop===void 0?matchRoute(assembly.routes,path):null;if(pageWorkshop!==void 0)route=workshopPageRoute(path,pageWorkshop);else{const params=m?.params??{};const workshop2=m?workshopOf(m.pattern,params):void 0;route={page:m?.page??null,params,path,...workshop2?{workshop:workshop2}:{}}}const workshop=route.workshop;if(workshop!==void 0&&(docWorkshop===void 0||!opts.onCrossWorkshop))docWorkshop=workshop;if(workshop!==void 0&&workshop!==before)refreshWorkshop(workshop);if(m?.alias){const entry=assembly.routes.find(r=>r.page===m.page);const better=entry&&exactPath(entry,m.params);if(better&&better!==path&&better!==path.replace(/\/+$/,"")){replaceLocation(better);if(route.workshop!==before)slotChanged();return}}for(const fn of[...routeListeners])fn(route);if(route.workshop!==before)slotChanged()}function replaceLocation(path){opts.onNavigate?.(path,{replace:true});setLocation(path)}function canonicalize(page,projectId,workshop){if(workshop===void 0||route.page!==page||route.params.project!==projectId)return"stay";const entry=assembly.routes.find(r=>r.page===page);const path=entry&&exactPath(entry,{...route.params,[WORKSHOP_PARAM]:workshop});if(docWorkshop!==void 0&&docWorkshop!==workshop&&path&&handOver(path))return"handover";docWorkshop=workshop;if(route.workshop===workshop)return"stay";if(path&&path!==route.path){replaceLocation(path);return"rewrote"}return"stay"}return{async start(){const hooked=assembly.global.plugins.filter(p=>needsHook(p,"app"));await activateAll(hooked,app)},mountRoot(el){const hasRoot=visible(app,"root").length>0;if(!hasRoot){diagnose({phase:"mount",message:"\u6CA1\u6709\u63D2\u4EF6\u5360 root\uFF08\u5916\u58F3\u6CA1\u88C5\u4E0A\uFF09"});return opts.renderError(el,{message:`\u5916\u58F3\u6CA1\u88C5\u4E0A\uFF1A${diagnostics.at(-1)?.message??""}`})??(()=>{})}return mountSlot(null,app,el,"root",{owner:{},fallback:target=>opts.renderError(target,{message:"\u5916\u58F3\u6CA1\u88C5\u4E0A"})})},openProject,inspectProjectPlugins,setLocation,crossesWorkshop,route:()=>route,diagnostics:()=>diagnostics,loaded:()=>[...settled].map(k=>k.slice(k.indexOf(":")+1)),dispose(){if(disposed)return;disposed=true;for(const s of[...projects.values()])closeScope(s);projects.clear();for(const ws of[...workshopSets.values()])closeScope(ws.scope);workshopSets.clear();closeScope(app)}}}function workshopPageOf(path){const parts=path.replace(/\/+$/,"").replace(/^\/+/,"").split("/");if(parts.length<3||parts[0]!=="w"||parts[2]!==WORKSHOP_PAGE_SEGMENT||!parts[1])return void 0;try{return decodeURIComponent(parts[1])}catch{return void 0}}function checkModule(view,p,m){const activation=p.manifest.activation??[];if(activation.includes("app")!==(typeof m.activate==="function")){return activation.includes("app")?"\u6E05\u5355\u5199\u4E86 activation: app\uFF0C\u6A21\u5757\u6CA1\u6709 activate":"\u6A21\u5757\u6709 activate\uFF0C\u6E05\u5355\u7684 activation \u6CA1\u5199 app"}for(const kind of["workshop","project","view"]){const has2=typeof m.scopes?.[kind]==="function";if(activation.includes(kind)!==has2){return has2?`\u6A21\u5757\u6709 scopes.${kind}\uFF0C\u6E05\u5355\u7684 activation \u6CA1\u5199 ${kind}`:`\u6E05\u5355\u5199\u4E86 activation: ${kind}\uFF0C\u6A21\u5757\u6CA1\u6709 scopes.${kind}`}}const wanted=new Set;const chains=new Set;for(const c of p.manifest.contributes??[]){const decl=view.slots[c.slot]?.decl;if(!decl)continue;if(decl.mount!==false)wanted.add(c.id);if(decl.kind==="chain")chains.add(c.id)}const given=new Set(Object.keys(m.surfaces??{}));const missing=[...wanted].filter(id=>!given.has(id));if(missing.length>0)return`\u7F3A\u6302\u8F7D\u51FD\u6570\uFF1A${missing.join("\u3001")}`;const extra=[...given].filter(id=>!(p.manifest.contributes??[]).some(c=>c.id===id));if(extra.length>0)return`\u6302\u8F7D\u51FD\u6570 ${extra.join("\u3001")} \u5728\u6E05\u5355\u91CC\u6CA1\u6709\u5BF9\u5E94\u7684\u8D21\u732E`;const noSelect=[...chains].filter(id=>typeof m.select?.[id]!=="function");if(noSelect.length>0)return`chain \u8D21\u732E\u7F3A select\uFF1A${noSelect.join("\u3001")}`;return null}function rank(kind){return{app:0,workshop:0,project:1,view:2}[kind]}function exactPath(entry,params){const want=Object.keys(params).sort().join("/");for(const pattern of[entry.pattern,...entry.aliases]){const names=pattern.split("/").filter(s=>s.startsWith(":")).map(s=>s.slice(1)).sort().join("/");if(names===want)return buildRoute(pattern,params)}return null}function emptyData(){return{workshops:async()=>[],workshop:async()=>null,projects:async()=>[],inbox:async()=>({needsYou:[],inProgress:[]}),myArtifacts:async(query={})=>({query,counts:{joined:0,mine:0,review:0,starred:0},facets:{workshops:[],projects:[],types:[]},rows:[]}),search:async()=>({projects:[],workshops:[],threads:[]}),plugins:async()=>[],plugin:async()=>null,subscribe:()=>()=>{}}}function errorMessage(e){return e instanceof Error?e.message:String(e)}function safely(fn){try{fn()}catch{}}function projectInfoOf(id,info){if(!info)return{name:id};return{name:info.name,...info.branch!==void 0?{branch:info.branch}:{},...info.workshopName!==void 0?{workshopName:info.workshopName}:{},...info.workshopIcon!==void 0?{workshopIcon:info.workshopIcon}:{}}}function hostFor(services){services.follow();const owned=new WeakMap;return{services,access:services.access,canReadThreads:services.canReadThreads,agent:services.agent,...services.info?{info:services.info}:{},...services.shared?{shared:services.shared}:{},...services.notices?{notices:services.notices}:{},...services.upgrade?{upgrade:services.upgrade}:{},...services.deleted?{deleted:services.deleted}:{},...services.remove?{remove:services.remove}:{},status:()=>services.status(),focus:selection=>{const id=focusOf(selection);if(id!==void 0)services.focus(id)},openFocus:({selection,version})=>{const artifactId=focusOf(selection);const own=services.openFocus({...artifactId!==void 0?{artifactId}:{},...version?{version}:{}});const handle={focus:sel=>{const id=focusOf(sel);if(id!==void 0)own.focus(id)},dispose:()=>own.dispose()};owned.set(handle,own);return handle},api:({plugin,locked,track,version,live,mount,focus})=>services.api({name:plugin.as,via:plugin.name,anchors:plugin.manifest.anchors??[],resources:plugin.manifest.resources,...plugin.manifest.agent?{agent:plugin.manifest.agent}:{},locked,materialDiscussionWriter:locked&&plugin.roles.includes("comment")&&(plugin.manifest.collabFeatures?.includes("material-discussions")??false)},{track,...version?{version}:{},...live?{live:true}:{},...mount?{mount}:{},...focus&&owned.has(focus)?{focus:owned.get(focus)}:{}}),dispose:()=>services.dispose()}}function focusOf(selection){return selection?.kind==="artifact"?selection.artifactId:void 0}function surfaceErrorReason(message){const line=message.split("\n",1)[0]?.trim()||"\u51FA\u4E86\u70B9\u95EE\u9898";return line.length>160?`${line.slice(0,160)}\u2026`:line}function surfaceTitle(title){return title?.trim()?title:void 0}function renderSurfaceError(el,info){const host=el;const who=info.plugin??"\u5BBF\u4E3B";if(!info.retry){const p=document.createElement("p");p.className="band-surface-error";p.textContent=`${who}\uFF1A${info.message}`;host.appendChild(p);return()=>p.remove()}const retry=info.retry;const verb=info.load?"\u6CA1\u52A0\u8F7D\u51FA\u6765":"\u6CA1\u663E\u793A\u51FA\u6765";console.error(`[band] ${who} \u8FD9\u4E00\u5757${verb}`,info.error??info.message);const card=document.createElement("div");card.className="band-surface-error band-surface-failed";card.setAttribute("role","alert");const name=surfaceTitle(info.title);const title=document.createElement("p");title.className="band-surface-failed-title";title.textContent=`${name?`\u300C${name}\u300D`:"\u8FD9\u4E00\u5757"}${verb}`;const reason=document.createElement("p");reason.className="band-surface-failed-reason";reason.textContent=surfaceErrorReason(info.message);const button=document.createElement("button");button.type="button";button.className="btn sm";button.textContent="\u91CD\u8BD5";button.addEventListener("click",()=>retry());card.append(title,reason,button);host.appendChild(card);return()=>card.remove()}function assemble(o){const modules=new Map;const nameOf=input=>input.packageJson.name;for(const p of o.plugins)modules.set(`global:${nameOf(p.input)}`,p.module);const workshops=(o.workshops??[]).map(w=>({id:w.id,workshop:w.workshop,...w.locked?{locked:w.locked}:{},...w.views?{views:w.views}:{},...w.replace&&Object.keys(w.replace).length>0?{replace:w.replace}:{},plugins:w.plugins.map(p=>{modules.set(`${w.id}:${nameOf(p.input)}`,p.module);return p.input})}));return{input:{profile:{plugins:o.plugins.map(p=>p.input),locked:{...o.locked}},workshops},modules}}export{ANCHOR_RESOLVE_TIMEOUT_MS,BARE_HOST_GRACE_MS,EDIT_FLUSH_TIMEOUT_MS,EditFlushError,RuntimeError,assemble,canReadThreadsOf,createProjectServices,createRuntime,createSnapshotStore,defineStore,hostFor,markDiagnosticFailure,matchEvent,publishRuntimeDiagnostic,renderSurfaceError,shallowEqual,subscribeRuntimeDiagnostics,surfaceErrorReason,surfaceTitle,withDisplayDefaults};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-activity",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "项目动态:谁在什么时候做了什么,点一条意见定位到它的产物",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^2.0.0",
|
|
11
11
|
"@kanyun-ai-infra/band-project": "*",
|
|
12
|
-
"react": "^
|
|
13
|
-
"react-dom": "^
|
|
12
|
+
"react": "^19.0.0",
|
|
13
|
+
"react-dom": "^19.0.0"
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-approval",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "批准面板:批准或打回一个阶段",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^2.0.0",
|
|
11
11
|
"@kanyun-ai-infra/band-project": "*",
|
|
12
|
-
"react": "^
|
|
13
|
-
"react-dom": "^
|
|
12
|
+
"react": "^19.0.0",
|
|
13
|
+
"react-dom": "^19.0.0"
|
|
14
14
|
}
|
|
15
15
|
}
|