@weiping/wingline 0.0.0-stage → 0.1.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/dist/audit-table.d.ts +7 -0
  3. package/dist/audit-table.js +68 -0
  4. package/dist/cli.d.ts +61 -0
  5. package/dist/cli.js +323 -0
  6. package/dist/console.d.ts +33 -0
  7. package/dist/console.js +136 -0
  8. package/dist/main.d.ts +2 -0
  9. package/dist/main.js +11 -0
  10. package/dist/output.d.ts +80 -0
  11. package/dist/output.js +335 -0
  12. package/dist/tui/app.d.ts +28 -0
  13. package/dist/tui/app.js +259 -0
  14. package/dist/tui/command.d.ts +16 -0
  15. package/dist/tui/command.js +35 -0
  16. package/dist/tui/input.d.ts +14 -0
  17. package/dist/tui/input.js +67 -0
  18. package/dist/tui/items.d.ts +15 -0
  19. package/dist/tui/items.js +140 -0
  20. package/dist/tui/keys.d.ts +6 -0
  21. package/dist/tui/keys.js +41 -0
  22. package/dist/tui/reduce.d.ts +10 -0
  23. package/dist/tui/reduce.js +127 -0
  24. package/dist/tui/render.d.ts +7 -0
  25. package/dist/tui/render.js +70 -0
  26. package/dist/tui/screen.d.ts +25 -0
  27. package/dist/tui/screen.js +52 -0
  28. package/dist/tui/text.d.ts +8 -0
  29. package/dist/tui/text.js +28 -0
  30. package/dist/tui/types.d.ts +86 -0
  31. package/dist/tui/types.js +1 -0
  32. package/dist/tui/views/inbox.d.ts +4 -0
  33. package/dist/tui/views/inbox.js +23 -0
  34. package/dist/tui/views/overview.d.ts +6 -0
  35. package/dist/tui/views/overview.js +13 -0
  36. package/dist/tui/views/picker.d.ts +4 -0
  37. package/dist/tui/views/picker.js +44 -0
  38. package/dist/tui/views/timeline.d.ts +4 -0
  39. package/dist/tui/views/timeline.js +11 -0
  40. package/dist/tui/width.d.ts +4 -0
  41. package/dist/tui/width.js +45 -0
  42. package/dist/verified.json +1 -0
  43. package/dist/web/assets/index-DLO1-OIY.css +1 -0
  44. package/dist/web/assets/index-DyOl7NwF.js +2 -0
  45. package/dist/web/index.html +14 -0
  46. package/package.json +34 -3
  47. package/README.md +0 -3
@@ -0,0 +1,2 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))l(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const c of s.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&l(c)}).observe(document,{childList:!0,subtree:!0});function r(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function l(a){if(a.ep)return;a.ep=!0;const s=r(a);fetch(a.href,s)}})();var fe,w,nt,M,Be,rt,lt,we,oe,ee,st,qe,Ie,Re,at,he={},_e=[],kt=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,me=Array.isArray;function H(e,t){for(var r in t)e[r]=t[r];return e}function Ae(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function wt(e,t,r){var l,a,s,c={};for(s in t)s=="key"?l=t[s]:s=="ref"?a=t[s]:c[s]=t[s];if(arguments.length>2&&(c.children=arguments.length>3?fe.call(arguments,2):r),typeof e=="function"&&e.defaultProps!=null)for(s in e.defaultProps)c[s]===void 0&&(c[s]=e.defaultProps[s]);return ce(e,c,l,a,null)}function ce(e,t,r,l,a){var s={type:e,props:t,key:r,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:a??++nt,__i:-1,__u:0};return a==null&&w.vnode!=null&&w.vnode(s),s}function F(e){return e.children}function de(e,t){this.props=e,this.context=t}function J(e,t){if(t==null)return e.__?J(e.__,e.__i+1):null;for(var r;t<e.__k.length;t++)if((r=e.__k[t])!=null&&r.__e!=null)return r.__e;return typeof e.type=="function"?J(e):null}function $t(e){if(e.__P&&e.__d){var t=e.__v,r=t.__e,l=[],a=[],s=H({},t);s.__v=t.__v+1,w.vnode&&w.vnode(s),Oe(e.__P,s,t,e.__n,e.__P.namespaceURI,32&t.__u?[r]:null,l,r??J(t),!!(32&t.__u),a),s.__v=t.__v,s.__.__k[s.__i]=s,ut(l,s,a),t.__e=t.__=null,s.__e!=r&&it(s)}}function it(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),it(e)}function Te(e){(!e.__d&&(e.__d=!0)&&M.push(e)&&!pe.__r++||Be!=w.debounceRendering)&&((Be=w.debounceRendering)||rt)(pe)}function pe(){try{for(var e,t=1;M.length;)M.length>t&&M.sort(lt),e=M.shift(),t=M.length,$t(e)}finally{M.length=pe.__r=0}}function ot(e,t,r,l,a,s,c,d,i,o,h){var f,u,p,_,v,y,m=l&&l.__k||_e,b=t.length;for(i=St(r,t,m,i,b),f=0;f<b;f++)(p=r.__k[f])!=null&&(u=p.__i!=-1&&m[p.__i]||he,p.__i=f,y=Oe(e,p,u,a,s,c,d,i,o,h),_=p.__e,p.ref&&u.ref!=p.ref&&(u.ref&&He(u.ref,null,p),h.push(p.ref,p.__c||_,p)),v==null&&_!=null&&(v=_),4&p.__u?(i=ct(p,i,e),u.__e&&(u.__e=null)):typeof p.type=="function"&&y!==void 0?i=y:_&&(i=_.nextSibling),p.__u&=-7);return r.__e=v,i}function St(e,t,r,l,a){var s,c,d,i,o,h=r.length,f=h,u=0;for(e.__k=new Array(a),s=0;s<a;s++)(c=t[s])!=null&&typeof c!="boolean"&&typeof c!="function"?(typeof c=="string"||typeof c=="number"||typeof c=="bigint"||c.constructor==String?c=e.__k[s]=ce(null,c,null,null,null):me(c)?c=e.__k[s]=ce(F,{children:c},null,null,null):c.constructor===void 0&&c.__b>0?c=e.__k[s]=ce(c.type,c.props,c.key,c.ref?c.ref:null,c.__v):e.__k[s]=c,i=s+u,c.__=e,c.__b=e.__b+1,d=null,(o=c.__i=Ct(c,r,i,f))!=-1&&(f--,(d=r[o])&&(d.__u|=2)),d==null||d.__v==null?(o==-1&&(a>h?u--:a<h&&u++),typeof c.type!="function"&&(c.__u|=4)):o!=i&&(o==i-1?u--:o==i+1?u++:(o>i?u--:u++,c.__u|=4))):e.__k[s]=null;if(f)for(s=0;s<h;s++)(d=r[s])!=null&&(2&d.__u)==0&&(d.__e==l&&(l=J(d)),_t(d,d));return l}function ct(e,t,r){var l,a;if(typeof e.type=="function"){for(l=e.__k,a=0;l&&a<l.length;a++)l[a]&&(l[a].__=e,t=ct(l[a],t,r));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=J(e)),t=r.insertBefore(e.__e,t||null));do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function Ct(e,t,r,l){var a,s,c,d=e.key,i=e.type,o=t[r],h=o!=null&&(2&o.__u)==0;if(o===null&&d==null||h&&d==o.key&&i==o.type)return r;if(l>(h?1:0)){for(a=r-1,s=r+1;a>=0||s<t.length;)if((o=t[c=a>=0?a--:s++])!=null&&(2&o.__u)==0&&d==o.key&&i==o.type)return c}return-1}function Me(e,t,r){t[0]=="-"?e.setProperty(t,r??""):e[t]=r==null?"":typeof r!="number"||kt.test(t)?r:r+"px"}function ae(e,t,r,l,a){var s,c;e:if(t=="style")if(typeof r=="string")e.style.cssText=r;else{if(typeof l=="string"&&(e.style.cssText=l=""),l)for(t in l)r&&t in r||Me(e.style,t,"");if(r)for(t in r)l&&r[t]==l[t]||Me(e.style,t,r[t])}else if(t[0]=="o"&&t[1]=="n")s=t!=(t=t.replace(st,"$1")),c=t.toLowerCase(),t=c in e||t=="onFocusOut"||t=="onFocusIn"?c.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=r,r?l?r[ee]=l[ee]:(r[ee]=qe,e.addEventListener(t,s?Re:Ie,s)):e.removeEventListener(t,s?Re:Ie,s);else{if(a=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=r??"";break e}catch{}typeof r=="function"||(r==null||r===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&r==1?"":r))}}function ze(e){return function(t){if(this.l){var r=this.l[t.type+e];if(t[oe]==null)t[oe]=qe++;else if(t[oe]<r[ee])return;return r(w.event?w.event(t):t)}}}function Oe(e,t,r,l,a,s,c,d,i,o){var h,f,u,p,_,v,y,m,b,g,$,T,P,le,se,ke,O=t.type;if(t.constructor!==void 0)return null;128&r.__u&&(i=!!(32&r.__u),s=[d=t.__e=r.__e]),(h=w.__b)&&h(t);e:if(typeof O=="function"){f=c.length;try{if(b=t.props,g=O.prototype&&O.prototype.render,$=(h=O.contextType)&&l[h.__c],T=h?$?$.props.value:h.__:l,r.__c?m=(u=t.__c=r.__c).__=u.__E:(g?t.__c=u=new O(b,T):(t.__c=u=new de(b,T),u.constructor=O,u.render=Rt),$&&$.sub(u),u.state||(u.state={}),u.__n=l,p=u.__d=!0,u.__h=[],u._sb=[]),g&&u.__s==null&&(u.__s=u.state),g&&O.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=H({},u.__s)),H(u.__s,O.getDerivedStateFromProps(b,u.__s))),_=u.props,v=u.state,u.__v=t,p)g&&O.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),g&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(g&&O.getDerivedStateFromProps==null&&b!==_&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(b,T),t.__v==r.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(b,u.__s,T)===!1){t.__v!=r.__v&&(u.props=b,u.state=u.__s,u.__d=!1),t.__e=r.__e,t.__k=r.__k,t.__k.some(function(V){V&&(V.__=t)}),_e.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&c.push(u),d=J(r);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(b,u.__s,T),g&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(_,v,y)})}if(u.context=T,u.props=b,u.__P=e,u.__e=!1,P=w.__r,le=0,g)u.state=u.__s,u.__d=!1,P&&P(t),h=u.render(u.props,u.state,u.context),_e.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,P&&P(t),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++le<25);u.state=u.__s,u.getChildContext!=null&&(l=H(H({},l),u.getChildContext())),g&&!p&&u.getSnapshotBeforeUpdate!=null&&(y=u.getSnapshotBeforeUpdate(_,v)),se=h!=null&&h.type===F&&h.key==null?ht(h.props.children):h,d=ot(e,me(se)?se:[se],t,r,l,a,s,c,d,i,o),u.base=t.__e,t.__u&=-161,u.__h.length&&c.push(u),m&&(u.__E=u.__=null)}catch(V){if(c.length=f,t.__v=null,i||s!=null){if(V.then){for(t.__u|=i?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;s!=null&&(s[s.indexOf(d)]=null),t.__e=d}else if(s!=null)for(ke=s.length;ke--;)Ae(s[ke])}else t.__e=r.__e;t.__k==null&&(t.__k=r.__k||[]),V.then||dt(t),w.__e(V,t,r)}}else s==null&&t.__v==r.__v?(t.__k=r.__k,t.__e=r.__e):d=t.__e=It(r.__e,t,r,l,a,s,c,i,o);return(h=w.diffed)&&h(t),128&t.__u?void 0:d}function dt(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(dt))}function ut(e,t,r){for(var l=0;l<r.length;l++)He(r[l],r[++l],r[++l]);w.__c&&w.__c(t,e),e.some(function(a){try{e=a.__h,a.__h=[],e.some(function(s){s.call(a)})}catch(s){w.__e(s,a.__v)}})}function ht(e){return typeof e!="object"||e==null||e.__b>0?e:me(e)?e.map(ht):e.constructor!==void 0?null:H({},e)}function It(e,t,r,l,a,s,c,d,i){var o,h,f,u,p,_,v,y=r.props||he,m=t.props,b=t.type;if(b=="svg"?a="http://www.w3.org/2000/svg":b=="math"?a="http://www.w3.org/1998/Math/MathML":a||(a="http://www.w3.org/1999/xhtml"),s!=null){for(o=0;o<s.length;o++)if((p=s[o])&&"setAttribute"in p==!!b&&(b?p.localName==b:p.nodeType==3)){e=p,s[o]=null;break}}if(e==null){if(b==null)return document.createTextNode(m);e=document.createElementNS(a,b,m.is&&m),d&&(w.__m&&w.__m(t,s),d=!1),s=null}if(b==null)y===m||d&&e.data==m||(e.data=m);else{if(s=b=="textarea"&&m.defaultValue!=null?null:s&&fe.call(e.childNodes),!d&&s!=null)for(y={},o=0;o<e.attributes.length;o++)y[(p=e.attributes[o]).name]=p.value;for(o in y)p=y[o],o=="dangerouslySetInnerHTML"?f=p:o=="children"||o in m||o=="value"&&"defaultValue"in m||o=="checked"&&"defaultChecked"in m||ae(e,o,null,p,a);for(o in m)p=m[o],o=="children"?u=p:o=="dangerouslySetInnerHTML"?h=p:o=="value"?_=p:o=="checked"?v=p:d&&typeof p!="function"||y[o]===p||ae(e,o,p,y[o],a);if(h)d||f&&(h.__html==f.__html||h.__html==e.innerHTML)||(e.innerHTML=h.__html),t.__k=[];else if(f&&(e.innerHTML=""),ot(t.type=="template"?e.content:e,me(u)?u:[u],t,r,l,b=="foreignObject"?"http://www.w3.org/1999/xhtml":a,s,c,s?s[0]:r.__k&&J(r,0),d,i),s!=null)for(o=s.length;o--;)Ae(s[o]);d&&b!="textarea"||(o="value",b=="progress"&&_==null?e.removeAttribute("value"):_!=null&&(_!==e[o]||b=="progress"&&!_||b=="option"&&_!=y[o])&&ae(e,o,_,y[o],a),o="checked",v!=null&&v!=e[o]&&ae(e,o,v,y[o],a))}return e}function He(e,t,r){try{if(typeof e=="function"){var l=typeof e.__u=="function";l&&e.__u(),l&&t==null||(e.__u=e(t))}else e.current=t}catch(a){w.__e(a,r)}}function _t(e,t,r){var l,a;if(w.unmount&&w.unmount(e),(l=e.ref)&&(l.current&&l.current!=e.__e||He(l,null,t)),(l=e.__c)!=null){if(l.componentWillUnmount)try{l.componentWillUnmount()}catch(s){w.__e(s,t)}l.base=l.__P=l.__n=null}if(l=e.__k)for(a=0;a<l.length;a++)l[a]&&_t(l[a],t,r||typeof e.type!="function");r||Ae(e.__e),e.__c=e.__=e.__e=void 0}function Rt(e,t,r){return this.constructor(e,r)}function Tt(e,t,r){var l,a,s,c;t==document&&(t=document.documentElement),w.__&&w.__(e,t),a=(l=!1)?null:t.__k,s=[],c=[],Oe(t,e=t.__k=wt(F,null,[e]),a||he,he,t.namespaceURI,a?null:t.firstChild?fe.call(t.childNodes):null,s,a?a.__e:t.firstChild,l,c),ut(s,e,c),e.props.children=null}function xt(e){function t(r){var l,a;return this.getChildContext||(l=new Set,(a={})[t.__c]=this,this.getChildContext=function(){return a},this.componentWillUnmount=function(){l=null},this.shouldComponentUpdate=function(s){this.props.value!=s.value&&l.forEach(function(c){c.__e=!0,Te(c)})},this.sub=function(s){l.add(s);var c=s.componentWillUnmount;s.componentWillUnmount=function(){l&&l.delete(s),c&&c.call(s)}}),r.children}return t.__c="__cC"+at++,t.__=e,t.Provider=t.__l=(t.Consumer=function(r,l){return r.children(l)}).contextType=t,t}fe=_e.slice,w={__e:function(e,t,r,l){for(var a,s,c;t=t.__;)if((a=t.__c)&&!a.__)try{if((s=a.constructor)&&s.getDerivedStateFromError!=null&&(a.setState(s.getDerivedStateFromError(e)),c=a.__d),a.componentDidCatch!=null&&(a.componentDidCatch(e,l||{}),c=a.__d),c)return a.__E=a}catch(d){e=d}throw e}},nt=0,de.prototype.setState=function(e,t){var r;r=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=H({},this.state),typeof e=="function"&&(e=e(H({},r),this.props)),e&&H(r,e),e!=null&&this.__v&&(t&&this._sb.push(t),Te(this))},de.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Te(this))},de.prototype.render=F,M=[],rt=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,lt=function(e,t){return e.__v.__b-t.__v.__b},pe.__r=0,we=Math.random().toString(8),oe="__d"+we,ee="__a"+we,st=/(PointerCapture)$|Capture$/i,qe=0,Ie=ze(!1),Re=ze(!0),at=0;var Et=0;function n(e,t,r,l,a,s){t||(t={});var c,d,i=t;if("ref"in i)for(d in i={},t)d=="ref"?c=t[d]:i[d]=t[d];var o={type:e,props:i,key:r,ref:c,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Et,__i:-1,__u:0,__source:a,__self:s};if(typeof e=="function"&&(c=e.defaultProps))for(d in c)i[d]===void 0&&(i[d]=c[d]);return w.vnode&&w.vnode(o),o}class j extends Error{kind;code;status;hint;retry;retryRequest;detail;constructor(t,r){super(r.message),this.name="ApiError",this.status=t,this.kind=r.kind,this.code=r.code,this.hint=r.hint,this.retry=r.retry,this.retryRequest=r.retryRequest,this.detail=r.detail}}let $e=null;async function xe(e,t,r,l={}){const a={method:e,headers:{...l},credentials:"same-origin"};r!==void 0&&(a.headers={...l,"Content-Type":"application/json"},a.body=JSON.stringify(r));const s=await fetch(t,a);let c;try{c=await s.json()}catch{throw new j(s.status,{kind:"internal",code:"bad_response",message:`服务返回了无法识别的内容(HTTP ${s.status})`})}if(!c.ok){const d=s.status===401?"unauthenticated":c.error.code;throw new j(s.status,{...c.error,code:d})}return c.result}function Pt(){return $e??=xe("GET","/api/session").then(e=>e.csrfToken,e=>{throw $e=null,e}),$e}const C={get(e){return xe("GET",e)},async post(e,t){const r=await Pt();return xe("POST",e,t,{"X-Wingline-Token":r})}};function ge(e){return e instanceof j?e.code==="unauthenticated"?"会话已过期,请运行 wl console --link 获取新链接":e.hint?`${e.message}(${e.hint})`:e.message:e instanceof Error?e.message:String(e)}const Ut=e=>e instanceof j&&e.code==="unauthenticated";var X,S,Se,je,te=0,pt=[],I=w,We=I.__b,Je=I.__r,Ke=I.diffed,Ve=I.__c,Ge=I.unmount,Ye=I.__;function ve(e,t){I.__h&&I.__h(S,e,te||t),te=0;var r=S.__H||(S.__H={__:[],__h:[]});return e>=r.__.length&&r.__.push({}),r.__[e]}function k(e){return te=1,Dt(gt,e)}function Dt(e,t,r){var l=ve(X++,2);if(l.t=e,!l.__c&&(l.__=[gt(void 0,t),function(d){var i=l.__N?l.__N[0]:l.__[0],o=l.t(i,d);i!==o&&(l.__N=[o,l.__[1]],l.__c.setState({}))}],l.__c=S,!S.__f)){var a=function(d,i,o){if(!l.__c.__H)return!0;var h=!1,f=l.__c.props!==d;if(l.__c.__H.__.some(function(p){if(p.__N){h=!0;var _=p.__[0];p.__=p.__N,p.__N=void 0,_!==p.__[0]&&(f=!0)}}),s){var u=s.call(this,d,i,o);return h?u||f:u}return!h||f};S.__f=!0;var s=S.shouldComponentUpdate,c=S.componentWillUpdate;S.componentWillUpdate=function(d,i,o){if(this.__e){var h=s;s=void 0,a(d,i,o),s=h}c&&c.call(this,d,i,o)},S.shouldComponentUpdate=a}return l.__N||l.__}function B(e,t){var r=ve(X++,3);!I.__s&&mt(r.__H,t)&&(r.__=e,r.u=t,S.__H.__h.push(r))}function L(e){return te=5,ft(function(){return{current:e}},[])}function ft(e,t){var r=ve(X++,7);return mt(r.__H,t)&&(r.__=e(),r.__H=t,r.__h=e),r.__}function Lt(e,t){return te=8,ft(function(){return e},t)}function Nt(e){var t=S.context[e.__c],r=ve(X++,9);return r.c=e,t?(r.__==null&&(r.__=!0,t.sub(S)),t.props.value):e.__}function qt(){for(var e;e=pt.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(ue),t.__h.some(Ee),t.__h=[]}catch(r){t.__h=[],I.__e(r,e.__v)}}}I.__b=function(e){S=null,We&&We(e)},I.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Ye&&Ye(e,t)},I.__r=function(e){Je&&Je(e),X=0;var t=(S=e.__c).__H;t&&(Se===S?(t.__h=[],S.__h=[],t.__.some(function(r){r.__N&&(r.__=r.__N),r.u=r.__N=void 0})):(t.__h.some(ue),t.__h.some(Ee),t.__h=[],X=0)),Se=S},I.diffed=function(e){Ke&&Ke(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(pt.push(t)!==1&&je===I.requestAnimationFrame||((je=I.requestAnimationFrame)||At)(qt)),t.__H.__.some(function(r){r.u&&(r.__H=r.u,r.u=void 0)})),Se=S=null},I.__c=function(e,t){t.some(function(r){try{r.__h.some(ue),r.__h=r.__h.filter(function(l){return!l.__||Ee(l)})}catch(l){t.some(function(a){a.__h&&(a.__h=[])}),t=[],I.__e(l,r.__v)}}),Ve&&Ve(e,t)},I.unmount=function(e){Ge&&Ge(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.some(function(l){try{ue(l)}catch(a){t=a}}),r.__H=void 0,t&&I.__e(t,r.__v))};var Xe=typeof requestAnimationFrame=="function";function At(e){var t,r=function(){clearTimeout(l),Xe&&cancelAnimationFrame(t),setTimeout(e)},l=setTimeout(r,35);Xe&&(t=requestAnimationFrame(r))}function ue(e){var t=S,r=e.__c;typeof r=="function"&&(e.__c=void 0,r()),S=t}function Ee(e){var t=S;e.__c=e.__(),S=t}function mt(e,t){return!e||e.length!==t.length||t.some(function(r,l){return r!==e[l]})}function gt(e,t){return typeof t=="function"?t(e):t}function N(e){const[t,r]=k(null),[l,a]=k(null),[s,c]=k(0);return B(()=>{if(e===null)return;let d=!0;return C.get(e).then(i=>{d&&(r(i),a(null))},i=>{d&&a(i)}),()=>{d=!1}},[e,s]),{data:t,error:l,reload:()=>c(d=>d+1)}}function Ot(e){if(e==="/"||e==="")return{name:"home"};if(e==="/settings")return{name:"settings"};const t=l=>{try{return decodeURIComponent(l)}catch{return null}},r=[[/^\/t\/([^/]+)\/?$/,l=>t(l[1])===null?null:{name:"overview",team:t(l[1])}],[/^\/t\/([^/]+)\/inbox$/,l=>t(l[1])===null?null:{name:"inbox",team:t(l[1])}],[/^\/t\/([^/]+)\/tasks$/,l=>t(l[1])===null?null:{name:"board",team:t(l[1])}],[/^\/t\/([^/]+)\/log$/,l=>t(l[1])===null?null:{name:"log",team:t(l[1])}],[/^\/t\/([^/]+)\/edit$/,l=>t(l[1])===null?null:{name:"edit",team:t(l[1])}],[/^\/t\/([^/]+)\/tasks\/([^/]+)$/,l=>t(l[1])===null||t(l[2])===null?null:{name:"task",team:t(l[1]),id:t(l[2])}],[/^\/t\/([^/]+)\/posts\/([^/]+)$/,l=>t(l[1])===null||t(l[2])===null?null:{name:"post",team:t(l[1]),post:t(l[2])}]];for(const[l,a]of r){const s=e.match(l);if(s)return a(s)??{name:"notfound"}}return{name:"notfound"}}function vt(e){location.pathname!==e&&(history.pushState(null,"",e),window.dispatchEvent(new PopStateEvent("popstate")))}function Ht(){const[e,t]=k(()=>location.pathname);return B(()=>{const r=()=>t(location.pathname);return window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)},[]),Ot(e)}const Q=(e,t="")=>`/t/${encodeURIComponent(e)}${t}`,Pe=(e,t)=>Q(e,`/posts/${encodeURIComponent(t)}`),W=(e,t)=>Q(e,`/tasks/${encodeURIComponent(t)}`),Ft=5e3,Bt=3;function Mt(e,t){const[r,l]=k("reconnecting"),[a,s]=k(0),c=L(t);return c.current=t,B(()=>{let d=null,i,o=0,h=!1;const f=()=>{i=setTimeout(u,Ft)},u=()=>{h||(d=new EventSource(`/api/teams/${encodeURIComponent(e)}/events`),d.onopen=()=>{o=0,s(p=>p+1),l("live")},d.addEventListener("timeline",p=>c.current.timeline(JSON.parse(p.data))),d.addEventListener("snapshot",p=>c.current.snapshot(JSON.parse(p.data))),d.onerror=()=>{if(d?.close(),d=null,!h){if(o+=1,l("reconnecting"),o<Bt)return f();C.get("/api/session").then(()=>f(),p=>{if(p instanceof j&&p.code==="unauthenticated"){h=!0,l("closed");return}f()})}})};return u(),()=>{h=!0,clearTimeout(i),d?.close()}},[e]),{state:r,connection:a}}const bt=xt(null);function zt({team:e,children:t}){const r=L(new Set),[l,a]=k(null),{state:s,connection:c}=Mt(e,{timeline:o=>{for(const h of r.current)h.timeline?.(o)},snapshot:o=>{a(o);for(const h of r.current)h.snapshot?.(o)}}),d=Lt(o=>(r.current.add(o),()=>{r.current.delete(o)}),[]),i={state:s,connection:c,snapshot:l,listen:d};return n(bt.Provider,{value:i,children:t})}function be(){const e=Nt(bt);if(!e)throw new Error("useStream 必须在 StreamProvider 内使用");return e}function K(e){const{listen:t}=be(),r=L(e);r.current=e,B(()=>t({timeline:l=>r.current.timeline?.(l),snapshot:l=>r.current.snapshot?.(l)}),[t])}function D(e){return n("a",{href:e.href,class:e.class,onClick:t=>{t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.button!==0||(t.preventDefault(),vt(e.href))},children:e.children})}function q({what:e="加载中…"}){return n("p",{class:"muted",children:e})}function A({error:e}){return n("p",{class:"error",role:"alert",children:ge(e)})}function E({tone:e="neutral",children:t}){return n("span",{class:`pill pill-${e}`,children:t})}function R({title:e,count:t,children:r}){return n("section",{class:"section",children:[n("h2",{children:[e,t!==void 0&&n("span",{class:"count",children:t})]}),r]})}function yt(e){const t=new Date(e);if(Number.isNaN(t.getTime()))return e;const r=l=>String(l).padStart(2,"0");return`${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}const U=e=>e.split("@")[0]??e,jt={task:"任务",patrol:"巡查",command:"命令"},Wt=[{label:"总览",sub:""},{label:"收件箱",sub:"/inbox"},{label:"任务看板",sub:"/tasks"},{label:"时间线",sub:"/log"},{label:"编辑",sub:"/edit"}],Jt={live:["实时","ok"],reconnecting:["重连中","warn"],closed:["已断开","bad"]};function ie(e){return n("div",{class:"shell",children:[n("aside",{class:"side",children:[n("div",{class:"brand",children:"雁阵"}),e.teams.length>0?n("select",{class:"team-switch","aria-label":"团队",value:e.team??"",onChange:t=>vt(Q(t.target.value)),children:[!e.team&&n("option",{value:""}),e.teams.map(t=>n("option",{value:t,children:t},t))]}):n("p",{class:"muted small",children:"还没有团队"}),e.team&&n("nav",{children:Wt.map(t=>n(D,{href:Q(e.team,t.sub),class:"nav-link",children:t.label},t.sub))}),n("nav",{class:"side-foot",children:n(D,{href:"/settings",class:"nav-link",children:"关于"})})]}),n("div",{class:"main",children:e.children})]})}function Kt(){const{state:e}=be();return e==="live"?null:n("p",{class:e==="closed"?"banner error":"banner",role:"status",children:e==="closed"?"会话已过期,请运行 wl console --link 获取新链接":"与服务的连接中断,重连中…"})}function Vt(){const{state:e,snapshot:t}=be(),[r,l]=Jt[e],a=t?.attentionCounts,s=a?a.frozen+a.signals+a.questions+a.stale+(a.warnings??0):0;return n("header",{class:"topbar",children:[n(E,{tone:l,children:r}),n("span",{class:"badge","aria-label":"待办",children:["待办 ",s]}),t&&n("span",{class:"muted small",children:["调度员:",t.dispatcher]})]})}let Gt=0,ne=[];const Ue=new Set;function Qe(e){ne=e;for(const t of Ue)t(ne)}function Yt(e,t="ok"){const r={id:++Gt,text:e,tone:t};Qe([...ne,r]),setTimeout(()=>Qe(ne.filter(l=>l.id!==r.id)),4e3)}function Xt(){const[e,t]=k(ne);return B(()=>(Ue.add(t),()=>{Ue.delete(t)}),[]),n("div",{class:"toasts",role:"status","aria-live":"polite",children:e.map(r=>n("div",{class:`toast toast-${r.tone}`,children:r.text},r.id))})}function x(e){const t=e.fields??[],[r,l]=k(!1),[a,s]=k({}),[c,d]=k(!1),[i,o]=k(null),[h,f]=k(null),u=()=>{const _={};for(const v of t)_[v.name]=v.initial??"";s(_),o(null),f(null)},p=async(_,v)=>{const y=t.filter(m=>m.required&&!_[m.name]?.trim());if(y.length>0){o(`请填写:${y.map(m=>m.label).join("、")}`);return}d(!0),o(null);try{await e.onSubmit(_,v),Yt(`${e.title}:已完成`),l(!1),f(null),e.onDone?.()}catch(m){o(ge(m)),m instanceof j&&m.retryRequest&&f({values:_,retryRequest:m.retryRequest})}finally{d(!1)}};return r?n("div",{class:"dialog-backdrop",children:n("div",{class:"dialog",role:"dialog","aria-modal":"true","aria-label":e.title,children:[n("h3",{children:e.title}),n("form",{onSubmit:_=>{_.preventDefault(),p(a)},children:[t.map(_=>n("label",{class:"field",children:[n("span",{children:[_.label,_.required?" *":""]}),_.kind==="textarea"?n("textarea",{value:a[_.name]??"",onInput:v=>s({...a,[_.name]:v.target.value})}):_.kind==="select"?n("select",{value:a[_.name]??"",onChange:v=>s({...a,[_.name]:v.target.value}),children:[n("option",{value:""}),(_.options??[]).map(v=>n("option",{value:v,children:v},v))]}):n("input",{type:_.kind==="number"?"number":"text",value:a[_.name]??"",onInput:v=>s({...a,[_.name]:v.target.value})})]},_.name)),i&&n("p",{class:"error",role:"alert",children:i}),n("div",{class:"dialog-actions",children:[n("button",{type:"button",class:"btn ghost",onClick:()=>l(!1),disabled:c,children:"取消"}),h?n("button",{type:"button",class:"btn",disabled:c,onClick:()=>{p(h.values,h.retryRequest)},children:"按原样重试"}):n("button",{type:"submit",class:e.danger?"btn danger":"btn",disabled:c,children:e.submitLabel??"确认"})]})]})]})}):n("button",{type:"button",class:e.danger?"btn danger":"btn",onClick:()=>{u(),l(!0)},children:e.label})}const re=e=>e.join("."),Qt=(e,t)=>t.every((r,l)=>String(e[l])===String(r)),G=(e,t)=>t.reduce((r,l)=>r?.[l],e);function ye(e){const t=e.errors.find(r=>Qt(r.path,e.path));return n("div",{class:e.inline?"field check":"field","data-field":re(e.path),children:[n("label",{children:[n("span",{children:e.label}),e.children]}),t&&n("p",{class:"error small",role:"alert",children:t.message})]})}function z(e){return n(ye,{...e,children:n("input",{"data-path":re(e.path),value:typeof e.value=="string"?e.value:"",placeholder:e.placeholder,disabled:e.disabled,onInput:t=>{const r=t.target.value;e.onSet(e.path,r===""&&!e.required?null:r)}})})}function Ce(e){return n(ye,{...e,children:n("input",{type:"number","data-path":re(e.path),value:typeof e.value=="number"?e.value:"",placeholder:e.placeholder,disabled:e.disabled,onInput:t=>{const r=t.target.value.trim();e.onSet(e.path,r===""?null:Number(r))}})})}function De(e){return n(ye,{...e,inline:!0,children:n("input",{type:"checkbox","data-path":re(e.path),checked:typeof e.value=="boolean"?e.value:e.fallback,disabled:e.disabled,onChange:t=>e.onSet(e.path,t.target.checked)})})}const Ze=e=>e.split(",").map(t=>t.trim()).filter(Boolean);function Le(e){const t=Array.isArray(e.value)?e.value:[],[r,l]=k(t.join(", "));return B(()=>{JSON.stringify(Ze(r))!==JSON.stringify(t)&&l(t.join(", "))},[JSON.stringify(t)]),n(ye,{...e,children:n("input",{"data-path":re(e.path),value:r,placeholder:e.placeholder??"用逗号分隔",disabled:e.disabled,onInput:a=>{const s=a.target.value;l(s);const c=Ze(s);e.onSet(e.path,c.length===0?null:c)}})})}const Zt=[["no_progress_minutes",20],["prompt_minutes",5],["owner_idle_minutes",30],["post_failure_streak",3]],en=[["freeze_lead",!1],["auto_recover",!1],["worktree_comment",!1],["workspace_status",!0],["unread_mark",!0]],tn=[["max_gate_failures",3],["gate_timeout_seconds",600]];function nn({i:e,post:t,c:r}){const l=s=>["posts",e,s],a=s=>({...r,path:l(s),label:s,value:t?.[s]});return n("fieldset",{class:"card",children:[n("legend",{children:["岗位 ",String(t?.id??e)]}),n(z,{...a("id"),required:!0}),n(z,{...a("agent"),required:!0}),n(z,{...a("model")}),n(z,{...a("launch")}),n(z,{...a("environment"),placeholder:"本机(或 Orca 里的已配对环境名,如 lima-agent)"}),n(z,{...a("worktree"),placeholder:"current"}),n(Le,{...a("brief")}),n(Le,{...a("tags")}),n(De,{...a("self_claim"),fallback:!1}),n(De,{...a("plan_first"),fallback:!1})]})}function rn({ids:e,c:t,parsed:r}){return n(F,{children:e.map(l=>n("fieldset",{class:"card",children:[n("legend",{children:[l," 的协作与闸门"]}),["reviewed_by","hands_to","consults"].map(a=>n(Le,{...t,path:["links",l,a],label:`links.${a}`,value:G(r,["links",l,a])},a)),n(z,{...t,path:["gates",l],label:"gates(闸门命令)",value:G(r,["gates",l])})]},l))})}function ln({parsed:e,errors:t,disabled:r,onSet:l}){const a={errors:t,disabled:r,onSet:l},s=Array.isArray(e?.posts)?e.posts:[],c=s.map(d=>String(d?.id??"")).filter(Boolean);return n("form",{class:"spec-form",onSubmit:d=>d.preventDefault(),children:[n("fieldset",{class:"card",children:[n("legend",{children:"团队"}),n(z,{...a,path:["lead"],label:"lead(牵头岗)",value:e?.lead,required:!0})]}),s.map((d,i)=>n(nn,{i,post:d,c:a},i)),n(rn,{ids:c,c:a,parsed:e}),n("fieldset",{class:"card",children:[n("legend",{children:"预算 budgets.task"}),tn.map(([d,i])=>n(Ce,{...a,path:["budgets","task",d],label:d,value:G(e,["budgets","task",d]),placeholder:String(i)},d)),n(Ce,{...a,path:["budgets","task","max_minutes"],label:"max_minutes",value:G(e,["budgets","task","max_minutes"])})]}),n("fieldset",{class:"card",children:[n("legend",{children:"巡查 patrol"}),Zt.map(([d,i])=>n(Ce,{...a,path:["patrol",d],label:d,value:G(e,["patrol",d]),placeholder:String(i)},d)),en.map(([d,i])=>n(De,{...a,path:["patrol",d],label:d,value:G(e,["patrol",d]),fallback:i},d))]})]})}function sn(e,t){const[r,l,a]=e;return r==="lead"?!0:r==="posts"?typeof l=="number"&&["id","agent","model","launch","environment","worktree","brief","tags","self_claim","plan_first"].includes(String(a)):r==="links"||r==="gates"?e.length>=2&&t.includes(String(l)):r==="budgets"?l==="task"&&e.length>=3:r==="patrol"?e.length>=2&&l!=="notify":!1}function Y({command:e,note:t}){const[r,l]=k(!1);return n("div",{class:"cmd",children:[t&&n("span",{class:"muted",children:t}),n("code",{children:e}),n("button",{type:"button",class:"btn ghost small",onClick:async()=>{try{await navigator.clipboard.writeText(e),l(!0)}catch{l(!1)}},children:r?"已复制":"复制"})]})}const an={added:["新增","ok","新增岗位:wl up 会新开终端并发送启动包。"],kept:["不变","neutral","配置没变。"],launch_changed:["启动变化","warn","启动参数有变化:岗位终端还在时 wl up 会保持原终端,新的启动参数要等终端重建后才生效。"],removed:["删除","bad","岗位被删除:wl up 不会关闭它的终端,该终端将不再归雁阵管理,请先关闭它。"],brief_changed:["简报变化","neutral","简报路径变化,只影响之后新开的会话。"]},et=e=>e==null?"—":typeof e=="string"?e:JSON.stringify(e);function on({preview:e,team:t}){return n("section",{class:"card","data-testid":"preview",children:[n("h2",{children:"预演"}),n("ul",{class:"preview-posts",children:e.posts.map(r=>{const[l,a,s]=an[r.kind];return n("li",{children:[n("strong",{children:r.id})," ",n(E,{tone:a,children:l})," ",n("span",{class:"muted small",children:[s,r.fields?.length?`(${r.fields.join("、")})`:""]})]},r.id)})}),e.fields.length>0&&n("ul",{class:"preview-fields",children:e.fields.map(r=>n("li",{children:[n("code",{children:r.path})," ",n("span",{children:`${et(r.before)} → ${et(r.after)}`})]},r.path))}),n("p",{class:"muted small",children:"保存后在终端依次执行:"}),e.commands.map(r=>n(Y,{command:r},r)),e.closeSuggested&&n("p",{class:"muted small",children:["有岗位的启动参数变化或被删除,需要立即生效或释放旧终端时可改用 ",n("code",{children:`wl down ${t} --close`}),"。"]})]})}const cn=400;function dn(e,t,r){const l=JSON.parse(JSON.stringify(e??{}));let a=l;for(let c=0;c<t.length-1;c++){const d=t[c];a[d]??=typeof t[c+1]=="number"?[]:{},a=a[d]}const s=t[t.length-1];return r===null?delete a[s]:a[s]=r,l}async function un(e,t,r,l){if(r.length===0)return e({yaml:t.current});let a;for(const s of r){if(a=await e({yaml:t.current,set:s}),!l())return a;t.current=a.yaml}return a}function hn(e,t){const[r,l]=k({yaml:t.yaml,parsed:t.parsed,errors:[],preview:null,problem:null}),[a,s]=k(!1),c=L(t.yaml),d=L(t.parsed),i=L(),o=L([]),h=L(0),f=L(0),u=L(Promise.resolve());r.parsed!==null&&(d.current=r.parsed);const p=$=>C.post(`/api/teams/${encodeURIComponent(e)}/spec/validate`,$),_=async()=>{const $=h.current,T=f.current;try{const P=await un(p,c,o.current.splice(0),()=>f.current===T);h.current===$&&l({yaml:P.yaml,parsed:P.parsed,errors:P.errors,preview:P.preview,problem:null})}catch(P){l(le=>({...le,problem:ge(P)}))}h.current===$&&s(!1)},v=()=>{clearTimeout(i.current),u.current=u.current.then(_)};B(()=>()=>clearTimeout(i.current),[]);const y=()=>{h.current+=1,s(!0),clearTimeout(i.current),i.current=setTimeout(v,cn)},m=$=>{c.current=$,o.current=[],f.current+=1,l(T=>({...T,yaml:$})),y()},b=($,T)=>{o.current.push({path:$,value:T}),l(P=>({...P,parsed:dn(P.parsed,$,T)})),y()},g=$=>l(T=>({...T,errors:$}));return{shown:r,formParsed:r.parsed??d.current,dirty:a,latest:c,onYaml:m,onSet:b,flushNow:v,setErrors:g}}function _n(e){const[t,r]=k(!1),[l,a]=k(null),[s,c]=k(null),d=async()=>{r(!0),c(null);try{const i={yaml:e.yaml.current,running:e.spec.running,baseHash:e.spec.running?e.base.draftHash:e.base.hash},o=await C.post(`/api/teams/${encodeURIComponent(e.team)}/spec`,i);e.setBase(h=>o.wrote==="draft"?{...h,draftHash:o.hash,hasDraft:!0}:{...h,hash:o.hash}),a(o)}catch(i){i instanceof j&&i.detail?.errors&&e.setErrors(i.detail.errors),c({text:ge(i),conflict:i instanceof j&&i.code==="spec_conflict"})}finally{r(!1)}};return n("div",{class:"save-panel",children:[n("button",{type:"button",class:"btn",disabled:e.blocked||t,onClick:()=>{d()},children:e.spec.running?"保存为草稿":"保存"}),l&&n("p",{class:"muted small",role:"status",children:["已保存到 ",n("code",{children:l.path}),"(",l.wrote==="draft"?"草稿":"正式规格",")"]}),l?.wrote==="spec"&&e.base.hasDraft&&n("p",{class:"banner",role:"status",children:["旁边还留着一份旧草稿 ",n("code",{children:"team.draft.yaml"}),":之后执行 ",n("code",{children:"wl up --draft"})," 会用它覆盖这次保存的内容。不需要了就点上方的“丢弃草稿”。"]}),s&&n("p",{class:"error",role:"alert",children:[s.text," ",s.conflict&&n("button",{type:"button",class:"btn ghost small",onClick:e.reload,children:"重新加载"})]})]})}function tt({errors:e}){return e.length===0?null:n("ul",{class:"spec-errors",role:"alert",children:e.map(t=>n("li",{class:"error small",children:t.message},`${t.path.join(".")}:${t.code}`))})}function pn(e){const t=(r,l)=>n("button",{type:"button",class:e.view===r?"btn":"btn ghost","aria-pressed":e.view===r,onClick:()=>e.show(r),children:l});return n("div",{class:"tabs",role:"group","aria-label":"视图",children:[t("form","表单视图"),t("yaml","YAML 视图")]})}function fn(e){return n("div",{class:"banner",children:["当前打开的是未应用的草稿。"," ",n(x,{label:"丢弃草稿",title:"丢弃草稿",danger:!0,onSubmit:(t,r)=>C.post(`/api/teams/${encodeURIComponent(e.team)}/spec/discard-draft`,r?{retryRequest:r}:{}),onDone:e.reload})]})}function mn({view:e,ed:t}){const{shown:r}=t,l=(t.formParsed?.posts??[]).map(a=>String(a?.id??""));return e==="yaml"?n(F,{children:[n("textarea",{class:"yaml","aria-label":"YAML",spellcheck:!1,rows:26,value:r.yaml,onInput:a=>t.onYaml(a.target.value)}),n(tt,{errors:r.errors})]}):n(F,{children:[r.parsed===null&&n("p",{class:"banner error",children:"YAML 有语法错误,表单只读,请切到 YAML 视图修正。"}),n(tt,{errors:r.errors.filter(a=>!sn(a.path,l))}),n(ln,{parsed:t.formParsed,errors:r.errors,disabled:r.parsed===null,onSet:t.onSet})]})}function gn({team:e,spec:t,reload:r}){const l=hn(e,t.draft??t),[a,s]=k("form"),[c,d]=k({hash:t.hash,draftHash:t.draft?.hash??null,hasDraft:t.draft!==null}),{shown:i}=l,o=h=>{l.flushNow(),s(h)};return n("div",{class:"page",children:[n("header",{class:"page-head",children:[n("h1",{children:["编辑 ",e]}),n("span",{class:"muted small",children:t.specPath})]}),t.running&&n("p",{class:"banner",children:"团队正在运行:保存会写入草稿,不影响运行;停掉团队后用 wl up --draft 应用。"}),c.hasDraft&&n(fn,{team:e,reload:r}),n(pn,{view:a,show:o}),n(mn,{view:a,ed:l}),i.problem&&n("p",{class:"error",role:"alert",children:i.problem}),i.preview&&n(on,{preview:i.preview,team:e}),n(_n,{team:e,spec:t,base:c,setBase:d,yaml:l.latest,setErrors:l.setErrors,reload:r,blocked:l.dirty||i.errors.length>0||i.parsed===null}),n("p",{class:"muted small",children:"team.yaml 视为可信配置:launch、gates、notify.command 会在本机执行,请只保存你信任的内容。"})]})}function vn({team:e}){const t=N(`/api/teams/${encodeURIComponent(e)}/spec`),r=L(0),l=L(null);return t.data!==l.current&&(l.current=t.data,r.current+=1),t.error?n(A,{error:t.error}):t.data?n(gn,{team:e,spec:t.data,reload:t.reload},r.current):n(q,{})}const bn={done_unfinished:"已完成但未收尾",call_uncertain:"调用结果不确定",dead_assignee:"派发失主",owner_idle:"主人迟迟未开始",bypassed:"绕过闸门上报",blocked_waiting:"等待决策"},Z=()=>n("p",{class:"muted small",children:"暂无"});function yn({team:e}){const t=encodeURIComponent(e),r=N(`/api/teams/${t}/attention`);if(K({snapshot:()=>r.reload()}),r.error)return n(A,{error:r.error});if(!r.data)return n(q,{});const l=r.data,a=()=>r.reload(),s=`/api/teams/${t}/tasks`,c=l.stale.filter(i=>i.reason==="blocked_waiting"),d=l.stale.filter(i=>i.reason!=="blocked_waiting");return n("div",{class:"page",children:[n("header",{class:"page-head",children:n("h1",{children:"收件箱"})}),l.warnings.length>0&&n("div",{class:"warnings",children:l.warnings.map(i=>n("p",{class:"error",children:i},i))}),l.dispatcher.state!=="running"&&n(R,{title:"调度员",children:[n("p",{class:"error",children:"调度员不在运行,提问转达与巡查暂停。"}),n(Y,{command:`wl dispatcher up ${e}`})]}),n(R,{title:"待回答的提问",count:l.questions.length,children:l.questions.length===0?n(Z,{}):l.questions.map(i=>n("div",{class:"row",children:[n("div",{children:[n("strong",{children:U(i.asker)})," 问:",i.body,i.options.length>0&&n("span",{class:"muted small",children:[" 选项:",i.options.join(" / ")]})]}),n(x,{label:"回答",title:"回答提问",fields:[{name:"body",label:"回答",kind:"textarea",required:!0}],onSubmit:o=>C.post(`/api/teams/${t}/questions/${encodeURIComponent(i.messageId)}/reply`,{body:o.body}),onDone:a})]},i.messageId))}),n(R,{title:"等待决策的 gate",count:c.length,children:c.length===0?n(Z,{}):c.map(i=>n("div",{class:"row",children:[n("div",{children:[n(D,{href:W(e,i.taskId),children:i.title})," ",n(E,{tone:"bad",children:"等待决策"})," ",n("span",{class:"muted small",children:["归属 ",i.owner?U(i.owner):"—"]})]}),i.gateId?n(x,{label:"处理闸门",title:`处理闸门 ${i.gateId}`,fields:[{name:"resolution",label:"处理说明",kind:"textarea",required:!0},{name:"reassign",label:"改派新主人(岗位名,可选)"}],onSubmit:(o,h)=>C.post(`/api/teams/${t}/gates/${encodeURIComponent(i.gateId)}/resolve`,{resolution:o.resolution,...o.reassign?.trim()?{reassign:o.reassign.trim()}:{},...h?{retryRequest:h}:{}}),onDone:a}):n(Y,{command:i.command})]},`${i.taskId}:${i.gateId??i.reason}`))}),n(R,{title:"冻结的岗位",count:l.frozen.length,children:l.frozen.length===0?n(Z,{}):l.frozen.map(i=>n("div",{class:"row",children:[n("div",{children:[n("strong",{children:U(i.post)})," ",n("span",{class:"muted small",children:i.reason})]}),n(x,{label:"解冻",title:`解冻 ${U(i.post)}`,onSubmit:(o,h)=>C.post(`/api/teams/${t}/posts/${encodeURIComponent(U(i.post))}/unfreeze`,h?{retryRequest:h}:{}),onDone:a})]},i.post))}),n(R,{title:"卡住的任务",count:d.length,children:d.length===0?n(Z,{}):d.map(i=>n("div",{class:"row",children:[n("div",{children:[n(D,{href:W(e,i.taskId),children:i.title})," ",n(E,{tone:"warn",children:bn[i.reason]})," ",n("span",{class:"muted small",children:["主人 ",i.owner?U(i.owner):"—"]})]}),i.reason==="dead_assignee"?n(x,{label:"恢复派发",title:"恢复派发",submitLabel:"恢复",onSubmit:(o,h)=>C.post(`${s}/${encodeURIComponent(i.taskId)}/recover`,h?{retryRequest:h}:{}),onDone:a}):n(Y,{command:i.command})]},`${i.taskId}:${i.reason}`))}),n(R,{title:"巡查信号",count:l.signals.length,children:l.signals.length===0?n(Z,{}):l.signals.map(i=>n("div",{class:"row",children:[n("div",{children:[n("strong",{children:U(i.post)})," ",n("span",{class:"muted small",children:[i.signal," · L",i.level,i.summary?` · ${i.summary}`:""]})]}),n("div",{class:"actions",children:[n(x,{label:"发消息",title:`发给 ${U(i.post)}`,submitLabel:"发送",fields:[{name:"message",label:"消息",kind:"textarea",required:!0}],onSubmit:(o,h)=>C.post(`/api/teams/${t}/send`,{post:U(i.post),message:o.message,...h?{retryRequest:h}:{}}),onDone:a}),n(x,{label:"静音",title:`静音 ${U(i.post)}`,fields:[{name:"minutes",label:"静音时长(分钟,留空为默认)",kind:"number"}],onSubmit:(o,h)=>{const f=Number(o.minutes),u={...o.minutes?.trim()&&Number.isFinite(f)?{forMs:f*6e4}:{},...h?{retryRequest:h}:{}};return C.post(`/api/teams/${t}/posts/${encodeURIComponent(U(i.post))}/hush`,u)},onDone:a})]})]},`${i.post}:${i.signal}:${i.taskId}`))}),l.unavailable.length>0&&n("p",{class:"muted small",children:["无法读取:",l.unavailable.join(";")]})]})}function Fe({event:e,team:t}){const r=e.target?.match(/^(.+)#\d+$/)?.[1]??null,l=!r&&e.target?.includes("@")?U(e.target):null,a=e.actor.includes("@")?U(e.actor):null;return n("li",{class:`event event-${e.source}`,children:[n("time",{children:yt(e.at)}),n("span",{class:"tag",children:jt[e.source]}),n("span",{class:"actor",children:e.actor}),n("span",{class:"action",children:e.action}),n("span",{class:"target",children:r?n(D,{href:W(t,r),children:r}):l?n(D,{href:Pe(t,l),children:e.target}):e.target}),e.outcome&&n("span",{class:"outcome",children:e.outcome}),a&&n(D,{href:Pe(t,a),class:"muted small",children:"岗位"}),e.detail!==null&&e.detail!==void 0&&n("details",{children:[n("summary",{children:"详情"}),n("pre",{children:JSON.stringify(e.detail,null,2)})]})]})}const kn={live:["在线","ok"],offline:["离线","bad"],uncertain:["不确定","warn"]};function wn({post:e,team:t,frozen:r,signal:l,onChanged:a}){const s=U(e.address),[c,d]=kn[e.status];return n("article",{class:"card post",children:[n("header",{children:[n(D,{href:Pe(t,s),class:"post-name",children:s}),e.isLead&&n(E,{tone:"neutral",children:"牵头"})]}),n("p",{class:"muted small",children:[e.agent," · ",n(E,{tone:d,children:c})]}),n("div",{class:"flags",children:[r&&n(E,{tone:"bad",children:"已冻结"}),l!==void 0&&n(E,{tone:"warn",children:["巡查 L",l]})]}),n("div",{class:"actions",children:n(x,{label:"发消息",title:`发给 ${s}`,submitLabel:"发送",fields:[{name:"message",label:"消息",kind:"textarea",required:!0}],onSubmit:(i,o)=>C.post(`/api/teams/${encodeURIComponent(t)}/send`,{post:s,message:i.message,...o?{retryRequest:o}:{}}),onDone:a})})]})}const $n={running:["运行中","ok"],stale:["失联","bad"],stopped:["已停止","warn"],never:["未启动","neutral"]};function Sn({d:e,team:t}){const[r,l]=$n[e.health.state],a=e.health.ageMs;return n("section",{class:"card",children:[n("h2",{children:["调度员 ",n(E,{tone:l,children:r})]}),n("p",{class:"muted small",children:["心跳 ",a!==void 0?`${Math.round(a/1e3)} 秒前`:"—"," · 冻结 ",e.frozen," · 静音 ",e.hushed," · 待办 ",e.attentionItems]}),e.health.state!=="running"&&n(Y,{note:"在终端里启动调度员:",command:`wl dispatcher up ${t}`})]})}function Cn({team:e}){const t=N(`/api/teams/${encodeURIComponent(e)}/log?limit=20`);return K({timeline:()=>t.reload()}),t.error?n(A,{error:t.error}):t.data?n("ol",{class:"events",children:t.data.events.slice().reverse().map(r=>n(Fe,{event:r,team:e},r.id))}):n(q,{})}function In({team:e}){const t=encodeURIComponent(e),r=N(`/api/teams/${t}`),l=N(`/api/teams/${t}/attention`);if(K({snapshot:()=>{r.reload(),l.reload()}}),r.error)return n(A,{error:r.error});if(!r.data)return n(q,{});const a=new Set((l.data?.frozen??[]).map(d=>d.post)),s=new Map;for(const d of l.data?.signals??[])s.set(d.post,Math.max(d.level,s.get(d.post)??0));const c=r.data;return n("div",{class:"page",children:[n("header",{class:"page-head",children:[n("h1",{children:e}),n("span",{class:"muted small",children:["Run ",c.runId??"—"]})]}),(l.data?.warnings??[]).map(d=>n("p",{class:"banner",role:"status",children:d},d)),n(Sn,{d:c.dispatcher,team:e}),n(R,{title:"岗位",count:c.posts.length,children:n("div",{class:"cards",children:c.posts.map(d=>n(wn,{post:d,team:e,frozen:a.has(d.address),signal:s.get(d.address),onChanged:()=>r.reload()},d.address))})}),n(R,{title:"最近事件",children:n(Cn,{team:e})})]})}function Rn({team:e,post:t}){const r=encodeURIComponent(e),l=encodeURIComponent(t),a=N(`/api/teams/${r}/posts/${l}`);if(K({snapshot:()=>a.reload()}),a.error)return n(A,{error:a.error});if(!a.data)return n(q,{});const s=a.data,c=()=>a.reload(),d=`/api/teams/${r}/posts/${l}`;return n("div",{class:"page",children:[n("header",{class:"page-head",children:[n("h1",{children:t}),n(E,{tone:s.row.status==="live"?"ok":s.row.status==="offline"?"bad":"warn",children:s.row.status}),s.row.isLead&&n(E,{tone:"neutral",children:"牵头"})]}),n("dl",{class:"facts",children:[n("dt",{children:"agent"}),n("dd",{children:s.row.agent}),n("dt",{children:"会话 ID"}),n("dd",{children:n("code",{children:s.sessionId??"未记录"})}),n("dt",{children:"冻结"}),n("dd",{children:s.frozen?`${s.frozen.reason}`:"否"}),n("dt",{children:"静音至"}),n("dd",{children:s.hushedUntil??"否"})]}),n("div",{class:"actions",children:[n(x,{label:"发消息",title:`发给 ${t}`,submitLabel:"发送",fields:[{name:"message",label:"消息",kind:"textarea",required:!0}],onSubmit:(i,o)=>C.post(`/api/teams/${r}/send`,{post:t,message:i.message,...o?{retryRequest:o}:{}}),onDone:c}),s.frozen?n(x,{label:"解冻",title:"解冻",onSubmit:(i,o)=>C.post(`${d}/unfreeze`,o?{retryRequest:o}:{}),onDone:c}):n(x,{label:"冻结",title:"冻结岗位",danger:!0,fields:[{name:"reason",label:"理由",required:!0}],onSubmit:(i,o)=>C.post(`${d}/freeze`,{reason:i.reason,...o?{retryRequest:o}:{}}),onDone:c}),s.hushedUntil?n(x,{label:"取消静音",title:"取消静音",onSubmit:(i,o)=>C.post(`${d}/unhush`,o?{retryRequest:o}:{}),onDone:c}):n(x,{label:"静音",title:"静音",fields:[{name:"minutes",label:"时长(分钟,留空为默认)",kind:"number"}],onSubmit:(i,o)=>{const h=Number(i.minutes);return C.post(`${d}/hush`,{...i.minutes?.trim()&&Number.isFinite(h)?{forMs:h*6e4}:{},...o?{retryRequest:o}:{}})},onDone:c})]}),n(R,{title:"当前任务",children:s.currentTask?n(D,{href:W(e,s.currentTask.id),children:s.currentTask.title}):n("p",{class:"muted small",children:"空闲"})}),n(R,{title:"排队",count:s.queued.length,children:s.queued.length===0?n("p",{class:"muted small",children:"无"}):n("ul",{children:s.queued.map(i=>n("li",{children:n(D,{href:W(e,i.id),children:i.title})},i.id))})}),n(R,{title:"巡查信号",count:s.signals.length,children:s.signals.length===0?n("p",{class:"muted small",children:"无"}):n("ul",{children:s.signals.map(i=>n("li",{children:[i.signal," ",n(E,{tone:"warn",children:["L",i.level]}),i.summary?n("span",{class:"muted small",children:[" ",i.summary]}):null]},`${i.signal}:${i.taskId}`))})}),n(R,{title:"终端(最后 40 行,只读)",children:n("pre",{class:"term",children:s.preview.length>0?s.preview.join(`
2
+ `):"(无预览)"})}),n(R,{title:"最近事件",count:s.events.length,children:n("ol",{class:"events",children:s.events.slice().reverse().map(i=>n(Fe,{event:i,team:e},i.id))})})]})}const Tn={env:"环境变量",default:"默认值",registry:"注册表",file:"文件",orca:"Orca"},xn={"wingline.version":"雁阵版本","orca.path":"Orca 可执行文件","orca.version":"Orca 版本","orca.verified":"在已验证的版本范围内","home.path":"数据目录","registry.migration":"注册表迁移版本","logs.bytes":"logs/ 占用","console.pid":"控制台进程号","console.port":"控制台端口","console.startedAt":"控制台启动时间"},En={running:"运行中",stale:"失联",stopped:"已停止",never:"未启动"};function Pn(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function Un(e){return e.value===null?"—":typeof e.value=="boolean"?e.value?"是":"否":e.key==="logs.bytes"&&typeof e.value=="number"?Pn(e.value):String(e.value)}function Dn({teams:e}){return n("table",{class:"table",children:n("tbody",{children:e.map(t=>n("tr",{children:[n("td",{children:n(D,{href:Q(t.name),children:t.name})}),n("td",{children:n("code",{children:t.specPath})}),n("td",{children:t.status==="up"?"运行中":"已停止"}),n("td",{children:["调度员 ",En[t.dispatcher]]}),n("td",{children:t.draft?n(E,{tone:"warn",children:"有草稿"}):n("span",{class:"muted small",children:"无草稿"})})]},t.name))})})}function Ln(){const e=N("/api/about");return e.error?n(A,{error:e.error}):e.data?n("div",{class:"page",children:[n("header",{class:"page-head",children:n("h1",{children:"关于与诊断"})}),n(R,{title:"配置与环境",count:e.data.items.length,children:n("table",{class:"table",children:n("tbody",{children:e.data.items.map(t=>n("tr",{children:[n("td",{children:xn[t.key]??t.key}),n("td",{children:Un(t)}),n("td",{children:[n(E,{children:Tn[t.source]}),t.note&&n("span",{class:"muted small",children:["(",t.note,")"]})]})]},t.key))})})}),n(R,{title:"团队",count:e.data.teams.length,children:e.data.teams.length===0?n("p",{class:"muted small",children:"暂无"}):n(Dn,{teams:e.data.teams})})]}):n(q,{})}const Nn=[["ready","就绪"],["dispatched","已派发"],["blocked","阻塞"],["completed","完成"],["failed","失败"]],Ne={done_unfinished:"已完成但未收尾",call_uncertain:"调用结果不确定",dead_assignee:"派发失主",owner_idle:"主人迟迟未开始",bypassed:"绕过闸门上报",blocked_waiting:"等待决策"};function qn({t:e,team:t,stuck:r}){return n("article",{class:"card task",children:[n(D,{href:W(t,e.id),class:"task-title",children:e.title}),n("p",{class:"muted small",children:[e.id," · 主人 ",e.claimedBy?U(e.claimedBy):"—"," · 第 ",e.epoch," 轮"]}),n("div",{class:"flags",children:[e.tags.map(l=>n("span",{class:"chip",children:l},l)),e.gateFailures>0&&n(E,{tone:"bad",children:["闸门失败 ",e.gateFailures," 次"]}),r&&n(E,{tone:"warn",children:["卡住:",Ne[r]]})]})]})}function An({team:e}){const t=encodeURIComponent(e),[r,l]=k(""),[a,s]=k(""),[c,d]=k(!1),i=N(c?null:`/api/teams/${t}/tasks`),o=N(`/api/teams/${t}/tasks?stale=true`);K({snapshot:()=>{i.reload(),o.reload()}});const f=n("div",{class:"filters",children:[n("label",{class:"field inline",children:[n("span",{children:"标签"}),n("input",{value:r,onInput:_=>l(_.target.value.trim())})]}),n("label",{class:"field inline",children:[n("span",{children:"主人(岗位名)"}),n("input",{value:a,onInput:_=>s(_.target.value.trim())})]}),n("label",{class:"field inline check",children:[n("input",{type:"checkbox",checked:c,onChange:_=>d(_.target.checked)}),n("span",{children:"只看卡住的"})]}),n(x,{label:"新建任务",title:"新建任务",submitLabel:"创建",fields:[{name:"title",label:"标题",required:!0},{name:"post",label:"派给岗位(名字,如 builder,可留空)"},{name:"tags",label:"标签(逗号分隔)"}],onSubmit:(_,v)=>{const y=(_.tags??"").split(",").map(m=>m.trim()).filter(Boolean);return C.post(`/api/teams/${t}/tasks`,{title:_.title,...(_.post??"").trim()?{post:(_.post??"").trim()}:{},...y.length>0?{tags:y}:{},...v?{retryRequest:v}:{}})},onDone:()=>i.reload()})]});if(c)return o.error?n(A,{error:o.error}):o.data?n("div",{class:"page",children:[n("header",{class:"page-head",children:n("h1",{children:"任务看板"})}),f,n(R,{title:"卡住的任务",count:o.data.tasks.length,children:o.data.tasks.map(_=>n("div",{class:"row",children:[n(D,{href:W(e,_.taskId),children:_.title})," ",n(E,{tone:"warn",children:Ne[_.reason]})," ",n("span",{class:"muted small",children:["主人 ",_.owner??"—"]})]},`${_.taskId}:${_.reason}`))})]}):n(q,{});if(i.error)return n(A,{error:i.error});if(!i.data)return n(q,{});const u=new Map;for(const _ of o.data?.tasks??[])_.taskId&&_.reason in Ne&&u.set(_.taskId,_.reason);const p=i.data.tasks.filter(_=>(!r||_.tags.includes(r))&&(!a||(_.claimedBy??"").startsWith(`${a}@`)));return n("div",{class:"page",children:[n("header",{class:"page-head",children:n("h1",{children:"任务看板"})}),f,n("div",{class:"board",children:Nn.map(([_,v])=>{const y=p.filter(m=>m.status===_);return n("section",{class:"col",children:[n("h2",{children:[v," ",n("span",{class:"count",children:y.length})]}),y.map(m=>n(qn,{t:m,team:e,stuck:u.get(m.id)},m.id))]},_)})})]})}const On=new Set(["completed","failed"]);function Hn({team:e,id:t}){const r=encodeURIComponent(e),l=`/api/teams/${r}/tasks/${encodeURIComponent(t)}`,a=N(l);if(K({snapshot:()=>a.reload()}),a.error)return n(A,{error:a.error});if(!a.data)return n(q,{});const s=a.data,c=()=>a.reload(),d=!On.has(s.status),i=s.status==="completed"?"ok":s.status==="failed"||s.status==="blocked"?"bad":"neutral";return n("div",{class:"page",children:[n("header",{class:"page-head",children:[n("h1",{children:s.title}),n(E,{tone:i,children:s.status})]}),n("dl",{class:"facts",children:[n("dt",{children:"ID"}),n("dd",{children:n("code",{children:s.id})}),n("dt",{children:"主人"}),n("dd",{children:s.claimedBy??"—"}),n("dt",{children:"第几轮"}),n("dd",{children:s.epoch}),n("dt",{children:"闸门失败"}),n("dd",{children:[s.gateFailures," 次"]}),n("dt",{children:"父任务"}),n("dd",{children:s.parentId?n(D,{href:W(e,s.parentId),children:s.parentId}):"—"}),n("dt",{children:"标签"}),n("dd",{children:s.tags.length>0?s.tags.join("、"):"—"}),s.gateOutput&&n(F,{children:[n("dt",{children:"闸门输出"}),n("dd",{children:n("code",{children:s.gateOutput})})]})]}),n("div",{class:"actions",children:[d&&n(x,{label:"转人工",title:"转人工",danger:!0,fields:[{name:"reason",label:"理由",kind:"textarea",required:!0}],onSubmit:(o,h)=>C.post(`${l}/escalate`,{reason:o.reason,...h?{retryRequest:h}:{}}),onDone:c}),d&&n(x,{label:"改派",title:"改派",fields:[{name:"to",label:"新主人(岗位名)",required:!0}],onSubmit:o=>C.post(`${l}/reassign`,{to:o.to}),onDone:c}),s.status==="dispatched"&&n(x,{label:"恢复派发",title:"恢复派发",submitLabel:"恢复",onSubmit:(o,h)=>C.post(`${l}/recover`,h?{retryRequest:h}:{}),onDone:c}),s.status==="blocked"&&s.gateId?n(x,{label:"处理闸门",title:"处理闸门",fields:[{name:"resolution",label:"处理说明",kind:"textarea",required:!0},{name:"reassign",label:"改派新主人(岗位名,可选)"}],onSubmit:(o,h)=>C.post(`/api/teams/${r}/gates/${encodeURIComponent(s.gateId)}/resolve`,{resolution:o.resolution,...o.reassign?.trim()?{reassign:o.reassign.trim()}:{},...h?{retryRequest:h}:{}}),onDone:c}):s.status==="blocked"?n(Y,{note:"可在终端运行:",command:'wl task resolve <gate-id> --resolution "…"'}):null]}),s.plan&&n(R,{title:"计划",children:n("pre",{class:"term",children:s.plan})}),(s.result||s.outcome)&&n(R,{title:"结果",children:[n("p",{children:[s.outcome??"—",s.reportedBy&&n("span",{class:"muted small",children:[" · 上报人 ",s.reportedBy]})]}),s.result&&n("pre",{class:"term",children:s.result})]}),n(R,{title:"变迁历史",count:s.history?.length??0,children:n("ol",{class:"events",children:(s.history??[]).map(o=>n("li",{class:"event",children:[n("time",{children:yt(o.at)}),n("span",{class:"tag",children:["第 ",o.epoch," 轮"]}),n("span",{class:"actor",children:o.actor}),n("span",{class:"action",children:o.action}),o.detail&&n("span",{class:"muted small",children:o.detail})]},o.id))})})]})}const Fn=[["","不限"],["15m","最近 15 分钟"],["1h","最近 1 小时"],["24h","最近 24 小时"],["168h","最近 7 天"]];function Bn({team:e}){const t=encodeURIComponent(e),[r,l]=k(""),[a,s]=k(""),[c,d]=k(""),[i,o]=k(""),h=new URLSearchParams({limit:"200"});r&&h.set("source",r),a&&h.set("post",a),c&&h.set("task",c),i&&h.set("since",i);const f=`/api/teams/${t}/log?${h.toString()}`,u=N(f),[p,_]=k([]);B(()=>_([]),[f]);const{connection:v}=be();B(()=>{v>1&&(u.reload(),_([]))},[v]);const y=g=>(!r||g.source===r)&&(!a||g.actor===a||g.target===a)&&(!c||g.target===c||(g.target??"").startsWith(`${c}#`));if(K({timeline:g=>{y(g)&&_($=>$.some(T=>T.id===g.id)?$:[...$,g])}}),u.error)return n(A,{error:u.error});if(!u.data)return n(q,{});const m=new Set,b=[...u.data.events,...p].filter(g=>m.has(g.id)?!1:(m.add(g.id),!0));return n("div",{class:"page",children:[n("header",{class:"page-head",children:n("h1",{children:"时间线"})}),n("form",{class:"filters",onSubmit:g=>g.preventDefault(),children:[n("label",{class:"field inline",children:[n("span",{children:"来源"}),n("select",{value:r,onChange:g=>l(g.target.value),children:[n("option",{value:"",children:"全部"}),n("option",{value:"task",children:"任务"}),n("option",{value:"patrol",children:"巡查"}),n("option",{value:"command",children:"命令"})]})]}),n("label",{class:"field inline",children:[n("span",{children:["岗位(地址,如 builder@",e,")"]}),n("input",{value:a,onInput:g=>s(g.target.value.trim())})]}),n("label",{class:"field inline",children:[n("span",{children:"时间范围"}),n("select",{value:i,onChange:g=>o(g.target.value),children:Fn.map(([g,$])=>n("option",{value:g,children:$},g))})]}),n("label",{class:"field inline",children:[n("span",{children:"任务 ID"}),n("input",{value:c,onInput:g=>d(g.target.value.trim())})]})]}),b.length===0?n("p",{class:"muted",children:"暂无事件。"}):n("ol",{class:"events",children:b.slice().reverse().map(g=>n(Fe,{event:g,team:e},g.id))}),n("button",{type:"button",class:"btn ghost",onClick:()=>{_([]),u.reload()},children:"刷新"})]})}function Mn(){return n("main",{class:"expired",children:[n("h1",{children:"会话已过期"}),n("p",{children:["请在终端运行 ",n("code",{children:"wl console --link"})," 获取新的登录链接。"]})]})}function zn({teams:e}){return e.length===0?n("p",{class:"muted",children:["还没有团队。先在终端运行 ",n("code",{children:"wl up <team.yaml>"}),"。"]}):n("section",{children:[n("h1",{children:"团队"}),n("ul",{class:"team-list",children:e.map(t=>n("li",{children:n(D,{href:Q(t),children:t})},t))})]})}function jn({route:e,team:t}){switch(e.name){case"overview":return n(In,{team:t});case"inbox":return n(yn,{team:t});case"board":return n(An,{team:t});case"task":return n(Hn,{team:t,id:e.id});case"post":return n(Rn,{team:t,post:e.post});case"log":return n(Bn,{team:t});case"edit":return n(vn,{team:t});default:return n("p",{class:"muted",children:"页面不存在。"})}}function Wn({route:e,teams:t}){if(e.name==="home")return n(ie,{teams:t,team:null,children:n(zn,{teams:t})});if(e.name==="settings")return n(ie,{teams:t,team:null,children:n(Ln,{})});if(e.name==="notfound")return n(ie,{teams:t,team:null,children:n("p",{class:"muted",children:"页面不存在。"})});const r="team"in e?e.team:"";return n(ie,{teams:t,team:r,children:n(zt,{team:r,children:[n(Vt,{}),n(Kt,{}),n(jn,{route:e,team:r})]},r)})}function Jn(){const e=Ht(),t=N("/api/session");let r;return Ut(t.error)?r=n(Mn,{}):t.error?r=n(A,{error:t.error}):t.data?r=n(Wn,{route:e,teams:t.data.teams}):r=n(q,{}),n(F,{children:[r,n(Xt,{})]})}Tt(n(Jn,{}),document.getElementById("app"));
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="light dark" />
7
+ <title>雁阵 控制台</title>
8
+ <script type="module" crossorigin src="/assets/index-DyOl7NwF.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DLO1-OIY.css">
10
+ </head>
11
+ <body>
12
+ <div id="app"></div>
13
+ </body>
14
+ </html>
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@weiping/wingline",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "雁阵 Wingline:在 Orca 之上运行常驻 agent 团队的命令行(wl)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "wingline": "dist/main.js",
9
+ "wl": "dist/main.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "engines": {
15
+ "node": ">=22.13"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/weiping/wingline.git",
23
+ "directory": "packages/cli"
24
+ },
25
+ "keywords": [
26
+ "orca",
27
+ "agent",
28
+ "team",
29
+ "claude",
30
+ "codex",
31
+ "orchestration"
32
+ ],
33
+ "dependencies": {
34
+ "@weiping/wingline-core": "^0.1.0",
35
+ "commander": "^13.0.0"
36
+ }
6
37
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.