tandem-editor 0.14.3 → 0.16.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 +4 -4
- package/CHANGELOG.md +47 -0
- package/README.md +21 -1
- package/dist/cli/index.js +82 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/client/assets/CoworkSettings-B4LapjhG.js +11 -0
- package/dist/client/assets/CoworkSettings-C0m1IhNy.css +1 -0
- package/dist/client/assets/{dist-dYgyssYq.js → dist-CJtsfiU2.js} +1 -1
- package/dist/client/assets/index-BIEOrpU_.js +270 -0
- package/dist/client/assets/index-DdjGUhNd.css +1 -0
- package/dist/client/assets/{prod-DeXsEx17.js → prod-p35ShryZ.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/index.js +277 -64
- package/dist/server/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/client/assets/CoworkSettings-BevsTL0m.css +0 -1
- package/dist/client/assets/CoworkSettings-CAr7DoyA.js +0 -5
- package/dist/client/assets/index-BbxWZ4FI.css +0 -1
- package/dist/client/assets/index-wtM-9NgF.js +0 -262
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,F as a,H as o,I as s,L as c,M as l,N as u,O as d,P as f,R as p,S as m,T as h,V as g,_,a as v,b as y,c as ee,d as b,f as x,g as S,h as C,i as w,j as T,k as E,l as D,m as te,n as O,o as k,p as A,r as ne,s as j,t as M,u as N,v as P,w as F,x as I,y as L,z as R}from"./index-BIEOrpU_.js";var z=r(`<div class="cs-help-text svelte-kvy574" data-testid="cowork-settings-loading">Loading Cowork status...</div>`),B=r(`<div class="cs-info-banner svelte-kvy574" data-testid="cowork-settings-unsupported">Cowork integration is available on Windows today. macOS/Linux support is tracked in #316 /
|
|
2
|
+
#317.</div>`),V=r(`<div class="cs-info-banner svelte-kvy574" data-testid="cowork-settings-undetected"><!> <a class="cs-link svelte-kvy574" target="_blank" rel="noreferrer">Learn more</a></div>`),re=r(`<div class="cs-reachability" data-testid="cowork-reachability"><div class="cs-reachability-title svelte-kvy574"> </div> <div class="cs-reachability-detail svelte-kvy574"> </div></div>`),ie=r(`<div class="cs-warning-banner svelte-kvy574" data-testid="cowork-enable-confirm" role="dialog"><div class="cs-confirm-heading svelte-kvy574">Confirm: Enable Cowork</div> <div class="cs-confirm-body svelte-kvy574">Tandem will register itself as a plugin in every detected Cowork workspace so Claude in
|
|
3
|
+
Cowork can reach your open documents. This adds a Windows firewall rule so the Cowork VM
|
|
4
|
+
can connect back — admin is required once.</div> <div class="cs-actions svelte-kvy574"><button class="cs-btn cs-btn--primary svelte-kvy574" data-testid="cowork-enable-confirm-btn" type="button">Enable</button> <button class="cs-btn cs-btn--ghost svelte-kvy574" data-testid="cowork-enable-cancel-btn" type="button">Cancel</button></div></div>`),ae=r(`<div class="cs-vethernet svelte-kvy574" data-testid="cowork-vethernet-cidr">Detected Cowork environment: <code> </code></div>`),oe=r(`<div><label data-testid="cowork-lan-ip-override"><input class="cs-accent-cbx svelte-kvy574" data-testid="cowork-lan-ip-override-checkbox" type="checkbox"/> <span>Use LAN IP instead of host.docker.internal</span></label> <div class="cs-help svelte-kvy574"> </div></div>`),se=r(`<div class="cs-help-text svelte-kvy574">No Cowork workspaces detected yet.</div>`),ce=r(`<a class="cs-report-link svelte-kvy574" href="mailto:maintainers@tandem.invalid?subject=Cowork%20schema%20drift">Report</a>`),le=r(`<div class="cs-workspace-row svelte-kvy574"><span class="cs-workspace-id svelte-kvy574"> </span> <span class="cs-workspace-label svelte-kvy574"> </span> <!></div>`),ue=r(`<div class="cs-workspace-table svelte-kvy574" data-testid="cowork-workspace-table"></div>`),de=r(`<label data-testid="cowork-toggle"><input class="cs-accent-cbx svelte-kvy574" data-testid="cowork-toggle-checkbox" type="checkbox"/> <span>Enable Cowork integration</span></label> <div class="cs-help svelte-kvy574"> </div> <!> <details class="cs-explainer svelte-kvy574" data-testid="cowork-explainer"><summary class="svelte-kvy574">What this does & how to verify</summary> <div class="cs-explainer-body svelte-kvy574"><p class="svelte-kvy574">Enabling registers Tandem as a plugin in every detected Cowork workspace, so Claude
|
|
5
|
+
running inside Cowork can reach the documents you have open. This needs Windows admin
|
|
6
|
+
once to add a firewall rule that lets the Cowork VM connect back to Tandem on this
|
|
7
|
+
computer — you don't add a marketplace or run any commands inside Cowork yourself.</p> <p class="svelte-kvy574"><strong>Verify:</strong> in a Cowork session, ask Claude to open or list your documents
|
|
8
|
+
— Tandem's tools should appear. If they don't, re-run “Enable” here.</p> <p class="svelte-kvy574"><strong>Note:</strong> live updates (annotations and chat as they happen) need the
|
|
9
|
+
Tandem desktop app running; the Cowork connection itself is request-and-response.</p></div></details> <!> <!> <!> <div><div class="cs-label svelte-kvy574"> </div> <!> <button class="cs-btn cs-btn--ghost cs-rescan-btn svelte-kvy574" data-testid="cowork-rescan-btn" type="button">Re-scan workspaces</button></div>`,1),fe=r(`<div class="cs-error-banner svelte-kvy574" data-testid="cowork-settings-error" role="alert"> </div>`),pe=r(`<div class="cs-error-banner svelte-kvy574" data-testid="cowork-inline-toast" role="alert"> </div>`),me=r(`<div class="cs-root svelte-kvy574" data-testid="cowork-settings"><div class="cs-label svelte-kvy574">Cowork Integration</div> <!> <!> <!></div>`);function H(r,E){t(E,!0);let H={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)`},neutral:{bg:`var(--tandem-info-bg)`,fg:`var(--tandem-info-fg-strong)`,border:`var(--tandem-info-border)`}},U=M(()=>!0),{refetch:W}=U,G=c(null),K=c(null),q=c(!1),J=b(C);_(()=>J.cancel());let Y=p(()=>D(U.status)),X=p(()=>j(U.status));function he(e){let t=H[e];return`border: 1px solid ${t.border}; background: ${t.bg}; color: ${t.fg}; border-radius: var(--tandem-r-3); padding: 8px 10px; font-size: 12px;`}async function Z(e,t){s(q,!0);try{await e(await v()),s(G,null)}catch(e){s(G,`${t}: ${N(e instanceof Error?e.message:String(e))}`)}finally{s(q,!1)}}async function ge(){await Z(async e=>{await w(e,!0),await W(),s(K,null)},`Failed to enable Cowork`)}async function _e(){await Z(async e=>{await w(e,!1),await W()},`Failed to disable Cowork`)}function ve(){J.schedule(()=>{Z(async e=>{await O(e),await W()},`Re-scan failed`)})}async function ye(e){await Z(async t=>{await ne(t,e),await W()},`Failed to update LAN-IP override`)}function be(e){let t=H[A(k(e))];return`display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 4px 6px; border: 1px solid ${t.border}; background: ${t.bg}; color: ${t.fg}; border-radius: var(--tandem-r-2); font-size: 11px;`}var Q=me(),$=a(u(Q),2),xe=e=>{i(e,z())},Se=e=>{i(e,B())},Ce=e=>{let t=p(()=>U.status?x(U.status):`noClaude`);var n=V(),r=u(n),s=e=>{var t=d();t.nodeValue=`Cowork sessions were found in a network-redirected or cloud-synced location that Tandem
|
|
10
|
+
can't safely configure. `,i(e,t)},c=e=>{var t=d();t.nodeValue=`Claude Desktop detected. Run a Cowork session once, then enable the integration here —
|
|
11
|
+
Tandem keeps newly created workspaces configured automatically. `,i(e,t)},f=e=>{var t=d();t.nodeValue=`Cowork not detected on this system. `,i(e,t)};F(r,e=>{T(t)===`blocked`?e(s):T(t)===`noWorkspacesYet`?e(c,1):e(f,-1)});var m=a(r,2);o(n),l(()=>{L(n,`data-detail`,T(t)),L(m,`href`,`${S}#cowork`)}),i(e,n)},we=t=>{let r=p(()=>U.status);var c=de(),d=f(c);let _;var v=u(d);P(v),g(2),o(d);var b=a(d,2),x=u(b);o(b);var S=a(b,2),C=e=>{let t=p(()=>ee(T(X)));var n=re(),r=u(n),s=u(r,!0);o(r);var c=a(r,2),d=u(c,!0);o(c),o(n),l(e=>{L(n,`data-reachability`,T(X)),L(n,`role`,T(X)===`unreachable`?`alert`:void 0),I(n,e),h(s,T(t).title),h(d,T(t).detail)},[()=>he(T(t).family)]),i(e,n)};F(S,e=>{T(X)!==`not-applicable`&&e(C)});var w=a(S,4),E=t=>{var n=ie(),r=a(u(n),4),c=u(r),d=a(c,2);o(r),o(n),l(()=>{c.disabled=T(q),d.disabled=T(q)}),e(`click`,c,()=>void ge()),e(`click`,d,()=>{s(K,null)}),i(t,n)};F(w,e=>{T(K)===`enable`&&e(E)});var D=a(w,2),O=e=>{var t=ae(),n=a(u(t)),s=u(n,!0);o(n),o(t),l(()=>h(s,T(r).vethernetCidr)),i(e,t)};F(D,e=>{T(r).vethernetCidr!==null&&e(O)});var A=a(D,2),ne=t=>{var n=oe(),s=u(n);let c;var d=u(s);P(d),g(2),o(s);var f=a(s,2),p=u(f);o(f),o(n),l(()=>{c=m(s,1,`cs-toggle svelte-kvy574`,null,c,{"is-busy":T(q)}),y(d,T(r).useLanIpOverride),d.disabled=T(q),h(p,`Fallback: ${T(r).lanIpFallback??``}`)}),e(`change`,d,e=>void ye(e.target.checked)),i(t,n)};F(A,e=>{T(r).lanIpFallback!==null&&e(ne)});var j=a(A,2),M=u(j),N=u(M);o(M);var R=a(M,2),z=e=>{i(e,se())},B=e=>{var t=ue();n(t,21,()=>T(r).workspaces,e=>`${e.workspaceId}/${e.vmId}`,(e,t)=>{let n=p(()=>k(T(t))),r=p(()=>te(T(n)));var s=le(),c=u(s),d=u(c);o(c);var f=a(c,2),m=u(f,!0);o(f);var g=a(f,2),_=e=>{var n=ce();l(()=>L(n,`data-testid`,`cowork-workspace-report-${T(t).workspaceId}-${T(t).vmId}`)),i(e,n)};F(g,e=>{T(n)===`schemaDrift`&&e(_)}),o(s),l(e=>{L(s,`data-testid`,`cowork-workspace-row-${T(t).workspaceId}-${T(t).vmId}`),L(s,`data-status`,T(n)),L(s,`title`,T(t).failureDetail??T(t).path),I(s,e),h(d,`${T(t).workspaceId??``} / ${T(t).vmId??``}`),h(m,T(r))},[()=>be(T(t))]),i(e,s)}),o(t),i(e,t)};F(R,e=>{T(r).workspaces.length===0?e(z):e(B,-1)});var V=a(R,2);o(j),l(()=>{_=m(d,1,`cs-toggle svelte-kvy574`,null,_,{"is-busy":T(q)}),y(v,T(r).enabled),v.disabled=T(q),h(x,`Integration enabled: ${T(r).enabled?`yes`:`no`}`),h(N,`Workspaces (${T(r).workspaces.length??``})`),V.disabled=T(q)}),e(`change`,v,e=>{e.target.checked?s(K,`enable`):_e()}),e(`click`,V,ve),i(t,c)};F($,e=>{U.loading?e(xe):T(Y)===`unsupported`?e(Se,1):T(Y)===`undetected`?e(Ce,2):T(Y)===`normal`&&U.status!==null&&e(we,3)});var Te=a($,2),Ee=e=>{var t=fe(),n=u(t);o(t),l(()=>h(n,`Failed to load Cowork status: ${U.error??``}`)),i(e,t)};F(Te,e=>{U.error&&!U.status&&e(Ee)});var De=a(Te,2),Oe=e=>{var t=pe(),n=u(t,!0);o(t),l(()=>h(n,T(G))),i(e,t)};F(De,e=>{T(G)&&e(Oe)}),o(Q),i(r,Q),R()}E([`change`,`click`]);export{H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.cs-root.svelte-kvy574{flex-direction:column;gap:10px;display:flex}.cs-label.svelte-kvy574{color:var(--tandem-fg);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;font-size:11px;font-weight:600}.cs-help-text.svelte-kvy574{color:var(--tandem-fg-subtle);font-size:12px}.cs-help.svelte-kvy574{color:var(--tandem-fg-subtle);margin-top:4px;font-size:10px}.cs-info-banner.svelte-kvy574{border:1px solid var(--tandem-info-border);background:var(--tandem-info-bg);color:var(--tandem-info-fg-strong);border-radius:var(--tandem-r-3);padding:8px 10px;font-size:12px}.cs-error-banner.svelte-kvy574{border:1px solid var(--tandem-error-border);background:var(--tandem-error-bg);color:var(--tandem-error-fg-strong);border-radius:var(--tandem-r-3);padding:8px 10px;font-size:12px}.cs-warning-banner.svelte-kvy574{border:1px solid var(--tandem-warning-border);background:var(--tandem-warning-bg);color:var(--tandem-warning-fg-strong);border-radius:var(--tandem-r-3);padding:8px 10px;font-size:12px}.cs-confirm-heading.svelte-kvy574{margin-bottom:4px;font-weight:600}.cs-confirm-body.svelte-kvy574{margin-bottom:8px}.cs-link.svelte-kvy574{color:var(--tandem-accent)}.cs-explainer.svelte-kvy574{color:var(--tandem-fg-muted);font-size:12px}.cs-explainer.svelte-kvy574>summary:where(.svelte-kvy574){cursor:pointer;color:var(--tandem-accent);font-size:11px}.cs-explainer-body.svelte-kvy574{flex-direction:column;gap:6px;margin-top:6px;line-height:1.5;display:flex}.cs-explainer-body.svelte-kvy574 p:where(.svelte-kvy574){margin:0}.cs-toggle.svelte-kvy574{cursor:pointer;color:var(--tandem-fg);align-items:center;gap:8px;min-height:24px;font-size:12px;display:flex}.cs-toggle.is-busy.svelte-kvy574{cursor:wait}.cs-accent-cbx.svelte-kvy574{accent-color:var(--tandem-accent)}.cs-vethernet.svelte-kvy574{font-size:12px}.cs-reachability-title.svelte-kvy574{margin-bottom:2px;font-weight:600}.cs-reachability-detail.svelte-kvy574{line-height:1.4}.cs-actions.svelte-kvy574{gap:8px;display:flex}.cs-btn.svelte-kvy574{border-radius:var(--tandem-r-2);cursor:pointer;padding:4px 10px;font-size:12px}.cs-btn--primary.svelte-kvy574{border:1px solid var(--tandem-accent);background:var(--tandem-accent);color:var(--tandem-accent-fg);font-weight:600}.cs-btn--primary.svelte-kvy574:disabled{cursor:not-allowed;opacity:.5}.cs-btn--ghost.svelte-kvy574{border:1px solid var(--tandem-border-strong);background:var(--tandem-surface);color:var(--tandem-fg-muted)}.cs-btn--ghost.svelte-kvy574:hover:not(:disabled){background:var(--tandem-surface-sunk);color:var(--tandem-fg)}.cs-btn--ghost.svelte-kvy574:disabled{cursor:not-allowed;opacity:.5}.cs-rescan-btn.svelte-kvy574{margin-top:8px}.cs-workspace-table.svelte-kvy574{flex-direction:column;gap:4px;display:flex}.cs-workspace-row.svelte-kvy574{border-radius:var(--tandem-r-2);justify-content:space-between;align-items:center;gap:8px;padding:4px 6px;font-size:11px;display:flex}.cs-workspace-id.svelte-kvy574{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.cs-workspace-label.svelte-kvy574{white-space:nowrap;font-weight:600}.cs-report-link.svelte-kvy574{color:var(--tandem-error-fg-strong);text-decoration:underline}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createTransport as e}from"./prod-
|
|
1
|
+
import{createTransport as e}from"./prod-p35ShryZ.js";async function t(e,t={},n){return window.__TAURI_INTERNALS__.invoke(e,t,n)}var n=!1;function r(r){return e(r,async e=>{if(n)return{statusCode:200};try{await t(`plugin:sentry|envelope`,{envelope:e.body})}catch(e){console.error(`Failed to send envelope to Rust:`,e),n=!0}return{statusCode:200}})}function i(e){return n||typeof e.data?.url==`string`&&(e.data.url.startsWith(`ipc://`)||e.data.url.match(/^https?:\/\/ipc\.localhost/))||t(`plugin:sentry|breadcrumb`,{breadcrumb:e}).catch(e=>{console.error(`Failed to send breadcrumb to Rust:`,e),n=!0}),null}var a={dsn:`https://123456@dummy.dsn/0`,integrations:e=>e.filter(e=>e.name!==`BrowserSession`),transport:r,beforeBreadcrumb:i};export{a as defaultOptions};
|