pipane 0.1.10 → 0.1.12

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.
@@ -1 +0,0 @@
1
- import{s as c}from"./device-identity-C_w2NbSk.js";class d{constructor(e,n=globalThis.fetch.bind(globalThis)){const t=new URL(e);t.pathname="/",t.search="",t.hash="",this.baseUrl=t.toString(),this.fetch=n}async createPairingTicket(e,n,t=`c_${crypto.randomUUID()}`){const r=await this.createChallenge({purpose:"pair",deviceId:e.deviceId,devicePublicKey:e.publicKey,backendId:n.backendId,connectionId:t,pairId:n.pairId});return this.completeTicket(`v1/pairings/${encodeURIComponent(n.pairId)}/tickets`,e,r)}async createConnectionTicket(e,n,t=`c_${crypto.randomUUID()}`){const r=await this.createChallenge({purpose:"connect",deviceId:e.deviceId,backendId:n,connectionId:t});return this.completeTicket("v1/connections/tickets",e,r)}async listAuthorizedBackends(e){const n=await this.createChallenge({purpose:"discover",deviceId:e.deviceId}),t=await this.completeSignedRequest("v1/accounts/backends",e,n);if(!Array.isArray(t.backends)||!t.backends.every(o))throw new Error("Rendezvous returned an invalid backend list");return t.backends}async revokeDevice(e,n,t){const r=await this.createChallenge({purpose:"revoke_device",deviceId:e.deviceId,backendId:n,targetDeviceId:t});await this.completeMutation("v1/revocations/devices",e,r)}async revokeBackend(e,n){const t=await this.createChallenge({purpose:"revoke_backend",deviceId:e.deviceId,backendId:n});await this.completeMutation("v1/revocations/backends",e,t)}async createChallenge(e){return this.requestJson("v1/auth/challenges",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}async completeTicket(e,n,t){const r=await c(n,t),a=await this.requestJson(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({challengeId:t.challengeId,signature:r})});if(!a||typeof a.ticket!="string"||!Array.isArray(a.iceServers))throw new Error("Rendezvous returned an invalid connection ticket");return a}async completeMutation(e,n,t){await this.completeSignedRequest(e,n,t)}async completeSignedRequest(e,n,t){const r=await c(n,t);return this.requestJson(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({challengeId:t.challengeId,signature:r})})}async requestJson(e,n){const t=await this.fetch(new URL(e,this.baseUrl),n),r=await t.json().catch(()=>{});if(!t.ok)throw new Error(typeof r?.error=="string"?r.error:`Rendezvous request failed (${t.status})`);return r}}function o(s){if(!s||typeof s!="object"||Array.isArray(s))return!1;const e=s;return typeof e.backendId=="string"&&e.backendId.length>0&&(e.name===void 0||typeof e.name=="string")&&(e.softwareVersion===void 0||typeof e.softwareVersion=="string")&&Array.isArray(e.protocolVersions)&&e.protocolVersions.every(n=>Number.isSafeInteger(n)&&n>0)&&typeof e.online=="boolean"}function l(s){const e=new URL(s),n=/^\/pair\/([^/]+)$/u.exec(e.pathname),t=new URLSearchParams(e.hash.replace(/^#/u,"")),r=t.get("backend"),a=t.get("secret");if(!n?.[1]||!r||!a)throw new Error("Pairing URL is malformed");return{pairId:decodeURIComponent(n[1]),backendId:r,secret:a}}export{d as R,l as p};
@@ -1 +0,0 @@
1
- import{B as a}from"./backend-protocol-BvNAsFvb.js";const u={model:void 0,thinkingLevel:"off",messages:[],isStreaming:!1};class C{constructor(e,t,i){if(this.manager=t,this.contexts=new Map,this.endpoint="webrtc",this.connectedOnce=!1,this.connectionListeners=new Set,this.extensionStatusListeners=new Set,this.globalStatusListeners=new Set,this.steeringQueueListeners=new Set,this.sessionListeners=new Set,this.contentListeners=new Set,this.statusListeners=new Set,this.sessionsChangedListeners=new Set,this.piInstallRequiredListeners=new Set,this.workspaceListeners=new Set,e.length===0)throw new Error("No authorized backends are available");for(const s of e)this.contexts.set(s.backendId,{descriptor:{...s,protocolVersions:[...s.protocolVersions]},sessions:[],...this.isCompatible(s)?{}:{error:`Update required for semantic protocol v${a}`},initialized:!1,unsubscribers:[]});this.activeId=this.chooseInitialBackend(i),this.ensureClient(this.requireContext(this.activeId))}get state(){return this.activeClient?.state??u}get sessionId(){return this.activeClient?.sessionId??""}get sessionFile(){return this.activeClient?.sessionFile}get sessionName(){return this.activeClient?.sessionName}get sessionStatus(){return this.activeClient?.sessionStatus??"virtual"}get isConnected(){return this.activeClient?.isConnected??!1}get isReconnecting(){return this.activeClient?.isReconnecting??!1}get pendingToolCallIds(){return this.activeClient?.pendingToolCallIds??new Set}get toolCallTimings(){return this.activeClient?.toolCallTimings??{}}get steeringQueue(){return this.activeClient?.steeringQueue??[]}get extensionStatuses(){return this.activeClient?.extensionStatuses??new Map}get cwd(){return this.activeClient?.cwd}get activeBackendId(){return this.activeId}get workspaceBackends(){return[...this.contexts.values()].map(e=>({...e.descriptor,protocolVersions:[...e.descriptor.protocolVersions],connected:e.client?.isConnected??!1,reconnecting:e.client?.isReconnecting??!1,...e.error?{error:e.error}:{}}))}get optimisticSessions(){return[...this.contexts.entries()].flatMap(([e,t])=>(t.client?.optimisticSessions??[]).map(i=>({...i,backendId:e})))}get virtualSessionInfo(){const e=this.activeClient?.virtualSessionInfo;return e?{...e,backendId:this.activeId}:void 0}async connect(e){this.endpoint=e;const t=[...this.contexts.values()].filter(n=>n.descriptor.online&&this.isCompatible(n.descriptor)),s=(await Promise.allSettled(t.map(async n=>{const l=this.ensureClient(n);try{return await l.connect(e),n.error=void 0,await this.refreshContextSessions(n),n}catch(h){throw n.error=c(h),h}}))).flatMap(n=>n.status==="fulfilled"?[n.value]:[]);if(s.length===0)throw this.emitWorkspaceChange(),new Error(t.length===0?"All authorized backends are offline":"Could not connect to any authorized backend");this.connectedOnce=!0,this.activeClient?.isConnected||this.setActiveBackend(s[0].descriptor.backendId),this.emitWorkspaceChange()}disconnect(){for(const e of this.contexts.values())e.client?.disconnect()}onConnectionChange(e){return r(this.connectionListeners,e)}onExtensionStatusChange(e){return r(this.extensionStatusListeners,e)}onGlobalStatusChange(e){return r(this.globalStatusListeners,e)}onSteeringQueueChange(e){return r(this.steeringQueueListeners,e)}onSessionChange(e){return r(this.sessionListeners,e)}onContentChange(e){return r(this.contentListeners,e)}onStatusChange(e){return r(this.statusListeners,e)}onSessionsChanged(e){return r(this.sessionsChangedListeners,e)}onPiInstallRequired(e){return r(this.piInstallRequiredListeners,e)}onWorkspaceChange(e){return r(this.workspaceListeners,e)}getSessionStatus(e,t=this.activeId){return this.contexts.get(t)?.client?.getSessionStatus(e)}reportError(e,t){this.requireActiveClient().reportError(e,t)}fetchAvailableModels(){return this.requireActiveClient().fetchAvailableModels()}installPi(){return this.requireActiveClient().installPi()}async loadDefaultModel(){await this.requireActiveClient().loadDefaultModel(),this.requireContext(this.activeId).initialized=!0}setCwd(e){this.requireActiveClient().setCwd(e)}prompt(e,t){return this.requireActiveClient().prompt(e,t)}fetchCommands(){return this.requireActiveClient().fetchCommands()}abort(){this.requireActiveClient().abort()}hardKill(){this.requireActiveClient().hardKill()}steer(e){this.requireActiveClient().steer(e)}removeSteering(e){this.requireActiveClient().removeSteering(e)}setModel(e){this.requireActiveClient().setModel(e)}setThinkingLevel(e){this.requireActiveClient().setThinkingLevel(e)}getForkMessages(){return this.requireActiveClient().getForkMessages()}fork(e){return this.requireActiveClient().fork(e)}forkAndPrompt(e,t){return this.requireActiveClient().forkAndPrompt(e,t)}async switchSession(e,t,i=this.activeId){const s=await this.activateContext(i,!1);await this.ensureConversationInitialized(s),await this.requireContextClient(s).switchSession(e,t)}async newSession(e,t=this.activeId){const i=await this.activateContext(t,!1);await this.ensureConversationInitialized(i),await this.requireContextClient(i).newSession(e)}async activateBackend(e){const t=await this.activateContext(e);await this.ensureConversationInitialized(t)}async removeBackend(e){const t=this.requireContext(e);await this.manager.revokeBackend(e);for(const i of t.unsubscribers)i();if(t.client?.disconnect(),this.contexts.delete(e),this.contexts.size===0){this.emitWorkspaceChange();return}if(this.activeId===e){const i=[...this.contexts.values()].find(s=>s.client?.isConnected)??[...this.contexts.values()].find(s=>s.descriptor.online)??[...this.contexts.values()][0];this.setActiveBackend(i.descriptor.backendId)}this.emitWorkspaceChange()}getConnectionDiagnostics(){return this.requireActiveClient().getConnectionDiagnostics?.()??Promise.resolve(void 0)}getBackendConnectionDiagnostics(e){const t=this.requireContext(e);return this.ensureClient(t).getConnectionDiagnostics?.()??Promise.resolve(void 0)}async listSessions(){return[...this.contexts.entries()].flatMap(([e,t])=>t.sessions.map(i=>({...i,backendId:e})))}async deleteSession(e,t=this.activeId){const i=this.requireContext(t),s=this.ensureClient(i);s.isConnected||await this.connectContext(i),await s.deleteSession(e),i.sessions=i.sessions.filter(n=>n.path!==e),this.emitSessionsChanged(t,"")}async browseDirectory(e,t=this.activeId){return this.connectedClient(t).then(i=>i.browseDirectory(e))}async createDirectory(e,t,i=this.activeId){return this.connectedClient(i).then(s=>s.createDirectory(e,t))}listForkMessages(e){return this.requireActiveClient().listForkMessages(e)}getRawSession(e){return this.requireActiveClient().getRawSession(e)}getFileContent(e,t){return this.requireActiveClient().getFileContent(e,t)}createFileUpload(e){return this.requireActiveClient().createFileUpload(e)}appendFileUpload(e){return this.requireActiveClient().appendFileUpload(e)}completeFileUpload(e){return this.requireActiveClient().completeFileUpload(e)}getLocalSettings(){return this.requireActiveClient().getLocalSettings()}validateLocalSettings(e){return this.requireActiveClient().validateLocalSettings(e)}patchLocalSettings(e){return this.requireActiveClient().patchLocalSettings(e)}saveLocalSettings(e){return this.requireActiveClient().saveLocalSettings(e)}getUpdates(){return this.requireActiveClient().getUpdates()}runUpdate(e){return this.requireActiveClient().runUpdate(e)}getCapabilities(){return this.requireActiveClient().getCapabilities?.()??Promise.reject(new Error("Backend capabilities are unavailable"))}get activeClient(){return this.contexts.get(this.activeId)?.client}chooseInitialBackend(e){const t=[...this.contexts.values()].filter(i=>this.isCompatible(i.descriptor));if(t.length===0)throw new Error(`No authorized backend supports semantic protocol v${a}`);return e&&t.some(i=>i.descriptor.backendId===e)?e:t.find(i=>i.descriptor.online)?.descriptor.backendId??t[0].descriptor.backendId}isCompatible(e){return e.protocolVersions.includes(a)}requireContext(e){const t=this.contexts.get(e);if(!t)throw new Error("This browser is not authorized for the requested backend");return t}requireActiveClient(){const e=this.activeClient;if(!e)throw new Error("No active backend is available");return e}requireContextClient(e){return e.client??this.ensureClient(e)}ensureClient(e){if(!this.isCompatible(e.descriptor))throw new Error(e.error||"Backend update required");if(e.client)return e.client;const t=e.descriptor.backendId,i=this.manager.getClient(t);return e.client=i,e.unsubscribers.push(i.onConnectionChange(s=>{e.error=s?void 0:e.error,s&&this.connectedOnce&&this.refreshContextSessions(e),this.emitWorkspaceChange(),this.activeId===t&&this.emit(this.connectionListeners,s)}),i.onExtensionStatusChange(()=>{this.activeId===t&&this.emit(this.extensionStatusListeners)}),i.onGlobalStatusChange(()=>{this.emit(this.globalStatusListeners),this.emitWorkspaceChange()}),i.onSteeringQueueChange(()=>{this.activeId===t&&this.emit(this.steeringQueueListeners)}),i.onSessionChange(()=>{this.refreshContextSessions(e),this.activeId===t&&this.emit(this.sessionListeners)}),i.onContentChange(()=>{this.activeId===t&&this.emit(this.contentListeners)}),i.onStatusChange(()=>{this.activeId===t&&this.emit(this.statusListeners)}),i.onSessionsChanged(s=>{this.refreshContextSessions(e).finally(()=>this.emitSessionsChanged(t,s))}),i.onPiInstallRequired(s=>{this.activeId===t&&this.emit(this.piInstallRequiredListeners,s)})),i}async activateContext(e,t=!0){const i=this.requireContext(e),s=this.ensureClient(i);return s.isConnected||await this.connectContext(i),this.activeId!==e&&(await this.activeClient?.setSessionSubscriptionActive?.(!1),this.setActiveBackend(e),t&&await s.setSessionSubscriptionActive?.(!0)),i}async connectContext(e){const t=this.ensureClient(e);try{await t.connect(this.endpoint),e.error=void 0,await this.refreshContextSessions(e)}catch(i){throw e.error=c(i),this.emitWorkspaceChange(),i}}async connectedClient(e){const t=this.requireContext(e),i=this.ensureClient(t);return i.isConnected||await this.connectContext(t),i}async ensureConversationInitialized(e){if(e.initialized)return;if(e.initializing)return e.initializing;const t=this.requireContextClient(e);return e.initializing=(async()=>{try{await t.fetchAvailableModels()}catch{}await t.loadDefaultModel(),e.initialized=!0})().finally(()=>{e.initializing=void 0}),e.initializing}async refreshContextSessions(e){const t=e.client;if(t?.isConnected)try{e.sessions=await t.listSessions(),e.error=void 0,this.emitWorkspaceChange()}catch(i){e.error=c(i),this.emitWorkspaceChange()}}setActiveBackend(e){this.activeId=e,this.connectedOnce&&window.location.pathname.startsWith("/backend/")&&window.history.replaceState(null,"","/"),this.emitWorkspaceChange(),this.emit(this.connectionListeners,this.isConnected),this.emit(this.sessionListeners),this.emit(this.contentListeners),this.emit(this.statusListeners),this.emit(this.extensionStatusListeners),this.emit(this.steeringQueueListeners),this.emit(this.sessionsChangedListeners,"__local_settings__")}emitSessionsChanged(e,t){this.emit(this.sessionsChangedListeners,t),this.emitWorkspaceChange()}emitWorkspaceChange(){this.emit(this.workspaceListeners)}emit(e,...t){for(const i of e)i(...t)}}function r(o,e){return o.add(e),()=>o.delete(e)}function c(o){return o instanceof Error?o.message:String(o)}export{C as WorkspaceBackendClient};