piu-piu-cli 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.
@@ -0,0 +1 @@
1
+ .xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}:root{--paper: #fbf8f2;--paper-2: #f3ede3;--paper-3: #ebe3d6;--ink: #2a231e;--ink-2: #4c423a;--ink-muted: #8a7e72;--line: #e8dfd1;--brass: #b0843a;--working: #3f8a6c;--waiting: #e39f37;--waiting-ink: #7c4c06;--error: #c2533d;--idle: #a69a8e;--shadow: 0 1px 0 rgba(42, 35, 30, .04), 0 18px 40px -18px rgba(42, 35, 30, .45);--font: "Schibsted Grotesk", ui-sans-serif, system-ui, sans-serif;--mono: ui-monospace, "SF Mono", Menlo, monospace;--dock-w: 420px;color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:#1f1915;color:var(--ink);font:15px/1.45 var(--font);overflow:hidden}button,input,textarea{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--brass);outline-offset:2px}.app{position:relative;height:100%}.stage{position:absolute;inset:0}.app-docked{display:grid;grid-template-columns:minmax(0,1fr) var(--dock-w);grid-template-rows:minmax(0,100%);height:100%}.app-docked .stage{position:relative}.stage canvas{touch-action:none}.hud{position:absolute;top:16px;left:16px;max-width:min(460px,calc(100% - 32px));pointer-events:none;background:#fbf8f2e0;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:12px 16px;border-radius:16px;box-shadow:var(--shadow)}.hud h1{margin:0;font-size:22px;font-weight:700;letter-spacing:-.02em;line-height:1.1}.hud p{margin:4px 0 0;color:var(--ink-muted);font-size:14px}.hud .hud-offline{color:var(--error)}.light-switch{display:flex;gap:2px;margin-top:10px;pointer-events:auto;background:var(--paper-3);border-radius:10px;padding:3px;width:fit-content}.light-switch button{border:0;background:transparent;font-size:12px;padding:4px 10px;border-radius:7px;cursor:pointer;color:var(--ink-muted)}.light-switch button:hover{color:var(--ink)}.light-switch button[aria-pressed=true]{background:var(--paper);color:var(--ink);box-shadow:0 1px 2px #2a231e29}.needs-you{position:absolute;left:16px;bottom:16px;width:min(320px,calc(100% - 32px));background:var(--paper);border-radius:16px;padding:14px 12px 8px;box-shadow:var(--shadow);border-top:4px solid var(--waiting)}.needs-you h2{margin:0 4px 6px;font-size:14px;font-weight:600}.needs-you ul{list-style:none;margin:0;padding:0}.needs-you button{display:grid;width:100%;text-align:left;background:none;border:0;cursor:pointer;padding:8px;border-radius:10px}.needs-you button:hover{background:#fdf0db}.needs-you strong{font-weight:600}.needs-you span{color:var(--ink-muted);font-size:13px}.tags{position:absolute;inset:0;pointer-events:none;overflow:hidden}.tag{position:absolute;left:0;top:0;will-change:transform;display:grid;justify-items:center;gap:1px;white-space:nowrap;-webkit-user-select:none;user-select:none}.tag-name{background:#fbf8f2f0;color:var(--ink);font-size:12px;font-weight:600;padding:2px 8px;border-radius:99px;box-shadow:0 1px 3px #2a231e33}.tag-doing{max-width:190px;overflow:hidden;text-overflow:ellipsis;font-size:11px;color:var(--ink);background:#fbf8f2cc;padding:1px 7px;border-radius:6px}.tags-compact .tag:not(.tag-waiting):not(.tag-selected) .tag-doing{display:none}.tag-off .tag-name{background:#fbf8f29e;color:var(--ink-muted);font-weight:500}.tag-waiting .tag-name{background:var(--waiting);color:#2b1a02}.tag-selected .tag-name{background:var(--ink);color:var(--paper)}.side{position:absolute;top:14px;right:14px;bottom:14px;width:min(var(--dock-w),calc(100% - 28px));display:flex;flex-direction:column;background:var(--paper);border-radius:20px;box-shadow:var(--shadow);overflow:hidden;animation:side-in .2s ease-out}.side-pinned{position:relative;top:auto;right:auto;bottom:auto;width:auto;height:auto;min-height:0;margin:12px 12px 12px 0;animation:none}@keyframes side-in{0%{transform:translate(14px);opacity:0}}@media(prefers-reduced-motion:reduce){.side{animation:none}}.side-nav{flex:none;display:flex;align-items:center;gap:6px;padding:10px 10px 8px 12px;border-bottom:1px solid var(--line);background:var(--paper-2)}.side-tabs{flex:1;display:flex;gap:2px;background:var(--paper-3);padding:3px;border-radius:12px;min-width:0}.side-tab{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;background:transparent;padding:6px 8px;border-radius:9px;font-size:13px;color:var(--ink-muted);cursor:pointer;white-space:nowrap}.side-tab svg{width:16px;height:16px;flex:none}.side-tab:hover{color:var(--ink)}.side-tab-on{background:var(--paper);color:var(--ink);font-weight:600;box-shadow:0 1px 2px #2a231e24}.side-tools{display:flex;gap:0}.side-badge{min-width:18px;height:18px;padding:0 5px;border-radius:99px;background:var(--brass);color:#fff;font-size:11px;font-weight:700;display:inline-grid;place-items:center}.side-body{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden}.side-empty{padding:20px 18px;color:var(--ink-muted);font-size:14px;list-style:none}.side-heading{flex:none;padding:14px 18px 10px}.side-heading h2{margin:0;font-size:17px;font-weight:700}.side-heading p{margin:3px 0 0;font-size:13px;color:var(--ink-muted)}.side-heading .chips{margin-top:10px}.team-controls{flex:none;padding:12px 14px 8px;display:grid;gap:10px}.search{display:flex;align-items:center;gap:8px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:0 10px;color:var(--ink-muted)}.search:focus-within{border-color:var(--brass);box-shadow:0 0 0 3px #b0843a26}.search input{flex:1;border:0;outline:none;background:transparent;padding:9px 0;font-size:14px;color:var(--ink);min-width:0}.chips{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none}.chip{flex:none;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--paper);border-radius:99px;padding:4px 10px;font-size:12.5px;color:var(--ink-2);cursor:pointer}.chip span{font-size:11px;color:var(--ink-muted)}.chip[aria-pressed=true]{background:var(--ink);border-color:var(--ink);color:var(--paper)}.chip[aria-pressed=true] span{color:#fbf8f2b3}.team-list{flex:1;min-height:0;overflow-y:auto;padding:0 8px 12px;overscroll-behavior:contain}.team-section h3{display:flex;align-items:center;gap:6px;margin:12px 10px 4px;font-size:12px;font-weight:600;color:var(--ink-muted);letter-spacing:.01em}.team-section h3 span{font-weight:500;opacity:.8}.team-section ul{list-style:none;margin:0;padding:0}.agent-row{display:flex;align-items:center;border-radius:14px}.agent-row:hover{background:var(--paper-2)}.agent-main{flex:1;min-width:0;display:flex;align-items:center;gap:11px;border:0;background:none;text-align:left;padding:8px 4px 8px 8px;cursor:pointer}.agent-avatar{position:relative;display:inline-flex;flex:none}.presence{position:absolute;right:-1px;bottom:-1px;width:12px;height:12px;border-radius:50%;border:2.5px solid var(--paper);background:#cfc5b8}.presence-working{background:var(--working)}.presence-waiting{background:var(--waiting)}.presence-error{background:var(--error)}.presence-idle,.presence-break{background:var(--idle)}.agent-text{flex:1;min-width:0;display:grid;gap:1px}.agent-line{display:flex;align-items:baseline;gap:6px;min-width:0}.agent-line strong{font-size:14.5px;font-weight:600;white-space:nowrap}.agent-meta{font-size:12px;color:var(--ink-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-activity{font-size:12.5px;color:var(--ink-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-working .agent-activity{color:#2c5f4a}.agent-waiting .agent-activity{color:var(--waiting-ink);font-weight:500}.agent-off .agent-line strong{color:var(--ink-2);font-weight:500}.agent-badges{display:flex;align-items:center;gap:6px;flex:none}.badge-waiting{font-size:11px;font-weight:600;color:var(--waiting-ink);background:#fdf0db;padding:2px 8px;border-radius:99px;white-space:nowrap}.star{opacity:0;width:30px;height:30px;margin-right:4px}.agent-row:hover .star,.star.icon-on,.star:focus-visible{opacity:1}.star svg{width:16px;height:16px}.inbox-list{flex:1;min-height:0;overflow-y:auto;padding:0 14px 14px;display:grid;align-content:start;gap:12px}.inbox-who{display:flex;align-items:center;gap:8px;width:100%;border:0;background:none;padding:0 2px 6px;cursor:pointer;text-align:left;font-size:13px}.inbox-who span{color:var(--ink-muted)}.inbox-who time{margin-left:auto;font-size:12px;color:var(--ink-muted)}.inbox-elsewhere{display:flex;align-items:center;gap:10px;border:1px dashed #f0dcb5;background:#fffaf1;border-radius:14px;padding:10px 12px;text-align:left;font-size:13px;cursor:pointer;color:var(--ink-2)}.inbox-clear{display:grid;justify-items:center;gap:8px;padding:48px 0;color:var(--ink-muted);font-size:15px}.inbox-clear-mark{width:44px;height:44px;border-radius:50%;display:grid;place-items:center;background:#e6f1eb;color:var(--working);font-size:20px}.feed{flex:1;min-height:0;overflow-y:auto;list-style:none;margin:0;padding:0 10px 14px}.feed button{display:grid;grid-template-columns:24px 1fr auto;gap:10px;align-items:start;width:100%;border:0;background:none;text-align:left;padding:7px 8px;border-radius:10px;cursor:pointer;font-size:13px;color:var(--ink-2)}.feed button:hover{background:var(--paper-2)}.feed-text strong{color:var(--ink);font-weight:600}.feed-text b{font-weight:600;color:var(--ink)}.feed-text em{display:block;font-style:normal;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed time{font-size:11.5px;color:var(--ink-muted);padding-top:1px}.chat{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.chat-head{flex:none;display:flex;align-items:center;gap:4px;padding:10px 10px 8px 8px}.chat-who{flex:1;min-width:0;display:flex;align-items:center;gap:10px;border:0;background:none;padding:4px 6px;border-radius:12px;text-align:left;cursor:pointer}.chat-who:hover{background:var(--paper-2)}.chat-who-text{min-width:0;display:grid}.chat-who-text strong{display:inline-flex;align-items:center;gap:2px;font-size:17px;font-weight:700;letter-spacing:-.01em}.chat-who-text strong svg{width:15px;height:15px;color:var(--ink-muted);transform:rotate(90deg)}.chat-who-text>span{font-size:12.5px;color:var(--ink-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-actions{display:flex}.menu-wrap{position:relative}.menu{position:absolute;right:0;top:38px;z-index:5;min-width:210px;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);padding:6px;display:grid}.menu button{display:flex;align-items:center;gap:10px;border:0;background:none;padding:8px 10px;border-radius:9px;font-size:13.5px;text-align:left;cursor:pointer;color:var(--ink-2)}.menu button:hover{background:var(--paper-2);color:var(--ink)}.menu svg{width:16px;height:16px}.menu-mono{font:11.5px var(--mono);color:var(--ink-muted)}.chat-strip{flex:none;display:flex;align-items:center;gap:10px;width:100%;border:0;border-bottom:1px solid var(--line);background:none;padding:2px 14px 10px 16px;cursor:pointer;text-align:left}.chat-strip .status-chip{flex:0 1 auto;min-width:0}.chat-strip .dock-stats{margin-left:auto}.chat-strip>svg{color:var(--ink-muted);flex:none}.chat-details{flex:none;padding:10px 18px 12px;border-bottom:1px solid var(--line);background:var(--paper-2);max-height:34vh;overflow-y:auto}.chat-details dl{display:grid;gap:5px;margin:0;font-size:13px}.chat-details dl div{display:flex;justify-content:space-between;gap:12px}.chat-details dt{color:var(--ink-muted);flex:none}.chat-details dd{margin:0;text-align:right;overflow-wrap:anywhere}.side-foot{flex:none;display:flex;align-items:center;gap:12px;padding:8px 16px;border-top:1px solid var(--line);background:var(--paper-2);font-size:12px;color:var(--ink-muted)}.side-foot span{display:inline-flex;align-items:center;gap:5px}.side-foot .status-dot{display:inline-block;width:7px;height:7px}.side-foot-cost{margin-left:auto;font-weight:600;color:var(--ink-2)}.switcher-backdrop{position:absolute;inset:0;z-index:10;background:#2a231e40;display:grid;align-items:start;justify-items:center;padding:64px 12px 12px}.switcher{width:100%;background:var(--paper);border-radius:18px;box-shadow:var(--shadow);overflow:hidden;display:flex;flex-direction:column;max-height:100%}.search-big{margin:10px;border-radius:12px}.search-big kbd{font:11px var(--mono);color:var(--ink-muted);border:1px solid var(--line);border-radius:6px;padding:1px 6px}.switcher ul{list-style:none;margin:0;padding:0 6px 8px;overflow-y:auto}.switcher li button{display:grid;grid-template-columns:auto auto 1fr auto;align-items:center;gap:10px;width:100%;border:0;background:none;padding:7px 8px;border-radius:10px;text-align:left;cursor:pointer;font-size:13.5px}.switcher li button>span:not(.agent-avatar){color:var(--ink-muted);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.switcher li em{font-style:normal;font-size:12px;color:var(--ink-muted)}.switcher-on{background:var(--paper-2)!important}.launcher{position:absolute;right:16px;bottom:16px;display:flex;align-items:center;gap:12px;border:0;cursor:pointer;background:var(--paper);border-radius:18px;padding:9px 16px 9px 10px;box-shadow:var(--shadow);text-align:left}.launcher:hover{transform:translateY(-1px)}.launcher-faces{display:flex}.launcher-faces .avatar{border:2px solid var(--paper);margin-left:-8px}.launcher-faces .avatar:first-child{margin-left:0}.launcher-text{display:grid}.launcher-text strong{font-size:14px}.launcher-text span{font-size:12px;color:var(--ink-muted)}.launcher-dot{position:absolute;top:6px;right:8px;width:10px;height:10px;border-radius:50%;background:var(--brass);border:2px solid var(--paper)}.launcher-dot-waiting{background:var(--waiting)}.icon-button{display:inline-grid;place-items:center;width:34px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--ink-muted);cursor:pointer}.icon-button:hover{background:var(--paper-3);color:var(--ink)}.icon-button:disabled{opacity:.35;cursor:default;background:transparent}.icon-on{color:var(--brass)}.avatar{display:inline-grid;place-items:center;flex:none;border-radius:50%;color:#fff;font-weight:700;letter-spacing:.02em;box-shadow:inset 0 -2px #0000001f}.status-chip{display:inline-flex;align-items:center;gap:7px;max-width:100%;font-size:13px;font-weight:500;padding:4px 10px 4px 8px;border-radius:99px;background:var(--paper-2);color:var(--ink-2);overflow:hidden}.status-chip{white-space:nowrap;text-overflow:ellipsis}.status-dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--idle)}.status-working .status-dot,.status-dot.status-working{background:var(--working)}.status-waiting .status-dot,.status-dot.status-waiting{background:var(--waiting)}.status-error .status-dot,.status-dot.status-error{background:var(--error)}.status-off .status-dot,.status-dot.status-off{background:#cfc5b8}.status-chip.status-waiting{background:#fdf0db;color:var(--waiting-ink)}.status-chip.status-working{background:#e6f1eb;color:#2c5f4a}.status-chip.status-error{background:#f8e4de;color:#8e3524}@media(prefers-reduced-motion:no-preference){.status-working .status-dot,.status-dot.status-working{animation:breathe 1.6s ease-in-out infinite}@keyframes breathe{50%{box-shadow:0 0 0 4px #3f8a6c2e}}}.dock-stats{display:inline-flex;gap:12px;font-size:12px;color:var(--ink-muted)}.dock-stats>span{display:inline-flex;align-items:center;gap:6px}.meter{width:42px;height:5px;border-radius:99px;background:var(--paper-3);overflow:hidden}.meter span{display:block;height:100%;background:var(--brass)}.dock-note{margin:0 0 10px;font-size:13px;color:var(--ink-muted)}.convo-wrap{position:relative;flex:1 1 auto;min-height:0;display:flex;flex-direction:column}.convo{flex:1 1 auto;min-height:0;overflow-y:auto;padding:14px 18px 10px;overscroll-behavior:contain}.convo-content{display:flex;flex-direction:column;gap:6px;min-height:100%}.jump-latest{position:absolute;top:10px;left:50%;transform:translate(-50%);z-index:4;width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:var(--paper);color:var(--ink);box-shadow:var(--shadow);display:grid;place-items:center;cursor:pointer}.jump-latest:hover{border-color:var(--brass);color:var(--brass)}.jump-latest svg{transform:rotate(90deg)}.convo-empty{margin:auto 0;display:grid;justify-items:center;text-align:center;gap:12px;padding:24px 6px;color:var(--ink-muted);font-size:14px}.convo-empty p{margin:0}.suggestions{display:grid;gap:6px;width:100%}.suggestions button{border:1px solid var(--line);background:var(--paper);border-radius:12px;padding:9px 12px;text-align:left;font-size:13.5px;color:var(--ink-2);cursor:pointer}.suggestions button:hover{border-color:var(--brass);color:var(--ink)}.convo-time{align-self:center;font-size:11.5px;color:var(--ink-muted);padding:10px 0 4px}.msg-you{align-self:flex-end;max-width:82%;background:var(--ink);color:var(--paper);padding:8px 13px;border-radius:16px 16px 5px;font-size:14px;white-space:pre-wrap;overflow-wrap:anywhere}.msg-you.msg-first{margin-top:8px}.msg-agent{display:grid;grid-template-columns:28px 1fr;gap:10px;align-items:start}.msg-agent.msg-first{margin-top:10px}.msg-gutter{width:28px}.msg-body{min-width:0;font-size:14px;line-height:1.5;overflow-wrap:anywhere}.msg-name{font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:2px}.msg-meta{align-self:center;display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--ink-muted);padding:2px 0;text-align:center}.msg-meta svg{width:14px;height:14px;color:var(--working)}.msg-meta-error{color:var(--error)}.md-p{margin:0 0 6px;white-space:pre-wrap}.md-p:last-child{margin-bottom:0}.md-list{margin:0 0 6px;padding-left:18px}.md-code{margin:4px 0 8px;font:12.5px/1.45 var(--mono);background:var(--paper-2);border:1px solid var(--line);border-radius:8px;padding:8px 10px;white-space:pre-wrap;overflow-wrap:anywhere}.md-inline{font:12.5px var(--mono);background:var(--paper-2);border-radius:4px;padding:1px 5px}.tools{margin-left:38px;border-radius:10px;background:var(--paper-2)}.tools-head{display:flex;align-items:center;gap:8px;width:100%;border:0;background:none;padding:7px 10px;font-size:12.5px;color:var(--ink-muted);text-align:left;cursor:pointer}.tools-head svg{width:15px;height:15px;flex:none}.tools-summary{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tools-summary strong{color:var(--ink-2);font-weight:600}.tools-live .tools-head svg:first-child{color:var(--working)}.tools-list{list-style:none;margin:0;padding:0 12px 9px 33px;display:grid;gap:4px;font-size:12px;color:var(--ink-muted)}.tools-list li{overflow-wrap:anywhere}.tools-list strong{color:var(--ink-2);font-weight:600}.convo-working{margin:6px 0 0 38px;display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-muted)}.convo-working em{font-style:normal;color:var(--ink-2);overflow-wrap:anywhere}.dots{display:inline-flex;gap:3px}.dots i{width:5px;height:5px;border-radius:50%;background:var(--working);opacity:.35}@media(prefers-reduced-motion:no-preference){.dots i{animation:dot 1.2s infinite}.dots i:nth-child(2){animation-delay:.15s}.dots i:nth-child(3){animation-delay:.3s}@keyframes dot{30%{opacity:1;transform:translateY(-2px)}}}.approvals{flex:none;padding:8px 14px 0;display:grid;gap:8px;max-height:40%;overflow-y:auto}.approval{background:#fffaf1;border:1px solid #f0dcb5;border-radius:14px;padding:12px;display:grid;gap:10px;box-shadow:0 8px 20px -14px #7c4c0699}.approval-head{display:flex;align-items:center;gap:8px}.approval-head p{margin:0;font-size:14px}.approval-dot{width:9px;height:9px;border-radius:50%;background:var(--waiting);box-shadow:0 0 0 4px #e39f3733;flex:none}.approval-detail{margin:0;font:12.5px/1.45 var(--mono);background:var(--paper);border:1px solid #f0e2c6;border-radius:8px;padding:8px 10px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:140px;overflow-y:auto}.approval-actions{display:grid;grid-template-columns:1fr auto auto;gap:6px;align-items:center}.approval input,.question input{min-width:0;font-size:13px;padding:7px 10px;border:1px solid var(--line);border-radius:9px;background:var(--paper)}.question{border:0;margin:0;padding:0;display:grid;gap:6px}.question legend{font-size:14px;font-weight:600;margin-bottom:6px}.question-options{display:grid;gap:6px}.question-header{justify-self:start;font-size:11px;font-weight:600;color:var(--brass);background:#f6ecd8;border-radius:99px;padding:2px 8px}.question-hint{font-size:12px;color:var(--ink-muted)}.choice{display:flex;align-items:flex-start;gap:10px;width:100%;border:1px solid var(--line);background:var(--paper);border-radius:12px;padding:9px 11px;text-align:left;cursor:pointer;font-size:13.5px}.choice:hover{border-color:#d9c49b}.choice-on{border-color:var(--brass);background:#fdf6e8;box-shadow:0 0 0 2px #b0843a26}.choice-mark{flex:none;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:11.5px;font-weight:700;background:var(--paper-3);color:var(--ink-2)}.choice-box{border-radius:6px}.choice-on .choice-mark{background:var(--brass);color:#fff}.choice-text{display:grid;gap:2px;min-width:0}.choice-text span{font-size:12.5px;color:var(--ink-muted)}.choice-other input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13.5px;padding:1px 0}.approval-question{gap:12px}.approval-plan-body{max-height:260px;overflow-y:auto;background:var(--paper);border:1px solid #f0e2c6;border-radius:10px;padding:10px 12px;font-size:13.5px;line-height:1.5}.option{font-size:13px;padding:5px 11px;border-radius:99px;border:1px solid var(--line);background:var(--paper);cursor:pointer}.option[aria-pressed=true]{background:var(--ink);color:var(--paper);border-color:var(--ink)}.button-primary,.button-quiet{font-size:13.5px;font-weight:600;padding:7px 14px;border-radius:10px;cursor:pointer;border:1px solid transparent}.button-primary{background:var(--ink);color:var(--paper)}.button-primary:hover{background:#000}.button-primary:disabled{opacity:.35;cursor:default}.button-quiet{background:transparent;border-color:var(--line);color:var(--ink)}.button-quiet:hover{background:var(--paper-2)}.mirror-note{flex:none;margin:0;padding:8px 18px;font-size:12px;color:var(--ink-muted);background:var(--paper-2);border-top:1px solid var(--line)}.composer{position:relative;flex:none;padding:10px 14px 12px;border-top:1px solid var(--line);background:var(--paper)}.composer-box{display:flex;align-items:flex-end;gap:4px;border:1px solid var(--line);border-radius:16px;background:#fff;padding:6px 6px 6px 14px;transition:border-color .12s,box-shadow .12s}.composer-box:focus-within{border-color:var(--brass);box-shadow:0 0 0 3px #b0843a26}.composer textarea{flex:1;border:0;outline:none;resize:none;background:transparent;font-size:14px;line-height:1.45;padding:6px 0;max-height:160px}.composer-send{background:var(--ink);color:var(--paper);border-radius:11px}.composer-send:hover{background:#000;color:var(--paper)}.composer-send:disabled{background:var(--paper-3);color:var(--ink-muted);opacity:1}.composer-stop{color:var(--error)}.composer-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:7px}.composer-hint,.composer-error{margin:0 4px;font-size:11.5px;color:var(--ink-muted);white-space:nowrap}.mode-switch{display:flex;gap:2px;background:var(--paper-3);border-radius:9px;padding:2px}.mode-switch button{border:0;background:transparent;font-size:12px;padding:3px 9px;border-radius:7px;cursor:pointer;color:var(--ink-muted)}.mode-switch button:hover{color:var(--ink)}.mode-switch button[aria-pressed=true]{background:var(--paper);color:var(--ink);font-weight:600;box-shadow:0 1px 2px #2a231e24}.slash-menu{position:absolute;left:14px;right:14px;bottom:calc(100% - 4px);z-index:6;list-style:none;margin:0;padding:6px;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);max-height:320px;overflow-y:auto}.slash-menu button{display:grid;gap:1px;width:100%;border:0;background:none;text-align:left;padding:7px 10px;border-radius:9px;cursor:pointer}.slash-menu .slash-on{background:var(--paper-2)}.slash-name{font:600 13px var(--mono);color:var(--ink)}.slash-name em{font-style:normal;font-weight:400;color:var(--ink-muted)}.slash-desc{font-size:12px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.composer-error{color:var(--error)}@media(max-width:760px){.app-docked{display:block}.hud{top:10px;left:10px;padding:9px 12px}.hud h1{font-size:19px}.needs-you{left:10px;bottom:10px}.side,.side-pinned{position:absolute;inset:auto 8px 8px;width:auto;height:72%;margin:0;border-radius:18px}.launcher{right:10px;bottom:10px}}.team-top{display:flex;gap:8px}.team-top .search{flex:1;min-width:0}.new-agent{display:inline-flex;align-items:center;gap:4px;flex:none;padding:7px 12px 7px 9px}.new-agent svg{width:16px;height:16px}.form-head{flex:none;display:flex;align-items:center;gap:6px;padding:10px 14px 4px 8px}.form-head h2{margin:0;font-size:17px;font-weight:700}.form{flex:1;min-height:0;overflow-y:auto;padding:8px 18px 14px;display:grid;align-content:start;gap:14px}.field{position:relative;display:grid;gap:5px}.field>span{font-size:12.5px;font-weight:600;color:var(--ink-2)}.field input,.field select{font-size:14px;padding:9px 11px;border:1px solid var(--line);border-radius:11px;background:#fff;color:var(--ink);min-width:0}.field input:focus,.field select:focus{outline:none;border-color:var(--brass);box-shadow:0 0 0 3px #b0843a26}.field-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}.field-suggestions{position:absolute;top:100%;left:0;right:0;z-index:6;margin:4px 0 0;padding:5px;list-style:none;background:var(--paper);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);max-height:260px;overflow-y:auto}.field-suggestions button{width:100%;border:0;background:none;text-align:left;padding:7px 9px;border-radius:8px;font:12.5px var(--mono);color:var(--ink-2);cursor:pointer}.field-suggestions button:hover{background:var(--paper-2);color:var(--ink)}.picker{display:grid;gap:6px}.pick{display:grid;gap:2px;width:100%;text-align:left;border:1px solid var(--line);background:var(--paper);border-radius:12px;padding:9px 12px;cursor:pointer}.pick strong{font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pick span{font-size:12px;color:var(--ink-muted)}.pick:hover{border-color:#d9c49b}.pick-on{border-color:var(--brass);background:#fdf6e8;box-shadow:0 0 0 2px #b0843a26}.picker-none{margin:0;font-size:12.5px;color:var(--ink-muted)}.form-preview{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;background:var(--paper-2);font-size:13px;color:var(--ink-2)}.form-actions{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid var(--line)}.convo-older{align-self:center;border:1px solid var(--line);background:var(--paper);border-radius:99px;padding:5px 14px;font-size:12.5px;color:var(--ink-2);cursor:pointer;margin-bottom:4px}.convo-older:hover{border-color:var(--brass)}.convo-start{align-self:center;font-size:11.5px;color:var(--ink-muted);padding:4px 0 8px}.mode-switch .mode-danger[aria-pressed=true]{background:var(--error);color:#fff}.mode-switch .mode-danger:not([aria-pressed=true]):hover{color:var(--error)}.allow-all{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:12px;padding:10px 12px;cursor:pointer;background:var(--paper)}.allow-all input{margin-top:3px;accent-color:var(--error)}.allow-all>span{display:grid;gap:2px}.allow-all strong{font-size:13.5px}.allow-all>span>span{font-size:12px;color:var(--ink-muted)}.allow-all-on{border-color:var(--error);background:#fbeee9}.mode-picker{position:relative}.mode-button{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--paper);border-radius:9px;padding:3px 6px 3px 9px;font-size:12px;font-weight:600;color:var(--ink-2);cursor:pointer}.mode-button:hover{border-color:#d9c49b;color:var(--ink)}.mode-button svg{width:14px;height:14px;color:var(--ink-muted);transform:rotate(-90deg)}.mode-button[aria-expanded=true] svg{transform:rotate(90deg)}.mode-button-danger{border-color:var(--error);color:var(--error);background:#fbeee9}.mode-dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--idle)}.mode-dot-default{background:#6f8ca6}.mode-dot-acceptEdits{background:var(--working)}.mode-dot-plan{background:var(--brass)}.mode-dot-bypassPermissions{background:var(--error)}.mode-menu{position:absolute;left:0;bottom:calc(100% + 6px);z-index:7;width:290px;padding:6px;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);display:grid;gap:2px}.mode-menu button{display:flex;align-items:flex-start;gap:10px;width:100%;border:0;background:none;text-align:left;padding:8px 10px;border-radius:10px;cursor:pointer}.mode-menu button:hover{background:var(--paper-2)}.mode-menu .mode-dot{margin-top:5px}.mode-text{flex:1;display:grid;gap:1px;min-width:0}.mode-text strong{font-size:13px;color:var(--ink)}.mode-text span{font-size:11.5px;color:var(--ink-muted);line-height:1.35}.mode-menu svg{width:16px;height:16px;color:var(--brass);flex:none;margin-top:2px}.mode-item-danger .mode-text strong{color:var(--error)}.chat-rename{cursor:default}.chat-rename:hover{background:none}.chat-rename input{flex:1;min-width:0;font-size:17px;font-weight:700;padding:5px 9px;border:1px solid var(--brass);border-radius:10px;background:#fff;box-shadow:0 0 0 3px #b0843a26;outline:none}.chat-rename-error{padding:0 18px 6px}.project-bar{flex:none;display:flex;align-items:center;gap:10px;margin:0 14px 8px 16px;padding:6px 10px;border-radius:10px;background:var(--paper-2);font-size:12.5px;min-width:0}.project-bar svg{width:15px;height:15px;flex:none;color:var(--brass)}.project-name,.project-branch{display:inline-flex;align-items:center;gap:5px;flex:none;font-weight:600;color:var(--ink)}.project-branch{font:500 12px var(--mono);color:var(--ink-2);max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-path{flex:1;min-width:0;font:11.5px var(--mono);color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}.side-expanded,.side-pinned.side-expanded{position:fixed;inset:12px;width:auto;height:auto;margin:0;z-index:50;animation:none}.view-toggle{display:inline-flex;gap:2px;padding:3px;margin-right:4px;border-radius:10px;background:var(--paper-3)}.view-toggle button{position:relative;display:inline-grid;place-items:center;width:30px;height:26px;border:0;border-radius:7px;background:transparent;color:var(--ink-muted);cursor:pointer}.view-toggle button svg{width:16px;height:16px}.view-toggle button:hover{color:var(--ink)}.view-toggle .view-on{background:var(--paper);color:var(--ink);box-shadow:0 1px 2px #2a231e24}.view-live{position:absolute;top:3px;right:4px;width:6px;height:6px;border-radius:50%;background:#5fae6a;box-shadow:0 0 0 1.5px var(--paper)}.term{position:relative;flex:1 1 auto;min-height:0;display:flex;flex-direction:column;margin:0 10px 10px;border-radius:12px;background:#1c1815;overflow:hidden;box-shadow:inset 0 0 0 1px #ffffff0a}.term-host{flex:1 1 auto;min-height:0;padding:10px 4px 6px 12px}.term-host .xterm{height:100%}.term-host .xterm-viewport{background:transparent!important}.term-host .xterm-viewport::-webkit-scrollbar{width:8px}.term-host .xterm-viewport::-webkit-scrollbar-thumb{background:#ece4d62e;border-radius:8px}.term-exited{flex:none;padding:10px 14px;font-size:13px;color:#ece4d6;background:#2a2420;border-top:1px solid rgba(255,255,255,.06)}.term-start{flex:1 1 auto;min-height:0;display:grid;place-items:center;padding:20px}.term-start-card{max-width:380px;text-align:center;display:grid;gap:10px;justify-items:center}.term-start-card h3{margin:4px 0 0;font-size:17px}.term-start-card p{margin:0;font-size:13.5px;line-height:1.5;color:var(--ink-muted)}.term-prompt{display:inline-grid;place-items:center;width:52px;height:52px;border-radius:14px;background:#1c1815;color:#e2b45c;font:600 18px SF Mono,ui-monospace,Menlo,monospace}.composer-locked{flex:none;display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 12px 12px;padding:10px 12px;border-radius:12px;background:var(--paper-2);font-size:13px;color:var(--ink-2)}.composer-locked button{display:inline-flex;align-items:center;gap:6px}.composer-locked svg{width:15px;height:15px}.settings-menu{width:270px;padding:8px}.settings-title{margin:2px 6px 6px;font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-muted)}.settings-menu .settings-option{display:flex;align-items:flex-start;gap:10px;width:100%;padding:8px;border-radius:9px;text-align:left}.settings-option>span{display:grid;gap:1px}.settings-option small{font-size:12px;color:var(--ink-muted)}.settings-on{background:var(--paper-2);box-shadow:inset 0 0 0 1px var(--brass)}.tag-specialist .tag-name{display:inline-flex;align-items:center;gap:5px}.tag-dot{width:7px;height:7px;border-radius:50%;flex:none}.tag-skill{margin-left:5px;padding:0 6px;border-radius:99px;background:var(--brass);color:#fff;font-size:10.5px;font-weight:700}.project-skill{flex:none;padding:1px 8px;border-radius:99px;background:var(--brass);color:#fff;font-size:11.5px;font-weight:600}.helpers-strip{flex:none;display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 14px 8px 16px;font-size:12px;color:var(--ink-muted)}.run-chip{display:inline-flex;align-items:center;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--line);background:var(--paper);color:var(--ink-2);border-radius:99px;padding:1px 9px;font-size:11.5px;font-weight:600;cursor:pointer;vertical-align:middle}.run-chip:hover{border-color:var(--brass);color:var(--ink)}.run-chip-live{border-color:#5fae6a99;background:#5fae6a1a}.bench-toggle{display:inline-flex;align-items:center;gap:6px;margin:4px 10px 8px;border:0;background:none;color:var(--ink-muted);font-size:12.5px;cursor:pointer}.bench-toggle svg{width:14px;height:14px}.specialist{overflow-y:auto}.specialist-body{padding:4px 18px 18px}.specialist-body h4{margin:16px 0 6px;font-size:12px;font-weight:600;color:var(--ink-muted)}.specialist-desc{margin:0 0 8px;font-size:14px;line-height:1.5}.specialist .side-empty{padding:4px 0}.chat-who-text code{font-size:11.5px}.run-list{list-style:none;margin:0;padding:0;display:grid;gap:2px}.run-list button{display:flex;align-items:center;gap:10px;width:100%;border:0;background:none;padding:8px;border-radius:10px;text-align:left;cursor:pointer}.run-list button:hover{background:var(--paper-2)}.run-text{flex:1;min-width:0;display:grid}.run-text strong{font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.run-text span{font-size:12px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.run-live{width:8px;height:8px;border-radius:50%;background:#5fae6a;flex:none}.term-start-more{display:flex;flex-wrap:wrap;justify-content:center;gap:6px}
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>piu-piu</title>
7
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M16 3 29 10.5v11L16 29 3 21.5v-11Z%27 fill=%27%232e3b3f%27/%3E%3Cpath d=%27M16 7l9 5.2-9 5.2-9-5.2Z%27 fill=%27%23c9a87a%27/%3E%3Ccircle cx=%2716%27 cy=%2712%27 r=%272.4%27 fill=%27%23f2a93b%27/%3E%3C/svg%3E" />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
+ <link href="https://fonts.googleapis.com/css2?family=Schibsted+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet" />
11
+ <script type="module" crossorigin src="/assets/index-77PZXJ_x.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-CB3kPPFD.css">
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ </body>
17
+ </html>
@@ -0,0 +1,81 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>piu-piu · debug</title>
7
+ <style>
8
+ :root { --bg: #f6f5f2; --card: #fff; --ink: #1d1d1b; --muted: #77756f; --line: #e4e2dc;
9
+ --working: #2f7d4f; --waiting: #c27a12; --idle: #8a8780; --error: #b8402f; }
10
+ @media (prefers-color-scheme: dark) {
11
+ :root { --bg: #161615; --card: #1f1f1d; --ink: #ecebe7; --muted: #9b9890; --line: #2e2d2a; }
12
+ }
13
+ * { box-sizing: border-box; }
14
+ body { margin: 0; background: var(--bg); color: var(--ink); font: 14px/1.45 ui-sans-serif, system-ui, sans-serif; }
15
+ header { padding: 20px 16px 8px; display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
16
+ h1 { font-size: 18px; margin: 0; }
17
+ #conn { color: var(--muted); font-size: 12px; }
18
+ main { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 16px; padding: 8px 16px 24px; }
19
+ @media (max-width: 800px) { main { grid-template-columns: 1fr; } }
20
+ h2 { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin: 16px 0 8px; }
21
+ .card { background: var(--card); border: 1px solid var(--line); border-radius: 10px; padding: 12px; margin-bottom: 8px; }
22
+ .row { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; }
23
+ .name { font-weight: 600; }
24
+ .muted { color: var(--muted); font-size: 12px; }
25
+ .pill { font-size: 11px; padding: 1px 8px; border-radius: 99px; color: #fff; background: var(--idle); }
26
+ .pill.working { background: var(--working); } .pill.waiting { background: var(--waiting); } .pill.error { background: var(--error); }
27
+ .tool { font-family: ui-monospace, monospace; font-size: 12px; margin-top: 6px; overflow-wrap: anywhere; }
28
+ .text { margin-top: 6px; color: var(--muted); overflow-wrap: anywhere; }
29
+ #events { font-family: ui-monospace, monospace; font-size: 12px; }
30
+ #events div { padding: 3px 0; border-bottom: 1px solid var(--line); overflow-wrap: anywhere; }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <header><h1>piu-piu</h1><span id="conn">connecting…</span></header>
35
+ <main>
36
+ <section id="rooms"></section>
37
+ <section><h2>Activity</h2><div id="events"></div></section>
38
+ </main>
39
+ <script>
40
+ const sessions = new Map();
41
+ const events = [];
42
+ const roomsEl = document.getElementById('rooms');
43
+ const eventsEl = document.getElementById('events');
44
+ const esc = (s) => String(s ?? '').replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]));
45
+ const ago = (t) => { const s = Math.round((Date.now() - t) / 1000); return s < 60 ? s + 's' : s < 3600 ? Math.round(s / 60) + 'm' : Math.round(s / 3600) + 'h'; };
46
+
47
+ function render() {
48
+ const byRoom = {};
49
+ for (const s of sessions.values()) if (s.status !== 'ended') (byRoom[s.room] ??= []).push(s);
50
+ roomsEl.innerHTML = Object.keys(byRoom).sort().map((room) => `<h2>${esc(room)}</h2>` +
51
+ byRoom[room].sort((a, b) => b.lastActivity - a.lastActivity).map((s) => `
52
+ <div class="card">
53
+ <div class="row"><span class="name">${esc(s.agentName)}</span><span class="pill ${s.status}">${s.status}</span>
54
+ <span class="muted">${esc(s.project)} · ${esc(s.title ?? s.sessionId.slice(0, 8))} · ${ago(s.lastActivity)} ago</span></div>
55
+ <div class="muted">${(s.contextTokens / 1000).toFixed(0)}k ctx · $${s.costUSD.toFixed(2)}${s.activeSubagents ? ` · ${s.activeSubagents} subagents` : ''}${s.model ? ' · ' + esc(s.model) : ''}</div>
56
+ ${s.currentTool ? `<div class="tool">▶ ${esc(s.currentTool)} ${esc(s.currentToolDetail)}</div>` : ''}
57
+ ${s.lastText ? `<div class="text">${esc(s.lastText)}</div>` : ''}
58
+ </div>`).join('')).join('') || '<p class="muted">No active sessions.</p>';
59
+ eventsEl.innerHTML = events.slice(-80).reverse().map((e) => {
60
+ const s = sessions.get(e.sessionId);
61
+ return `<div>${new Date(e.ts).toLocaleTimeString()} <b>${esc(s?.agentName ?? e.sessionId.slice(0, 6))}</b> ${e.kind} ${esc(e.tool)} ${esc(e.detail)}</div>`;
62
+ }).join('');
63
+ }
64
+
65
+ function connect() {
66
+ const ws = new WebSocket(`ws://${location.host}/ws`);
67
+ ws.onopen = () => (document.getElementById('conn').textContent = 'live');
68
+ ws.onclose = () => { document.getElementById('conn').textContent = 'disconnected, retrying…'; setTimeout(connect, 2000); };
69
+ ws.onmessage = (m) => {
70
+ const msg = JSON.parse(m.data);
71
+ if (msg.type === 'snapshot') { sessions.clear(); msg.sessions.forEach((s) => sessions.set(s.sessionId, s)); events.splice(0, events.length, ...msg.events); }
72
+ if (msg.type === 'session') sessions.set(msg.session.sessionId, msg.session);
73
+ if (msg.type === 'event') events.push(msg.event);
74
+ render();
75
+ };
76
+ }
77
+ connect();
78
+ setInterval(render, 10000);
79
+ </script>
80
+ </body>
81
+ </html>
@@ -0,0 +1,72 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1280" height="400" viewBox="0 0 1280 400" role="img" aria-label="piu-piu: a 3D office for your Claude Code agents">
2
+ <defs>
3
+ <linearGradient id="sky" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#2a2420"/>
5
+ <stop offset="1" stop-color="#3b2f27"/>
6
+ </linearGradient>
7
+ <linearGradient id="floor" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0" stop-color="#c9a77c"/>
9
+ <stop offset="1" stop-color="#b48b5e"/>
10
+ </linearGradient>
11
+ <linearGradient id="wall" x1="0" y1="0" x2="0" y2="1">
12
+ <stop offset="0" stop-color="#efe4d2"/>
13
+ <stop offset="1" stop-color="#e2d3bc"/>
14
+ </linearGradient>
15
+ <filter id="soft" x="-20%" y="-20%" width="140%" height="140%">
16
+ <feDropShadow dx="0" dy="10" stdDeviation="14" flood-color="#000" flood-opacity="0.35"/>
17
+ </filter>
18
+ </defs>
19
+ <rect width="1280" height="400" fill="url(#sky)"/>
20
+ <g opacity="0.07" stroke="#f0c878">
21
+ <path d="M0 80H1280M0 160H1280M0 240H1280M0 320H1280"/>
22
+ <path d="M160 0V400M320 0V400M480 0V400M640 0V400M800 0V400M960 0V400M1120 0V400"/>
23
+ </g>
24
+
25
+ <!-- isometric office -->
26
+ <g transform="translate(850 70)" filter="url(#soft)">
27
+ <polygon points="200,40 380,140 200,240 20,140" fill="url(#floor)"/>
28
+ <polygon points="20,140 200,40 200,-30 20,70" fill="url(#wall)"/>
29
+ <polygon points="200,40 380,140 380,70 200,-30" fill="#d8c7ad"/>
30
+ <polygon points="200,240 20,140 20,152 200,252" fill="#8d6a45"/>
31
+ <polygon points="200,240 380,140 380,152 200,252" fill="#7a5a3a"/>
32
+ <!-- window -->
33
+ <polygon points="250,40 330,84 330,40 250,-4" fill="#9cbfe8" opacity="0.75"/>
34
+ <!-- desks -->
35
+ <g>
36
+ <polygon points="120,120 170,148 140,165 90,137" fill="#f4ede2"/>
37
+ <polygon points="90,137 140,165 140,171 90,143" fill="#cdbfa9"/>
38
+ <rect x="117" y="112" width="20" height="16" rx="2" fill="#2a2420" transform="skewY(29)"/>
39
+ <circle cx="146" cy="128" r="9" fill="#e0b48a"/>
40
+ <path d="M137 125a9 9 0 0 1 18 0" fill="#3b2616"/>
41
+ <rect x="138" y="136" width="16" height="22" rx="7" fill="#4e6e9a"/>
42
+ </g>
43
+ <g>
44
+ <polygon points="230,150 280,178 250,195 200,167" fill="#f4ede2"/>
45
+ <polygon points="200,167 250,195 250,201 200,173" fill="#cdbfa9"/>
46
+ <circle cx="256" cy="158" r="9" fill="#c99a6e"/>
47
+ <path d="M247 155a9 9 0 0 1 18 0" fill="#7a4a2a"/>
48
+ <rect x="248" y="166" width="16" height="22" rx="7" fill="#5f8a55"/>
49
+ </g>
50
+ <!-- specialist link -->
51
+ <path d="M146 112 Q200 40 256 142" fill="none" stroke="#e2b45c" stroke-width="3" stroke-dasharray="8 6"/>
52
+ <!-- waiting beacon -->
53
+ <ellipse cx="300" cy="190" rx="16" ry="8" fill="none" stroke="#e2b45c" stroke-width="2.5"/>
54
+ <rect x="292" y="100" width="16" height="90" fill="#e2b45c" opacity="0.18"/>
55
+ <circle cx="300" cy="166" r="8" fill="#b88a64"/>
56
+ <rect x="292" y="174" width="16" height="20" rx="7" fill="#b5533c"/>
57
+ </g>
58
+
59
+ <!-- wordmark -->
60
+ <g font-family="ui-sans-serif, -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
61
+ <text x="80" y="178" font-size="104" font-weight="800" fill="#fbf6ee" letter-spacing="-3">piu-piu</text>
62
+ <text x="84" y="228" font-size="28" font-weight="500" fill="#e6ddd0">A 3D office for your Claude Code agents.</text>
63
+ <text x="84" y="268" font-size="21" fill="#b9ab99">Watch every session work. Talk to them, approve, resume,</text>
64
+ <text x="84" y="296" font-size="21" fill="#b9ab99">and drive the real Claude Code, all from one place.</text>
65
+ <g font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="17">
66
+ <rect x="84" y="322" width="292" height="36" rx="9" fill="#1c1815" stroke="#4a3e35"/>
67
+ <text x="102" y="346" fill="#e2b45c">$</text>
68
+ <text x="122" y="346" fill="#ece4d6">pnpm start</text>
69
+ <text x="238" y="346" fill="#6e6157"># :7777</text>
70
+ </g>
71
+ </g>
72
+ </svg>
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "piu-piu-cli",
3
+ "version": "0.1.0",
4
+ "description": "A 3D office for your Claude Code agents: watch every session work, talk to them, approve, resume, and drive the real Claude Code from one place.",
5
+ "type": "module",
6
+ "bin": {
7
+ "piu-piu": "bin/piu-piu.mjs"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "dist",
12
+ "docs",
13
+ "scripts/postinstall.mjs",
14
+ "README.md",
15
+ "CHANGELOG.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "node scripts/build.mjs",
19
+ "postinstall": "node scripts/postinstall.mjs",
20
+ "prepack": "node scripts/build.mjs"
21
+ },
22
+ "engines": {
23
+ "node": ">=24"
24
+ },
25
+ "os": [
26
+ "darwin",
27
+ "linux"
28
+ ],
29
+ "keywords": [
30
+ "claude",
31
+ "claude-code",
32
+ "agents",
33
+ "ai",
34
+ "dashboard",
35
+ "three.js",
36
+ "office",
37
+ "subagents"
38
+ ],
39
+ "license": "UNLICENSED",
40
+ "dependencies": {
41
+ "@anthropic-ai/claude-agent-sdk": "^0.3.289",
42
+ "@fastify/static": "^8.2.0",
43
+ "@fastify/websocket": "^11.2.0",
44
+ "@modelcontextprotocol/sdk": "^1.32.0",
45
+ "chokidar": "^4.0.3",
46
+ "fastify": "^5.6.0",
47
+ "node-pty": "^1.1.0",
48
+ "yaml": "^2.8.0",
49
+ "zod": "^4.6.5"
50
+ },
51
+ "devDependencies": {
52
+ "esbuild": "^0.25.0"
53
+ }
54
+ }
@@ -0,0 +1,16 @@
1
+ // node-pty ships its macOS spawn helper without the execute bit on some
2
+ // installs, which makes every terminal fail with "posix_spawnp failed".
3
+ import { chmodSync, existsSync, readdirSync } from 'node:fs';
4
+ import { createRequire } from 'node:module';
5
+ import { dirname, join } from 'node:path';
6
+
7
+ try {
8
+ const require = createRequire(import.meta.url);
9
+ const prebuilds = join(dirname(require.resolve('node-pty/package.json')), 'prebuilds');
10
+ for (const arch of existsSync(prebuilds) ? readdirSync(prebuilds) : []) {
11
+ const helper = join(prebuilds, arch, 'spawn-helper');
12
+ if (existsSync(helper)) chmodSync(helper, 0o755);
13
+ }
14
+ } catch {
15
+ // node-pty not installed yet (e.g. while packing): nothing to fix
16
+ }