@cuongtran001/kanna 1.79.0 → 1.80.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/README.md +9 -4
- package/dist/client/assets/{BoardsPage-CEXKEgVA.js → BoardsPage-ak2jw_ye.js} +1 -1
- package/dist/client/assets/{BoardsRoutePage-gKDIo3_h.js → BoardsRoutePage-BIXRBWBZ.js} +1 -1
- package/dist/client/assets/ChatPage-BpYWHT4l.js +98 -0
- package/dist/client/assets/{CronJobRow-bbxM3wcS.js → CronJobRow-QDpzjXzL.js} +1 -1
- package/dist/client/assets/{CronJobsPage-BJwXBejh.js → CronJobsPage-D7XyruX5.js} +1 -1
- package/dist/client/assets/{CronRunMessage-3pMEEUUV.js → CronRunMessage-D8zuai9W.js} +1 -1
- package/dist/client/assets/{FilePreviewSheet-B19g3op3.js → FilePreviewSheet-BoCUJQsQ.js} +1 -1
- package/dist/client/assets/{FlowSurface-BKe8zPpA.js → FlowSurface-JlrGgsX_.js} +1 -1
- package/dist/client/assets/{GenUIBlock-C40i2kA_.js → GenUIBlock-C3_Kkaem.js} +2 -2
- package/dist/client/assets/{KannaSocketProvider-B7pK1ou8.js → KannaSocketProvider-DHyVBu1V.js} +1 -1
- package/dist/client/assets/{LocalProjectsPage-vcuU8c8-.js → LocalProjectsPage-Cz_pihkz.js} +1 -1
- package/dist/client/assets/SettingsPage-CGZLy1GQ.js +13 -0
- package/dist/client/assets/{StackBoardsRoutePage-9_7pTCna.js → StackBoardsRoutePage-Bsh--mMB.js} +1 -1
- package/dist/client/assets/{ToolCallMessage-BGSSdeKk.js → ToolCallMessage-AUDXZhjJ.js} +2 -2
- package/dist/client/assets/{VChartSurface-273lUfc1.js → VChartSurface-BhJc4u2q.js} +1 -1
- package/dist/client/assets/{WebhooksPage-BYiW5rv1.js → WebhooksPage-B9aZigNP.js} +1 -1
- package/dist/client/assets/{WorkflowsPage-D6NwljfG.js → WorkflowsPage-7U4RDaVm.js} +1 -1
- package/dist/client/assets/{WorkflowsSection-DZd5b0m0.js → WorkflowsSection-DAyTGq6F.js} +1 -1
- package/dist/client/assets/{chart-renderer-K1Ao8T-7.js → chart-renderer-BCTJSF40.js} +1 -1
- package/dist/client/assets/chatFocusPolicy-kid_uU9k.js +41 -0
- package/dist/client/assets/{chatSounds-DxmZCZYX.js → chatSounds-CfbVJvK9.js} +1 -1
- package/dist/client/assets/chevron-left-DQhffG9n.js +1 -0
- package/dist/client/assets/{clipboard.adapter-D-CMr5eN.js → clipboard.adapter-Br9hSPrM.js} +1 -1
- package/dist/client/assets/{columnStyle-hNmyiyoE.js → columnStyle-BSAYinWI.js} +1 -1
- package/dist/client/assets/{contextWindow-DbPnmXaM.js → contextWindow-BnrSKix5.js} +1 -1
- package/dist/client/assets/{copyFeedbackStore-BUbSmpLj.js → copyFeedbackStore-D1w2N6Lh.js} +1 -1
- package/dist/client/assets/{createScopedStore-BxIu2bjk.js → createScopedStore-BeHs6yiP.js} +1 -1
- package/dist/client/assets/{cronJobsStore-C93xPWzB.js → cronJobsStore-D-b8ocnB.js} +1 -1
- package/dist/client/assets/{dist-Bd4iXDMM.js → dist-Clqd7pyP.js} +1 -1
- package/dist/client/assets/dist-dmbUIN6h.js +1 -0
- package/dist/client/assets/{ellipsis-BUjtIlEq.js → ellipsis-wuJ6qO4i.js} +1 -1
- package/dist/client/assets/{flow-kinds-BY-TQ4WU.js → flow-kinds-BJqrqSkL.js} +1 -1
- package/dist/client/assets/{folder-DXShKNrj.js → folder-Cof6LdOm.js} +1 -1
- package/dist/client/assets/{formatDuration-BPXP2Wrm.js → formatDuration-B6lYtt_z.js} +1 -1
- package/dist/client/assets/{genui-BAZbjkCg.js → genui-BMOFWuPB.js} +1 -1
- package/dist/client/assets/{globe-CQjLuq6p.js → globe-D7eOeLSs.js} +1 -1
- package/dist/client/assets/{host-CtWFmA_4.js → host-CHsHtPUb.js} +1 -1
- package/dist/client/assets/index-NC-TLQqq.js +26 -0
- package/dist/client/assets/{info-BGpdV4qW.js → info-CtesYilP.js} +1 -1
- package/dist/client/assets/{input-C1abeIY3.js → input-BOBOwpo-.js} +1 -1
- package/dist/client/assets/{lexicalToReact-SqXUukfW.js → lexicalToReact-Bn4MgiGY.js} +3 -3
- package/dist/client/assets/{log-BEHbw2UB.js → log--XoBt1aT.js} +1 -1
- package/dist/client/assets/{monitor-B2qM5duW.js → monitor-Ep4UVm8U.js} +1 -1
- package/dist/client/assets/{pendingActionsStore-DvTHDSQZ.js → pendingActionsStore-CLmv3H0B.js} +1 -1
- package/dist/client/assets/{play-DBu8231U.js → play-hTcDJjE_.js} +1 -1
- package/dist/client/assets/{plus-Cwjsb2OS.js → plus-wQ1lPnGT.js} +1 -1
- package/dist/client/assets/{popover-DDefFyM7.js → popover-DpmxYzoV.js} +1 -1
- package/dist/client/assets/{pushClient-BFW1JtiS.js → pushClient-Bq2Gfu3H.js} +1 -1
- package/dist/client/assets/{refresh-cw-DEShJRd4.js → refresh-cw-_7gXSjtr.js} +1 -1
- package/dist/client/assets/runDetached-D30qd9j8.js +1 -0
- package/dist/client/assets/segmented-control-BYRdY-x_.js +1 -0
- package/dist/client/assets/select-C4TmqOyM.js +1 -0
- package/dist/client/assets/{settings-header-button-ojhGKCCX.js → settings-header-button-IYPblgvQ.js} +1 -1
- package/dist/client/assets/{sidebarPendingActions-DsV9HY0N.js → sidebarPendingActions-9hIodq8d.js} +1 -1
- package/dist/client/assets/{square-pen-Dl9SNXtu.js → square-pen-XF0rE_Hs.js} +1 -1
- package/dist/client/assets/{state-mark-BL0qf-AG.js → state-mark-D5GOxb42.js} +1 -1
- package/dist/client/assets/{terminal-C6xTW7D4.js → terminal-C5_w8AyW.js} +1 -1
- package/dist/client/assets/{timer.adapter-DXvhxbmx.js → timer.adapter-C90U59C9.js} +1 -1
- package/dist/client/assets/{triangle-alert-D-qVgEcP.js → triangle-alert-C7CHT558.js} +1 -1
- package/dist/client/assets/useAppGlobalState-C4i9W1il.js +1 -0
- package/dist/client/assets/{useKannaState-CdQ23sZK.js → useKannaState-D-DzM-ka.js} +2 -2
- package/dist/client/assets/{useTheme-DyjL_bkr.js → useTheme-qEcKSzW7.js} +1 -1
- package/dist/client/assets/{webhookPresentation-6O2Umpp5.js → webhookPresentation-Cnuvb6v1.js} +1 -1
- package/dist/client/assets/{webhooksStore-UEe6RI_c.js → webhooksStore-Dz980a1Y.js} +1 -1
- package/dist/client/index.html +39 -39
- package/package.json +2 -2
- package/src/server/codex-app-server-protocol.ts +3 -0
- package/src/server/codex-app-server.test.ts +44 -0
- package/src/server/codex-app-server.ts +5 -0
- package/dist/client/assets/ChatPage-BaW_kyEG.js +0 -98
- package/dist/client/assets/SettingsPage-DDjk7plP.js +0 -13
- package/dist/client/assets/chatFocusPolicy-DYR_9DV3.js +0 -41
- package/dist/client/assets/chevron-left-UWVzAFoI.js +0 -1
- package/dist/client/assets/dist-CUWB6mPe.js +0 -1
- package/dist/client/assets/index-CjkObrwF.js +0 -26
- package/dist/client/assets/runDetached-E5TrC9Dq.js +0 -1
- package/dist/client/assets/segmented-control-C5pOVatw.js +0 -1
- package/dist/client/assets/select-hK1ZEqXS.js +0 -1
- package/dist/client/assets/useAppGlobalState-GeMu_Zgi.js +0 -1
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
|
|
34
34
|
## What Kanna is
|
|
35
35
|
|
|
36
|
-
Kanna runs on your machine and puts a browser UI in front of the coding agents you already use: the Claude Agent SDK, the Codex app-server, and
|
|
36
|
+
Kanna runs on your machine and puts a browser UI in front of the coding agents you already use: the Claude Agent SDK, the Codex app-server, OpenRouter models, and any Anthropic-compatible endpoint you register. Every chat belongs to a project, every event is saved to disk, and the UI works on a desktop, a phone, or through a tunnel.
|
|
37
37
|
|
|
38
38
|
## Quickstart
|
|
39
39
|
|
|
@@ -61,9 +61,10 @@ One Bun process owns everything. The browser sends commands over a WebSocket, th
|
|
|
61
61
|
**Chat with any agent**
|
|
62
62
|
|
|
63
63
|
- **Claude, Codex and OpenRouter** in one composer, with per-chat model, reasoning effort and context-window controls. [Providers & models](https://kanna-wiki.lowbit.link/features/providers-models/)
|
|
64
|
+
- **Custom endpoints**: register any Anthropic-compatible API (GLM, Qwen, Kimi, DeepSeek, MiniMax, a local Ollama) in Settings and pick its models in the composer. [Custom endpoints](https://kanna-wiki.lowbit.link/guides/user/custom-endpoints/)
|
|
64
65
|
- **OAuth token pool**: register several Claude tokens and Kanna rotates between them, failing over when one hits a rate limit. [OAuth pool](https://kanna-wiki.lowbit.link/getting-started/oauth-pool-setup/)
|
|
65
|
-
- **Live output**: on Claude
|
|
66
|
-
- **Rich transcript**: grouped tool calls, inline diffs, plan-mode approval, mermaid diagrams checked before you see them, and interactive charts and
|
|
66
|
+
- **Live output**: on chats that run on the Claude Agent SDK, thinking, text and tool input stream in as the model writes them, with the reply typed out behind a caret. Codex chats publish their plan as a live task list.
|
|
67
|
+
- **Rich transcript**: grouped tool calls, inline diffs, plan-mode approval, mermaid diagrams checked before you see them, and interactive charts, reports and flow diagrams the agent composes ([generative UI](https://kanna-wiki.lowbit.link/features/generative-ui/)).
|
|
67
68
|
- **Slash commands everywhere**: `/clear`, `/compact`, `/cron`, plus your local Claude Code skills, on every provider. [Slash commands](https://kanna-wiki.lowbit.link/features/slash-commands/)
|
|
68
69
|
|
|
69
70
|
**Let it work while you're away**
|
|
@@ -90,13 +91,15 @@ One Bun process owns everything. The browser sends commands over a WebSocket, th
|
|
|
90
91
|
</picture>
|
|
91
92
|
</p>
|
|
92
93
|
|
|
93
|
-
- **Projects and session tabs**: chats grouped by project with live status, a split-pane workspace, a project quick switcher, and one-click import of existing Claude Code sessions. [Projects & sessions](https://kanna-wiki.lowbit.link/features/projects-sessions/)
|
|
94
|
+
- **Projects and session tabs**: chats grouped by project with live status, a split-pane workspace where Settings, Cron, Workflows, Boards and Webhooks open as tabs beside your chats, a project quick switcher, and one-click import of existing Claude Code sessions. [Projects & sessions](https://kanna-wiki.lowbit.link/features/projects-sessions/)
|
|
94
95
|
- **Kanban boards**: *Start work* on a card creates a branch, a git worktree and a chat, so several agents can work at once without touching each other's files. Boards sync with GitHub issues. [Boards](https://kanna-wiki.lowbit.link/features/boards/)
|
|
95
96
|
- **Multi-repo stacks**: group several repositories so one chat can read and edit across all of them. [Stacks](https://kanna-wiki.lowbit.link/features/multi-repo-stacks/)
|
|
96
97
|
|
|
97
98
|
**Extend and connect**
|
|
98
99
|
|
|
99
100
|
- **Your MCP servers** (`stdio`, `http`, `sse`, `ws`, with OAuth 2.1) are available in every chat. [Advanced](https://kanna-wiki.lowbit.link/features/advanced/)
|
|
101
|
+
- **Kanna as an MCP server**: Claude Code, Codex, Claude Desktop and ChatGPT can drive Kanna itself over MCP. [Remote MCP](https://kanna-wiki.lowbit.link/guides/user/remote-mcp/)
|
|
102
|
+
- **Inbound webhooks**: CI, GitHub or a `curl` call can post a card into a chat, queue a prompt, or start a new chat. [Webhooks](https://kanna-wiki.lowbit.link/guides/user/webhooks/)
|
|
100
103
|
- **Kanna plugins** add sidebar pages, panels and `/` commands, with a server half running in its own process. [Plugins](https://kanna-wiki.lowbit.link/features/plugins/)
|
|
101
104
|
- **Beacons** pair another machine you own, so the agent can read files or run commands there within limits you set. [Beacons](https://kanna-wiki.lowbit.link/guides/user/beacons/)
|
|
102
105
|
- **Package updates** for installed skills, Claude Code plugins and Codex plugins, checked and applied from Settings. [Package auto-update](https://kanna-wiki.lowbit.link/features/package-auto-update/)
|
|
@@ -148,6 +151,8 @@ bun run build # the same build CI deploys
|
|
|
148
151
|
|
|
149
152
|
Pages live in `wiki/src/content/docs/`. Change a page in the same PR as the behavior it describes.
|
|
150
153
|
|
|
154
|
+
The [GitHub Wiki](https://github.com/cuongtranba/kanna/wiki) is a generated mirror of the same pages, rewritten from `wiki/` on every push to `main` that touches it. Edit `wiki/`, never the GitHub Wiki: changes made there are overwritten on the next sync. To preview the mirror, run `bun run export:github-wiki <dir>` in `wiki/`.
|
|
155
|
+
|
|
151
156
|
## Star History
|
|
152
157
|
|
|
153
158
|
<a href="https://www.star-history.com/?repos=cuongtranba%2Fkanna&type=date&legend=top-left">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{t as n}from"./jsx-runtime-BdxMnOeJ.js";import{c as r,i,m as a,t as o}from"./log
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{t as n}from"./jsx-runtime-BdxMnOeJ.js";import{c as r,i,m as a,t as o}from"./log--XoBt1aT.js";import{a as s,c,i as l,n as u,r as d,s as f,t as p}from"./pendingActionsStore-CLmv3H0B.js";import{t as m}from"./ellipsis-wuJ6qO4i.js";import{t as h}from"./plus-wQ1lPnGT.js";import{t as g}from"./input-BOBOwpo-.js";import{n as _,r as v,t as y}from"./popover-DpmxYzoV.js";import{o as b,r as x,s as S,t as C}from"./columnStyle-BSAYinWI.js";var w=e(t(),1),T=[],E=r()(e=>({templates:T,templatesStatus:`loading`,openMenuId:null,picking:!1,renamingId:null,error:null,setTemplates:t=>e({templates:Array.isArray(t)?t:[],templatesStatus:`ready`}),beginTemplatesLoad:()=>e({templatesStatus:`loading`}),failTemplatesLoad:()=>e({templatesStatus:`failed`}),openMenu:t=>e({openMenuId:t}),closeMenu:()=>e({openMenuId:null}),openPicker:()=>e({picking:!0,error:null}),closePicker:()=>e({picking:!1}),startRename:t=>e({renamingId:t,picking:!1,openMenuId:null}),stopRename:()=>e({renamingId:null}),setError:t=>e({error:t})}));function D(e){return e.templates}var O=e(n(),1),k=[`board.update`,`board.duplicate`,`board.saveAsTemplate`,`board.archive`];function A(e){return l(t=>k.some(n=>t.inFlight[p(n,e)]===!0))}function j({ownerKind:e,ownerId:t,ownerName:n,socket:r,onOpenBoard:c}){let l=x(e,t),f=S(b(l)),m=E(D),g=E(e=>e.picking),_=E(e=>e.renamingId),v=E(e=>e.error),y=E(e=>e.templatesStatus),C=p(`board.create`,l),T=d(C),{openPicker:k,closePicker:A,startRename:j,stopRename:N,setError:P,setTemplates:I}=E.getState();(0,w.useEffect)(()=>r.subscribe({type:`boards`,ownerKind:e,ownerId:t},e=>{S.getState().setBoards(x(e.ownerKind,e.ownerId),e.boards)}),[e,t,r]),(0,w.useEffect)(()=>{let e=!1,t=E.getState();return t.templatesStatus!==`ready`&&t.beginTemplatesLoad(),r.command({type:`board.templates.list`}).then(t=>{e||I(t)},a(t=>{o.error(i,`board.templates.list failed`,t),e||E.getState().failTemplatesLoad()})),()=>{e=!0}},[r,I]);let L=(0,w.useCallback)(async e=>{try{return await r.command(e),P(null),!0}catch(e){return P(e instanceof Error?e.message:`That did not work.`),!1}},[r,P]),R=(0,w.useCallback)(n=>{u(C,async()=>{await L({type:`board.create`,ownerKind:e,ownerId:t,title:n?n.name:`Untitled board`,templateId:n?.id??null})&&A()})},[A,C,e,t,L]),z=(0,w.useCallback)((e,t)=>{N();let n=t.trim();n!==``&&u(p(`board.update`,e),()=>L({type:`board.update`,boardId:e,title:n}))},[L,N]),B=g||f.length===0;return(0,O.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col bg-background`,children:[(0,O.jsxs)(`header`,{className:`flex items-end justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`h1`,{className:`text-lg font-medium leading-tight tracking-[-0.01em] text-foreground`,children:`Boards`}),(0,O.jsxs)(`p`,{className:`truncate text-13 text-muted-foreground`,children:[n,f.length>0?(0,O.jsxs)(`span`,{className:`tabular-nums`,children:[` · `,f.length,` boards`]}):null]})]}),f.length>0?(0,O.jsxs)(s,{size:`sm`,onClick:k,pending:T,children:[(0,O.jsx)(h,{className:`size-3.5`}),`New board`]}):null]}),v?(0,O.jsx)(`p`,{className:`border-b border-border px-6 py-2 text-13 text-destructive-text`,children:v}):null,(0,O.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[B?(0,O.jsx)(F,{templates:m,templatesStatus:y,creating:T,firstRun:f.length===0,onPick:R,onCancel:A}):null,f.length>0?(0,O.jsx)(`ul`,{className:`px-4 py-1`,children:f.map(e=>(0,O.jsx)(M,{board:e,renaming:_===e.id,onOpen:c,onStartRename:j,onRename:z,onCancelRename:N,onCommand:L},e.id))}):null]})]})}function M({board:e,renaming:t,onOpen:n,onStartRename:r,onRename:i,onCancelRename:a,onCommand:o}){let s=A(e.id),c=(0,w.useCallback)(()=>n(e.id),[e.id,n]),l=(0,w.useCallback)(t=>{t.key===`Enter`&&i(e.id,t.currentTarget.value),t.key===`Escape`&&a()},[e.id,a,i]),u=(0,w.useCallback)(t=>i(e.id,t.currentTarget.value),[e.id,i]);return(0,O.jsxs)(`li`,{"aria-busy":s||void 0,className:`group grid grid-cols-[1fr_auto_auto] items-center gap-5 border-b border-border px-3 py-3 last:border-b-0 hover:bg-secondary`,children:[(0,O.jsx)(`div`,{className:`min-w-0`,children:t?(0,O.jsx)(g,{autoFocus:!0,defaultValue:e.title,onKeyDown:l,onBlur:u,className:`h-7 max-w-sm`,"aria-label":`Board name`}):(0,O.jsxs)(`button`,{type:`button`,onClick:c,className:`block w-full text-left`,children:[(0,O.jsx)(`span`,{className:`block truncate text-15 font-semibold tracking-[-0.005em] text-foreground`,children:e.title}),e.description?(0,O.jsx)(`span`,{className:`mt-0.5 block truncate text-13 text-muted-foreground`,children:e.description}):null]})}),(0,O.jsxs)(`div`,{className:`flex items-center gap-4 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.columnCount}),` columns`]}),(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`b`,{className:`font-medium tabular-nums text-foreground`,children:e.cardCount}),` cards`]})]}),(0,O.jsx)(N,{board:e,pending:s,onStartRename:r,onCommand:o})]})}function N({board:e,pending:t,onStartRename:n,onCommand:r}){let i=E(t=>t.openMenuId===e.id),{openMenu:a,closeMenu:o}=E.getState(),s=(0,w.useCallback)(t=>{t?a(e.id):o()},[e.id,o,a]),l=(0,w.useCallback)(()=>{o(),n(e.id)},[e.id,o,n]),d=(0,w.useCallback)(()=>{o(),u(p(`board.duplicate`,e.id),()=>r({type:`board.duplicate`,boardId:e.id,title:`${e.title} copy`}))},[e.id,e.title,o,r]),h=(0,w.useCallback)(()=>{o(),u(p(`board.saveAsTemplate`,e.id),()=>r({type:`board.saveAsTemplate`,boardId:e.id,name:e.title}))},[e.id,e.title,o,r]),g=(0,w.useCallback)(()=>{o(),u(p(`board.archive`,e.id),()=>r({type:`board.archive`,boardId:e.id}))},[e.id,o,r]);return(0,O.jsxs)(y,{open:i,onOpenChange:s,children:[(0,O.jsx)(v,{asChild:!0,children:(0,O.jsx)(`button`,{type:`button`,"aria-label":`Actions for ${e.title}`,disabled:t,"aria-busy":t||void 0,className:c(`rounded-md px-1.5 py-1 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 data-[state=open]:opacity-100`,t&&`opacity-100`),children:t?(0,O.jsx)(f,{className:`size-4`}):(0,O.jsx)(m,{className:`size-4`})})}),(0,O.jsxs)(_,{align:`end`,className:`w-56 p-1`,children:[(0,O.jsx)(P,{onClick:l,children:`Rename`}),(0,O.jsx)(P,{onClick:d,children:`Duplicate structure`}),(0,O.jsx)(P,{onClick:h,children:`Save as template`}),(0,O.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,O.jsx)(P,{onClick:g,tone:`destructive`,children:`Archive`})]})]})}function P({onClick:e,children:t,tone:n}){return(0,O.jsx)(`button`,{type:`button`,onClick:e,className:c(`flex w-full items-center rounded-sm px-2 py-1.5 text-left text-xs font-medium hover:bg-secondary`,n===`destructive`&&`text-destructive-text`),children:t})}function F({templates:e,templatesStatus:t,creating:n,firstRun:r,onPick:i,onCancel:a}){let o=(0,w.useCallback)(()=>i(null),[i]);return(0,O.jsxs)(`div`,{className:`px-6 py-8`,children:[r?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`No boards yet.`}),(0,O.jsx)(`p`,{className:`mt-1 max-w-[58ch] text-sm text-muted-foreground`,children:`A board turns issues into work your agents can pick up. Start from a shape, or import an existing tracker.`})]}):(0,O.jsx)(`h2`,{className:`text-15 font-semibold text-foreground`,children:`Start from a shape`}),(0,O.jsxs)(`div`,{className:`mt-4 max-w-xl rounded-lg border border-border`,"aria-busy":n||void 0,children:[e.map(e=>(0,O.jsx)(I,{template:e,disabled:n,onPick:i},e.id)),t===`loading`?(0,O.jsxs)(`p`,{role:`status`,className:`flex items-center gap-2 px-3.5 py-2.5 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Loading templates…`]}):null,t===`failed`?(0,O.jsx)(`p`,{className:`px-3.5 py-2.5 text-xs text-muted-foreground`,children:`Couldn't load templates.`}):null,(0,O.jsx)(`button`,{type:`button`,onClick:o,disabled:n,className:`flex w-full items-center border-t border-border px-3.5 py-2.5 text-left hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:(0,O.jsxs)(`span`,{children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:`Empty board`}),(0,O.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:`Name your own columns`})]})})]}),n?(0,O.jsxs)(`p`,{role:`status`,className:`mt-3 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,O.jsx)(f,{}),`Creating board…`]}):null,r?null:(0,O.jsx)(s,{variant:`ghost`,size:`sm`,className:`mt-3`,onClick:a,children:`Cancel`})]})}function I({template:e,disabled:t,onPick:n}){let r=(0,w.useCallback)(()=>n(e),[n,e]),i=e.definition.columns;return(0,O.jsxs)(`button`,{type:`button`,onClick:r,disabled:t,className:`flex w-full items-center gap-3 border-b border-border px-3.5 py-2.5 text-left last:border-b-0 hover:bg-secondary disabled:pointer-events-none disabled:opacity-60`,children:[(0,O.jsxs)(`span`,{className:`min-w-0`,children:[(0,O.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.name}),(0,O.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:i.map(e=>e.title).join(` · `)})]}),(0,O.jsx)(`span`,{"aria-hidden":!0,className:`ml-auto flex shrink-0 gap-1`,children:i.map((t,n)=>(0,O.jsx)(`span`,{className:c(`size-1.5 rounded-full`,t.colorToken?C[t.colorToken]:`bg-muted-icon`)},`${e.id}-${String(n)}`))})]})}export{j as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{l as n,u as r}from"./chunk-OB3PAWPO-DERdSR9u.js";import{t as i}from"./jsx-runtime-BdxMnOeJ.js";import{a}from"./formatters-BGORekd-.js";import{t as o}from"./BoardsPage-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{t}from"./react-DiVRNtpo.js";import{l as n,u as r}from"./chunk-OB3PAWPO-DERdSR9u.js";import{t as i}from"./jsx-runtime-BdxMnOeJ.js";import{a}from"./formatters-BGORekd-.js";import{t as o}from"./BoardsPage-ak2jw_ye.js";var s=e(t(),1),c=e(i(),1);function l({projectId:e}){let t=r(),i=n(),l=[...t.sidebarData.starredProjectGroups,...t.sidebarData.projectGroups].find(t=>t.groupKey===e),u=l?a(l.localPath):`Project`,d=(0,s.useCallback)(t=>{i(`/boards/${e}/${t}`)},[i,e]);return(0,c.jsx)(`div`,{className:`relative flex min-h-0 min-w-0 flex-1 flex-col`,children:(0,c.jsx)(o,{ownerKind:`project`,ownerId:e,ownerName:u,socket:t.socket,onOpenBoard:d})})}export{l as BoardsRoutePage};
|