@robota-sdk/agent-transport 3.0.0-beta.75 → 3.0.0-beta.76
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 +10 -10
- package/dist/node/headless/index.cjs +1 -1
- package/dist/node/{headless-CT2ibQnr.cjs → headless-OnpVk4-k.cjs} +7 -7
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.ts +1 -6
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +7 -75
- package/src/index.ts +1 -5
- package/src/transport-registry.ts +0 -9
- package/dist/node/http/index.cjs +0 -1
- package/dist/node/http/index.d.ts +0 -2
- package/dist/node/http/index.js +0 -1
- package/dist/node/http-2Jiuflc1.js +0 -2
- package/dist/node/http-2Jiuflc1.js.map +0 -1
- package/dist/node/http-CBAvefLw.cjs +0 -1
- package/dist/node/index-BNccqSpv.d.ts +0 -86
- package/dist/node/index-BNccqSpv.d.ts.map +0 -1
- package/dist/node/index-BUhHIf7X.d.ts +0 -86
- package/dist/node/index-BUhHIf7X.d.ts.map +0 -1
- package/dist/node/index-BnAGE-u9.d.ts +0 -33
- package/dist/node/index-BnAGE-u9.d.ts.map +0 -1
- package/dist/node/index-BrQ4gGw0.d.ts +0 -213
- package/dist/node/index-BrQ4gGw0.d.ts.map +0 -1
- package/dist/node/index-CoeBF21y.d.ts +0 -213
- package/dist/node/index-CoeBF21y.d.ts.map +0 -1
- package/dist/node/index-DHt-2VQ-.d.ts +0 -46
- package/dist/node/index-DHt-2VQ-.d.ts.map +0 -1
- package/dist/node/index-DMwKN5Le.d.ts +0 -33
- package/dist/node/index-DMwKN5Le.d.ts.map +0 -1
- package/dist/node/index-c0M42fsA.d.ts +0 -46
- package/dist/node/index-c0M42fsA.d.ts.map +0 -1
- package/dist/node/mcp/index.cjs +0 -1
- package/dist/node/mcp/index.d.ts +0 -2
- package/dist/node/mcp/index.js +0 -1
- package/dist/node/mcp-BOglBJNy.cjs +0 -1
- package/dist/node/mcp-D3BBVK7C.js +0 -2
- package/dist/node/mcp-D3BBVK7C.js.map +0 -1
- package/dist/node/rolldown-runtime-CMqjfN_6.cjs +0 -1
- package/dist/node/tui/index.cjs +0 -1
- package/dist/node/tui/index.d.ts +0 -2
- package/dist/node/tui/index.js +0 -1
- package/dist/node/tui-CcH5EsQh.js +0 -25
- package/dist/node/tui-CcH5EsQh.js.map +0 -1
- package/dist/node/tui-DznRbcku.cjs +0 -24
- package/dist/node/ws/index.cjs +0 -1
- package/dist/node/ws/index.d.ts +0 -2
- package/dist/node/ws/index.js +0 -1
- package/dist/node/ws-Dc2RUwVs.js +0 -2
- package/dist/node/ws-Dc2RUwVs.js.map +0 -1
- package/dist/node/ws-QNMQn5kg.cjs +0 -1
- package/src/http/__tests__/http-transport.test.ts +0 -55
- package/src/http/__tests__/routes.test.ts +0 -168
- package/src/http/http-transport.ts +0 -41
- package/src/http/index.ts +0 -4
- package/src/http/routes.ts +0 -152
- package/src/mcp/__tests__/mcp-server.test.ts +0 -66
- package/src/mcp/__tests__/mcp-transport.test.ts +0 -46
- package/src/mcp/index.ts +0 -4
- package/src/mcp/mcp-server.ts +0 -163
- package/src/mcp/mcp-transport.ts +0 -48
- package/src/tui/App.tsx +0 -491
- package/src/tui/BackgroundTaskPanel.tsx +0 -36
- package/src/tui/CjkTextInput.tsx +0 -199
- package/src/tui/ConfirmPrompt.tsx +0 -70
- package/src/tui/ContextWarningBanner.tsx +0 -34
- package/src/tui/ExecutionWorkspaceDetailPane.tsx +0 -64
- package/src/tui/ExecutionWorkspaceSwitcher.tsx +0 -187
- package/src/tui/InputArea.tsx +0 -310
- package/src/tui/InteractivePrompt.tsx +0 -59
- package/src/tui/ListPicker.tsx +0 -95
- package/src/tui/MenuSelect.tsx +0 -104
- package/src/tui/MessageList.tsx +0 -284
- package/src/tui/PermissionPrompt.tsx +0 -86
- package/src/tui/PluginTUI.tsx +0 -258
- package/src/tui/SessionPicker.tsx +0 -68
- package/src/tui/SessionStatusBar.tsx +0 -73
- package/src/tui/SlashAutocomplete.tsx +0 -110
- package/src/tui/StatusBar.tsx +0 -236
- package/src/tui/StreamingIndicator.tsx +0 -93
- package/src/tui/TextPrompt.tsx +0 -81
- package/src/tui/ToolCommandOutput.tsx +0 -39
- package/src/tui/ToolDiffBlock.tsx +0 -32
- package/src/tui/TransportTUI.tsx +0 -117
- package/src/tui/TuiInteractionChannel.ts +0 -495
- package/src/tui/UpdateNotice.tsx +0 -14
- package/src/tui/UsageSummaryEntry.tsx +0 -39
- package/src/tui/WaveText.tsx +0 -44
- package/src/tui/__tests__/InteractivePrompt.test.tsx +0 -82
- package/src/tui/__tests__/ListPicker.test.tsx +0 -159
- package/src/tui/__tests__/MenuSelect.test.tsx +0 -103
- package/src/tui/__tests__/PluginTUI.test.tsx +0 -167
- package/src/tui/__tests__/SlashAutocomplete.test.tsx +0 -140
- package/src/tui/__tests__/TextPrompt.test.tsx +0 -98
- package/src/tui/__tests__/TuiInteractionChannel.display-contract.test.ts +0 -239
- package/src/tui/__tests__/TuiInteractionChannel.lifecycle.test.ts +0 -297
- package/src/tui/__tests__/TuiInteractionChannel.requestAction.test.ts +0 -124
- package/src/tui/__tests__/UpdateNotice.test.tsx +0 -15
- package/src/tui/__tests__/abort-after-permission.test.tsx +0 -169
- package/src/tui/__tests__/abort-streaming-e2e.test.tsx +0 -183
- package/src/tui/__tests__/background-task-panel.test.tsx +0 -53
- package/src/tui/__tests__/background-task-row-format.test.ts +0 -59
- package/src/tui/__tests__/channel-factory-integration.test.ts +0 -138
- package/src/tui/__tests__/cjk-text-input-flow.test.ts +0 -109
- package/src/tui/__tests__/cjk-text-input.test.ts +0 -191
- package/src/tui/__tests__/command-effect-handler.test.ts +0 -127
- package/src/tui/__tests__/command-output-summary.test.ts +0 -95
- package/src/tui/__tests__/compact-event-bridge.test.ts +0 -20
- package/src/tui/__tests__/confirm-permission-flow.test.ts +0 -130
- package/src/tui/__tests__/confirm-prompt.test.tsx +0 -87
- package/src/tui/__tests__/execution-workspace-switcher.test.tsx +0 -110
- package/src/tui/__tests__/execution-workspace-view-model.test.ts +0 -93
- package/src/tui/__tests__/fixtures/provider-setup-prompt-driver.tsx +0 -125
- package/src/tui/__tests__/input-area-flow.test.ts +0 -164
- package/src/tui/__tests__/message-list-rendering.test.tsx +0 -353
- package/src/tui/__tests__/prompt-queue.test.tsx +0 -255
- package/src/tui/__tests__/provider-setup-pty-e2e.test.ts +0 -233
- package/src/tui/__tests__/pty/pty-driver.ts +0 -135
- package/src/tui/__tests__/pty/tui-pty.ptytest.ts +0 -61
- package/src/tui/__tests__/render-channel-options.test.ts +0 -32
- package/src/tui/__tests__/render-markdown.test.ts +0 -72
- package/src/tui/__tests__/selection-flow.test.ts +0 -61
- package/src/tui/__tests__/session-init-poller.test.ts +0 -102
- package/src/tui/__tests__/session-naming.test.ts +0 -64
- package/src/tui/__tests__/session-switch-channel.test.tsx +0 -307
- package/src/tui/__tests__/slash-routing-effects.test.ts +0 -228
- package/src/tui/__tests__/status-activity.test.ts +0 -71
- package/src/tui/__tests__/status-bar.test.tsx +0 -177
- package/src/tui/__tests__/streaming-indicator.test.tsx +0 -137
- package/src/tui/__tests__/text-prompt-flow.test.ts +0 -77
- package/src/tui/__tests__/tui-channel-init-failure.test.ts +0 -57
- package/src/tui/__tests__/tui-state-manager.test.ts +0 -401
- package/src/tui/background-task-row-format.ts +0 -53
- package/src/tui/command-interaction.ts +0 -9
- package/src/tui/command-output-summary.ts +0 -122
- package/src/tui/create-default-tui-cli-adapter.ts +0 -41
- package/src/tui/execution-workspace-view-model.ts +0 -123
- package/src/tui/flows/cjk-text-input-flow.ts +0 -285
- package/src/tui/flows/confirm-prompt-flow.ts +0 -45
- package/src/tui/flows/input-area-flow.ts +0 -189
- package/src/tui/flows/permission-prompt-flow.ts +0 -85
- package/src/tui/flows/selection-flow.ts +0 -126
- package/src/tui/flows/session-init-poller.ts +0 -77
- package/src/tui/flows/text-prompt-flow.ts +0 -98
- package/src/tui/hooks/command-effect-handler.ts +0 -97
- package/src/tui/hooks/command-effect-queue.ts +0 -39
- package/src/tui/hooks/side-effects-types.ts +0 -35
- package/src/tui/hooks/useAutocomplete.ts +0 -87
- package/src/tui/hooks/usePluginCallbacks.ts +0 -31
- package/src/tui/hooks/usePluginScreenData.ts +0 -85
- package/src/tui/hooks/useSideEffects.ts +0 -175
- package/src/tui/hooks/useSlashRouting.ts +0 -118
- package/src/tui/hooks/useStatusLineSettings.ts +0 -37
- package/src/tui/hooks/useTuiChannel.ts +0 -95
- package/src/tui/index.ts +0 -14
- package/src/tui/interactions/CommandConfirm.tsx +0 -36
- package/src/tui/interactions/CommandPicker.tsx +0 -77
- package/src/tui/interactions/__tests__/CommandConfirm.test.tsx +0 -124
- package/src/tui/interactions/__tests__/CommandPicker.test.tsx +0 -138
- package/src/tui/plugin-tui-handlers.ts +0 -163
- package/src/tui/render-markdown.ts +0 -130
- package/src/tui/render.tsx +0 -129
- package/src/tui/session-naming.ts +0 -33
- package/src/tui/status-activity.ts +0 -63
- package/src/tui/tui-cli-adapter-context.tsx +0 -13
- package/src/tui/tui-cli-adapter.ts +0 -25
- package/src/tui/tui-state-manager.ts +0 -226
- package/src/tui/tui-transport.ts +0 -35
- package/src/tui/types.ts +0 -15
- package/src/tui/utils/__tests__/edit-diff.test.ts +0 -426
- package/src/tui/utils/__tests__/paste-detection.test.ts +0 -116
- package/src/tui/utils/__tests__/paste-labels.test.ts +0 -46
- package/src/tui/utils/__tests__/tool-call-extractor.test.ts +0 -227
- package/src/tui/utils/__tests__/tool-diff-summary.test.ts +0 -104
- package/src/tui/utils/edit-diff.ts +0 -153
- package/src/tui/utils/paste-labels.ts +0 -9
- package/src/tui/utils/tool-call-extractor.ts +0 -92
- package/src/tui/utils/tool-diff-summary.ts +0 -75
- package/src/ws/__tests__/ws-handler.test.ts +0 -409
- package/src/ws/__tests__/ws-transport.test.ts +0 -53
- package/src/ws/index.ts +0 -13
- package/src/ws/ws-background-messages.ts +0 -170
- package/src/ws/ws-handler.ts +0 -280
- package/src/ws/ws-protocol.ts +0 -78
- package/src/ws/ws-transport-configurable.ts +0 -128
- package/src/ws/ws-transport.ts +0 -42
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const e=require("./rolldown-runtime-CMqjfN_6.cjs");let t=require("@robota-sdk/agent-framework"),n=require("ink"),r=require("react");r=e.t(r,1);let i=require("@robota-sdk/agent-core"),a=require("react/jsx-runtime"),o=require("chalk");o=e.t(o,1);let s=require("string-width");s=e.t(s,1);let c=require("marked"),l=require("marked-terminal");l=e.t(l,1);const u=[`active`,`queued`,`running`,`waiting_permission`,`sleeping`],d=/\s+/g;function f(e){return(e?.entries??[]).filter(e=>e.kind===`background_task`&&e.visibility==="default")}function p(e){return f(e).filter(e=>u.includes(e.status)).length}function m(e,t={}){let n=e.id===t.selectedEntryId,r={id:e.id,radio:n?`●`:`○`,title:g(e),subtitle:_(e),statusLabel:v(e.status),preview:b(e.preview??e.currentAction),color:y(e),isSelected:n};return{...r,accessibleText:x(r)}}function h(e){let t=e.text.trim().replace(d,` `);return t?t.length>160?`${t.slice(0,160)}...`:t:e.kind}function g(e){return e.kind===`main_thread`?e.title:e.kind===`background_group`?`${e.title} group`:e.taskKind===`agent`?`${e.title} agent`:e.taskKind===`process`?e.title||`Process`:e.taskKind===`scheduled`?e.title||`Scheduled`:e.title}function _(e){return e.kind===`main_thread`?e.subtitle:[e.taskKind,e.subtitle,e.attention===`none`?void 0:e.attention].filter(e=>typeof e==`string`&&e.length>0).join(` · `)||void 0}function v(e){return e.replace(/_/g,` `)}function y(e){return e.attention===`failed`||e.status===`failed`?`red`:e.attention===`permission`||e.status===`waiting_permission`?`yellow`:e.status===`completed`?`green`:e.status===`cancelled`?`yellow`:u.includes(e.status)?`cyan`:`white`}function b(e){return e?.trim().replace(d,` `)||void 0}function x(e){return[e.radio,e.title,e.statusLabel,e.subtitle,e.preview].filter(e=>typeof e==`string`&&e.length>0).join(` · `)}function S(e,t={}){let n=m(e),r=C(e)?`□`:`■`,i=[n.statusLabel,n.subtitle].filter(e=>typeof e==`string`&&e.length>0);return{connector:t.isLast===!1?`├`:`└`,marker:r,color:n.color,label:n.title,segments:i,preview:n.preview,accessibleText:[`${t.isLast===!1?`├`:`└`} ${r} ${n.title}`,...i,n.preview].filter(e=>typeof e==`string`&&e.length>0).join(` · `)}}function C(e){return e.status===`active`||e.status===`queued`||e.status===`running`||e.status===`waiting_permission`||e.status===`sleeping`}function w({entries:e}){return e.length===0?null:(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Background work`}),e.map((t,r)=>{let i=S(t,{isLast:r===e.length-1});return(0,a.jsxs)(n.Text,{children:[`${i.connector} `,(0,a.jsx)(n.Text,{color:i.color,children:i.marker}),` ${i.label}`,i.segments.map((e,t)=>(0,a.jsx)(n.Text,{dimColor:!0,children:` · ${e}`},`${e}-${t}`)),i.preview?(0,a.jsx)(n.Text,{dimColor:!0,children:` · ${i.preview}`}):null]},t.id)})]})}function T({percentage:e}){return e>=90?(0,a.jsx)(n.Box,{borderStyle:`single`,borderColor:`red`,paddingX:1,children:(0,a.jsxs)(n.Text,{color:`red`,bold:!0,children:[`⚠ Context at `,Math.round(e),`% — window nearly full. Run /compact to summarize the conversation.`]})}):e>=70?(0,a.jsx)(n.Box,{paddingX:1,children:(0,a.jsxs)(n.Text,{color:`yellow`,children:[`Context at `,Math.round(e),`% — consider running /compact to free up space.`]})}):null}function E({entry:e,page:t,loading:r,error:i}){let o=m(e,{selectedEntryId:e.id}),s=t?.records.slice(-12)??[];return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Viewing ${o.title}`}),(0,a.jsxs)(n.Text,{dimColor:!0,children:[o.statusLabel,o.subtitle?` · ${o.subtitle}`:``,o.preview?` · ${o.preview}`:``]}),r?(0,a.jsx)(n.Text,{dimColor:!0,children:`Loading workspace detail...`}):null,i?(0,a.jsx)(n.Text,{color:`red`,children:i}):null,!r&&!i&&s.length===0?(0,a.jsx)(n.Text,{dimColor:!0,children:`No detail yet`}):null,!r&&!i&&s.map(e=>(0,a.jsx)(n.Text,{color:D(e.kind),children:h(e)},e.id)),t?.nextCursor?(0,a.jsx)(n.Text,{dimColor:!0,children:`... more detail available`}):null]})}function D(e){if(e===`error`)return`red`;if(e===`result`)return`green`;if(e===`process_output`)return`white`;if(e===`group_summary`)return`cyan`}function O(){return{selectedIndex:0,scrollOffset:0,resolved:!1}}function k(e){if(e.escape===!0)return`cancel`;if(e.upArrow===!0)return`previous`;if(e.downArrow===!0)return`next`;if(e.return===!0)return`select`}function A(e){if(e.escape===!0)return`cancel`;if(e.leftArrow===!0||e.upArrow===!0)return`previous`;if(e.rightArrow===!0||e.downArrow===!0)return`next`;if(e.return===!0)return`select`}function j(e,t,n){if(e.resolved)return{state:e,effect:{type:`none`}};if(t===`cancel`)return{state:{...e,resolved:!0},effect:{type:`cancel`}};if(n.enabled===!1||n.itemCount===0)return{state:e,effect:{type:`none`}};if(t===`select`){let t=F(e.selectedIndex,n.itemCount);return{state:{...e,selectedIndex:t,resolved:!0},effect:{type:`select`,index:t}}}let r=N(e.selectedIndex,t,n),i=P(r,e.scrollOffset,n);return{state:{...e,selectedIndex:r,scrollOffset:i},effect:{type:`none`}}}function M(e,t){if(t.itemCount===0)return{...e,selectedIndex:0,scrollOffset:0};let n=F(e.selectedIndex,t.itemCount),r=P(n,e.scrollOffset,t);return n===e.selectedIndex&&r===e.scrollOffset?e:{...e,selectedIndex:n,scrollOffset:r}}function N(e,t,n){return t===`previous`?n.wrap===!0&&e===0?n.itemCount-1:Math.max(0,e-1):n.wrap===!0&&e===n.itemCount-1?0:Math.min(n.itemCount-1,e+1)}function P(e,t,n){let r=n.maxVisible??n.itemCount;return r<=0?0:e<t?e:e>=t+r?e-r+1:Math.max(0,t)}function F(e,t){return Math.min(Math.max(e,0),t-1)}function ee({snapshot:e,selectedEntryId:t,onSelect:r,onClose:i}){let{normalized:o,visibleEntries:s,applyAction:c}=I({entries:[...e?.entries??[]],selectedEntryId:t,onSelect:r,onClose:i});return(0,n.useInput)((e,t)=>{let n=k(t);n!==void 0&&c(n)}),(0,a.jsxs)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`cyan`,paddingX:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Execution workspace`}),(0,a.jsx)(n.Box,{flexDirection:`column`,marginTop:1,children:s.length===0?(0,a.jsx)(n.Text,{dimColor:!0,children:`No workspace entries`}):s.map((e,n)=>(0,a.jsx)(R,{entry:e,isFocused:o.scrollOffset+n===o.selectedIndex,selectedEntryId:t},e.id))}),(0,a.jsx)(n.Text,{dimColor:!0,children:`Ctrl+B Close ↑↓ Navigate Enter Switch Esc Close`})]})}function I({entries:e,selectedEntryId:t,onSelect:n,onClose:i}){let[a,o]=(0,r.useState)(()=>O()),s=(0,r.useRef)(a);(0,r.useEffect)(()=>{let n=L({selectedIndex:Math.max(0,e.findIndex(e=>e.id===t)),itemCount:e.length});s.current=n,o(n)},[e.length,t]);let c=L({selectedIndex:a.selectedIndex,scrollOffset:a.scrollOffset,itemCount:e.length});return c!==a&&(s.current=c),{normalized:c,visibleEntries:e.slice(c.scrollOffset,c.scrollOffset+8),applyAction:te({entries:e,stateRef:s,setState:o,onSelect:n,onClose:i})}}function te({entries:e,stateRef:t,setState:n,onSelect:r,onClose:i}){return a=>{let o=j(t.current,a,{itemCount:e.length,maxVisible:8}),s=o.effect.type===`select`||o.effect.type===`cancel`?{...o.state,resolved:!1}:o.state;if(t.current=s,n(s),o.effect.type===`cancel`)i();else if(o.effect.type===`select`){let t=e[o.effect.index];t&&r(t.id)}}}function L(e){return M({selectedIndex:e.selectedIndex,scrollOffset:e.scrollOffset??0,resolved:!1},{itemCount:e.itemCount,maxVisible:8})}function R({entry:e,isFocused:t,selectedEntryId:r}){let i=m(e,{selectedEntryId:r});return(0,a.jsxs)(n.Text,{children:[(0,a.jsx)(n.Text,{color:t?`cyan`:void 0,bold:t,children:t?`> `:` `}),(0,a.jsx)(n.Text,{color:i.color,children:i.radio}),(0,a.jsx)(n.Text,{color:t?`cyan`:void 0,bold:t,children:` ${i.title}`}),(0,a.jsx)(n.Text,{dimColor:!0,children:` · ${i.statusLabel}`}),i.subtitle?(0,a.jsx)(n.Text,{dimColor:!0,children:` · ${i.subtitle}`}):null,i.preview?(0,a.jsx)(n.Text,{dimColor:!0,children:` · ${i.preview}`}):null]})}function z(){return{listInstalled:async()=>[],listAvailablePlugins:async()=>[],install:async()=>void 0,uninstall:async()=>void 0,enable:async()=>void 0,disable:async()=>void 0,marketplaceAdd:async()=>``,marketplaceRemove:async()=>void 0,marketplaceUpdate:async()=>void 0,marketplaceList:async()=>[],reloadPlugins:async()=>({loadedPluginCount:0})}}function ne(e){return(0,r.useMemo)(()=>z(),[])}function B(e,n){for(let r of e){if(r.type===`language-change-requested`)return re(r.language,n),!0;if(r.type===`settings-reset-requested`)return ie(n),!0;if(r.type===`session-exit-requested`)return n.requestShutdown(r.reason??`prompt_input_exit`,r.message??`User requested exit`),!0;if(r.type===`session-restart-requested`)return n.requestShutdown(r.reason,r.message),!0;if(r.type===`plugin-tui-requested`)return n.openPluginTUI(),!0;if(r.type===`settings-tui-requested`)return n.openTransportTUI(),!0;if(r.type===`agent-switcher-requested`)return n.openAgentSwitcher(),!0;if(r.type===`session-picker-requested`)return n.openSessionPicker(),!0;if(r.type===`session-renamed`)return n.renameSession(r.name),!0;if(r.type===`statusline-settings-patch`&&(0,t.isStatusLineCommandSettingsPatch)(r.patch))return n.applyStatusLinePatch(r.patch)}return!1}function re(e,t){let n=t.cliAdapter.getUserSettingsPath(),r=t.cliAdapter.readSettings(n);r.language=e,t.cliAdapter.writeSettings(n,r),t.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Language set to "${e}". Restarting...`))),t.requestShutdown(`other`,`Language change restart`)}function ie(e){let t=e.cliAdapter.getUserSettingsPath();e.cliAdapter.deleteSettings(t)?e.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Deleted ${t}. Exiting...`))):e.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`No user settings found.`))),e.requestShutdown(`other`,`Reset settings restart`)}const V=(0,r.createContext)(null),ae=V.Provider;function H(){let e=(0,r.useContext)(V);if(!e)throw Error(`TuiCliAdapterContext not provided`);return e}function oe({cwd:e,providerOverride:t,interactiveSession:a,commandEffectQueue:o,addEntry:s,baseHandleSubmit:c,setSessionName:l,setStatusLineSettings:u,showSessionPickerOnStart:d,openAgentSwitcher:f}){let{exit:p}=(0,n.useApp)(),m=H(),[h,g]=(0,r.useState)(null),_=(0,r.useRef)(null),[v,y]=(0,r.useState)(!1),[b,x]=(0,r.useState)(d??!1),[S,C]=(0,r.useState)(!1),w=(0,r.useCallback)((e,t)=>{s((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Shutting down...`))),setTimeout(()=>{a.shutdown({reason:e,message:t}).finally(()=>p())},500)},[a,s,p]),T=(0,r.useCallback)(e=>B(e,{addEntry:s,requestShutdown:w,openPluginTUI:()=>y(!0),openSessionPicker:()=>x(!0),openTransportTUI:()=>C(!0),openAgentSwitcher:()=>f?.(),renameSession:e=>{a.setName(e),l(e)},applyStatusLinePatch:e=>(u(m.applyStatusLineSettings(m.getUserSettingsPath(),e)),!0),cliAdapter:m}),[s,m,a,w,l,u]),E=(0,r.useCallback)(e=>{if(e.message.length>0&&s((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(e.message))),e.interaction!==void 0){_.current=e.interaction,g(e.interaction.prompt);return}_.current=null,g(null),e.effects!==void 0&&e.effects.length>0&&T(e.effects)},[s,T]),D=(0,r.useCallback)(()=>{let e=o.drain();if(e===void 0)return!1;if(e.type===`interaction`){let{interaction:t}=e;return _.current=t,g(t.prompt),!0}return T(e.effects)},[T,o]);return{handleSubmit:(0,r.useCallback)(async e=>{await c(e),D()},[c,D]),pendingInteractionPrompt:h,showPluginTUI:v,showSessionPicker:b,showTransportTUI:S,setShowPluginTUI:y,setShowSessionPicker:x,setShowTransportTUI:C,handleInteractionSubmit:(0,r.useCallback)(async e=>{let t=_.current;if(t===null){g(null);return}try{E(await t.submit(e))}catch(e){_.current=null,g(null),s((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Failed: ${e instanceof Error?e.message:String(e)}`)))}},[s,E]),handleInteractionCancel:(0,r.useCallback)(()=>{let e=_.current;if(_.current=null,g(null),e?.cancel===void 0){s((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Command interaction cancelled.`)));return}Promise.resolve(e.cancel()).then(e=>E(e)).catch(e=>{s((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Failed: ${e instanceof Error?e.message:String(e)}`)))})},[s,E])}}function se(e){let n={...t.DEFAULT_STATUS_LINE_COMMAND_SETTINGS},r=e.statusline;return U(r)?{enabled:typeof r.enabled==`boolean`?r.enabled:n.enabled,gitBranch:typeof r.gitBranch==`boolean`?r.gitBranch:n.gitBranch}:n}function U(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(e instanceof Date)}function ce(){let e=H();return(0,r.useState)(()=>se(e.readSettings(e.getUserSettingsPath())))}function le(e){let[,t]=(0,r.useState)(0);(0,r.useEffect)(()=>(e.onChange=()=>t(e=>e+1),()=>{e.onChange=null}),[e]);let n=e.stateManager;return{interactiveSession:e.getSession(),registry:e.getRegistry(),commandEffectQueue:e.getCommandEffectQueue(),history:n.history,addEntry:e=>n.addEntry(e),streamingText:n.streamingText,activeTools:n.activeTools,isThinking:n.isThinking,isAborting:n.isAborting,isShuttingDown:e.isShuttingDown,pendingPrompt:n.pendingPrompt,executionWorkspaceSnapshot:n.executionWorkspaceSnapshot,selectedExecutionEntryId:n.selectedExecutionEntryId,permissionRequest:e.permissionRequest,contextState:n.contextState,handleSubmit:t=>e.handleInput(t),handleAbort:()=>e.abort(),handleCancelQueue:()=>e.cancelQueue(),handleShutdown:t=>e.shutdown({reason:t}),selectExecutionWorkspaceEntry:t=>e.selectExecutionWorkspaceEntry(t),readExecutionWorkspaceDetail:t=>e.readExecutionWorkspaceDetail(t)}}const ue=`[200~`,W=`[201~`;function de(e){return{value:e,cursor:e.length,isPasting:!1,pasteBuffer:``}}function fe(e,t,n){return t===e.value?e:{...e,value:t,cursor:n==null?t.length:Math.min(n,t.length)}}function pe(e,t,n,r){let i=G(e,t,r);if(i!==void 0)return i;let a=he(e,t,n,r);if(a!==void 0)return a;let o=K(e,n,r);return o===void 0?Se(e,t):o}function me(e,t,n){let r=t.replace(/\r\n?/g,`
|
|
2
|
-
`);return r.length===0?{state:e,effect:{type:`none`}}:r.includes(`
|
|
3
|
-
`)&&n.canPaste?{state:e,effect:{type:`paste`,text:r,cursor:e.cursor}}:Se(e,r)}function G(e,t,n){if(t===ue||t.startsWith(ue))return _e(e,t);if(e.isPasting)return ve(e,t,n)}function he(e,t,n,r){if(n.ctrl===!0&&t===`c`||n.tab===!0)return{state:e,effect:{type:`none`}};if(n.return===!0)return{state:e,effect:{type:`submit`,value:e.value}};if(t.length>1&&(t.includes(`
|
|
4
|
-
`)||t.includes(`\r`))&&r.canPaste)return{state:e,effect:{type:`paste`,text:t.replace(/\r\n?/g,`
|
|
5
|
-
`),cursor:e.cursor}}}function K(e,t,n){if(t.upArrow===!0||t.downArrow===!0)return n.enableVerticalNavigation===!1?{state:e,effect:{type:`none`}}:ye(e,t.upArrow===!0?`up`:`down`,n.availableWidth);if(t.leftArrow===!0)return be(e,`left`);if(t.rightArrow===!0)return be(e,`right`);if(t.backspace===!0||t.delete===!0)return xe(e)}function q(e){if(!e||e.length===0)return``;let t=``;for(let n of e){let e=n.charCodeAt(0);e>31&&e!==127&&(t+=n)}return t}function J(e,t,n){return{value:e.slice(0,t)+n+e.slice(t),cursor:t+n.length}}function Y(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++){let t=(0,s.default)(e[i]),a=r%n;a+t>n&&(r+=n-a),r+=t}return r}function ge(e,t,n){let r=0;for(let i=0;i<e.length;i++){if(r>=t)return i;let a=(0,s.default)(e[i]),o=r%n;o+a>n&&(r+=n-o),r+=a}return e.length}function _e(e,t){return{state:{...e,isPasting:!0,pasteBuffer:t.slice(5)},effect:{type:`none`}}}function ve(e,t,n){if(t!==W&&!t.includes(W))return{state:{...e,pasteBuffer:e.pasteBuffer+t},effect:{type:`none`}};let r=t.split(W)[0]??``;return me({...e,isPasting:!1,pasteBuffer:``},e.pasteBuffer+r,n)}function ye(e,t,n){if(!n||n<=0)return{state:e,effect:{type:`none`}};let r=[...e.value],i=Y(r,e.cursor,n),a=t===`up`?i-n:i+n;if(a<0)return{state:e,effect:{type:`none`}};let o=ge(r,a,n);return o===e.cursor?{state:e,effect:{type:`none`}}:{state:{...e,cursor:o},effect:{type:`render`}}}function be(e,t){return t===`left`&&e.cursor>0?{state:{...e,cursor:e.cursor-1},effect:{type:`render`}}:t===`right`&&e.cursor<e.value.length?{state:{...e,cursor:e.cursor+1},effect:{type:`render`}}:{state:e,effect:{type:`none`}}}function xe(e){if(e.cursor===0)return{state:e,effect:{type:`none`}};let t=e.value.slice(0,e.cursor-1)+e.value.slice(e.cursor);return{state:{...e,value:t,cursor:e.cursor-1},effect:{type:`change`,value:t}}}function Se(e,t){let n=q(t);if(n.length===0)return{state:e,effect:{type:`none`}};let r=J(e.value,e.cursor,n);return{state:{...e,value:r.value,cursor:r.cursor},effect:{type:`change`,value:r.value}}}function Ce({value:e,onChange:t,onSubmit:i,onPaste:o,placeholder:s=``,focus:c=!0,showCursor:l=!0,availableWidth:u,cursorHint:d=null,enableVerticalNavigation:f=!0}){let p=(0,r.useRef)(de(e)),[,m]=(0,r.useState)(0);return p.current=fe(p.current,e,d),we({stateRef:p,onChange:t,onSubmit:i,onPaste:o,availableWidth:u,focus:c,enableVerticalNavigation:f,forceRender:m}),(0,a.jsx)(n.Text,{children:De(p.current.value,p.current.cursor,s,l&&c)})}function we(e){(0,n.usePaste)(t=>{X(e,()=>me(e.stateRef.current,t,Te(e)))},{isActive:e.focus}),(0,n.useInput)((t,n)=>{X(e,()=>pe(e.stateRef.current,t,n,Te(e)))},{isActive:e.focus})}function Te(e){return{availableWidth:e.availableWidth,canPaste:e.onPaste!==void 0,enableVerticalNavigation:e.enableVerticalNavigation}}function X(e,t){try{let n=t();e.stateRef.current=n.state,Ee(n.effect,e.onChange,e.onSubmit,e.onPaste,e.forceRender)}catch{}}function Ee(e,t,n,r,i){e.type===`change`?t(e.value):e.type===`submit`?n?.(e.value):e.type===`paste`?r?.(e.text,e.cursor):e.type===`render`&&i(e=>e+1)}function De(e,t,n,r){if(!r)return e.length>0?e:n?o.default.gray(n):``;if(e.length===0)return n.length>0?o.default.inverse(n[0])+o.default.gray(n.slice(1)):o.default.inverse(` `);let i=[...e],a=``;for(let e=0;e<i.length;e++){let n=i[e]??``;a+=e===t?o.default.inverse(n):n}return t>=i.length&&(a+=o.default.inverse(` `)),a}function Oe(e){if(e.upArrow===!0)return`previous`;if(e.downArrow===!0)return`next`;if(e.escape===!0)return`close`;if(e.tab===!0)return`complete`}function ke(e){if(e.backspace===!0||e.delete===!0)return`cancelQueue`}function Ae(e){if(e.upArrow===!0)return`previous`;if(e.downArrow===!0)return`next`}function je(){return{selectedIndex:null,draft:``}}function Me(e,t,n,r){if(t.length===0)return{value:e,cursorHint:e.length,state:n};if(r===`previous`){let r=n.selectedIndex===null?t.length-1:Math.max(0,n.selectedIndex-1),i=t[r]??e;return{value:i,cursorHint:i.length,state:{selectedIndex:r,draft:n.selectedIndex===null?e:n.draft}}}if(n.selectedIndex===null)return{value:e,cursorHint:e.length,state:n};if(n.selectedIndex<t.length-1){let r=n.selectedIndex+1,i=t[r]??e;return{value:i,cursorHint:i.length,state:{...n,selectedIndex:r}}}return{value:n.draft,cursorHint:n.draft.length,state:je()}}function Ne(e,t){let n=t.trim();return n.length===0||e[e.length-1]===n?[...e]:[...e,n]}function Pe(e){let t=[];for(let n of e){if(n.category!==`chat`||n.type!==`user`)continue;let e=n.data;typeof e?.content==`string`&&(t=Ne(t,e.content))}return t}function Fe(e,t,n){return t===0?0:n===`previous`?e>0?e-1:t-1:e<t-1?e+1:0}function Ie(e,n){if((0,t.isSlashCommand)(e)&&e.slice(1).includes(` `)){let{name:r}=(0,t.tokeniseSlashCommand)(e);return{type:`insert`,value:`/${r} ${n.name} `}}return n.subcommands&&n.subcommands.length>0?{type:`insert`,value:`/${n.name} `,selectedIndex:0}:{type:`insert`,value:`/${n.name} `}}function Le(e,n){if((0,t.isSlashCommand)(e)&&e.slice(1).includes(` `)){let{name:r}=(0,t.tokeniseSlashCommand)(e);return{type:`submit`,value:`/${r} ${n.name}`}}return n.subcommands&&n.subcommands.length>0?{type:`insert`,value:`/${n.name} `,selectedIndex:0}:{type:`submit`,value:`/${n.name}`}}function Re(e,t,n,r){let i=r.split(`
|
|
6
|
-
`).length,a=`[Pasted text #${n} +${i} lines]`;return{value:e.slice(0,t)+a+e.slice(t),cursorHint:t+a.length,label:a,lineCount:i}}function ze(e){return e.trim().length>0}function Be(e){if(!e.startsWith(`/`))return{isSlash:!1,parentCommand:``,filter:``};let t=e.slice(1),n=t.indexOf(` `);return n===-1?{isSlash:!0,parentCommand:``,filter:t}:{isSlash:!0,parentCommand:t.slice(0,n),filter:t.slice(n+1)}}function Ve(e,t){let[n,i]=(0,r.useState)(0),[a,o]=(0,r.useState)(!1),s=r.default.useRef(e);s.current!==e&&(s.current=e,a&&o(!1));let c=Be(e),l=c.isSlash&&c.parentCommand.length>0,u=(0,r.useMemo)(()=>{if(!t||!c.isSlash||a)return[];if(l){let e=t.getSubcommands(c.parentCommand);if(e.length===0)return[];if(!c.filter)return e;let n=c.filter.toLowerCase();return e.filter(e=>e.name.toLowerCase().startsWith(n))}return t.getCommands(c.filter)},[t,c.isSlash,c.parentCommand,c.filter,a,l]),d=c.isSlash&&u.length>0&&!a;return n>=u.length&&u.length>0&&i(u.length-1),{showPopup:d,filteredCommands:u,selectedIndex:n,setSelectedIndex:i,isSubcommandMode:l,setShowPopup:e=>{o(typeof e==`function`?t=>!e(!t):!e)}}}function He(){let{stdout:e}=(0,n.useStdout)(),t=()=>Math.max(40,(e.columns??80)-4),[i,a]=(0,r.useState)(t);return(0,r.useEffect)(()=>{let n=()=>a(t());return e.on(`resize`,n),()=>{e.off(`resize`,n)}},[e]),i}function Ue(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e.padEnd(t)}function We(e){let{cmd:t,isSelected:r,showSlash:i,rowWidth:o,nameColWidth:s}=e,c=r?`▸ `:` `,l=r?`cyan`:void 0,u=!r,d=Ue(t.name,s);return(0,a.jsx)(n.Box,{width:o,children:(0,a.jsx)(n.Text,{color:l,dimColor:u,wrap:`truncate-end`,children:i?`${c}/${d} ${t.description??``}`:`${c}${d} ${t.description??``}`})})}function Ge({commands:e,selectedIndex:t,visible:r,isSubcommandMode:i}){let o=He();if(!r||e.length===0)return null;let s=Ke(t,e.length),c=e.slice(s,s+8),l=Math.min(20,Math.max(...c.map(e=>e.name.length)));return(0,a.jsx)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`gray`,paddingX:1,children:c.map((e,n)=>(0,a.jsx)(We,{cmd:e,isSelected:s+n===t,showSlash:!i,rowWidth:o,nameColWidth:l},e.name))})}function Ke(e,t){if(t<=8||e<8)return 0;let n=t-8;return Math.min(e-8+1,n)}const qe=/\[Pasted text #(\d+)(?: \+\d+ lines)?\]/g;function Je(e,t){return e.replace(qe,(e,n)=>t.get(Number(n))??``)}const Ye=[`#666666`,`#888888`,`#aaaaaa`,`#888888`];function Xe({text:e}){let[t,i]=(0,r.useState)(0);return(0,r.useEffect)(()=>{let e=setInterval(()=>{i(e=>e+1)},400);return()=>clearInterval(e)},[]),(0,a.jsx)(n.Text,{children:[...e].map((e,r)=>(0,a.jsx)(n.Text,{color:Ye[(t+Math.floor(r/4))%Ye.length],children:e},r))})}function Ze({onSubmit:e,onCancelQueue:t,isDisabled:i,isAborting:o,pendingPrompt:s,registry:c,sessionName:l,history:u}){let[d,f]=(0,r.useState)(``),[p,m]=(0,r.useState)(null),[h,g]=(0,r.useState)(je),[_,v]=(0,r.useState)([]),y=(0,r.useMemo)(()=>Pe(u??[]),[u]),b=(0,r.useMemo)(()=>_.reduce((e,t)=>Ne(e,t),y),[y,_]),x=(0,r.useRef)(new Map),{columns:S}=(0,n.useWindowSize)(),C=S>0?S:80,w=Math.max(1,C-3),T=(0,r.useRef)(0),{showPopup:E,filteredCommands:D,selectedIndex:O,setSelectedIndex:k,isSubcommandMode:A,setShowPopup:j}=Ve(d,c),M=(0,r.useCallback)((e,t)=>{T.current+=1;let n=T.current;x.current.set(n,e),f(r=>{let i=Re(r,t,n,e);return m(i.cursorHint),i.value})},[]),N=(0,r.useCallback)(()=>{g(je())},[]),P=(0,r.useCallback)(e=>{v(t=>Ne(t,e))},[]),F=(0,r.useCallback)(t=>{P(t),N(),e(t)},[e,P,N]),ee=(0,r.useCallback)(e=>{let t=Ie(d,e);t.type===`insert`&&(f(t.value),t.selectedIndex!==void 0&&k(t.selectedIndex))},[d,k]),I=(0,r.useCallback)(e=>{let t=Le(d,e);if(t.type===`insert`){f(t.value),t.selectedIndex!==void 0&&k(t.selectedIndex);return}t.type===`submit`&&(f(``),F(t.value))},[d,F,k]),te=(0,r.useCallback)(e=>{if(!ze(e))return;if(E&&D[O]){I(D[O]);return}let t=Je(e.trim(),x.current);f(``),x.current.clear(),T.current=0,F(t)},[E,D,O,I,F]);(0,n.useInput)((e,t)=>{if(!E)return;let n=Oe(t);if(n===`previous`||n===`next`)k(e=>Fe(e,D.length,n));else if(n===`close`)j(!1);else if(n===`complete`){let e=D[O];e&&ee(e)}},{isActive:E&&!i}),(0,n.useInput)((e,t)=>{let n=Ae(t);if(!n)return;let r=Me(d,b,h,n);f(r.value),m(r.cursorHint),g(r.state)},{isActive:!E&&!i&&!s}),(0,n.useInput)((e,n)=>{ke(n)===`cancelQueue`&&s&&t?.()},{isActive:!!s});let L=o?`yellow`:s?`cyan`:i?`gray`:`green`,R=Math.max(1,C-0),z=(()=>{if(l){let e=` "${l}" `,t=Math.max(0,R-e.length-2);return{left:`─`.repeat(t),label:e,right:`─`.repeat(2)}}return{left:`─`.repeat(R),label:``,right:``}})();return(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[E&&(0,a.jsx)(Ge,{commands:D,selectedIndex:O,visible:E,isSubcommandMode:A}),(0,a.jsxs)(n.Text,{color:L,children:[z.left,z.label?(0,a.jsx)(n.Text,{backgroundColor:L,color:`black`,bold:!0,children:z.label}):null,z.right]}),(0,a.jsx)(n.Box,{borderStyle:`single`,borderTop:!1,borderLeft:!1,borderRight:!1,borderColor:L,paddingLeft:1,children:o?(0,a.jsx)(n.Text,{color:`yellow`,children:` Interrupting...`}):s?(0,a.jsxs)(n.Text,{color:`cyan`,children:[` `,`Queued:`,` `,s.length>50?s.slice(0,47)+`...`:s,` `,(0,a.jsx)(n.Text,{dimColor:!0,children:`(Backspace to cancel)`})]}):i?(0,a.jsx)(Xe,{text:` Waiting for response... (ESC to interrupt)`}):(0,a.jsxs)(n.Box,{children:[(0,a.jsx)(n.Text,{color:`green`,bold:!0,children:`> `}),(0,a.jsx)(Ce,{value:d,onChange:e=>{f(e),N(),m(null)},onSubmit:te,onPaste:M,placeholder:`Type a message or /help`,availableWidth:w,cursorHint:p,enableVerticalNavigation:!1})]})})]})}function Qe({items:e,renderItem:t,onSelect:i,onCancel:o,maxVisible:s=3}){let[c,l]=(0,r.useState)(()=>O()),u=(0,r.useRef)(c),d=(0,r.useCallback)(t=>{let n=j(u.current,t,{itemCount:e.length,maxVisible:s});if(u.current=n.state,l(n.state),n.effect.type===`cancel`)o();else if(n.effect.type===`select`){let t=e[n.effect.index];t!==void 0&&i(t)}},[e,s,o,i]);if((0,n.useInput)((e,t)=>{let n=k(t);n!==void 0&&d(n)}),e.length===0)return(0,a.jsx)(n.Box,{});let f=M(c,{itemCount:e.length,maxVisible:s});f!==c&&(u.current=f);let{selectedIndex:p,scrollOffset:m}=f,h=e.slice(m,m+s),g=m+s<e.length;return(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[m>0&&(0,a.jsxs)(n.Text,{dimColor:!0,children:[` ↑ `,m,` more above`]}),h.map((e,r)=>(0,a.jsx)(n.Box,{marginBottom:1,children:t(e,m+r===p)},m+r)),g&&(0,a.jsxs)(n.Text,{dimColor:!0,children:[` ↓ `,e.length-m-s,` more below`]})]})}function $e(){return{value:``,resolved:!1}}function et(e,t){if(t.escape===!0)return{type:`cancel`};if(t.return===!0)return{type:`submit`};if(t.backspace===!0||t.delete===!0)return{type:`delete`};if(e&&t.ctrl!==!0&&t.meta!==!0)return{type:`insert`,value:e}}function tt(e,t,n){return e.resolved?{state:e,effect:{type:`none`}}:t.type===`cancel`?{state:{...e,resolved:!0},effect:{type:`cancel`}}:t.type===`delete`?{state:{...e,value:e.value.slice(0,-1),error:void 0},effect:{type:`none`}}:t.type===`insert`?{state:{...e,value:e.value+t.value,error:void 0},effect:{type:`none`}}:nt(e,n)}function nt(e,t){let n=e.value.trim();if(!n&&!t.allowEmpty){let r=t.validate?.(n);return{state:r?{...e,error:r}:e,effect:{type:`none`}}}let r=t.validate?.(n);return r===void 0?{state:{...e,resolved:!0},effect:{type:`submit`,value:n}}:{state:{...e,error:r},effect:{type:`none`}}}function rt({title:e,description:t,placeholder:i,onSubmit:o,onCancel:s,validate:c,allowEmpty:l=!1,masked:u=!1}){let[d,f]=(0,r.useState)(()=>$e()),p=(0,r.useRef)(d),m=(0,r.useCallback)(e=>{let t=tt(p.current,e,{allowEmpty:l,validate:c});p.current=t.state,f(t.state),t.effect.type===`cancel`?s():t.effect.type===`submit`&&o(t.effect.value)},[l,c,s,o]);return(0,n.useInput)((e,t)=>{let n=et(e,t);n!==void 0&&m(n)}),(0,a.jsxs)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,children:[(0,a.jsx)(n.Text,{color:`yellow`,bold:!0,children:e}),(0,a.jsx)(it,{description:t}),(0,a.jsxs)(n.Box,{marginTop:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,children:`> `}),d.value?(0,a.jsx)(n.Text,{children:u?`*`.repeat(d.value.length):d.value}):i?(0,a.jsx)(n.Text,{dimColor:!0,children:i}):null,(0,a.jsx)(n.Text,{color:`cyan`,children:`█`})]}),d.error&&(0,a.jsx)(n.Text,{color:`red`,children:d.error}),(0,a.jsx)(n.Text,{dimColor:!0,children:` Enter Submit Esc Cancel`})]})}function it({description:e}){return e===void 0||e.length===0?null:(0,a.jsx)(n.Text,{dimColor:!0,children:e})}function at({prompt:e,onSubmit:t,onCancel:r}){return e.kind===`text`?(0,a.jsx)(rt,{title:e.title,description:e.description,placeholder:e.placeholder,allowEmpty:e.allowEmpty,masked:e.masked,validate:e.validate,onSubmit:t,onCancel:r},`text:${e.title}`):(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[(0,a.jsx)(n.Text,{bold:!0,children:e.title}),e.description!==void 0&&e.description.length>0&&(0,a.jsx)(n.Text,{dimColor:!0,children:e.description}),(0,a.jsx)(Qe,{items:[...e.options],maxVisible:e.maxVisible,renderItem:(e,t)=>(0,a.jsxs)(n.Text,{color:t?`cyan`:void 0,children:[t?`> `:` `,e.label]}),onSelect:e=>t(e.value),onCancel:r})]})}const ot=new Set([`Bash`,`BackgroundProcess`]);function st(e){if(!ot.has(e.toolName)||!e.toolResultData)return;let t=ct(e.toolResultData),n=mt(t,`exitCode`),r=ht(t,`success`),i=ft(dt(lt(e.toolResultData,t))),a=i.slice(0,4),o=Math.max(0,i.length-a.length),s=e.result===`error`||r===!1||n!==void 0&&n!==0;return{status:s?`error`:`success`,statusLabel:ut(s,n),previewLines:a,omittedLineCount:o,transcriptHint:o>0?`... +${o} lines (full output in session transcript)`:void 0}}function ct(e){try{return JSON.parse(e)}catch{return e}}function lt(e,t){if(!Z(t))return e;let n=Q(t,`output`);if(n!==void 0)return n;let r=Q(t,`stdout`),i=Q(t,`stderr`),a=Q(t,`error`),o=[];return r&&o.push(r),i&&o.push(pt(i,`[stderr] `)),!r&&!i&&a&&o.push(a),o.join(`
|
|
7
|
-
`)}function ut(e,t){return t!==void 0&&t!==0?`exit ${t}`:e?`error`:`ok`}function dt(e){return e?e.replace(/\r\n/g,`
|
|
8
|
-
`).split(`
|
|
9
|
-
`):[]}function ft(e){let t=e.length;for(;t>0&&e[t-1].trim().length===0;)--t;return e.slice(0,t)}function pt(e,t){return dt(e).map(e=>`${t}${e}`).join(`
|
|
10
|
-
`)}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(e instanceof Date)}function Q(e,t){if(!Z(e))return;let n=e[t];return typeof n==`string`?n:void 0}function mt(e,t){if(!Z(e))return;let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}function ht(e,t){if(!Z(e))return;let n=e[t];return typeof n==`boolean`?n:void 0}const $=`\x1B[0m`,gt=` `,_t=l.default;function vt(e){return e===void 0?process.env.NO_COLOR||process.env.FORCE_COLOR===`0`?!1:process.env.FORCE_COLOR?!0:!!process.stdout.isTTY:e}function yt(e){return e?.trim().toLowerCase()===`diff`}function bt(e,t,n){let r=`${gt}${e}`.padEnd(t);return n?e.startsWith(`+`)?`[48;5;22m[38;5;120m${r}${$}`:e.startsWith(`-`)?`[48;5;52m[38;5;210m${r}${$}`:r.trimEnd():r.trimEnd()}function xt(e,t,n){if(e.startsWith(`+`)||e.startsWith(`-`))return bt(e,n,t);let r=`${gt}${e}`;return t?e.startsWith(`@@`)?`[36m${r}${$}`:e.startsWith(`diff `)||e.startsWith(`index `)?`[2m${r}${$}`:r:r}function St(e,t){let n=e.reduce((e,t)=>Math.max(e,4+t.length),0);return t===void 0?n:Math.max(n,t)}function Ct(e,t,n){let r=e.split(`
|
|
11
|
-
`),i=St(r,n);return`${r.map(e=>xt(e,t,i)).join(`
|
|
12
|
-
`)}\n\n`}function wt(e,t){let n=new _t(void 0,{ignoreIllegals:!0}),r=n.code.bind(n);return n.code=(n,i,a)=>yt(i)?Ct(n,e,t):r(n,i,a),n}function Tt(e,t={}){let n=c.marked.parse(e,{renderer:wt(vt(t.color),t.codeBlockWidth)});return typeof n==`string`?n.trimEnd():e}function Et({tool:e}){let t=st(e);if(!t||t.statusLabel===`ok`&&t.previewLines.length===0&&!t.transcriptHint)return null;let r=t.status===`error`?`red`:`white`;return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginLeft:4,children:[t.statusLabel!==`ok`&&(0,a.jsx)(n.Text,{color:r,dimColor:!0,children:t.statusLabel}),t.previewLines.map((e,t)=>(0,a.jsx)(n.Text,{color:r,dimColor:!0,children:e},`${e}-${t}`)),t.transcriptHint&&(0,a.jsx)(n.Text,{dimColor:!0,children:t.transcriptHint})]})}function Dt(e){let t=e.lines.length>12?kt(e.lines):e.lines,n=Math.max(...t.map(e=>e.lineNumber),0).toString().length,r=t.map(e=>Ot(e,n)),i=e.lines.length>12;return{file:e.file,markdown:["```diff",...r,"```"].join(`
|
|
13
|
-
`),truncated:i,remainingLineCount:i?e.lines.length-t.length:0}}function Ot(e,t){if(e.type===`hunk`)return e.text;let n=e.lineNumber.toString().padStart(t,` `);return e.type===`remove`?`- ${n} | ${e.text}`:e.type===`add`?`+ ${n} | ${e.text}`:` ${n} | ${e.text}`}function kt(e){let t=At(e),n=[];for(let e of t){if(n.length===0&&e.length>10)return e.slice(0,10);if(n.length+e.length>10)break;n.push(...e)}return n.length>0?n:e.slice(0,10)}function At(e){let t=[],n=[];for(let r of e){if(r.type===`hunk`&&n.length>0){t.push(n),n=[r];continue}n.push(r)}return n.length>0&&t.push(n),t}function jt({file:e,lines:t}){let r=Dt({file:e,lines:t});return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginLeft:4,children:[r.file&&(0,a.jsxs)(n.Text,{color:`white`,dimColor:!0,children:[`│ `,r.file]}),(0,a.jsx)(n.Text,{children:Tt(r.markdown)}),r.truncated&&(0,a.jsxs)(n.Text,{color:`white`,dimColor:!0,children:[`│ ... and `,r.remainingLineCount,` more lines`]})]})}function Mt({entry:e}){let t=e.data;if(!t)return(0,a.jsx)(a.Fragment,{});let r=t.promptTokens===void 0?`?`:Nt(t.promptTokens),o=t.completionTokens===void 0?`?`:Nt(t.completionTokens),s=Nt(t.totalTokens),c=`${Math.round(t.contextUsedPercentage)}% (${(0,i.formatTokenCount)(t.contextUsedTokens)}/${(0,i.formatTokenCount)(t.contextMaxTokens)})`,l=t.costStatus===`unknown`?`cost unknown`:`cost ${t.costStatus}`;return(0,a.jsx)(n.Box,{flexDirection:`column`,marginBottom:1,children:(0,a.jsxs)(n.Box,{children:[(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Usage:`,` `]}),(0,a.jsxs)(n.Text,{dimColor:!0,children:[t.kind,` `,s,` tokens (in `,r,` / out `,o,`) · Context `,c,` ·`,` `,l]})]})})}function Nt(e){return e<1e3?e.toLocaleString():(0,i.formatTokenCount)(e)}function Pt(e){return st(e)?.status===`error`?`✗`:e.isRunning?`⟳`:e.result===`error`?`✗`:e.result===`denied`?`⊘`:`✓`}function Ft(e){return st(e)?.status===`error`||e.result===`error`?`red`:e.isRunning||e.result===`denied`?`yellow`:`green`}function It(e){return`${Pt(e)} ${e.toolName}${e.firstArg?`(${e.firstArg})`:``}`}function Lt({role:e}){switch(e){case`user`:return(0,a.jsxs)(n.Text,{color:`green`,bold:!0,children:[`You:`,` `]});case`assistant`:return(0,a.jsxs)(n.Text,{color:`cyan`,bold:!0,children:[`Robota:`,` `]});case`system`:return(0,a.jsxs)(n.Text,{color:`yellow`,bold:!0,children:[`System:`,` `]});case`tool`:return(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Tool:`,` `]})}}function Rt({message:e}){if(!(0,i.isToolMessage)(e))return(0,a.jsx)(a.Fragment,{});let t=e.name,r=e.content,o=null;try{let e=JSON.parse(r);Array.isArray(e)&&e.length>0&&typeof e[0].line==`string`&&(o=e)}catch{}if(o)return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsxs)(n.Box,{children:[(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Tool:`,` `]}),t&&(0,a.jsxs)(n.Text,{color:`white`,dimColor:!0,children:[`[`,t,`]`]})]}),(0,a.jsx)(n.Text,{children:` `}),o.map((e,t)=>(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[(0,a.jsxs)(n.Text,{color:`green`,children:[` `,`✓`,` `,e.line]}),e.diffLines&&e.diffLines.length>0&&(0,a.jsx)(jt,{file:e.diffFile,lines:e.diffLines})]},t))]});let s=r.split(`
|
|
14
|
-
`).filter(e=>e.trim());return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsxs)(n.Box,{children:[(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Tool:`,` `]}),t&&(0,a.jsxs)(n.Text,{color:`white`,dimColor:!0,children:[`[`,t,`]`]})]}),(0,a.jsx)(n.Text,{children:` `}),s.map((e,t)=>(0,a.jsxs)(n.Text,{color:`green`,children:[` `,`✓`,` `,e]},t))]})}const zt=r.default.memo(function({message:e}){if((0,i.isToolMessage)(e))return(0,a.jsx)(Rt,{message:e});let t=e.content??``,r=e.state===`interrupted`;return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Box,{children:(0,a.jsx)(Lt,{role:e.role})}),(0,a.jsx)(n.Text,{children:` `}),(0,a.jsx)(n.Box,{marginLeft:2,children:(0,a.jsx)(n.Text,{wrap:`wrap`,children:(0,i.isAssistantMessage)(e)?Tt(t+(r?`
|
|
15
|
-
|
|
16
|
-
_(interrupted)_`:``)):t})})]})});function Bt({entry:e}){let t=e.data,r=t?.tools,i=t?.summary?.split(`
|
|
17
|
-
`)??[];return r&&r.length>0?(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Box,{children:(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Tool:`,` `]})}),(0,a.jsx)(n.Text,{children:` `}),r.map((e,t)=>(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[(0,a.jsxs)(n.Text,{color:Ft(e),children:[` `,It(e)]}),(0,a.jsx)(Et,{tool:e}),e.diffLines&&e.diffLines.length>0&&(0,a.jsx)(jt,{file:e.diffFile,lines:e.diffLines})]},t))]}):(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Box,{children:(0,a.jsxs)(n.Text,{color:`white`,bold:!0,children:[`Tool:`,` `]})}),(0,a.jsx)(n.Text,{children:` `}),i.map((e,t)=>(0,a.jsxs)(n.Text,{color:`green`,children:[` `,e]},t))]})}function Vt({entry:e}){let t=e.data,r=typeof t?.message==`string`?t.message:typeof t?.content==`string`?t.content:e.type;return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Box,{children:(0,a.jsxs)(n.Text,{color:`yellow`,bold:!0,children:[`System:`,` `]})}),(0,a.jsx)(n.Text,{children:` `}),(0,a.jsx)(n.Box,{marginLeft:2,children:(0,a.jsx)(n.Text,{wrap:`wrap`,children:r})})]})}function Ht({entry:e}){if(e.category===`chat`){let t=e.data;return(0,a.jsx)(zt,{message:t})}return e.type===`tool-summary`?(0,a.jsx)(Bt,{entry:e}):e.type===`usage-summary`?(0,a.jsx)(Mt,{entry:e}):e.type===`tool-start`||e.type===`tool-end`?(0,a.jsx)(a.Fragment,{}):(0,a.jsx)(Vt,{entry:e})}function Ut({history:e}){return(0,a.jsx)(n.Box,{flexDirection:`column`,children:e.map(e=>(0,a.jsx)(Ht,{entry:e},e.id))})}const Wt=[`Allow [y]`,`Allow always (this session) [s]`,`Allow always (this project) [p]`,`Deny [n]`];function Gt(e,t){let n=A({...t,escape:!1});if(n!==void 0)return n;if(e===`y`||e===`1`)return{type:`shortcut`,index:0};if(e===`s`||e===`a`||e===`2`)return{type:`shortcut`,index:1};if(e===`p`||e===`3`)return{type:`shortcut`,index:2};if(e===`n`||e===`d`||e===`4`)return{type:`shortcut`,index:3}}function Kt(e,t){if(e.resolved)return{state:e,effect:{type:`none`}};if(typeof t!=`string`)return Jt(e,t.index);let n=j(e,t,{itemCount:Wt.length});return n.effect.type===`select`?{state:n.state,effect:{type:`resolve`,decision:qt(n.effect.index)}}:{state:n.state,effect:{type:`none`}}}function qt(e){return e===0?!0:e===1?`allow-session`:e===2?`allow-project`:!1}function Jt(e,t){return{state:{...e,selectedIndex:t,resolved:!0},effect:{type:`resolve`,decision:qt(t)}}}function Yt(e){let t=Object.entries(e);return t.length===0?`(no arguments)`:t.map(([e,t])=>`${e}: ${typeof t==`string`?t:JSON.stringify(t)}`).join(`, `)}function Xt({request:e}){let[t,i]=r.default.useState(()=>O()),o=r.default.useRef(t),s=r.default.useRef(e);if(s.current!==e){s.current=e;let t=O();o.current=t,i(t)}let c=r.default.useCallback(t=>{let n=Kt(o.current,t);o.current=n.state,i(n.state),n.effect.type===`resolve`&&e.resolve(n.effect.decision)},[e]);return(0,n.useInput)((e,t)=>{let n=Gt(e,t);n!==void 0&&c(n)}),(0,a.jsxs)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,children:[(0,a.jsx)(n.Text,{color:`yellow`,bold:!0,children:`[Permission Required]`}),(0,a.jsxs)(n.Text,{children:[`Tool:`,` `,(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:e.toolName})]}),(0,a.jsxs)(n.Text,{dimColor:!0,children:[` `,Yt(e.toolArgs)]}),(0,a.jsx)(n.Box,{marginTop:1,children:Wt.map((e,r)=>(0,a.jsx)(n.Box,{marginRight:2,children:(0,a.jsxs)(n.Text,{color:r===t.selectedIndex?`cyan`:void 0,bold:r===t.selectedIndex,children:[r===t.selectedIndex?`> `:` `,e]})},e))}),(0,a.jsx)(n.Text,{dimColor:!0,children:` left/right to select, Enter to confirm`})]})}function Zt(e,t,n){let r=A({...t,escape:!1});if(r!==void 0)return r;if(n===2&&e===`y`)return{type:`shortcut`,index:0};if(n===2&&e===`n`)return{type:`shortcut`,index:1}}function Qt(e,t,n){return e.resolved?{state:e,effect:{type:`none`}}:typeof t==`string`?j(e,t,{itemCount:n}):{state:{...e,selectedIndex:t.index,resolved:!0},effect:{type:`select`,index:t.index}}}function $t({message:e,options:t=[`Yes`,`No`],onSelect:i}){let[o,s]=(0,r.useState)(()=>O()),c=(0,r.useRef)(o),l=(0,r.useCallback)(e=>{let n=Qt(c.current,e,t.length);c.current=n.state,s(n.state),n.effect.type===`select`&&i(n.effect.index)},[i,t.length]);return(0,n.useInput)((e,n)=>{let r=Zt(e,n,t.length);r!==void 0&&l(r)}),(0,a.jsxs)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,children:[(0,a.jsx)(n.Text,{color:`yellow`,children:e}),(0,a.jsx)(n.Box,{marginTop:1,children:t.map((e,t)=>(0,a.jsx)(n.Box,{marginRight:2,children:(0,a.jsxs)(n.Text,{color:t===o.selectedIndex?`cyan`:void 0,bold:t===o.selectedIndex,children:[t===o.selectedIndex?`> `:` `,e]})},e))}),(0,a.jsx)(n.Text,{dimColor:!0,children:` arrow keys to select, Enter to confirm`})]})}function en(e,t,n,i,a){let[o,s]=(0,r.useState)([]),[c,l]=(0,r.useState)(!1),[u,d]=(0,r.useState)();return(0,r.useEffect)(()=>{if(s([]),d(void 0),e===`marketplace-list`)l(!0),n.marketplaceList().then(e=>{let t=[{label:`Add Marketplace`,value:`__add__`}],n=e.map(e=>({label:e.name,value:e.name,hint:e.type}));s([...t,...n]),l(!1)}).catch(e=>{d(e instanceof Error?e.message:String(e)),l(!1)});else if(e===`marketplace-browse`){let e=t??``;l(!0),n.listAvailablePlugins(e).then(e=>{s(e.map(e=>({label:e.name,value:e.name,hint:e.installed?`installed`:e.description}))),l(!1)}).catch(e=>{d(e instanceof Error?e.message:String(e)),l(!1)})}else e===`installed-list`&&(l(!0),n.listInstalled().then(e=>{s(e.map(e=>({label:e.name,value:e.name,hint:e.description}))),l(!1)}).catch(e=>{d(e instanceof Error?e.message:String(e)),l(!1)}))},[a,e,t,n,i]),{items:o,loading:c,error:u}}function tn({title:e,items:t,onSelect:i,onBack:o,loading:s,error:c}){let[l,u]=(0,r.useState)(()=>O()),d=(0,r.useRef)(l),f=!s&&!c,p=(0,r.useCallback)(e=>{let n=j(d.current,e,{itemCount:t.length,enabled:f});if(d.current=n.state,u(n.state),n.effect.type===`cancel`)o();else if(n.effect.type===`select`){let e=t[n.effect.index];e!==void 0&&i(e.value)}},[f,t,o,i]);(0,n.useInput)((e,t)=>{let n=k(t);n!==void 0&&p(n)});let m=M(l,{itemCount:t.length});m!==l&&(d.current=m);let h=m.selectedIndex;return(0,a.jsxs)(n.Box,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,children:[(0,a.jsx)(n.Text,{color:`yellow`,bold:!0,children:e}),s&&(0,a.jsx)(n.Box,{marginTop:1,children:(0,a.jsx)(n.Text,{dimColor:!0,children:`Loading...`})}),c&&(0,a.jsxs)(n.Box,{marginTop:1,flexDirection:`column`,children:[(0,a.jsx)(n.Text,{color:`red`,children:c}),(0,a.jsx)(n.Text,{dimColor:!0,children:`Press Esc to go back`})]}),!s&&!c&&(0,a.jsx)(n.Box,{flexDirection:`column`,marginTop:1,children:t.map((e,t)=>(0,a.jsxs)(n.Box,{children:[(0,a.jsxs)(n.Text,{color:t===h?`cyan`:void 0,bold:t===h,children:[t===h?`> `:` `,e.label]}),e.hint&&(0,a.jsxs)(n.Text,{dimColor:!0,children:[` `,e.hint]})]},e.value))}),(0,a.jsx)(n.Text,{dimColor:!0,children:s||c?``:` ↑↓ Navigate Enter Select Esc Back`})]})}function nn(e,t){e===`marketplace`?t.push({screen:`marketplace-list`}):e===`installed`&&t.push({screen:`installed-list`})}function rn(e,t){e===`__add__`?t.push({screen:`marketplace-add`}):t.push({screen:`marketplace-action`,context:{marketplace:e}})}function an(e,t,n,r){e===`browse`?r.push({screen:`marketplace-browse`,context:{marketplace:t}}):e===`update`?n.marketplaceUpdate(t).then(()=>{r.notify(`Updated marketplace "${t}".`),r.pop()}).catch(e=>{r.notify(`Error: ${e instanceof Error?e.message:String(e)}`)}):e===`remove`&&r.setConfirm({message:`Remove marketplace "${t}" and all its plugins?`,onConfirm:()=>{r.setConfirm(void 0),n.marketplaceRemove(t).then(()=>{r.notify(`Removed marketplace "${t}".`),r.popN(2)}).catch(e=>{r.notify(`Error: ${e instanceof Error?e.message:String(e)}`)})},onCancel:()=>r.setConfirm(void 0)})}function on(e,t,n,r){let i=`${e}@${t}`;n.find(t=>t.value===e)?.hint===`installed`?r.push({screen:`installed-action`,context:{pluginId:i}}):r.push({screen:`marketplace-install-scope`,context:{marketplace:t,pluginId:i}})}function sn(e,t,n,r){let i=e;n.install(t,i).then(()=>{r.notify(`Installed plugin "${t}" (${i} scope).`),r.popN(2)}).catch(e=>{r.notify(`Error: ${e instanceof Error?e.message:String(e)}`)})}function cn(e,t,n){n.setConfirm({message:`Uninstall plugin "${e}"?`,onConfirm:()=>{n.setConfirm(void 0),t.uninstall(e).then(()=>{n.notify(`Uninstalled plugin "${e}".`),n.refresh()}).catch(e=>{n.notify(`Error: ${e instanceof Error?e.message:String(e)}`)})},onCancel:()=>n.setConfirm(void 0)})}function ln(e,t,n,r){e===`uninstall`&&r.setConfirm({message:`Uninstall plugin "${t}"?`,onConfirm:()=>{r.setConfirm(void 0),n.uninstall(t).then(()=>{r.notify(`Uninstalled plugin "${t}".`),r.popN(2)}).catch(e=>{r.notify(`Error: ${e instanceof Error?e.message:String(e)}`)})},onCancel:()=>r.setConfirm(void 0)})}function un({callbacks:e,onClose:t,addMessage:n}){let[i,o]=(0,r.useState)([{screen:`main`}]),[s,c]=(0,r.useState)(),[l,u]=(0,r.useState)(0),d=i[i.length-1]??{screen:`main`},f=(0,r.useCallback)(e=>{o(t=>[...t,e])},[]),p=(0,r.useCallback)(()=>{o(e=>e.length<=1?(t(),e):e.slice(0,-1))},[t]),m=(0,r.useCallback)(e=>{o(n=>{let r=n.slice(0,Math.max(1,n.length-e));return r.length===0?(t(),n):r})},[t]),h=(0,r.useCallback)(e=>{n?.({role:`system`,content:e})},[n]),g=(0,r.useCallback)(()=>{u(e=>e+1)},[]),_=(0,r.useCallback)(e=>c(e),[c]),v={push:(0,r.useCallback)(e=>f({screen:e.screen,context:e.context}),[f]),pop:p,popN:m,notify:h,setConfirm:_,refresh:g},{items:y,loading:b,error:x}=en(d.screen,d.context?.marketplace,e,l,i.length),S=(0,r.useCallback)(t=>{let n=d.screen,r=d.context;n===`main`?nn(t,v):n===`marketplace-list`?rn(t,v):n===`marketplace-action`?an(t,r?.marketplace??``,e,v):n===`marketplace-browse`?on(t,r?.marketplace??``,y,v):n===`marketplace-install-scope`?sn(t,r?.pluginId??``,e,v):n===`installed-list`?cn(t,e,v):n===`installed-action`&&ln(t,r?.pluginId??``,e,v)},[d,y,e,f,p,m,h,c,g]),C=(0,r.useCallback)(t=>{d.screen===`marketplace-add`&&e.marketplaceAdd(t).then(e=>{h(`Added marketplace "${e}" from ${t}.`),p()}).catch(e=>{h(`Error: ${e instanceof Error?e.message:String(e)}`),p()})},[d.screen,e,h,p]);if(s)return(0,a.jsx)($t,{message:s.message,onSelect:e=>{e===0?s.onConfirm():s.onCancel()}});let w=d.screen;return w===`marketplace-add`?(0,a.jsx)(rt,{title:`Add Marketplace Source`,placeholder:`owner/repo or git URL`,onSubmit:C,onCancel:p,validate:e=>e.includes(`/`)?void 0:`Must be owner/repo or a git URL`}):w===`marketplace-action`?(0,a.jsx)(tn,{title:`Marketplace: ${d.context?.marketplace??``}`,items:[{label:`Browse plugins`,value:`browse`},{label:`Update`,value:`update`},{label:`Remove`,value:`remove`}],onSelect:S,onBack:p},i.length):w===`marketplace-install-scope`?(0,a.jsx)(tn,{title:`Install scope for "${d.context?.pluginId??``}"`,items:[{label:`User scope`,value:`user`},{label:`Project scope`,value:`project`}],onSelect:S,onBack:p},i.length):w===`installed-action`?(0,a.jsx)(tn,{title:`Plugin: ${d.context?.pluginId??``}`,items:[{label:`Uninstall`,value:`uninstall`}],onSelect:S,onBack:p},i.length):(0,a.jsx)(tn,{title:{main:`Plugin Management`,"marketplace-list":`Marketplace`,"marketplace-browse":`Browse: ${d.context?.marketplace??``}`,"installed-list":`Installed Plugins`}[w]??`Plugin Management`,items:{main:[{label:`Marketplace`,value:`marketplace`},{label:`Installed Plugins`,value:`installed`}]}[w]??y,onSelect:S,onBack:p,loading:b,error:x},`${w}-${i.length}-${l}`)}function dn({sessions:e,onSelect:t,onCancel:r}){return(0,a.jsxs)(n.Box,{flexDirection:`column`,paddingX:1,marginBottom:1,children:[(0,a.jsx)(n.Text,{bold:!0,color:`cyan`,children:`Select a session to resume (ESC to cancel):`}),(0,a.jsx)(Qe,{items:[...e],renderItem:(e,t)=>{let r=e.preview?e.preview.slice(0,60)+(e.preview.length>60?`...`:``):``;return(0,a.jsxs)(n.Text,{children:[t?`> `:` `,(0,a.jsx)(n.Text,{bold:!0,children:e.name??e.id.slice(0,8)}),` `,(0,a.jsx)(n.Text,{dimColor:!0,children:new Date(e.updatedAt).toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}),` `,(0,a.jsxs)(n.Text,{dimColor:!0,children:[`msgs: `,e.messageCount]}),r?(0,a.jsxs)(a.Fragment,{children:[`
|
|
18
|
-
`,(0,a.jsx)(n.Text,{color:`gray`,children:r})]}):null]})},onSelect:e=>t(e.id),onCancel:r})]})}function fn(e){let t=pn(e),n=e.hasPendingPrompt&&t.kind!==`queued`?[`queued`]:[],r=[t.label,...n].join(` · `);return{...t,segments:n,text:r}}function pn(e){return e.activeToolCount>0?{kind:`tools`,label:`Tools (${e.activeToolCount})`,color:`cyan`}:e.isThinking?{kind:`thinking`,label:`Thinking`,color:`yellow`}:e.activeBackgroundTaskCount>0?{kind:`background`,label:`Background (${e.activeBackgroundTaskCount})`,color:`cyan`}:e.hasPendingPrompt?{kind:`queued`,label:`Queued`,color:`yellow`}:{kind:`idle`,label:`Idle`,color:`gray`}}function mn(e){return e>=90?`red`:e>=70?`yellow`:`green`}function hn({isThinking:e,activeToolCount:t,activeBackgroundTaskCount:r,hasPendingPrompt:i}){let o=fn({isThinking:e,activeToolCount:t,activeBackgroundTaskCount:r,hasPendingPrompt:i});return(0,a.jsx)(n.Text,{color:o.color,bold:o.kind!==`idle`,children:o.text})}function gn({percentage:e,usedTokens:t,maxTokens:r}){return(0,a.jsxs)(n.Text,{color:mn(e),children:[`Context: `,Math.round(e),`% (`,(0,i.formatTokenCount)(t),`/`,(0,i.formatTokenCount)(r),` tokens)`]})}function _n({permissionMode:e}){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Mode:`}),` `,(0,a.jsx)(n.Text,{children:e})]})}function vn(e){return e!=="default"}function yn({activePresetId:e}){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Preset:`}),` `,(0,a.jsx)(n.Text,{children:e})]})}function bn(e){return e!==void 0&&e!=="default"}function xn({modelName:e,providerDisplayName:t}){return t===void 0?(0,a.jsx)(n.Text,{dimColor:!0,children:e}):(0,a.jsxs)(n.Text,{dimColor:!0,children:[t,` `,e]})}function Sn(e){let t=e.showGitBranch&&e.gitBranch!==void 0&&e.gitBranch.length>0,r=vn(e.permissionMode),i=e.activePresetId,o=bn(i);return(0,a.jsxs)(n.Text,{children:[(0,a.jsx)(hn,{isThinking:e.isThinking,activeToolCount:e.activeToolCount,activeBackgroundTaskCount:e.activeBackgroundTaskCount,hasPendingPrompt:e.hasPendingPrompt}),r&&(0,a.jsxs)(a.Fragment,{children:[` | `,(0,a.jsx)(_n,{permissionMode:e.permissionMode})]}),o&&(0,a.jsxs)(a.Fragment,{children:[` | `,(0,a.jsx)(yn,{activePresetId:i})]}),e.sessionName&&(0,a.jsxs)(a.Fragment,{children:[` | `,(0,a.jsx)(n.Text,{color:`magenta`,children:e.sessionName})]}),t&&(0,a.jsxs)(a.Fragment,{children:[` | `,(0,a.jsxs)(n.Text,{dimColor:!0,children:[`git: `,e.gitBranch]})]}),` | `,(0,a.jsx)(xn,{modelName:e.modelName,providerDisplayName:e.providerDisplayName}),` | `,(0,a.jsx)(gn,{percentage:e.contextPercentage,usedTokens:e.contextUsedTokens,maxTokens:e.contextMaxTokens})]})}function Cn({permissionMode:e,modelName:t,providerDisplayName:r,sessionId:i,isThinking:o,activeToolCount:s=0,activeBackgroundTaskCount:c=0,hasPendingPrompt:l=!1,contextPercentage:u,contextUsedTokens:d,contextMaxTokens:f,sessionName:p,gitBranch:m,showGitBranch:h=!0,activeAgentLabel:g,activePresetId:_}){return(0,a.jsxs)(n.Box,{paddingLeft:1,paddingRight:1,justifyContent:`space-between`,children:[(0,a.jsx)(Sn,{permissionMode:e,modelName:t,providerDisplayName:r,isThinking:o,activeToolCount:s,activeBackgroundTaskCount:c,hasPendingPrompt:l,contextPercentage:u,contextUsedTokens:d,contextMaxTokens:f,sessionName:p,gitBranch:m,showGitBranch:h,activePresetId:_}),g!==void 0&&(0,a.jsxs)(n.Text,{color:`yellow`,bold:!0,children:[`[`,g,`]`]})]})}function wn({cwd:e,permissionMode:t,modelId:n,providerType:i,sessionId:o,isThinking:s,activeToolCount:c,activeBackgroundTaskCount:l,hasPendingPrompt:u,contextState:d,sessionName:f,settings:p,activeAgentLabel:m,activePresetId:h,gitRefreshToken:g}){let _=H(),v=(0,r.useMemo)(()=>_.getGitBranch(e),[_,e,g]),y=(0,r.useMemo)(()=>i===void 0?void 0:_.getProviderDisplayName(i),[_,i]);return p.enabled?(0,a.jsx)(Cn,{permissionMode:t,modelName:n??``,providerDisplayName:y,sessionId:o,isThinking:s,activeToolCount:c,activeBackgroundTaskCount:l,hasPendingPrompt:u,contextPercentage:d.percentage,contextUsedTokens:d.usedTokens,contextMaxTokens:d.maxTokens,sessionName:f,gitBranch:v,showGitBranch:p.gitBranch,activeAgentLabel:m,activePresetId:h}):null}function Tn(e){return e.isRunning?{color:`yellow`,icon:`⟳`,strikethrough:!1}:e.result===`error`?{color:`red`,icon:`✗`,strikethrough:!0}:e.result===`denied`?{color:`yellowBright`,icon:`⊘`,strikethrough:!0}:{color:`green`,icon:`✓`,strikethrough:!1}}function En(e){return e?(0,a.jsx)(n.Box,{marginBottom:1,children:(0,a.jsx)(n.Text,{color:`yellow`,children:`Thinking...`})}):(0,a.jsx)(a.Fragment,{})}function Dn(e){return(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Text,{color:`white`,bold:!0,children:`Tools:`}),(0,a.jsx)(n.Text,{children:` `}),e.map((e,t)=>{let{color:r,icon:i,strikethrough:o}=Tn(e);return(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[(0,a.jsxs)(n.Text,{color:r,strikethrough:o,children:[` `,i,` `,e.toolName,`(`,e.firstArg,`)`]}),e.diffLines&&e.diffLines.length>0&&(0,a.jsx)(jt,{file:e.diffFile,lines:e.diffLines})]},`${e.toolName}-${t}`)})]})}function On({text:e,activeTools:t,isThinking:r=!1}){let i=t.length>0,o=e.length>0;return!i&&!o?En(r):(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[i&&Dn(t),o&&(0,a.jsxs)(n.Box,{flexDirection:`column`,marginBottom:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`Robota:`}),(0,a.jsx)(n.Text,{children:` `}),(0,a.jsx)(n.Box,{marginLeft:2,children:(0,a.jsx)(n.Text,{wrap:`wrap`,children:Tt(e)})})]})]})}function kn({entry:e,selected:t}){let r=e.config.enabled,i=r?`●`:`○`,o=r?`[enabled] `:`[disabled]`,s=e.config.options?.port,c=typeof s==`number`?`port: ${s}`:``;return(0,a.jsx)(n.Box,{children:(0,a.jsx)(n.Text,{color:t?`cyan`:void 0,bold:t,children:`${i} ${e.transport.name.padEnd(18)} ${o} ${c}`})})}function An(e,t,i,a,o,s,c,l){(0,n.useInput)((0,r.useCallback)((n,r)=>{if(!i){if(r.upArrow){o(e=>Math.max(0,e-1));return}if(r.downArrow){o(t=>Math.min(e.length-1,t+1));return}if(r.escape||r.return){c();return}if(n===` `){let n=e[t];if(!n)return;s(!0),a.setEnabled(n.transport.name,!n.config.enabled).then(()=>{l(),s(!1)}).catch(()=>s(!1))}}},[i,e,t,a,c,l,o,s]))}function jn({registry:e,onClose:t}){let[i,o]=(0,r.useState)(()=>e.getAll()),[s,c]=(0,r.useState)(0),[l,u]=(0,r.useState)(!1);return An(i,s,l,e,c,u,t,(0,r.useCallback)(()=>{o(e.getAll())},[e])),(0,a.jsxs)(n.Box,{flexDirection:`column`,paddingX:2,paddingY:1,children:[(0,a.jsx)(n.Text,{bold:!0,children:`Settings › Transports`}),(0,a.jsx)(n.Box,{marginTop:1,flexDirection:`column`,children:i.map((e,t)=>(0,a.jsx)(kn,{entry:e,selected:t===s},e.transport.name))}),(0,a.jsx)(n.Box,{marginTop:1,children:(0,a.jsx)(n.Text,{dimColor:!0,children:`↑↓ select space toggle enter/esc close`})}),l&&(0,a.jsx)(n.Box,{marginTop:1,children:(0,a.jsx)(n.Text,{color:`yellow`,children:`Saving…`})})]})}function Mn({message:e}){return(0,a.jsx)(n.Box,{paddingX:1,marginBottom:1,children:(0,a.jsx)(n.Text,{color:`yellow`,children:e})})}function Nn(e){let[t,n]=(0,r.useState)(()=>({channel:e.createChannel(e.resumeSessionId),sessionId:e.resumeSessionId})),[i,o]=(0,r.useState)(e.showSessionPickerOnStart??!1);return(0,a.jsx)(ae,{value:e.cliAdapter,children:(0,a.jsx)(Pn,{...e,channel:t.channel,showSessionPickerOnStart:i,resumeSessionId:t.sessionId,onSessionSwitch:r=>{o(!1),t.channel.stop(),n({channel:e.createChannel(r),sessionId:r})}},t.sessionId??`__new__`)})}function Pn(e){let o=e.cwd,{channel:s}=e,{interactiveSession:c,registry:l,commandEffectQueue:u,history:d,addEntry:m,streamingText:h,activeTools:g,isThinking:_,isAborting:v,isShuttingDown:y,pendingPrompt:b,executionWorkspaceSnapshot:x,selectedExecutionEntryId:S,selectExecutionWorkspaceEntry:C,readExecutionWorkspaceDetail:D,permissionRequest:O,contextState:k,handleSubmit:A,handleAbort:j,handleCancelQueue:M,handleShutdown:N}=le(s),[P,F]=(0,r.useState)(s.sessionName),I=ne(o),te=c?void 0:I,{exit:L}=(0,n.useApp)(),[R,z]=(0,r.useState)(),[B,re]=(0,r.useState)(!1),[ie,V]=(0,r.useState)(null),[ae,H]=(0,r.useState)(),[se,U]=(0,r.useState)(!1),[ue,W]=ce(),[de,fe]=(0,r.useState)(0),pe=(0,r.useMemo)(()=>f(x),[x]),me=p(x),G=(0,r.useMemo)(()=>x?.entries.find(e=>e.id===S),[x,S]),{handleSubmit:he,pendingInteractionPrompt:K,showPluginTUI:q,showSessionPicker:J,showTransportTUI:Y,setShowPluginTUI:ge,setShowSessionPicker:_e,setShowTransportTUI:ve,handleInteractionSubmit:ye,handleInteractionCancel:be}=oe({cwd:o,providerOverride:e.providerOverride,interactiveSession:c,commandEffectQueue:u,addEntry:m,baseHandleSubmit:A,setSessionName:F,setStatusLineSettings:W,showSessionPickerOnStart:e.showSessionPickerOnStart,openAgentSwitcher:()=>re(!0)});(0,r.useEffect)(()=>(s.start(),()=>{s.stop()}),[s]);let xe=!G||G.kind===`main_thread`||G.controls.includes(`send`),Se=G&&G.kind!==`main_thread`?G.title:void 0,Ce=(0,r.useMemo)(()=>x?.entries.find(e=>e.kind===`main_thread`)?.id,[x]),we=(0,r.useCallback)(async e=>{G&&G.kind!==`main_thread`&&G.controls.includes(`send`)?await c.sendAgentJob(G.sourceId,e):await he(e)},[G,he,c]),Te=(0,r.useCallback)(async e=>{fe(e=>e+1),await we(e)},[we]),X=(0,r.useRef)(!1);(0,r.useEffect)(()=>{X.current&&!_&&fe(e=>e+1),X.current=_},[_]),(0,r.useEffect)(()=>{let e=c?.getName?.();e&&!P&&F(e)},[c,P]),(0,r.useEffect)(()=>{let t=!0;return e.startupUpdateNotice?.then(e=>{t&&e!==void 0&&z(e)}).catch(()=>{}),()=>{t=!1}},[e.startupUpdateNotice]),(0,r.useEffect)(()=>{let e=P?`Robota — ${P}`:`Robota`;process.stdout.write(`\x1b]0;${e}\x07`)},[P]),(0,n.useInput)((e,t)=>{!t.escape||!_||O||q||Y||J||B||j()}),(0,n.useInput)((e,t)=>{!t.ctrl||e!==`b`||O||q||J||y||re(e=>!e)}),(0,n.useInput)((e,t)=>{!t.escape||_||O||q||Y||J||B||G&&G.kind!==`main_thread`&&Ce!==void 0&&C(Ce)}),(0,n.useInput)((e,t)=>{!t.ctrl||e!==`c`||y||N(`prompt_input_exit`).finally(()=>L())}),(0,r.useEffect)(()=>{let e=()=>{y||N(`other`).finally(()=>L())};return process.once(`SIGINT`,e),process.once(`SIGTERM`,e),()=>{process.off(`SIGINT`,e),process.off(`SIGTERM`,e)}},[N,L,y]),(0,r.useEffect)(()=>{if(!G||G.kind===`main_thread`){V(null),H(void 0),U(!1);return}let e=!0;return U(!0),H(void 0),D(G.id).then(t=>{e&&(V(t),U(!1))}).catch(t=>{e&&(H(t.message),U(!1))}),()=>{e=!1}},[x,D,G]);let Ee=e.permissionMode??`default`,De=``,Oe;try{let e=c.getSession();Ee=e.getPermissionMode(),Oe=e.getActivePresetId?.(),De=e.getSessionId()}catch{}return(0,a.jsxs)(n.Box,{flexDirection:`column`,children:[(0,a.jsx)(n.Static,{items:[{version:e.version??`0.0.0`}],children:e=>(0,a.jsxs)(n.Box,{flexDirection:`column`,paddingX:1,marginBottom:1,children:[(0,a.jsx)(n.Text,{color:`cyan`,bold:!0,children:`
|
|
19
|
-
____ ___ ____ ___ _____ _
|
|
20
|
-
| _ \\ / _ \\| __ ) / _ \\_ _|/ \\
|
|
21
|
-
| |_) | | | | _ \\| | | || | / _ \\
|
|
22
|
-
| _ <| |_| | |_) | |_| || |/ ___ \\
|
|
23
|
-
|_| \\_\\\\___/|____/ \\___/ |_/_/ \\_\\
|
|
24
|
-
`}),(0,a.jsxs)(n.Text,{dimColor:!0,children:[` v`,e.version]})]},`logo`)}),R&&(0,a.jsx)(Mn,{message:R}),(0,a.jsxs)(n.Box,{flexDirection:`column`,paddingX:1,flexGrow:1,children:[G&&G.kind!==`main_thread`?(0,a.jsx)(E,{entry:G,page:ie,loading:se,error:ae}):(0,a.jsx)(Ut,{history:d}),y&&(0,a.jsx)(n.Box,{marginBottom:1,children:(0,a.jsx)(n.Text,{color:`yellow`,children:`Shutting down...`})}),(_||g.length>0)&&(0,a.jsx)(n.Box,{flexDirection:`column`,marginBottom:1,children:(0,a.jsx)(On,{text:h,activeTools:g,isThinking:_})}),(0,a.jsx)(w,{entries:pe})]}),B&&(0,a.jsx)(ee,{snapshot:x,selectedEntryId:S,onSelect:C,onClose:()=>re(!1)}),O&&(0,a.jsx)(Xt,{request:O}),K&&(0,a.jsx)(at,{prompt:K,onSubmit:ye,onCancel:be}),q&&(0,a.jsx)(un,{callbacks:te,onClose:()=>ge(!1),addMessage:e=>m((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(e.content)))}),Y&&e.transportRegistry&&(0,a.jsx)(jn,{registry:e.transportRegistry,onClose:()=>ve(!1)}),J&&(0,a.jsx)(dn,{sessions:(0,t.listResumableSessionSummaries)(e.sessionStore,e.cwd),onSelect:t=>{_e(!1),e.onSessionSwitch(t)},onCancel:()=>{_e(!1),m((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Session resume cancelled.`)))}}),(0,a.jsx)(T,{percentage:k.percentage}),(0,a.jsx)(Ze,{onSubmit:Te,onCancelQueue:M,isDisabled:!!O||q||Y||J||B||y||K!==null||_&&!!b||!xe,isAborting:v,pendingPrompt:b,registry:l,sessionName:P,history:d}),(0,a.jsx)(wn,{cwd:o,permissionMode:Ee,modelId:e.modelId,providerType:e.providerType,sessionId:De,isThinking:_,activeToolCount:g.length,activeBackgroundTaskCount:me,hasPendingPrompt:b!==null,contextState:k,sessionName:P,settings:ue,activeAgentLabel:Se,activePresetId:Oe,gitRefreshToken:de})]})}function Fn(e){return/not initialized/i.test(e.message)}function In(e){let t=e.isBenignError??Fn,n=null,r=0,i;function a(){n!==null&&(clearInterval(n),n=null)}function o(){r+=e.intervalMs;try{e.check()}catch(n){let o=n instanceof Error?n:Error(String(n));if(!t(o)){a(),e.onFailure({kind:`error`,error:o});return}i=o,r>=e.timeoutMs&&(a(),e.onFailure({kind:`timeout`,lastError:i}));return}a(),e.onReady()}return{start(){n===null&&(r=0,n=setInterval(o,e.intervalMs))},stop:a}}var Ln=class{queue=[];enqueueInteraction(e){this.queue.push({type:`interaction`,interaction:e})}enqueueEffects(e){e.length!==0&&this.queue.push({type:`effects`,effects:[...e]})}drain(){return this.queue.shift()}clear(){this.queue.length=0}};function Rn(e,t,n,r,a,o){let s=zn(e.effects,n,r,o);if(r.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(e.message))),e.interaction!==void 0&&a.enqueueInteraction(e.interaction),s.length>0&&a.enqueueEffects(s),t.isInitialized){let e=t.getContextState();r.setContextState({percentage:e.usedPercentage,usedTokens:e.usedTokens,maxTokens:e.maxTokens})}}function zn(e,t,n,r){if(e===void 0||e.length===0)return[];let i=[];for(let a of e){if(a.type===`conversation-history-cleared`){n.clearHistory();continue}if(a.type===`plugin-registry-reload-requested`){r?.(t);continue}i.push(a)}return i}function Bn(e){return e.toLowerCase().replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`).slice(0,60)}async function Vn(e,t){let n=t.slice(0,200),r=await e.chat([(0,i.createSystemMessage)(`You generate short session titles. Respond with ONLY a 3-5 word lowercase-hyphenated title (e.g. refactor-auth-middleware). No explanation, no punctuation, no quotes.`),(0,i.createUserMessage)(n)],{maxTokens:20}),a=Bn(typeof r.content==`string`?r.content:``);return!a||a.length<3?Bn(t):a}function Hn(e,t){let n=null;return{schedule(){n||=setTimeout(()=>{n=null,e()},t)},flush(){n&&=(clearTimeout(n),null)}}}var Un=class{history=[];streamingText=``;activeTools=[];isThinking=!1;isAborting=!1;pendingPrompt=null;contextState={percentage:0,usedTokens:0,maxTokens:0};executionWorkspaceSnapshot=null;selectedExecutionEntryId;onChange=null;streamBuf=``;debouncedStreamNotify=Hn(()=>this.notify(),300);notify(){this.onChange?.()}onTextDelta=e=>{this.streamBuf+=e,this.streamingText=this.streamBuf,this.debouncedStreamNotify.schedule()};onToolStart=e=>{this.activeTools=[...this.activeTools,e],this.notify()};onToolEnd=e=>{let t=this.activeTools.findLastIndex(t=>t.toolName===e.toolName&&t.isRunning);if(t!==-1){let n=[...this.activeTools];n[t]=e,this.activeTools=n}this.notify()};onThinking=e=>{this.isThinking=e,e?(this.debouncedStreamNotify.flush(),this.streamBuf=``,this.streamingText=``,this.activeTools=[]):(this.isAborting=!1,this.activeTools=[]),this.notify()};onComplete=e=>{this.debouncedStreamNotify.flush(),this.streamBuf=``,this.streamingText=``,this.activeTools=[],this.contextState={percentage:e.contextState.usedPercentage,usedTokens:e.contextState.usedTokens,maxTokens:e.contextState.maxTokens},this.notify()};onInterrupted=()=>{this.debouncedStreamNotify.flush(),this.streamBuf=``,this.streamingText=``,this.activeTools=[],this.notify()};onError=()=>{this.debouncedStreamNotify.flush(),this.streamBuf=``,this.streamingText=``,this.activeTools=[],this.notify()};onContextUpdate=e=>{this.setContextState({percentage:e.usedPercentage,usedTokens:e.usedTokens,maxTokens:e.maxTokens})};syncHistory(e){e.length!==0&&(this.history=e.length>100?e.slice(-100):[...e],this.notify())}addEntry(e){let t=[...this.history,e];this.history=t.length>100?t.slice(-100):t,this.notify()}clearHistory(){this.history=[],this.debouncedStreamNotify.flush(),this.streamBuf=``,this.streamingText=``,this.activeTools=[],this.notify()}setPendingPrompt(e){this.pendingPrompt=e,this.notify()}setAborting(e){this.isAborting=e,this.notify()}setContextState(e){this.contextState=e,this.notify()}syncExecutionWorkspaceSnapshot(e){let t=this.selectedExecutionEntryId,n=t!==void 0&&e.entries.some(e=>e.id===t)?t:e.selectedEntryId??e.entries[0]?.id;this.executionWorkspaceSnapshot={...e,...n?{selectedEntryId:n}:{}},this.selectedExecutionEntryId=n,this.notify()}selectExecutionWorkspaceEntry(e){this.executionWorkspaceSnapshot?.entries.some(t=>t.id===e)&&(this.selectedExecutionEntryId=e,this.executionWorkspaceSnapshot={...this.executionWorkspaceSnapshot,selectedEntryId:e},this.notify())}};const Wn=15e3;var Gn=class{stateManager;interactiveSession;registry;commandEffectQueue;opts;submitHandler=null;actionQueue=[];processingAction=!1;permissionRequest=null;pendingAction=null;availableCommands=[];isShuttingDown=!1;sessionName;autoNameTriggered=!1;sessionStarted=!1;initPoller=null;permissionQueue=[];processingPermission=!1;onChange=null;constructor(e){this.opts=e,this.sessionName=e.sessionName,this.stateManager=new Un,this.stateManager.onChange=()=>this.onChange?.(),this.interactiveSession=this.createSession(),this.registry=this.createRegistry(),this.commandEffectQueue=new Ln}createSession(){let e=this.opts;return new t.InteractiveSession({cwd:e.cwd,provider:e.provider,permissionMode:e.permissionMode,maxTurns:e.maxTurns,permissionHandler:(e,t)=>this.handlePermissionRequest(e,t),sessionStore:e.sessionStore,resumeSessionId:e.resumeSessionId,forkSession:e.forkSession,sessionName:e.sessionName,backgroundTaskRunners:e.backgroundTaskRunners,subagentRunnerFactory:e.subagentRunnerFactory,commandModules:e.commandModules,commandHostAdapters:e.commandHostAdapters,shellExec:e.shellExec,language:e.language,agentName:e.agentName,activePresetId:e.activePresetId,persona:e.persona,systemPrompt:e.systemPrompt,appendSystemPrompt:e.appendSystemPrompt,allowedTools:e.allowedTools,deniedTools:e.deniedTools,enableParallelSubagents:e.enableParallelSubagents,selfVerification:e.selfVerification})}createRegistry(){let e=new t.CommandRegistry;for(let t of this.opts.commandModules??[])e.addModule(t);return this.opts.reloadPluginCommandSource?.(e),e}onSubmit(e){this.submitHandler=e}write(e){}async requestAction(e){return new Promise(t=>{this.actionQueue.push({action:e,resolve:t}),this.processNextAction()})}setAvailableCommands(e){this.availableCommands=e,this.onChange?.()}setBusy(e){this.stateManager.onThinking(e)}async start(){this.sessionStarted||(this.sessionStarted=!0,this.wireSessionEvents(),this.syncRestoredHistory(),this.startInitCheck(),this.opts.transportRegistry&&await this.opts.transportRegistry.startAll(this.interactiveSession))}async stop(){this.onChange=null,this.sessionStarted=!1,this.stopInitCheck(),this.opts.transportRegistry&&await this.opts.transportRegistry.stopAll()}getSession(){return this.interactiveSession}getRegistry(){return this.registry}getCommandEffectQueue(){return this.commandEffectQueue}abort(){this.stateManager.setAborting(!0),this.interactiveSession.abort()}cancelQueue(){this.interactiveSession.cancelQueue(),this.stateManager.setPendingPrompt(null)}async shutdown(e){this.isShuttingDown||(this.isShuttingDown=!0,this.stateManager.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Shutting down...`))),this.onChange?.(),await this.interactiveSession.shutdown({reason:e?.reason??`prompt_input_exit`,message:`CLI shutdown`}))}selectExecutionWorkspaceEntry(e){this.stateManager.selectExecutionWorkspaceEntry(e)}async readExecutionWorkspaceDetail(e){return this.interactiveSession.readExecutionWorkspaceDetail(e)}async sendAgentJob(e,t){await this.interactiveSession.sendAgentJob(e,t)}setSessionName(e){this.sessionName=e,this.interactiveSession.setName(e),this.onChange?.()}resolveAction(e){let t=this.actionQueue[0];t&&(this.actionQueue.shift(),this.processingAction=!1,this.pendingAction=null,this.onChange?.(),t.resolve(e),this.processNextAction())}async handleInput(e){if(!e.startsWith(`/`)){await this.interactiveSession.submit(e),this.stateManager.setPendingPrompt(this.interactiveSession.getPendingPrompt());return}await this.handleSlashCommand(e)}async handleSlashCommand(e){let t=e.slice(1).split(/\s+/),n=t[0]?.toLowerCase()??``,r=t.slice(1).join(` `),a=await this.interactiveSession.executeCommand(n,r);if(a){if(a.effects?.some(e=>e.type===`session-execution-started`)){this.stateManager.setPendingPrompt(this.interactiveSession.getPendingPrompt());return}Rn(a,this.interactiveSession,this.registry,this.stateManager,this.commandEffectQueue,this.opts.reloadPluginCommandSource);return}this.stateManager.addEntry((0,i.messageToHistoryEntry)((0,i.createSystemMessage)(`Unknown command "/${n}". Type /help for help.`)))}processNextAction(){if(this.processingAction)return;let e=this.actionQueue[0];if(!e){this.pendingAction=null,this.onChange?.();return}this.processingAction=!0,this.pendingAction=e.action,this.onChange?.()}handlePermissionRequest(e,t){return new Promise(n=>{this.permissionQueue.push({toolName:e,toolArgs:t,resolve:n}),this.processNextPermission()})}processNextPermission(){if(this.processingPermission)return;let e=this.permissionQueue[0];if(!e){this.permissionRequest=null,this.onChange?.();return}this.processingPermission=!0,this.permissionRequest={toolName:e.toolName,toolArgs:e.toolArgs,resolve:t=>{this.permissionQueue.shift(),this.processingPermission=!1,this.permissionRequest=null,e.resolve(t),setTimeout(()=>this.processNextPermission(),0)}},this.onChange?.()}wireSessionEvents(){let e=this.interactiveSession,t=this.stateManager;e.on(`user_message`,e=>{this.handleAutoNaming(e),t.addEntry((0,i.messageToHistoryEntry)((0,i.createUserMessage)(e)))}),e.on(`text_delta`,t.onTextDelta),e.on(`tool_start`,t.onToolStart),e.on(`tool_end`,t.onToolEnd),e.on(`thinking`,t.onThinking),e.on(`complete`,n=>{t.onComplete(n),t.syncHistory(e.getFullHistory())}),e.on(`interrupted`,t.onInterrupted),e.on(`error`,()=>{t.onError(),t.syncHistory(e.getFullHistory())}),e.on(`context_update`,t.onContextUpdate),e.on(`compact`,()=>{t.syncHistory(e.getFullHistory())}),e.on(`skill_activation`,()=>{t.syncHistory(e.getFullHistory())}),e.on(`memory_event`,()=>{t.syncHistory(e.getFullHistory())}),e.on(`execution_workspace_event`,e=>{t.syncExecutionWorkspaceSnapshot(e.snapshot)})}handleAutoNaming(e){this.autoNameTriggered||this.opts.sessionName||this.interactiveSession.getName()||(this.autoNameTriggered=!0,Vn(this.opts.provider,e).then(e=>{this.interactiveSession.setName(e),this.sessionName=e,this.opts.onAutoNamed?.(e),this.onChange?.()}).catch(()=>{this.autoNameTriggered=!1}))}syncRestoredHistory(){if(this.stateManager.history.length===0){let e=this.interactiveSession.getFullHistory();e.length>0&&this.stateManager.syncHistory(e)}}startInitCheck(){this.initPoller=In({check:()=>this.runInitCheck(),intervalMs:200,timeoutMs:Wn,onReady:()=>void 0,onFailure:e=>this.onInitFailure(e)}),this.initPoller.start()}runInitCheck(){let e=this.interactiveSession.getContextState();this.stateManager.setContextState({percentage:e.usedPercentage,usedTokens:e.usedTokens,maxTokens:e.maxTokens});let t=this.interactiveSession.getFullHistory();t.length>0&&this.stateManager.syncHistory(t),this.syncExecutionWorkspace()}onInitFailure(e){let t=e.kind===`timeout`?`Session initialization timed out after ${Wn/1e3}s${e.lastError?` (last error: ${e.lastError.message})`:``}`:`Session initialization failed: ${e.error.message}`;this.stateManager.onError(),this.stateManager.addEntry({id:`session-init-error-${Date.now()}`,timestamp:new Date,category:`event`,type:`session-init-error`,data:{message:t}})}stopInitCheck(){this.initPoller?.stop(),this.initPoller=null}syncExecutionWorkspace(){try{this.stateManager.syncExecutionWorkspaceSnapshot(this.interactiveSession.getExecutionWorkspaceSnapshot({selectedEntryId:this.stateManager.selectedExecutionEntryId}))}catch{}}};function Kn(e,t){return{cwd:e.cwd,provider:e.provider,permissionMode:e.permissionMode,maxTurns:e.maxTurns,allowedTools:e.allowedTools,deniedTools:e.deniedTools,sessionStore:e.sessionStore,resumeSessionId:t,forkSession:e.forkSession,sessionName:e.sessionName,backgroundTaskRunners:e.backgroundTaskRunners,subagentRunnerFactory:e.subagentRunnerFactory,commandModules:e.commandModules,commandHostAdapters:e.commandHostAdapters,shellExec:e.shellExec,transportRegistry:e.transportRegistry,language:e.language,reloadPluginCommandSource:e.reloadPluginCommandSource,agentName:e.agentName,activePresetId:e.activePresetId,persona:e.persona,enableParallelSubagents:e.enableParallelSubagents,selfVerification:e.selfVerification}}async function qn(e){process.on(`unhandledRejection`,e=>{process.stderr.write(`\n[UNHANDLED REJECTION] ${e}\n`),e instanceof Error&&process.stderr.write(`${e.stack}\n`)}),await(0,n.render)((0,a.jsx)(Nn,{cwd:e.cwd,createChannel:t=>new Gn(Kn(e,t)),providerOverride:e.providerOverride,providerType:e.providerType,modelId:e.modelId,permissionMode:e.permissionMode,version:e.version,sessionStore:e.sessionStore,resumeSessionId:e.resumeSessionId,showSessionPickerOnStart:e.showSessionPickerOnStart,startupUpdateNotice:e.startupUpdateNotice,transportRegistry:e.transportRegistry,cliAdapter:e.cliAdapter}),{exitOnCtrlC:!1}).waitUntilExit()}var Jn=class{name=`tui`;defaultEnabled=!0;optionsSchema={};options;constructor(e){this.options=e}attach(e){}async start(){await qn(this.options)}async stop(){}validateOptions(e){return!0}};function Yn({providerDefinitions:e,reloadPluginCommandSource:n}){return{getUserSettingsPath:()=>(0,t.getUserSettingsPath)(),readSettings:e=>(0,t.readSettings)(e),writeSettings:(e,n)=>(0,t.writeSettings)(e,n),deleteSettings:e=>(0,t.deleteSettings)(e),applyStatusLineSettings:(e,n)=>(0,t.applyStatusLineSettings)(e,n),reloadPluginCommandSource:e=>{n(e)},applyActiveModelChange:(e,n,r)=>((0,t.applyActiveModelChange)(e,n,r),{applied:!0}),getGitBranch:e=>(0,t.resolveGitBranch)(e),getProviderDisplayName:t=>(0,i.findProviderDefinition)(e,t)?.displayName??t}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Jn}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return qn}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Yn}});
|
package/dist/node/ws/index.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../ws-QNMQn5kg.cjs");exports.WsTransport=e.t,exports.createWsHandler=e.r,exports.createWsTransport=e.n;
|
package/dist/node/ws/index.d.ts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { a as IWsTransportConfig, c as createWsTransport, d as TClientMessage, f as TServerMessage, i as TExecutionWorkspaceStatus, l as IWsHandlerOptions, n as IExecutionWorkspaceSnapshot, o as WsTransport, r as TExecutionAttention, s as IWsTransportOptions, t as IExecutionWorkspaceEntry, u as createWsHandler } from "../index-BrQ4gGw0.js";
|
|
2
|
-
export { type IExecutionWorkspaceEntry, type IExecutionWorkspaceSnapshot, type IWsHandlerOptions, type IWsTransportConfig, type IWsTransportOptions, type TClientMessage, type TExecutionAttention, type TExecutionWorkspaceStatus, type TServerMessage, WsTransport, createWsHandler, createWsTransport };
|
package/dist/node/ws/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,r as t,t as n}from"../ws-Dc2RUwVs.js";export{n as WsTransport,t as createWsHandler,e as createWsTransport};
|
package/dist/node/ws-Dc2RUwVs.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createServer as e}from"node:http";import{WebSocket as t,WebSocketServer as n}from"ws";function r(e,t,n){if(n.type===`get-background-tasks`){t({type:`background_tasks`,tasks:e.listBackgroundTasks(n.filter)});return}if(n.type===`get-background-task`){a(e,t,n);return}if(n.type===`get-background-job-groups`){t({type:`background_job_groups`,groups:e.listBackgroundJobGroups()});return}if(n.type===`get-background-job-group`){s(e,t,n);return}if(n.type===`wait-background-job-group`){c(e,t,n);return}o(e,t,n)}function i(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}if(n.type===`cancel-background-task`){u(t,`cancel`,n.taskId,e.cancelBackgroundTask(n.taskId,n.reason));return}if(n.type===`close-background-task`){u(t,`close`,n.taskId,e.closeBackgroundTask(n.taskId));return}l(e,t,n)}function a(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}t({type:`background_task`,taskId:n.taskId,task:e.getBackgroundTask(n.taskId)??null})}function o(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}e.readBackgroundTaskLog(n.taskId,n.cursor).then(e=>t({type:`background_task_log`,taskId:n.taskId,page:e}),e=>t({type:`protocol_error`,message:e.message}))}function s(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}t({type:`background_job_group`,groupId:n.groupId,group:e.getBackgroundJobGroup(n.groupId)??null})}function c(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}e.waitBackgroundJobGroup(n.groupId).then(e=>t({type:`background_job_group`,groupId:n.groupId,group:e}),e=>t({type:`protocol_error`,message:e.message}))}function l(e,t,n){if(!n.input){t({type:`protocol_error`,message:`input is required`});return}u(t,`send`,n.taskId,e.sendBackgroundTask(n.taskId,n.input))}function u(e,t,n,r){r.then(()=>e({type:`background_task_control_result`,action:t,taskId:n,success:!0}),r=>e({type:`background_task_control_result`,action:t,taskId:n,success:!1,message:r.message}))}function d(e){let t=f(e.session,e.send);return{onMessage:p(e.session,e.send),cleanup:t}}function f(e,t){let n=e=>t({type:`user_message`,content:e}),r=e=>t({type:`text_delta`,delta:e}),i=e=>t({type:`tool_start`,state:e}),a=e=>t({type:`tool_end`,state:e}),o=e=>t({type:`thinking`,isThinking:e}),s=e=>t({type:`complete`,result:e}),c=e=>t({type:`interrupted`,result:e}),l=e=>t({type:`error`,message:e.message}),u=e=>t({type:`background_task_event`,event:e}),d=e=>t({type:`background_job_group_event`,event:e}),f=e=>t({type:`execution_workspace_event`,snapshot:e.snapshot});return e.on(`user_message`,n),e.on(`text_delta`,r),e.on(`tool_start`,i),e.on(`tool_end`,a),e.on(`thinking`,o),e.on(`complete`,s),e.on(`interrupted`,c),e.on(`error`,l),e.on(`background_task_event`,u),e.on(`background_job_group_event`,d),e.on(`execution_workspace_event`,f),()=>{e.off(`user_message`,n),e.off(`text_delta`,r),e.off(`tool_start`,i),e.off(`tool_end`,a),e.off(`thinking`,o),e.off(`complete`,s),e.off(`interrupted`,c),e.off(`error`,l),e.off(`background_task_event`,u),e.off(`background_job_group_event`,d),e.off(`execution_workspace_event`,f)}}function p(e,t){return n=>{let r=m(n,t);r&&h(e,t,r)}}function m(e,t){try{return JSON.parse(e)}catch{return t({type:`protocol_error`,message:`Invalid JSON`}),null}}function h(e,t,n){if(_(n)){x(e,t,n);return}if(v(n)){S(e,t,n);return}if(y(n)){r(e,t,n);return}if(b(n)){i(e,t,n);return}t({type:`protocol_error`,message:`Unknown message type: ${g(n)}`})}function g(e){return e.type}function _(e){return e.type===`submit`||e.type===`command`||e.type===`abort`||e.type===`cancel-queue`}function v(e){return e.type===`get-messages`||e.type===`get-context`||e.type===`get-executing`||e.type===`get-pending`||e.type===`get-execution-workspace`}function y(e){return e.type===`get-background-tasks`||e.type===`get-background-task`||e.type===`read-background-task-log`||e.type===`get-background-job-groups`||e.type===`get-background-job-group`||e.type===`wait-background-job-group`}function b(e){return e.type===`cancel-background-task`||e.type===`close-background-task`||e.type===`send-background-task`}function x(e,t,n){if(n.type===`submit`){if(!n.prompt){t({type:`protocol_error`,message:`prompt is required`});return}e.submit(n.prompt)}else if(n.type===`command`){if(!n.name){t({type:`protocol_error`,message:`name is required`});return}e.executeCommand(n.name,n.args??``).then(e=>{t({type:`command_result`,name:n.name,message:e?.message??`Unknown command: ${n.name}`,success:e?.success??!1,data:e?.data})})}else n.type===`abort`?e.abort():e.cancelQueue()}function S(e,t,n){n.type===`get-messages`?t({type:`messages`,messages:e.getMessages()}):n.type===`get-context`?t({type:`context`,state:e.getContextState()}):n.type===`get-executing`?t({type:`executing`,executing:e.isExecuting()}):n.type===`get-execution-workspace`?t({type:`execution_workspace_event`,snapshot:e.getExecutionWorkspaceSnapshot()}):t({type:`pending`,pending:e.getPendingPrompt()})}function C(e){let t=null,n=null;return{name:`ws`,onMessage:null,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);let r=d({session:t,send:e.send});n=r.cleanup,this.onMessage=r.onMessage},async stop(){n?.(),n=null,this.onMessage=null}}}const w=7070;var T=class{name=`ws`;defaultEnabled=!0;optionsSchema={port:{type:`number`,description:`WebSocket server port`,default:w},maxRetries:{type:`number`,description:`Port retry attempts when port is occupied`,default:20}};session=null;stopFn=null;port;maxRetries;constructor(e={}){this.port=e.port??w,this.maxRetries=e.maxRetries??20}attach(e){this.session=e}async start(){if(!this.session)throw Error(`WsTransport: attach() must be called before start()`);let e=await this.bindWithRetry(this.session,this.port,this.maxRetries);this.stopFn=e.stop}async stop(){await this.stopFn?.(),this.stopFn=null}validateOptions(e){let{port:t,maxRetries:n}=e;return!(t!==void 0&&(typeof t!=`number`||t<1||t>65535)||n!==void 0&&(typeof n!=`number`||n<0))}bindWithRetry(e,t,n){return this.tryBind(e,t).catch(r=>{if(r.code===`EADDRINUSE`&&n>0)return this.bindWithRetry(e,t+1,n-1);throw r})}tryBind(r,i){return new Promise((a,o)=>{let s=e((e,t)=>{t.writeHead(400).end(`WebSocket endpoint`)});s.on(`error`,e=>{s.close(),o(e)}),s.listen(i,`127.0.0.1`,()=>{let e=new n({server:s});e.on(`connection`,e=>{let n=n=>{e.readyState===t.OPEN&&e.send(JSON.stringify(n))},{onMessage:i,cleanup:a}=d({session:r,send:n});e.on(`message`,e=>i(String(e))),e.on(`close`,a),e.on(`error`,a),n({type:`messages`,messages:r.getMessages()}),n({type:`execution_workspace_event`,snapshot:r.getExecutionWorkspaceSnapshot()})}),a({stop:()=>new Promise(t=>{e.close(()=>s.close(()=>t()))})})})})}};export{C as n,d as r,T as t};
|
|
2
|
-
//# sourceMappingURL=ws-Dc2RUwVs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-Dc2RUwVs.js","names":[],"sources":["../../src/ws/ws-background-messages.ts","../../src/ws/ws-handler.ts","../../src/ws/ws-transport.ts","../../src/ws/ws-transport-configurable.ts"],"sourcesContent":["import type { TBackgroundControlAction, TClientMessage, TServerMessage } from './ws-protocol.js';\nimport type { IInteractiveSession } from '@robota-sdk/agent-interface-transport';\n\nexport function handleBackgroundQueryMessage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<\n TClientMessage,\n | { type: 'get-background-tasks' | 'get-background-task' | 'read-background-task-log' }\n | {\n type:\n | 'get-background-job-groups'\n | 'get-background-job-group'\n | 'wait-background-job-group';\n }\n >,\n): void {\n if (msg.type === 'get-background-tasks') {\n send({ type: 'background_tasks', tasks: session.listBackgroundTasks(msg.filter) });\n return;\n }\n if (msg.type === 'get-background-task') {\n sendBackgroundTaskSnapshot(session, send, msg);\n return;\n }\n if (msg.type === 'get-background-job-groups') {\n send({ type: 'background_job_groups', groups: session.listBackgroundJobGroups() });\n return;\n }\n if (msg.type === 'get-background-job-group') {\n sendBackgroundJobGroupSnapshot(session, send, msg);\n return;\n }\n if (msg.type === 'wait-background-job-group') {\n sendBackgroundJobGroupWaitResult(session, send, msg);\n return;\n }\n sendBackgroundTaskLogPage(session, send, msg);\n}\n\nexport function handleBackgroundControlMessage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<\n TClientMessage,\n { type: 'cancel-background-task' | 'close-background-task' | 'send-background-task' }\n >,\n): void {\n if (!msg.taskId) {\n send({ type: 'protocol_error', message: 'taskId is required' });\n return;\n }\n if (msg.type === 'cancel-background-task') {\n sendBackgroundTaskControlResult(\n send,\n 'cancel',\n msg.taskId,\n session.cancelBackgroundTask(msg.taskId, msg.reason),\n );\n return;\n }\n if (msg.type === 'close-background-task') {\n sendBackgroundTaskControlResult(\n send,\n 'close',\n msg.taskId,\n session.closeBackgroundTask(msg.taskId),\n );\n return;\n }\n sendBackgroundTaskInput(session, send, msg);\n}\n\nfunction sendBackgroundTaskSnapshot(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'get-background-task' }>,\n): void {\n if (!msg.taskId) {\n send({ type: 'protocol_error', message: 'taskId is required' });\n return;\n }\n send({\n type: 'background_task',\n taskId: msg.taskId,\n task: session.getBackgroundTask(msg.taskId) ?? null,\n });\n}\n\nfunction sendBackgroundTaskLogPage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'read-background-task-log' }>,\n): void {\n if (!msg.taskId) {\n send({ type: 'protocol_error', message: 'taskId is required' });\n return;\n }\n session.readBackgroundTaskLog(msg.taskId, msg.cursor).then(\n (page) => send({ type: 'background_task_log', taskId: msg.taskId, page }),\n (error: Error) => send({ type: 'protocol_error', message: error.message }),\n );\n}\n\nfunction sendBackgroundJobGroupSnapshot(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'get-background-job-group' }>,\n): void {\n if (!msg.groupId) {\n send({ type: 'protocol_error', message: 'groupId is required' });\n return;\n }\n send({\n type: 'background_job_group',\n groupId: msg.groupId,\n group: session.getBackgroundJobGroup(msg.groupId) ?? null,\n });\n}\n\nfunction sendBackgroundJobGroupWaitResult(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'wait-background-job-group' }>,\n): void {\n if (!msg.groupId) {\n send({ type: 'protocol_error', message: 'groupId is required' });\n return;\n }\n session.waitBackgroundJobGroup(msg.groupId).then(\n (group) => send({ type: 'background_job_group', groupId: msg.groupId, group }),\n (error: Error) => send({ type: 'protocol_error', message: error.message }),\n );\n}\n\nfunction sendBackgroundTaskInput(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'send-background-task' }>,\n): void {\n if (!msg.input) {\n send({ type: 'protocol_error', message: 'input is required' });\n return;\n }\n sendBackgroundTaskControlResult(\n send,\n 'send',\n msg.taskId,\n session.sendBackgroundTask(msg.taskId, msg.input),\n );\n}\n\nfunction sendBackgroundTaskControlResult(\n send: (message: TServerMessage) => void,\n action: TBackgroundControlAction,\n taskId: string,\n operation: Promise<void>,\n): void {\n operation.then(\n () => send({ type: 'background_task_control_result', action, taskId, success: true }),\n (error: Error) =>\n send({\n type: 'background_task_control_result',\n action,\n taskId,\n success: false,\n message: error.message,\n }),\n );\n}\n","/**\n * WebSocket transport adapter — exposes IInteractiveSession over WebSocket.\n *\n * Framework-agnostic: works with any WebSocket implementation via\n * send/onMessage callbacks. No dependency on ws, uWebSockets, etc.\n *\n * Protocol: JSON messages with { type, ...payload } structure.\n * Server pushes IInteractiveSession events to client in real-time.\n */\n\nimport {\n handleBackgroundControlMessage,\n handleBackgroundQueryMessage,\n} from './ws-background-messages.js';\n\nimport type { TClientMessage, TServerMessage } from './ws-protocol.js';\nimport type { TBackgroundTaskEvent } from '@robota-sdk/agent-framework';\nimport type {\n IExecutionResult,\n IExecutionWorkspaceEvent,\n IInteractiveSession,\n IToolState,\n TBackgroundJobGroupEvent,\n} from '@robota-sdk/agent-interface-transport';\n\nexport interface IWsHandlerOptions {\n /** IInteractiveSession to expose. */\n session: IInteractiveSession;\n /** Send a JSON message to the client. */\n send: (message: TServerMessage) => void;\n}\n\n/**\n * Create a WebSocket message handler for an IInteractiveSession.\n *\n * Returns:\n * - `onMessage(data)`: call this when the WebSocket receives a message\n * - `cleanup()`: call this when the WebSocket disconnects\n *\n * Usage:\n * ```typescript\n * const { onMessage, cleanup } = createWsHandler({\n * session: interactiveSession,\n * send: (msg) => ws.send(JSON.stringify(msg)),\n * });\n *\n * ws.on('message', (data) => onMessage(String(data)));\n * ws.on('close', cleanup);\n * ```\n */\nexport function createWsHandler(options: IWsHandlerOptions): {\n onMessage: (data: string) => void;\n cleanup: () => void;\n} {\n const cleanup = subscribeSessionEvents(options.session, options.send);\n const onMessage = createWsMessageHandler(options.session, options.send);\n\n return { onMessage, cleanup };\n}\n\nfunction subscribeSessionEvents(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n): () => void {\n const onUserMessage = (content: string): void => send({ type: 'user_message', content });\n const onTextDelta = (delta: string): void => send({ type: 'text_delta', delta });\n const onToolStart = (state: IToolState): void => send({ type: 'tool_start', state });\n const onToolEnd = (state: IToolState): void => send({ type: 'tool_end', state });\n const onThinking = (isThinking: boolean): void => send({ type: 'thinking', isThinking });\n const onComplete = (result: IExecutionResult): void => send({ type: 'complete', result });\n const onInterrupted = (result: IExecutionResult): void => send({ type: 'interrupted', result });\n const onError = (error: Error): void => send({ type: 'error', message: error.message });\n const onBackgroundTaskEvent = (event: TBackgroundTaskEvent): void =>\n send({ type: 'background_task_event', event });\n const onBackgroundJobGroupEvent = (event: TBackgroundJobGroupEvent): void =>\n send({ type: 'background_job_group_event', event });\n const onExecutionWorkspace = (event: IExecutionWorkspaceEvent): void =>\n send({ type: 'execution_workspace_event', snapshot: event.snapshot });\n\n session.on('user_message', onUserMessage);\n session.on('text_delta', onTextDelta);\n session.on('tool_start', onToolStart);\n session.on('tool_end', onToolEnd);\n session.on('thinking', onThinking);\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n session.on('background_task_event', onBackgroundTaskEvent);\n session.on('background_job_group_event', onBackgroundJobGroupEvent);\n session.on('execution_workspace_event', onExecutionWorkspace);\n\n return (): void => {\n session.off('user_message', onUserMessage);\n session.off('text_delta', onTextDelta);\n session.off('tool_start', onToolStart);\n session.off('tool_end', onToolEnd);\n session.off('thinking', onThinking);\n session.off('complete', onComplete);\n session.off('interrupted', onInterrupted);\n session.off('error', onError);\n session.off('background_task_event', onBackgroundTaskEvent);\n session.off('background_job_group_event', onBackgroundJobGroupEvent);\n session.off('execution_workspace_event', onExecutionWorkspace);\n };\n}\n\nfunction createWsMessageHandler(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n): (data: string) => void {\n return (data: string): void => {\n const msg = parseClientMessage(data, send);\n if (!msg) return;\n handleClientMessage(session, send, msg);\n };\n}\n\nfunction parseClientMessage(\n data: string,\n send: (message: TServerMessage) => void,\n): TClientMessage | null {\n try {\n return JSON.parse(data) as TClientMessage;\n } catch {\n send({ type: 'protocol_error', message: 'Invalid JSON' });\n return null;\n }\n}\n\nfunction handleClientMessage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: TClientMessage,\n): void {\n if (isSessionControlMessage(msg)) {\n handleSessionControlMessage(session, send, msg);\n return;\n }\n if (isSessionQueryMessage(msg)) {\n handleSessionQueryMessage(session, send, msg);\n return;\n }\n if (isBackgroundQueryMessage(msg)) {\n handleBackgroundQueryMessage(session, send, msg);\n return;\n }\n if (isBackgroundControlMessage(msg)) {\n handleBackgroundControlMessage(session, send, msg);\n return;\n }\n send({ type: 'protocol_error', message: `Unknown message type: ${getMessageType(msg)}` });\n}\n\nfunction getMessageType(msg: TClientMessage): string {\n return (msg as { type: string }).type;\n}\n\nfunction isSessionControlMessage(\n msg: TClientMessage,\n): msg is Extract<TClientMessage, { type: 'submit' | 'command' | 'abort' | 'cancel-queue' }> {\n return (\n msg.type === 'submit' ||\n msg.type === 'command' ||\n msg.type === 'abort' ||\n msg.type === 'cancel-queue'\n );\n}\n\nfunction isSessionQueryMessage(msg: TClientMessage): msg is Extract<\n TClientMessage,\n {\n type:\n | 'get-messages'\n | 'get-context'\n | 'get-executing'\n | 'get-pending'\n | 'get-execution-workspace';\n }\n> {\n return (\n msg.type === 'get-messages' ||\n msg.type === 'get-context' ||\n msg.type === 'get-executing' ||\n msg.type === 'get-pending' ||\n msg.type === 'get-execution-workspace'\n );\n}\n\nfunction isBackgroundQueryMessage(\n msg: TClientMessage,\n): msg is Extract<\n TClientMessage,\n | { type: 'get-background-tasks' | 'get-background-task' | 'read-background-task-log' }\n | { type: 'get-background-job-groups' | 'get-background-job-group' | 'wait-background-job-group' }\n> {\n return (\n msg.type === 'get-background-tasks' ||\n msg.type === 'get-background-task' ||\n msg.type === 'read-background-task-log' ||\n msg.type === 'get-background-job-groups' ||\n msg.type === 'get-background-job-group' ||\n msg.type === 'wait-background-job-group'\n );\n}\n\nfunction isBackgroundControlMessage(\n msg: TClientMessage,\n): msg is Extract<\n TClientMessage,\n { type: 'cancel-background-task' | 'close-background-task' | 'send-background-task' }\n> {\n return (\n msg.type === 'cancel-background-task' ||\n msg.type === 'close-background-task' ||\n msg.type === 'send-background-task'\n );\n}\n\nfunction handleSessionControlMessage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<TClientMessage, { type: 'submit' | 'command' | 'abort' | 'cancel-queue' }>,\n): void {\n if (msg.type === 'submit') {\n if (!msg.prompt) {\n send({ type: 'protocol_error', message: 'prompt is required' });\n return;\n }\n session.submit(msg.prompt);\n } else if (msg.type === 'command') {\n if (!msg.name) {\n send({ type: 'protocol_error', message: 'name is required' });\n return;\n }\n session.executeCommand(msg.name, msg.args ?? '').then((result) => {\n send({\n type: 'command_result',\n name: msg.name,\n message: result?.message ?? `Unknown command: ${msg.name}`,\n success: result?.success ?? false,\n data: result?.data,\n });\n });\n } else if (msg.type === 'abort') {\n session.abort();\n } else {\n session.cancelQueue();\n }\n}\n\nfunction handleSessionQueryMessage(\n session: IInteractiveSession,\n send: (message: TServerMessage) => void,\n msg: Extract<\n TClientMessage,\n {\n type:\n | 'get-messages'\n | 'get-context'\n | 'get-executing'\n | 'get-pending'\n | 'get-execution-workspace';\n }\n >,\n): void {\n if (msg.type === 'get-messages') {\n send({ type: 'messages', messages: session.getMessages() });\n } else if (msg.type === 'get-context') {\n send({ type: 'context', state: session.getContextState() });\n } else if (msg.type === 'get-executing') {\n send({ type: 'executing', executing: session.isExecuting() });\n } else if (msg.type === 'get-execution-workspace') {\n send({\n type: 'execution_workspace_event',\n snapshot: session.getExecutionWorkspaceSnapshot(),\n });\n } else {\n send({ type: 'pending', pending: session.getPendingPrompt() });\n }\n}\n","/**\n * ITransportAdapter implementation for WebSocket transport.\n *\n * Wraps createWsHandler into the unified ITransportAdapter interface.\n * After start(), the consumer must wire onMessage to their WebSocket.\n */\n\nimport { createWsHandler } from './ws-handler.js';\n\nimport type { TServerMessage } from './ws-protocol.js';\nimport type { IInteractiveSession, ITransportAdapter } from '@robota-sdk/agent-interface-transport';\n\nexport interface IWsTransportOptions {\n /** Send a JSON message to the connected WebSocket client. */\n send: (message: TServerMessage) => void;\n}\n\nexport function createWsTransport(\n options: IWsTransportOptions,\n): ITransportAdapter<IInteractiveSession> & { onMessage: ((data: string) => void) | null } {\n let session: IInteractiveSession | null = null;\n let cleanup: (() => void) | null = null;\n\n return {\n name: 'ws',\n onMessage: null,\n attach(s: IInteractiveSession) {\n session = s;\n },\n async start() {\n if (!session) throw new Error('No session attached. Call attach() first.');\n const handler = createWsHandler({ session, send: options.send });\n cleanup = handler.cleanup;\n this.onMessage = handler.onMessage;\n },\n async stop() {\n cleanup?.();\n cleanup = null;\n this.onMessage = null;\n },\n };\n}\n","/**\n * Self-contained WS transport implementing IConfigurableTransport.\n * Owns the WebSocket server lifecycle (ws package), started/stopped via the transport registry.\n */\n\nimport { createServer, type Server } from 'node:http';\n\nimport { WebSocketServer, WebSocket } from 'ws';\n\nimport { createWsHandler } from './ws-handler.js';\n\nimport type { TServerMessage } from './ws-protocol.js';\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\nimport type {\n IConfigurableTransport,\n IInteractiveSession,\n} from '@robota-sdk/agent-interface-transport';\n\nconst DEFAULT_PORT = 7070;\nconst DEFAULT_MAX_RETRIES = 20;\n\nexport interface IWsTransportConfig {\n port?: number;\n maxRetries?: number;\n}\n\nexport class WsTransport implements IConfigurableTransport<IInteractiveSession> {\n readonly name = 'ws';\n readonly defaultEnabled = true;\n readonly optionsSchema = {\n port: { type: 'number', description: 'WebSocket server port', default: DEFAULT_PORT },\n maxRetries: {\n type: 'number',\n description: 'Port retry attempts when port is occupied',\n default: DEFAULT_MAX_RETRIES,\n },\n };\n\n private session: IInteractiveSession | null = null;\n private stopFn: (() => Promise<void>) | null = null;\n private readonly port: number;\n private readonly maxRetries: number;\n\n constructor(config: IWsTransportConfig = {}) {\n this.port = config.port ?? DEFAULT_PORT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n }\n\n attach(session: IInteractiveSession): void {\n this.session = session;\n }\n\n async start(): Promise<void> {\n if (!this.session) throw new Error('WsTransport: attach() must be called before start()');\n const handle = await this.bindWithRetry(this.session, this.port, this.maxRetries);\n this.stopFn = handle.stop;\n }\n\n async stop(): Promise<void> {\n await this.stopFn?.();\n this.stopFn = null;\n }\n\n validateOptions(options: Record<string, TUniversalValue>): boolean {\n const { port, maxRetries } = options;\n if (port !== undefined && (typeof port !== 'number' || port < 1 || port > 65535)) return false;\n if (maxRetries !== undefined && (typeof maxRetries !== 'number' || maxRetries < 0))\n return false;\n return true;\n }\n\n private bindWithRetry(\n session: IInteractiveSession,\n port: number,\n retriesLeft: number,\n ): Promise<{ stop: () => Promise<void> }> {\n return this.tryBind(session, port).catch((err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && retriesLeft > 0)\n return this.bindWithRetry(session, port + 1, retriesLeft - 1);\n throw err;\n });\n }\n\n private tryBind(\n session: IInteractiveSession,\n port: number,\n ): Promise<{ stop: () => Promise<void> }> {\n return new Promise((resolve, reject) => {\n const httpServer: Server = createServer((_, res) => {\n res.writeHead(400).end('WebSocket endpoint');\n });\n\n httpServer.on('error', (err: NodeJS.ErrnoException) => {\n httpServer.close();\n reject(err);\n });\n\n httpServer.listen(port, '127.0.0.1', () => {\n const wss = new WebSocketServer({ server: httpServer });\n\n wss.on('connection', (ws: WebSocket) => {\n const send = (message: TServerMessage): void => {\n if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify(message));\n };\n\n const { onMessage, cleanup } = createWsHandler({ session, send });\n\n ws.on('message', (data) => onMessage(String(data)));\n ws.on('close', cleanup);\n ws.on('error', cleanup);\n\n send({ type: 'messages', messages: session.getMessages() });\n send({\n type: 'execution_workspace_event',\n snapshot: session.getExecutionWorkspaceSnapshot(),\n });\n });\n\n resolve({\n stop: () =>\n new Promise<void>((res) => {\n wss.close(() => httpServer.close(() => res()));\n }),\n });\n });\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let e=require("node:http"),t=require("ws");function n(e,t,n){if(n.type===`get-background-tasks`){t({type:`background_tasks`,tasks:e.listBackgroundTasks(n.filter)});return}if(n.type===`get-background-task`){i(e,t,n);return}if(n.type===`get-background-job-groups`){t({type:`background_job_groups`,groups:e.listBackgroundJobGroups()});return}if(n.type===`get-background-job-group`){o(e,t,n);return}if(n.type===`wait-background-job-group`){s(e,t,n);return}a(e,t,n)}function r(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}if(n.type===`cancel-background-task`){l(t,`cancel`,n.taskId,e.cancelBackgroundTask(n.taskId,n.reason));return}if(n.type===`close-background-task`){l(t,`close`,n.taskId,e.closeBackgroundTask(n.taskId));return}c(e,t,n)}function i(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}t({type:`background_task`,taskId:n.taskId,task:e.getBackgroundTask(n.taskId)??null})}function a(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}e.readBackgroundTaskLog(n.taskId,n.cursor).then(e=>t({type:`background_task_log`,taskId:n.taskId,page:e}),e=>t({type:`protocol_error`,message:e.message}))}function o(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}t({type:`background_job_group`,groupId:n.groupId,group:e.getBackgroundJobGroup(n.groupId)??null})}function s(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}e.waitBackgroundJobGroup(n.groupId).then(e=>t({type:`background_job_group`,groupId:n.groupId,group:e}),e=>t({type:`protocol_error`,message:e.message}))}function c(e,t,n){if(!n.input){t({type:`protocol_error`,message:`input is required`});return}l(t,`send`,n.taskId,e.sendBackgroundTask(n.taskId,n.input))}function l(e,t,n,r){r.then(()=>e({type:`background_task_control_result`,action:t,taskId:n,success:!0}),r=>e({type:`background_task_control_result`,action:t,taskId:n,success:!1,message:r.message}))}function u(e){let t=d(e.session,e.send);return{onMessage:f(e.session,e.send),cleanup:t}}function d(e,t){let n=e=>t({type:`user_message`,content:e}),r=e=>t({type:`text_delta`,delta:e}),i=e=>t({type:`tool_start`,state:e}),a=e=>t({type:`tool_end`,state:e}),o=e=>t({type:`thinking`,isThinking:e}),s=e=>t({type:`complete`,result:e}),c=e=>t({type:`interrupted`,result:e}),l=e=>t({type:`error`,message:e.message}),u=e=>t({type:`background_task_event`,event:e}),d=e=>t({type:`background_job_group_event`,event:e}),f=e=>t({type:`execution_workspace_event`,snapshot:e.snapshot});return e.on(`user_message`,n),e.on(`text_delta`,r),e.on(`tool_start`,i),e.on(`tool_end`,a),e.on(`thinking`,o),e.on(`complete`,s),e.on(`interrupted`,c),e.on(`error`,l),e.on(`background_task_event`,u),e.on(`background_job_group_event`,d),e.on(`execution_workspace_event`,f),()=>{e.off(`user_message`,n),e.off(`text_delta`,r),e.off(`tool_start`,i),e.off(`tool_end`,a),e.off(`thinking`,o),e.off(`complete`,s),e.off(`interrupted`,c),e.off(`error`,l),e.off(`background_task_event`,u),e.off(`background_job_group_event`,d),e.off(`execution_workspace_event`,f)}}function f(e,t){return n=>{let r=p(n,t);r&&m(e,t,r)}}function p(e,t){try{return JSON.parse(e)}catch{return t({type:`protocol_error`,message:`Invalid JSON`}),null}}function m(e,t,i){if(g(i)){b(e,t,i);return}if(_(i)){x(e,t,i);return}if(v(i)){n(e,t,i);return}if(y(i)){r(e,t,i);return}t({type:`protocol_error`,message:`Unknown message type: ${h(i)}`})}function h(e){return e.type}function g(e){return e.type===`submit`||e.type===`command`||e.type===`abort`||e.type===`cancel-queue`}function _(e){return e.type===`get-messages`||e.type===`get-context`||e.type===`get-executing`||e.type===`get-pending`||e.type===`get-execution-workspace`}function v(e){return e.type===`get-background-tasks`||e.type===`get-background-task`||e.type===`read-background-task-log`||e.type===`get-background-job-groups`||e.type===`get-background-job-group`||e.type===`wait-background-job-group`}function y(e){return e.type===`cancel-background-task`||e.type===`close-background-task`||e.type===`send-background-task`}function b(e,t,n){if(n.type===`submit`){if(!n.prompt){t({type:`protocol_error`,message:`prompt is required`});return}e.submit(n.prompt)}else if(n.type===`command`){if(!n.name){t({type:`protocol_error`,message:`name is required`});return}e.executeCommand(n.name,n.args??``).then(e=>{t({type:`command_result`,name:n.name,message:e?.message??`Unknown command: ${n.name}`,success:e?.success??!1,data:e?.data})})}else n.type===`abort`?e.abort():e.cancelQueue()}function x(e,t,n){n.type===`get-messages`?t({type:`messages`,messages:e.getMessages()}):n.type===`get-context`?t({type:`context`,state:e.getContextState()}):n.type===`get-executing`?t({type:`executing`,executing:e.isExecuting()}):n.type===`get-execution-workspace`?t({type:`execution_workspace_event`,snapshot:e.getExecutionWorkspaceSnapshot()}):t({type:`pending`,pending:e.getPendingPrompt()})}function S(e){let t=null,n=null;return{name:`ws`,onMessage:null,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);let r=u({session:t,send:e.send});n=r.cleanup,this.onMessage=r.onMessage},async stop(){n?.(),n=null,this.onMessage=null}}}const C=7070;var w=class{name=`ws`;defaultEnabled=!0;optionsSchema={port:{type:`number`,description:`WebSocket server port`,default:C},maxRetries:{type:`number`,description:`Port retry attempts when port is occupied`,default:20}};session=null;stopFn=null;port;maxRetries;constructor(e={}){this.port=e.port??C,this.maxRetries=e.maxRetries??20}attach(e){this.session=e}async start(){if(!this.session)throw Error(`WsTransport: attach() must be called before start()`);let e=await this.bindWithRetry(this.session,this.port,this.maxRetries);this.stopFn=e.stop}async stop(){await this.stopFn?.(),this.stopFn=null}validateOptions(e){let{port:t,maxRetries:n}=e;return!(t!==void 0&&(typeof t!=`number`||t<1||t>65535)||n!==void 0&&(typeof n!=`number`||n<0))}bindWithRetry(e,t,n){return this.tryBind(e,t).catch(r=>{if(r.code===`EADDRINUSE`&&n>0)return this.bindWithRetry(e,t+1,n-1);throw r})}tryBind(n,r){return new Promise((i,a)=>{let o=(0,e.createServer)((e,t)=>{t.writeHead(400).end(`WebSocket endpoint`)});o.on(`error`,e=>{o.close(),a(e)}),o.listen(r,`127.0.0.1`,()=>{let e=new t.WebSocketServer({server:o});e.on(`connection`,e=>{let r=n=>{e.readyState===t.WebSocket.OPEN&&e.send(JSON.stringify(n))},{onMessage:i,cleanup:a}=u({session:n,send:r});e.on(`message`,e=>i(String(e))),e.on(`close`,a),e.on(`error`,a),r({type:`messages`,messages:n.getMessages()}),r({type:`execution_workspace_event`,snapshot:n.getExecutionWorkspaceSnapshot()})}),i({stop:()=>new Promise(t=>{e.close(()=>o.close(()=>t()))})})})})}};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return w}});
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createHttpTransport } from '../http-transport.js';
|
|
3
|
-
import type { IInteractiveSession } from '@robota-sdk/agent-interface-transport';
|
|
4
|
-
|
|
5
|
-
function createMockSession(): IInteractiveSession {
|
|
6
|
-
return {
|
|
7
|
-
submit: vi.fn(),
|
|
8
|
-
abort: vi.fn(),
|
|
9
|
-
cancelQueue: vi.fn(),
|
|
10
|
-
getMessages: vi.fn().mockReturnValue([]),
|
|
11
|
-
getContextState: vi
|
|
12
|
-
.fn()
|
|
13
|
-
.mockReturnValue({ usedPercentage: 0, usedTokens: 0, maxTokens: 200000 }),
|
|
14
|
-
isExecuting: vi.fn().mockReturnValue(false),
|
|
15
|
-
getPendingPrompt: vi.fn().mockReturnValue(null),
|
|
16
|
-
executeCommand: vi.fn().mockResolvedValue({ message: 'ok', success: true }),
|
|
17
|
-
listCommands: vi.fn().mockReturnValue([]),
|
|
18
|
-
on: vi.fn(),
|
|
19
|
-
off: vi.fn(),
|
|
20
|
-
} as unknown as IInteractiveSession;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe('createHttpTransport', () => {
|
|
24
|
-
it('returns an adapter with name "http"', () => {
|
|
25
|
-
const transport = createHttpTransport();
|
|
26
|
-
expect(transport.name).toBe('http');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('throws if start() is called without attach()', async () => {
|
|
30
|
-
const transport = createHttpTransport();
|
|
31
|
-
await expect(transport.start()).rejects.toThrow('No session attached');
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('throws if getApp() is called before start()', () => {
|
|
35
|
-
const transport = createHttpTransport();
|
|
36
|
-
expect(() => transport.getApp()).toThrow('Transport not started');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('creates a Hono app after attach + start', async () => {
|
|
40
|
-
const transport = createHttpTransport();
|
|
41
|
-
transport.attach(createMockSession() as never);
|
|
42
|
-
await transport.start();
|
|
43
|
-
const app = transport.getApp();
|
|
44
|
-
expect(app).toBeDefined();
|
|
45
|
-
expect(typeof app.fetch).toBe('function');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('nullifies app after stop()', async () => {
|
|
49
|
-
const transport = createHttpTransport();
|
|
50
|
-
transport.attach(createMockSession() as never);
|
|
51
|
-
await transport.start();
|
|
52
|
-
await transport.stop();
|
|
53
|
-
expect(() => transport.getApp()).toThrow('Transport not started');
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for HTTP transport routes.
|
|
3
|
-
* Uses Hono's built-in test client — no real HTTP server needed.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
-
import { createAgentRoutes } from '../routes.js';
|
|
8
|
-
import type { IInteractiveSession } from '@robota-sdk/agent-interface-transport';
|
|
9
|
-
|
|
10
|
-
function createMockSession(overrides?: Record<string, unknown>) {
|
|
11
|
-
return {
|
|
12
|
-
submit: vi.fn(),
|
|
13
|
-
abort: vi.fn(),
|
|
14
|
-
cancelQueue: vi.fn(),
|
|
15
|
-
getMessages: vi.fn().mockReturnValue([
|
|
16
|
-
{ role: 'user', content: 'hello' },
|
|
17
|
-
{ role: 'assistant', content: 'world' },
|
|
18
|
-
]),
|
|
19
|
-
getContextState: vi.fn().mockReturnValue({
|
|
20
|
-
usedPercentage: 10,
|
|
21
|
-
usedTokens: 1000,
|
|
22
|
-
maxTokens: 200000,
|
|
23
|
-
}),
|
|
24
|
-
isExecuting: vi.fn().mockReturnValue(false),
|
|
25
|
-
getPendingPrompt: vi.fn().mockReturnValue(null),
|
|
26
|
-
executeCommand: vi.fn().mockResolvedValue({
|
|
27
|
-
message: 'Conversation cleared.',
|
|
28
|
-
success: true,
|
|
29
|
-
}),
|
|
30
|
-
listCommands: vi.fn().mockReturnValue([]),
|
|
31
|
-
on: vi.fn(),
|
|
32
|
-
off: vi.fn(),
|
|
33
|
-
...overrides,
|
|
34
|
-
} as unknown as IInteractiveSession;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
describe('HTTP Transport Routes', () => {
|
|
38
|
-
function createApp(session?: IInteractiveSession) {
|
|
39
|
-
const mockSession = session ?? createMockSession();
|
|
40
|
-
const app = createAgentRoutes({
|
|
41
|
-
sessionFactory: () => mockSession,
|
|
42
|
-
});
|
|
43
|
-
return { app, mockSession };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// ── POST /abort ───────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
it('POST /abort calls session.abort()', async () => {
|
|
49
|
-
const { app, mockSession } = createApp();
|
|
50
|
-
const res = await app.request('/abort', { method: 'POST' });
|
|
51
|
-
expect(res.status).toBe(200);
|
|
52
|
-
expect(await res.json()).toEqual({ ok: true });
|
|
53
|
-
expect(mockSession.abort).toHaveBeenCalled();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// ── POST /cancel-queue ────────────────────────────────────────
|
|
57
|
-
|
|
58
|
-
it('POST /cancel-queue calls session.cancelQueue()', async () => {
|
|
59
|
-
const { app, mockSession } = createApp();
|
|
60
|
-
const res = await app.request('/cancel-queue', { method: 'POST' });
|
|
61
|
-
expect(res.status).toBe(200);
|
|
62
|
-
expect(await res.json()).toEqual({ ok: true });
|
|
63
|
-
expect(mockSession.cancelQueue).toHaveBeenCalled();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// ── GET /messages ─────────────────────────────────────────────
|
|
67
|
-
|
|
68
|
-
it('GET /messages returns message history', async () => {
|
|
69
|
-
const { app } = createApp();
|
|
70
|
-
const res = await app.request('/messages');
|
|
71
|
-
expect(res.status).toBe(200);
|
|
72
|
-
const body = await res.json();
|
|
73
|
-
expect(body).toHaveLength(2);
|
|
74
|
-
expect(body[0].role).toBe('user');
|
|
75
|
-
expect(body[1].role).toBe('assistant');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// ── GET /context ──────────────────────────────────────────────
|
|
79
|
-
|
|
80
|
-
it('GET /context returns context window state', async () => {
|
|
81
|
-
const { app } = createApp();
|
|
82
|
-
const res = await app.request('/context');
|
|
83
|
-
expect(res.status).toBe(200);
|
|
84
|
-
const body = await res.json();
|
|
85
|
-
expect(body.usedTokens).toBe(1000);
|
|
86
|
-
expect(body.maxTokens).toBe(200000);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// ── GET /executing ────────────────────────────────────────────
|
|
90
|
-
|
|
91
|
-
it('GET /executing returns execution status', async () => {
|
|
92
|
-
const { app } = createApp();
|
|
93
|
-
const res = await app.request('/executing');
|
|
94
|
-
expect(res.status).toBe(200);
|
|
95
|
-
expect(await res.json()).toEqual({ executing: false });
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// ── GET /pending ──────────────────────────────────────────────
|
|
99
|
-
|
|
100
|
-
it('GET /pending returns null when no queue', async () => {
|
|
101
|
-
const { app } = createApp();
|
|
102
|
-
const res = await app.request('/pending');
|
|
103
|
-
expect(res.status).toBe(200);
|
|
104
|
-
expect(await res.json()).toEqual({ pending: null });
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('GET /pending returns queued prompt', async () => {
|
|
108
|
-
const mockSession = createMockSession({
|
|
109
|
-
getPendingPrompt: vi.fn().mockReturnValue('queued prompt'),
|
|
110
|
-
});
|
|
111
|
-
const { app } = createApp(mockSession);
|
|
112
|
-
const res = await app.request('/pending');
|
|
113
|
-
expect(res.status).toBe(200);
|
|
114
|
-
expect(await res.json()).toEqual({ pending: 'queued prompt' });
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
// ── POST /command ─────────────────────────────────────────────
|
|
118
|
-
|
|
119
|
-
it('POST /command executes system command via session.executeCommand()', async () => {
|
|
120
|
-
const { app, mockSession } = createApp();
|
|
121
|
-
const res = await app.request('/command', {
|
|
122
|
-
method: 'POST',
|
|
123
|
-
headers: { 'Content-Type': 'application/json' },
|
|
124
|
-
body: JSON.stringify({ name: 'clear', args: '' }),
|
|
125
|
-
});
|
|
126
|
-
expect(res.status).toBe(200);
|
|
127
|
-
const body = await res.json();
|
|
128
|
-
expect(body.success).toBe(true);
|
|
129
|
-
expect(body.message).toBe('Conversation cleared.');
|
|
130
|
-
expect(mockSession.executeCommand).toHaveBeenCalledWith('clear', '');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('POST /command returns 400 without name', async () => {
|
|
134
|
-
const { app } = createApp();
|
|
135
|
-
const res = await app.request('/command', {
|
|
136
|
-
method: 'POST',
|
|
137
|
-
headers: { 'Content-Type': 'application/json' },
|
|
138
|
-
body: JSON.stringify({}),
|
|
139
|
-
});
|
|
140
|
-
expect(res.status).toBe(400);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it('POST /command returns 404 for unknown command', async () => {
|
|
144
|
-
const mockSession = createMockSession({
|
|
145
|
-
executeCommand: vi.fn().mockResolvedValue(null),
|
|
146
|
-
});
|
|
147
|
-
const { app } = createApp(mockSession);
|
|
148
|
-
|
|
149
|
-
const res = await app.request('/command', {
|
|
150
|
-
method: 'POST',
|
|
151
|
-
headers: { 'Content-Type': 'application/json' },
|
|
152
|
-
body: JSON.stringify({ name: 'nonexistent' }),
|
|
153
|
-
});
|
|
154
|
-
expect(res.status).toBe(404);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// ── POST /submit validation ───────────────────────────────────
|
|
158
|
-
|
|
159
|
-
it('POST /submit returns 400 without prompt', async () => {
|
|
160
|
-
const { app } = createApp();
|
|
161
|
-
const res = await app.request('/submit', {
|
|
162
|
-
method: 'POST',
|
|
163
|
-
headers: { 'Content-Type': 'application/json' },
|
|
164
|
-
body: JSON.stringify({}),
|
|
165
|
-
});
|
|
166
|
-
expect(res.status).toBe(400);
|
|
167
|
-
});
|
|
168
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ITransportAdapter implementation for HTTP transport.
|
|
3
|
-
*
|
|
4
|
-
* Wraps createAgentRoutes into the unified ITransportAdapter interface
|
|
5
|
-
* while exposing the underlying Hono app via getApp().
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { createAgentRoutes } from './routes.js';
|
|
9
|
-
|
|
10
|
-
import type { IInteractiveSession, ITransportAdapter } from '@robota-sdk/agent-interface-transport';
|
|
11
|
-
import type { Hono } from 'hono';
|
|
12
|
-
|
|
13
|
-
export interface IHttpTransportOptions {
|
|
14
|
-
/** Optional: base path prefix for routes. */
|
|
15
|
-
basePath?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function createHttpTransport(
|
|
19
|
-
options?: IHttpTransportOptions,
|
|
20
|
-
): ITransportAdapter<IInteractiveSession> & { getApp(): Hono } {
|
|
21
|
-
let session: IInteractiveSession | null = null;
|
|
22
|
-
let app: Hono | null = null;
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
name: 'http',
|
|
26
|
-
attach(s: IInteractiveSession) {
|
|
27
|
-
session = s;
|
|
28
|
-
},
|
|
29
|
-
async start() {
|
|
30
|
-
if (!session) throw new Error('No session attached. Call attach() first.');
|
|
31
|
-
app = createAgentRoutes({ sessionFactory: () => session! });
|
|
32
|
-
},
|
|
33
|
-
async stop() {
|
|
34
|
-
app = null;
|
|
35
|
-
},
|
|
36
|
-
getApp() {
|
|
37
|
-
if (!app) throw new Error('Transport not started. Call start() first.');
|
|
38
|
-
return app;
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
}
|
package/src/http/index.ts
DELETED