@jmfederico/pi-web 1.202605.1
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/LICENSE +21 -0
- package/README.md +321 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/assets/CodeViewer-DsXI9VCn.js +4 -0
- package/dist/client/assets/TerminalPanel-CpzJEFv1.js +47 -0
- package/dist/client/assets/index-Cbr8EG8h.js +687 -0
- package/dist/client/assets/vendor-editor-core-hulUn3GY.js +12 -0
- package/dist/client/assets/vendor-editor-languages-Cjllm-a8.js +26 -0
- package/dist/client/assets/vendor-editor-legacy-B4QLsWF8.js +1 -0
- package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
- package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
- package/dist/client/index.html +16 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/server/app.js +80 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/git/gitService.js +118 -0
- package/dist/server/git/gitService.js.map +1 -0
- package/dist/server/gitRoutes.js +23 -0
- package/dist/server/gitRoutes.js.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +37 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +31 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +36 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/sessiond/config.js +9 -0
- package/dist/server/sessiond/config.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonClient.js +65 -0
- package/dist/server/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +63 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond.js +45 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +27 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +517 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +68 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +134 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +68 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +116 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/storage/projectStore.js +88 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +70 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +70 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +115 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +24 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +50 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +84 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +26 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js +33 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +38 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +8 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceService.js +39 -0
- package/dist/server/workspaces/workspaceService.js.map +1 -0
- package/dist/shared/apiTypes.js +2 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/extensions/pi-web.ts +144 -0
- package/install.sh +5 -0
- package/package.json +107 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import{i as h,c as p,d as m,b as d,a as f,n as u,e as b,r as l,t as v}from"./index-Cbr8EG8h.js";import{D as g,o as w}from"./vendor-terminal-DjQ08hXu.js";var x=Object.defineProperty,y=Object.getOwnPropertyDescriptor,n=(e,i,t,r)=>{for(var s=r>1?void 0:r?y(i,t):i,a=e.length-1,c;a>=0;a--)(c=e[a])&&(s=(r?c(i,t,s):c(s))||s);return r&&s&&x(i,t,s),s};let o=class extends h{constructor(){super(...arguments),this.terminals=[],this.loading=!1,this.visible=!1}firstUpdated(){this.intersectionObserver=new IntersectionObserver(e=>{this.visible=e[0]?.isIntersecting===!0}),this.intersectionObserver.observe(this)}disconnectedCallback(){this.intersectionObserver?.disconnect(),this.intersectionObserver=void 0,this.disposeTerminalView(),super.disconnectedCallback()}willUpdate(){const e=this.workspace?.path;e!==this.observedCwd&&(this.observedCwd=e,this.loadedCwd=void 0,this.terminals=[],this.selectedId=void 0,this.disposeTerminalView())}updated(){this.loadVisibleWorkspaceTerminals(),this.ensureTerminalView()}loadVisibleWorkspaceTerminals(){const e=this.workspace?.path;!this.visible||e===void 0||e===this.loadedCwd||(this.loadedCwd=e,this.loadTerminals())}async loadTerminals(){this.loading=!0,this.error=void 0;try{if(this.workspace===void 0)return;const e=await p.terminals(this.workspace.projectId,this.workspace.id);this.terminals=e,this.selectedId=e.find(i=>!i.exited)?.id??e[0]?.id,e.length===0&&await this.startTerminal()}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loading=!1}}async startTerminal(){if(this.workspace!==void 0){this.error=void 0;try{const e=await p.startTerminal(this.workspace.projectId,this.workspace.id,{cols:100,rows:30});this.terminals=[...this.terminals,e],this.selectTerminal(e.id)}catch(e){this.error=e instanceof Error?e.message:String(e)}}}async closeTerminal(e,i){i.stopPropagation();try{if(this.workspace===void 0)return;await p.closeTerminal(this.workspace.projectId,this.workspace.id,e);const t=this.terminals.filter(r=>r.id!==e);this.terminals=t,this.selectedId===e&&(this.selectedId=t[0]?.id,this.disposeTerminalView())}catch(t){this.error=t instanceof Error?t.message:String(t)}}selectTerminal(e){this.selectedId!==e&&(this.selectedId=e,this.disposeTerminalView())}ensureTerminalView(){const e=this.workspace;if(!this.visible||this.terminal!==void 0||this.selectedId===void 0||this.terminalHost===void 0||e===void 0)return;const i=new g({cursorBlink:!0,convertEol:!0,fontFamily:"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",fontSize:13,theme:{background:"#05070a",foreground:"#e6edf3",cursor:"#58a6ff",selectionBackground:"#264f78"}}),t=new w;i.loadAddon(t),i.open(this.terminalHost),this.terminal=i,this.fitAddon=t,this.resizeObserver=new ResizeObserver(()=>{this.fitAndNotify()}),this.resizeObserver.observe(this.terminalHost),i.onData(r=>{this.send({type:"input",data:r})}),this.connectSocket(e.projectId,e.id,this.selectedId,i),requestAnimationFrame(()=>{this.fitAndNotify()}),i.focus()}connectSocket(e,i,t,r){const s=m(e,i,t);s.binaryType="arraybuffer",this.socket=s,s.addEventListener("open",()=>{this.fitAndNotify()}),s.addEventListener("message",a=>{this.handleSocketMessage(a.data,t,r)}),s.addEventListener("close",()=>{this.socket===s&&(this.socket=void 0)})}async handleSocketMessage(e,i,t){try{const r=k(await T(e));r.type==="output"&&t.write(r.data),r.type==="exit"&&(t.writeln(`\r
|
|
2
|
+
[process exited${r.exitCode===void 0?"":` with code ${String(r.exitCode)}`}]`),this.terminals=this.terminals.map(s=>s.id===i?{...s,exited:!0,...r.exitCode===void 0?{}:{exitCode:r.exitCode}}:s)),r.type==="error"&&t.writeln(`\r
|
|
3
|
+
[terminal error: ${r.message}]`)}catch(r){t.writeln(`\r
|
|
4
|
+
[terminal error: ${r instanceof Error?r.message:String(r)}]`)}}fitAndNotify(){this.fitAddon===void 0||this.terminal===void 0||(this.fitAddon.fit(),this.send({type:"resize",cols:this.terminal.cols,rows:this.terminal.rows}))}send(e){this.socket?.readyState===WebSocket.OPEN&&this.socket.send(JSON.stringify(e))}disposeTerminalView(){this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.socket?.close(),this.socket=void 0,this.terminal?.dispose(),this.terminal=void 0,this.fitAddon=void 0}render(){return d`
|
|
5
|
+
<section class="terminal-shell">
|
|
6
|
+
<div class="terminal-tabs">
|
|
7
|
+
${this.terminals.map(e=>d`
|
|
8
|
+
<button class=${this.selectedId===e.id?"selected":""} @click=${()=>{this.selectTerminal(e.id)}}>
|
|
9
|
+
<span>${e.name}${e.exited?" · exited":""}</span>
|
|
10
|
+
<small @click=${i=>{this.closeTerminal(e.id,i)}}>×</small>
|
|
11
|
+
</button>
|
|
12
|
+
`)}
|
|
13
|
+
<button class="new" ?disabled=${this.workspace===void 0} @click=${()=>{this.startTerminal()}}>+ Shell</button>
|
|
14
|
+
</div>
|
|
15
|
+
${this.error===void 0?null:d`<p class="error">${this.error}</p>`}
|
|
16
|
+
${this.loading?d`<p class="muted">Loading terminals…</p>`:null}
|
|
17
|
+
<div class="terminal-host"></div>
|
|
18
|
+
</section>
|
|
19
|
+
`}};o.styles=f`
|
|
20
|
+
:host { flex: 1 1 auto; min-height: 0; display: flex; }
|
|
21
|
+
.terminal-shell { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: #05070a; }
|
|
22
|
+
.terminal-tabs { flex: 0 0 auto; display: flex; gap: 6px; align-items: center; padding: 6px; border-bottom: 1px solid #21262d; background: #0d1117; overflow: auto; }
|
|
23
|
+
button { display: inline-flex; align-items: center; gap: 6px; min-width: 0; max-width: 180px; border: 1px solid #30363d; border-radius: 7px; background: #161b22; color: #e6edf3; padding: 5px 7px; cursor: pointer; }
|
|
24
|
+
button.selected { border-color: #58a6ff; background: #0d2847; }
|
|
25
|
+
button.new { flex: 0 0 auto; color: #8b949e; }
|
|
26
|
+
button span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
27
|
+
button small { color: #8b949e; font-size: 14px; line-height: 1; }
|
|
28
|
+
button small:hover { color: #ff7b72; }
|
|
29
|
+
button:disabled { opacity: .5; cursor: not-allowed; }
|
|
30
|
+
.terminal-host { flex: 1 1 auto; min-height: 0; padding: 6px; box-sizing: border-box; overflow: hidden; }
|
|
31
|
+
.terminal-host .xterm { height: 100%; cursor: text; position: relative; user-select: none; }
|
|
32
|
+
.terminal-host .xterm.focus, .terminal-host .xterm:focus { outline: none; }
|
|
33
|
+
.terminal-host .xterm-helpers { position: absolute; top: 0; z-index: 5; }
|
|
34
|
+
.terminal-host .xterm-helper-textarea { position: absolute !important; left: -9999em !important; top: 0 !important; width: 0 !important; height: 0 !important; min-width: 0 !important; min-height: 0 !important; padding: 0 !important; border: 0 !important; margin: 0 !important; opacity: 0 !important; z-index: -5 !important; white-space: nowrap !important; overflow: hidden !important; resize: none !important; outline: 0 !important; appearance: none !important; }
|
|
35
|
+
.terminal-host .xterm-viewport { position: absolute; inset: 0; overflow-y: scroll; cursor: default; background-color: #05070a; }
|
|
36
|
+
.terminal-host .xterm-screen { position: relative; }
|
|
37
|
+
.terminal-host .xterm-screen canvas { position: absolute; left: 0; top: 0; }
|
|
38
|
+
.terminal-host .xterm-char-measure-element { display: inline-block; visibility: hidden; position: absolute; top: 0; left: -9999em; line-height: normal; }
|
|
39
|
+
.terminal-host .xterm-accessibility:not(.debug), .terminal-host .xterm-message { position: absolute; inset: 0; z-index: 10; color: transparent; pointer-events: none; }
|
|
40
|
+
.terminal-host .xterm-accessibility-tree:not(.debug) *::selection { color: transparent; }
|
|
41
|
+
.terminal-host .xterm-accessibility-tree { font-family: monospace; user-select: text; white-space: pre; }
|
|
42
|
+
.terminal-host .xterm-accessibility-tree > div { transform-origin: left; width: fit-content; }
|
|
43
|
+
.terminal-host .live-region { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
|
|
44
|
+
.error { flex: 0 0 auto; margin: 0; padding: 8px; color: #ff7b72; border-bottom: 1px solid #30363d; background: #161b22; }
|
|
45
|
+
.muted { margin: 10px; color: #8b949e; }
|
|
46
|
+
.xterm { height: 100%; }
|
|
47
|
+
`;n([u({attribute:!1})],o.prototype,"workspace",2);n([b(".terminal-host")],o.prototype,"terminalHost",2);n([l()],o.prototype,"terminals",2);n([l()],o.prototype,"selectedId",2);n([l()],o.prototype,"loading",2);n([l()],o.prototype,"error",2);n([l()],o.prototype,"visible",2);o=n([v("terminal-panel")],o);function k(e){const i=JSON.parse(e);if(!S(i))return{type:"error",message:"Invalid terminal message"};const t=i;return t.type==="output"&&typeof t.data=="string"?{type:"output",data:t.data}:t.type==="exit"?{type:"exit",...typeof t.exitCode=="number"?{exitCode:t.exitCode}:{}}:t.type==="error"&&typeof t.message=="string"?{type:"error",message:t.message}:{type:"error",message:"Invalid terminal message"}}async function T(e){return typeof e=="string"?e:e instanceof ArrayBuffer?new TextDecoder().decode(e):e instanceof Blob?await e.text():String(e)}function S(e){return typeof e=="object"&&e!==null}export{o as TerminalPanel};
|