tandem-editor 0.7.0 → 0.8.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/.claude-plugin/plugin.json +9 -2
- package/CHANGELOG.md +43 -329
- package/README.md +36 -19
- package/dist/channel/index.js +3 -1
- package/dist/channel/index.js.map +1 -1
- package/dist/cli/index.js +442 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/client/assets/CoworkSettings-CXODT6KV.js +1 -0
- package/dist/client/assets/core-DhEqZVGG.js +1 -0
- package/dist/client/assets/index-C6rbXHNq.css +1 -0
- package/dist/client/assets/index-q_8NVSM3.js +228 -0
- package/dist/client/assets/webview-BQBJMQvJ.js +1 -0
- package/dist/client/index.html +47 -1
- package/dist/monitor/index.js +33 -32
- package/dist/monitor/index.js.map +1 -1
- package/dist/server/index.js +3615 -3102
- package/dist/server/index.js.map +1 -1
- package/package.json +6 -7
- package/skills/tandem/SKILL.md +2 -2
- package/dist/client/assets/index-B1Cd5UGT.js +0 -349
- package/dist/client/assets/webview-0tvvWtyc.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as L,r as n,m as F,l as O,f as W,c as w,a as B,b as D,d as $,j as e,C as N,e as U,w as _,g as A}from"./index-q_8NVSM3.js";const M={success:{bg:"var(--tandem-success-bg)",fg:"var(--tandem-success-fg-strong)",border:"var(--tandem-success-border)"},warning:{bg:"var(--tandem-warning-bg)",fg:"var(--tandem-warning-fg-strong)",border:"var(--tandem-warning-border)"},error:{bg:"var(--tandem-error-bg)",fg:"var(--tandem-error-fg-strong)",border:"var(--tandem-error-border)"}},j={fontSize:"11px",fontWeight:600,color:"var(--tandem-fg)",marginBottom:"6px",textTransform:"uppercase",letterSpacing:"0.5px"},v={fontSize:"10px",color:"var(--tandem-fg-subtle)",marginTop:"4px"};function Q(){const{status:t,loading:r,error:i,refetch:a}=L(!0),[p,u]=n.useState(null),[f,c]=n.useState(null),[b,o]=n.useState(!1),l=n.useRef(!0),x=n.useRef(F(N));n.useEffect(()=>()=>x.current.cancel(),[]),n.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]);const d=n.useCallback(async(s,m)=>{o(!0);try{const g=await O();await s(g),l.current&&u(null)}catch(g){const E=g instanceof Error?g.message:String(g),z=W(E);l.current&&u({message:`${m}: ${z}`,severity:"error"})}finally{l.current&&o(!1)}},[]),C=n.useCallback(async()=>{await d(async s=>{await w(s,!0),await a(),l.current&&c(null)},"Failed to enable Cowork")},[d,a]),I=n.useCallback(async()=>{await d(async s=>{await w(s,!1),await a()},"Failed to disable Cowork")},[d,a]),R=n.useCallback(()=>{x.current.schedule(()=>{d(async s=>{await B(s),await a()},"Re-scan failed")})},[d,a]),T=n.useCallback(async s=>{await d(async m=>{await D(m,s),await a()},"Failed to update LAN-IP override")},[d,a]),k=$(t);return e.jsxs("div",{"data-testid":"cowork-settings",style:{display:"flex",flexDirection:"column",gap:10},children:[e.jsx("div",{style:j,children:"Cowork Integration"}),r&&e.jsx(K,{}),!r&&k==="unsupported"&&e.jsx(P,{}),!r&&k==="undetected"&&e.jsx(V,{}),!r&&k==="normal"&&t!==null&&e.jsx(q,{status:t,busy:b,confirming:f,onRequestEnable:()=>c("enable"),onCancelEnable:()=>c(null),onConfirmEnable:C,onDisable:I,onRescan:R,onToggleLanIp:T}),i&&!t&&e.jsxs("div",{"data-testid":"cowork-settings-error",role:"alert",style:h,children:["Failed to load Cowork status: ",i]}),p&&e.jsx("div",{"data-testid":"cowork-inline-toast",role:"alert",style:h,children:p.message})]})}function K(){return e.jsx("div",{"data-testid":"cowork-settings-loading",style:{fontSize:12,color:"var(--tandem-fg-subtle)"},children:"Loading Cowork status..."})}function P(){return e.jsx("div",{"data-testid":"cowork-settings-unsupported",style:S,children:"Cowork integration is available on Windows in v0.8.0. macOS/Linux support tracked in #316 / #317."})}function V(){return e.jsxs("div",{"data-testid":"cowork-settings-undetected",style:S,children:["Cowork not detected on this system."," ",e.jsx("a",{href:"https://github.com/bloknayrb/tandem#cowork",target:"_blank",rel:"noreferrer",style:{color:"var(--tandem-accent)"},children:"Learn more"})]})}function q({status:t,busy:r,confirming:i,onRequestEnable:a,onCancelEnable:p,onConfirmEnable:u,onDisable:f,onRescan:c,onToggleLanIp:b}){return e.jsxs(e.Fragment,{children:[e.jsxs("label",{"data-testid":"cowork-toggle",style:{display:"flex",alignItems:"center",gap:8,cursor:r?"wait":"pointer",fontSize:12,color:"var(--tandem-fg)",minHeight:24},children:[e.jsx("input",{"data-testid":"cowork-toggle-checkbox",type:"checkbox",checked:t.enabled,disabled:r,onChange:o=>{o.target.checked?a():f()},style:{accentColor:"var(--tandem-accent)"}}),e.jsx("span",{children:"Enable Cowork integration"})]}),e.jsxs("div",{style:v,children:["Token provisioned: ",t.enabled?"yes":"no"]}),i==="enable"&&e.jsxs("div",{"data-testid":"cowork-enable-confirm",role:"dialog",style:{border:"1px solid var(--tandem-warning-border)",background:"var(--tandem-warning-bg)",color:"var(--tandem-warning-fg-strong)",borderRadius:6,padding:"8px 10px",fontSize:12},children:[e.jsx("div",{style:{fontWeight:600,marginBottom:4},children:"Confirm: Enable Cowork"}),e.jsx("div",{style:{marginBottom:8},children:"Windows will prompt for admin permission to modify firewall rules. This is expected. Tandem will write plugin entries to every detected Cowork workspace."}),e.jsxs("div",{style:{display:"flex",gap:8},children:[e.jsx("button",{"data-testid":"cowork-enable-confirm-btn",type:"button",onClick:()=>void u(),disabled:r,style:G,children:"Enable"}),e.jsx("button",{"data-testid":"cowork-enable-cancel-btn",type:"button",onClick:p,disabled:r,style:y,children:"Cancel"})]})]}),t.vethernetCidr!==null&&e.jsxs("div",{"data-testid":"cowork-vethernet-cidr",style:{fontSize:12},children:["Detected VM subnet: ",e.jsx("code",{children:t.vethernetCidr})]}),t.lanIpFallback!==null&&e.jsxs("div",{children:[e.jsxs("label",{"data-testid":"cowork-lan-ip-override",style:{display:"flex",alignItems:"center",gap:8,fontSize:12,cursor:r?"wait":"pointer"},children:[e.jsx("input",{"data-testid":"cowork-lan-ip-override-checkbox",type:"checkbox",checked:t.useLanIpOverride,disabled:r,onChange:o=>void b(o.target.checked),style:{accentColor:"var(--tandem-accent)"}}),e.jsx("span",{children:"Use LAN IP instead of host.docker.internal"})]}),e.jsxs("div",{style:v,children:["Fallback: ",t.lanIpFallback]})]}),e.jsxs("div",{children:[e.jsxs("div",{style:j,children:["Workspaces (",t.workspaces.length,")"]}),t.workspaces.length===0?e.jsx("div",{style:{fontSize:12,color:"var(--tandem-fg-subtle)"},children:"No Cowork workspaces detected yet."}):e.jsx("div",{"data-testid":"cowork-workspace-table",style:{display:"flex",flexDirection:"column",gap:4},children:t.workspaces.map(o=>e.jsx(H,{ws:o},`${o.workspaceId}/${o.vmId}`))}),e.jsx("button",{"data-testid":"cowork-rescan-btn",type:"button",onClick:c,disabled:r,style:{...y,marginTop:8},children:"Re-scan workspaces"})]})]})}function H({ws:t}){const r=U(t),i=M[_(r)],a=A(r);return e.jsxs("div",{"data-testid":`cowork-workspace-row-${t.workspaceId}-${t.vmId}`,"data-status":r,title:t.failureDetail??t.path,style:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:8,padding:"4px 6px",border:`1px solid ${i.border}`,background:i.bg,color:i.fg,borderRadius:4,fontSize:11},children:[e.jsxs("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[t.workspaceId," / ",t.vmId]}),e.jsx("span",{style:{fontWeight:600,whiteSpace:"nowrap"},children:a}),r==="schemaDrift"&&e.jsx("a",{"data-testid":`cowork-workspace-report-${t.workspaceId}-${t.vmId}`,href:"mailto:maintainers@tandem.invalid?subject=Cowork%20schema%20drift",style:{color:"var(--tandem-error-fg-strong)",textDecoration:"underline"},children:"Report"})]})}const S={border:"1px solid var(--tandem-info-border)",background:"var(--tandem-info-bg)",color:"var(--tandem-info-fg-strong)",borderRadius:6,padding:"8px 10px",fontSize:12},h={border:"1px solid var(--tandem-error-border)",background:"var(--tandem-error-bg)",color:"var(--tandem-error-fg-strong)",borderRadius:6,padding:"8px 10px",fontSize:12},G={padding:"4px 10px",fontSize:12,border:"1px solid var(--tandem-accent)",borderRadius:4,background:"var(--tandem-accent)",color:"var(--tandem-accent-fg)",cursor:"pointer",fontWeight:600},y={padding:"4px 10px",fontSize:12,border:"1px solid var(--tandem-border-strong)",borderRadius:4,background:"var(--tandem-surface)",color:"var(--tandem-fg-muted)",cursor:"pointer"};export{Q as CoworkSettings,Q as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(n,e,i,s){if(typeof e=="function"?n!==e||!s:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(n):s?s.value:e.get(n)}function c(n,e,i,s,_){if(typeof e=="function"?n!==e||!0:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(n,i),i}var a,r,o,l,u;const d="__TAURI_TO_IPC_KEY__";function w(n,e=!1){return window.__TAURI_INTERNALS__.transformCallback(n,e)}class g{constructor(e){a.set(this,void 0),r.set(this,0),o.set(this,[]),l.set(this,void 0),c(this,a,e||(()=>{})),this.id=w(i=>{const s=i.index;if("end"in i){s==t(this,r,"f")?this.cleanupCallback():c(this,l,s);return}const _=i.message;if(s==t(this,r,"f")){for(t(this,a,"f").call(this,_),c(this,r,t(this,r,"f")+1);t(this,r,"f")in t(this,o,"f");){const p=t(this,o,"f")[t(this,r,"f")];t(this,a,"f").call(this,p),delete t(this,o,"f")[t(this,r,"f")],c(this,r,t(this,r,"f")+1)}t(this,r,"f")===t(this,l,"f")&&this.cleanupCallback()}else t(this,o,"f")[s]=_})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(e){c(this,a,e)}get onmessage(){return t(this,a,"f")}[(a=new WeakMap,r=new WeakMap,o=new WeakMap,l=new WeakMap,d)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[d]()}}class f{constructor(e,i,s){this.plugin=e,this.event=i,this.channelId=s}async unregister(){return h(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}}async function m(n,e,i){const s=new g(i);try{return await h(`plugin:${n}|register_listener`,{event:e,handler:s}),new f(n,e,s.id)}catch{return await h(`plugin:${n}|registerListener`,{event:e,handler:s}),new f(n,e,s.id)}}async function I(n){return h(`plugin:${n}|check_permissions`)}async function C(n){return h(`plugin:${n}|request_permissions`)}async function h(n,e={},i){return window.__TAURI_INTERNALS__.invoke(n,e,i)}function T(n,e="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(n,e)}class k{get rid(){return t(this,u,"f")}constructor(e){u.set(this,void 0),c(this,u,e)}async close(){return h("plugin:resources|close",{rid:this.rid})}}u=new WeakMap;function E(){return!!(globalThis||window).isTauri}export{g as Channel,f as PluginListener,k as Resource,d as SERIALIZE_TO_IPC_FN,m as addPluginListener,I as checkPermissions,T as convertFileSrc,h as invoke,E as isTauri,C as requestPermissions,w as transformCallback};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.tandem-editor h1{font-size:2em;font-weight:700;margin:.67em 0}.tandem-editor h2{font-size:1.5em;font-weight:600;margin:.75em 0}.tandem-editor h3{font-size:1.17em;font-weight:600;margin:.83em 0}.tandem-editor p{margin:.5em 0}.tandem-editor ul,.tandem-editor ol{padding-left:1.5em}.tandem-editor table{border-collapse:collapse;width:100%;margin:1em 0}.tandem-editor td,.tandem-editor th{border:1px solid var(--tandem-border);padding:8px}.tandem-editor th{background:var(--tandem-surface-muted);font-weight:600}.tandem-editor blockquote{border-left:3px solid var(--tandem-border-strong);margin:.5em 0;padding-left:1em;color:var(--tandem-fg-muted)}.collaboration-cursor__caret{position:relative;border-left:2px solid;border-right:none;margin-left:-1px}.collaboration-cursor__label{position:absolute;top:-1.4em;left:-1px;font-size:12px;white-space:nowrap;padding:0 4px;border-radius:3px 3px 3px 0;color:var(--tandem-accent-fg)}.ProseMirror-focused{outline:none}.ProseMirror p.is-empty:before{content:attr(data-placeholder);color:var(--tandem-fg-subtle);pointer-events:none;float:left;height:0}.tandem-highlight{cursor:pointer}.tandem-highlight:hover{filter:brightness(.95)}.tandem-comment{cursor:pointer}.tandem-comment:hover{border-bottom-style:solid}.tandem-suggestion{cursor:pointer}.tandem-review-dimmed .ProseMirror{color:var(--tandem-fg-subtle);transition:color .2s}.tandem-review-dimmed .tandem-highlight,.tandem-review-dimmed .tandem-comment,.tandem-review-dimmed .tandem-suggestion{color:var(--tandem-fg)}.tandem-review-dimmed .tandem-annotation-active{outline:2px solid var(--tandem-accent);outline-offset:1px;border-radius:2px}.tandem-authorship{transition:color .2s}.tandem-authorship--user{color:var(--tandem-author-user)}.tandem-authorship--claude{color:var(--tandem-author-claude)}.tandem-claude-focus{position:relative}.tandem-claude-focus:before{content:"";position:absolute;left:-24px;top:0;bottom:0;width:3px;background:var(--tandem-accent);border-radius:2px;animation:tandem-gutter-pulse 2s ease-in-out infinite}@keyframes tandem-gutter-pulse{0%,to{opacity:.4}50%{opacity:1}}.tandem-claude-cursor{position:relative;display:inline;border-left:2px solid var(--tandem-author-claude);margin-left:-1px;z-index:10;animation:tandem-claude-blink 1.2s step-end infinite}.tandem-claude-cursor-idle{opacity:.3;animation:none}.tandem-claude-cursor-label{position:absolute;top:-1.4em;left:-1px;font-size:11px;font-weight:500;white-space:nowrap;padding:0 4px;border-radius:3px 3px 3px 0;background:var(--tandem-author-claude);color:var(--tandem-accent-fg);pointer-events:none;z-index:11}@keyframes tandem-claude-blink{0%,to{opacity:1}50%{opacity:0}}
|