@robota-sdk/agent-transport 3.0.0-beta.65 → 3.0.0-beta.67

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.
Files changed (143) hide show
  1. package/README.md +97 -0
  2. package/dist/node/chunk-Bmb41Sf3.cjs +1 -0
  3. package/dist/node/headless/index.cjs +1 -1
  4. package/dist/node/headless/index.d.ts +2 -2
  5. package/dist/node/headless/index.js +1 -1
  6. package/dist/node/headless-B8yWkXW_.js +15 -0
  7. package/dist/node/headless-B8yWkXW_.js.map +1 -0
  8. package/dist/node/headless-Dp3kQVmo.cjs +14 -0
  9. package/dist/node/http/index.cjs +1 -1
  10. package/dist/node/http/index.d.ts +1 -1
  11. package/dist/node/http/index.js +1 -1
  12. package/dist/node/{http-DwO1AHG-.js → http-Br10Ps8m.js} +1 -1
  13. package/dist/node/http-Br10Ps8m.js.map +1 -0
  14. package/dist/node/http-Da6Kw4oy.cjs +1 -0
  15. package/dist/node/{index-B_rcr14p.d.ts → index-C5KNEBO9.d.ts} +2 -2
  16. package/dist/node/{index-B_rcr14p.d.ts.map → index-C5KNEBO9.d.ts.map} +1 -1
  17. package/dist/node/{index-Y0zHb1Bz.d.ts → index-C7DvsmEg.d.ts} +2 -2
  18. package/dist/node/{index-Y0zHb1Bz.d.ts.map → index-C7DvsmEg.d.ts.map} +1 -1
  19. package/dist/node/index-C9LWCL4l.d.ts.map +1 -1
  20. package/dist/node/{index-k3TUjA-T.d.ts → index-CP7kaYMg.d.ts} +17 -2
  21. package/dist/node/index-CP7kaYMg.d.ts.map +1 -0
  22. package/dist/node/index-CQsMNXAh.d.ts +67 -0
  23. package/dist/node/index-CQsMNXAh.d.ts.map +1 -0
  24. package/dist/node/{index-nBlMTFkZ.d.ts → index-DOA2KIYt.d.ts} +2 -2
  25. package/dist/node/{index-nBlMTFkZ.d.ts.map → index-DOA2KIYt.d.ts.map} +1 -1
  26. package/dist/node/{index-D34WUfFH.d.ts → index-Gby9H4q2.d.ts} +17 -2
  27. package/dist/node/index-Gby9H4q2.d.ts.map +1 -0
  28. package/dist/node/{index-CvXLpjJO.d.ts → index-X2Zg8FEY.d.ts} +2 -2
  29. package/dist/node/{index-CEs25wVk.d.ts.map → index-X2Zg8FEY.d.ts.map} +1 -1
  30. package/dist/node/index-rGmGTQ9o.d.ts +67 -0
  31. package/dist/node/index-rGmGTQ9o.d.ts.map +1 -0
  32. package/dist/node/{index-CEs25wVk.d.ts → index-yvGShbDx.d.ts} +2 -2
  33. package/dist/node/{index-CvXLpjJO.d.ts.map → index-yvGShbDx.d.ts.map} +1 -1
  34. package/dist/node/index.cjs +1 -1
  35. package/dist/node/index.d.ts +28 -6
  36. package/dist/node/index.d.ts.map +1 -0
  37. package/dist/node/index.js +2 -1
  38. package/dist/node/index.js.map +1 -0
  39. package/dist/node/mcp/index.cjs +1 -1
  40. package/dist/node/mcp/index.d.ts +1 -1
  41. package/dist/node/mcp/index.js +1 -1
  42. package/dist/node/{mcp-BXBwF6Wu.js → mcp-BAujHOMr.js} +1 -1
  43. package/dist/node/mcp-BAujHOMr.js.map +1 -0
  44. package/dist/node/mcp-Bl8jUfev.cjs +1 -0
  45. package/dist/node/tui/index.cjs +1 -1
  46. package/dist/node/tui/index.d.ts +2 -2
  47. package/dist/node/tui/index.js +1 -1
  48. package/dist/node/tui-B8G3yHrL.cjs +24 -0
  49. package/dist/node/tui-DUIfVw3G.js +25 -0
  50. package/dist/node/tui-DUIfVw3G.js.map +1 -0
  51. package/dist/node/ws/index.cjs +1 -1
  52. package/dist/node/ws/index.d.ts +1 -1
  53. package/dist/node/ws/index.js +1 -1
  54. package/dist/node/{ws-B-oRccFl.js → ws-BWel8nzl.js} +1 -1
  55. package/dist/node/ws-BWel8nzl.js.map +1 -0
  56. package/dist/node/ws-tCjj2gPu.cjs +1 -0
  57. package/package.json +19 -18
  58. package/src/headless/cli-input.ts +50 -0
  59. package/src/headless/headless-runner.ts +2 -1
  60. package/src/headless/headless-stream-json.ts +1 -0
  61. package/src/headless/headless-transport.ts +3 -2
  62. package/src/headless/index.ts +2 -0
  63. package/src/headless/print-terminal.ts +57 -0
  64. package/src/http/http-transport.ts +3 -3
  65. package/src/http/routes.ts +2 -1
  66. package/src/index.ts +2 -1
  67. package/src/mcp/mcp-server.ts +1 -0
  68. package/src/mcp/mcp-transport.ts +3 -2
  69. package/src/transport-registry.ts +100 -0
  70. package/src/tui/App.tsx +52 -34
  71. package/src/tui/BackgroundTaskPanel.tsx +4 -2
  72. package/src/tui/CjkTextInput.tsx +3 -2
  73. package/src/tui/ConfirmPrompt.tsx +2 -1
  74. package/src/tui/ExecutionWorkspaceDetailPane.tsx +7 -5
  75. package/src/tui/ExecutionWorkspaceSwitcher.tsx +8 -6
  76. package/src/tui/InputArea.tsx +20 -19
  77. package/src/tui/InteractivePrompt.tsx +5 -3
  78. package/src/tui/ListPicker.tsx +2 -1
  79. package/src/tui/MenuSelect.tsx +2 -1
  80. package/src/tui/MessageList.tsx +8 -6
  81. package/src/tui/PermissionPrompt.tsx +5 -3
  82. package/src/tui/PluginTUI.tsx +5 -3
  83. package/src/tui/SessionPicker.tsx +4 -2
  84. package/src/tui/SessionStatusBar.tsx +7 -3
  85. package/src/tui/SlashAutocomplete.tsx +4 -3
  86. package/src/tui/StatusBar.tsx +5 -3
  87. package/src/tui/StreamingIndicator.tsx +4 -2
  88. package/src/tui/TextPrompt.tsx +2 -1
  89. package/src/tui/ToolCommandOutput.tsx +4 -2
  90. package/src/tui/ToolDiffBlock.tsx +4 -2
  91. package/src/tui/TransportTUI.tsx +3 -2
  92. package/src/tui/UpdateNotice.tsx +1 -1
  93. package/src/tui/UsageSummaryEntry.tsx +3 -2
  94. package/src/tui/WaveText.tsx +1 -1
  95. package/src/tui/__tests__/fixtures/provider-setup-prompt-driver.tsx +7 -4
  96. package/src/tui/background-task-row-format.ts +2 -1
  97. package/src/tui/command-interaction-registry.ts +66 -0
  98. package/src/tui/command-interaction.ts +9 -35
  99. package/src/tui/create-default-tui-cli-adapter.ts +42 -0
  100. package/src/tui/flows/input-area-flow.ts +3 -2
  101. package/src/tui/hooks/command-effect-handler.ts +4 -3
  102. package/src/tui/hooks/side-effects-types.ts +1 -1
  103. package/src/tui/hooks/use-interactive-session-init.ts +4 -2
  104. package/src/tui/hooks/useAutocomplete.ts +1 -0
  105. package/src/tui/hooks/useInteractiveSession.ts +22 -19
  106. package/src/tui/hooks/usePermissionQueue.ts +2 -1
  107. package/src/tui/hooks/usePluginCallbacks.ts +1 -0
  108. package/src/tui/hooks/usePluginScreenData.ts +2 -1
  109. package/src/tui/hooks/useSideEffects.ts +8 -6
  110. package/src/tui/hooks/useSlashRouting.ts +4 -3
  111. package/src/tui/hooks/useStatusLineSettings.ts +4 -2
  112. package/src/tui/index.ts +3 -1
  113. package/src/tui/interactions/CommandConfirm.tsx +2 -1
  114. package/src/tui/interactions/CommandPicker.tsx +2 -1
  115. package/src/tui/render-markdown.ts +2 -1
  116. package/src/tui/render.tsx +12 -28
  117. package/src/tui/tui-cli-adapter-context.tsx +1 -0
  118. package/src/tui/tui-cli-adapter.ts +1 -1
  119. package/src/tui/tui-transport.ts +5 -4
  120. package/src/tui/utils/edit-diff.ts +1 -0
  121. package/src/tui/utils/tool-call-extractor.ts +1 -0
  122. package/src/ws/ws-background-messages.ts +1 -1
  123. package/src/ws/ws-handler.ts +6 -5
  124. package/src/ws/ws-transport-configurable.ts +6 -3
  125. package/src/ws/ws-transport.ts +3 -2
  126. package/dist/node/headless-CWEpJXFK.js +0 -7
  127. package/dist/node/headless-CWEpJXFK.js.map +0 -1
  128. package/dist/node/headless-DJ5pnxM6.cjs +0 -6
  129. package/dist/node/http-CuQE6V6t.cjs +0 -1
  130. package/dist/node/http-DwO1AHG-.js.map +0 -1
  131. package/dist/node/index-CSgNoyPK.d.ts +0 -85
  132. package/dist/node/index-CSgNoyPK.d.ts.map +0 -1
  133. package/dist/node/index-D34WUfFH.d.ts.map +0 -1
  134. package/dist/node/index-_dNm-2J3.d.ts +0 -85
  135. package/dist/node/index-_dNm-2J3.d.ts.map +0 -1
  136. package/dist/node/index-k3TUjA-T.d.ts.map +0 -1
  137. package/dist/node/mcp-BXBwF6Wu.js.map +0 -1
  138. package/dist/node/mcp-BiJsIywJ.cjs +0 -1
  139. package/dist/node/tui-BIpIcT7-.cjs +0 -24
  140. package/dist/node/tui-DBLn1T15.js +0 -25
  141. package/dist/node/tui-DBLn1T15.js.map +0 -1
  142. package/dist/node/ws-B-oRccFl.js.map +0 -1
  143. package/dist/node/ws-XRTSFZOK.cjs +0 -1
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # Agent Transport
2
+
3
+ Protocol-level transport adapters for the Robota SDK — headless, HTTP, WebSocket, MCP, and TUI (Ink/React terminal UI).
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @robota-sdk/agent-transport
9
+ ```
10
+
11
+ ## Available Transports
12
+
13
+ | Transport | Sub-path | Description |
14
+ | --------- | ------------ | ------------------------------------------------------- |
15
+ | Headless | `./headless` | Non-interactive text / JSON / stream-JSON output |
16
+ | HTTP | `./http` | Hono-based REST adapter (Node.js / CF Workers / Lambda) |
17
+ | WebSocket | `./ws` | Framework-agnostic real-time bidirectional adapter |
18
+ | MCP | `./mcp` | Model Context Protocol server adapter |
19
+ | TUI | `./tui` | Ink/React terminal UI components and `TuiTransport` |
20
+
21
+ ## Quick Start
22
+
23
+ ### Headless
24
+
25
+ ```typescript
26
+ import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';
27
+
28
+ const transport = createHeadlessTransport({ format: 'text' });
29
+ ```
30
+
31
+ ### WebSocket
32
+
33
+ ```typescript
34
+ import { WsTransport } from '@robota-sdk/agent-transport/ws';
35
+
36
+ const transport = new WsTransport({ port: 3001 });
37
+ ```
38
+
39
+ ### HTTP
40
+
41
+ ```typescript
42
+ import { createHttpTransport } from '@robota-sdk/agent-transport/http';
43
+
44
+ const transport = createHttpTransport({ port: 8080 });
45
+ ```
46
+
47
+ ### MCP
48
+
49
+ ```typescript
50
+ import { createMcpTransport } from '@robota-sdk/agent-transport/mcp';
51
+
52
+ const transport = createMcpTransport({ name: 'my-agent' });
53
+ ```
54
+
55
+ ### TUI (Ink/React)
56
+
57
+ ```typescript
58
+ import { TuiTransport } from '@robota-sdk/agent-transport/tui';
59
+ import type { ITuiCliAdapter } from '@robota-sdk/agent-transport/tui';
60
+
61
+ const transport = new TuiTransport(adapter);
62
+ ```
63
+
64
+ > React and Ink dependencies are confined to the `./tui` sub-path. Importing from
65
+ > other sub-paths keeps your bundle React-free.
66
+
67
+ ## Sub-path Imports
68
+
69
+ Import only what you need to keep bundles small:
70
+
71
+ ```typescript
72
+ import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';
73
+ import { WsTransport } from '@robota-sdk/agent-transport/ws';
74
+ import type { TServerMessage } from '@robota-sdk/agent-transport/ws';
75
+ import { createHttpTransport } from '@robota-sdk/agent-transport/http';
76
+ import { createMcpTransport } from '@robota-sdk/agent-transport/mcp';
77
+ import { TuiTransport } from '@robota-sdk/agent-transport/tui';
78
+ ```
79
+
80
+ Root import re-exports all transports:
81
+
82
+ ```typescript
83
+ import { createHeadlessTransport, WsTransport, TuiTransport, ... } from '@robota-sdk/agent-transport';
84
+ ```
85
+
86
+ ## Dependencies
87
+
88
+ - `@robota-sdk/agent-core`
89
+ - `@robota-sdk/agent-interface-transport`
90
+ - `@robota-sdk/agent-framework`
91
+ - `ws`, `hono`, `@modelcontextprotocol/sdk`, `zod`
92
+ - `react`, `ink`, `ink-select-input`, `ink-spinner`, `ink-text-input`, `chalk`, `marked`, `marked-terminal`, `string-width` _(TUI sub-path only)_
93
+
94
+ ## Links
95
+
96
+ - [npm](https://www.npmjs.com/package/@robota-sdk/agent-transport)
97
+ - [GitHub](https://github.com/woojubb/robota)
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../headless-DJ5pnxM6.cjs`);exports.createHeadlessRunner=e.n,exports.createHeadlessTransport=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../headless-Dp3kQVmo.cjs`);exports.PrintTerminal=e.i,exports.createHeadlessRunner=e.n,exports.createHeadlessTransport=e.t,exports.promptInput=e.r;
@@ -1,2 +1,2 @@
1
- import { a as createHeadlessRunner, i as TOutputFormat, n as createHeadlessTransport, r as IHeadlessRunnerOptions, t as IHeadlessTransportOptions } from "../index-D34WUfFH.js";
2
- export { type IHeadlessRunnerOptions, type IHeadlessTransportOptions, type TOutputFormat, createHeadlessRunner, createHeadlessTransport };
1
+ import { a as createHeadlessRunner, i as TOutputFormat, n as createHeadlessTransport, o as promptInput, r as IHeadlessRunnerOptions, s as PrintTerminal, t as IHeadlessTransportOptions } from "../index-Gby9H4q2.js";
2
+ export { type IHeadlessRunnerOptions, type IHeadlessTransportOptions, PrintTerminal, type TOutputFormat, createHeadlessRunner, createHeadlessTransport, promptInput };
@@ -1 +1 @@
1
- import{n as e,t}from"../headless-CWEpJXFK.js";export{e as createHeadlessRunner,t as createHeadlessTransport};
1
+ import{i as e,n as t,r as n,t as r}from"../headless-B8yWkXW_.js";export{e as PrintTerminal,t as createHeadlessRunner,r as createHeadlessTransport,n as promptInput};
@@ -0,0 +1,15 @@
1
+ import*as e from"node:readline";import{randomUUID as t}from"node:crypto";var n=class{write(e){process.stdout.write(e)}writeLine(e){process.stdout.write(e+`
2
+ `)}writeMarkdown(e){process.stdout.write(e)}writeError(e){process.stderr.write(e+`
3
+ `)}prompt(t){return new Promise(n=>{let r=e.createInterface({input:process.stdin,output:process.stdout,terminal:!1,historySize:0});r.question(t,e=>{r.close(),n(e)})})}async select(e,t=0){for(let n=0;n<e.length;n++){let r=n===t?`>`:` `;process.stdout.write(` ${r} ${n+1}) ${e[n]}\n`)}let n=(await this.prompt(` Choose [1-${e.length}] (default: ${e[t]}): `)).trim().toLowerCase();if(n===``)return t;let r=parseInt(n,10);return!isNaN(r)&&r>=1&&r<=e.length?r-1:t}spinner(e){return{stop(){},update(){}}}};const r=(e,t=!1)=>new Promise((n,r)=>{process.stdout.write(e);let i=``,a=process.stdin,o=a.isRaw;if(!a.isTTY){r(Error(`Cannot prompt for input: stdin is not a TTY.
4
+ Set your API key via environment variable instead:
5
+ ANTHROPIC_API_KEY=<key> robota
6
+ OPENAI_API_KEY=<key> robota`));return}a.setRawMode(!0),a.resume(),a.setEncoding(`utf8`);let s=e=>{for(let r of e)if(r===`\r`||r===`
7
+ `){a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
8
+ `),n(i.trim());return}else r===``||r===`\b`?i.length>0&&(i=i.slice(0,-1),process.stdout.write(`\b \b`)):r===``?(a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
9
+ `),process.exit(0)):r.charCodeAt(0)>=32&&(i+=r,process.stdout.write(t?`*`:r))};a.on(`data`,s)});function i(e){let t=e.trimStart();if(!t.startsWith(`/`))return null;let[n=``,...r]=t.slice(1).split(/\s+/);return n.length===0?null:{name:n,args:r.join(` `)}}async function a(e,t){let n=i(t);if(!n)return{kind:`not-slash`};let r=await e.executeCommand(n.name,n.args);return r?r.effects?.some(e=>e.type===`session-execution-started`)?{kind:`session-execution`}:{kind:`command-result`,result:r}:{kind:`command-result`,result:{message:`Unknown command "/${n.name}".`,success:!1}}}function o(e,n,r){let i=JSON.stringify({type:`stream_event`,event:r,session_id:n(e),uuid:t()});process.stdout.write(i+`
10
+ `)}function s(e,t,n,r){let i=n=>o(e,t,n),a=e=>i({type:`content_block_delta`,delta:{type:`text_delta`,text:e}}),s=e=>i({type:`background_task_event`,background_task_event:e}),l=e=>i({type:`background_job_group_event`,background_job_group_event:e}),u=()=>c(e,{onTextDelta:a,onBackgroundTaskEvent:s,onBackgroundJobGroupEvent:l,onComplete:d,onInterrupted:f,onError:p}),d=i=>{u(),n(t(e),i.response,`success`),r(0)},f=i=>{u(),n(t(e),i.response,`success`),r(0)},p=i=>{u(),n(t(e),``,`error`),r(1)};return e.on(`text_delta`,a),e.on(`background_task_event`,s),e.on(`background_job_group_event`,l),e.on(`complete`,d),e.on(`interrupted`,f),e.on(`error`,p),u}function c(e,t){e.off(`text_delta`,t.onTextDelta),e.off(`background_task_event`,t.onBackgroundTaskEvent),e.off(`background_job_group_event`,t.onBackgroundJobGroupEvent),e.off(`complete`,t.onComplete),e.off(`interrupted`,t.onInterrupted),e.off(`error`,t.onError)}function l(e){let{session:t,outputFormat:n}=e;return{run:e=>n===`text`?f(t,e):n===`json`?p(t,e):m(t,e)}}function u(e,t,n){let r=JSON.stringify({type:`result`,result:t,session_id:e,subtype:n});process.stdout.write(r+`
11
+ `)}function d(e){try{return e.getSession().getSessionId()}catch{return``}}function f(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,o),e.off(`error`,s)},i=e=>{r(),process.stdout.write(e.response+`
12
+ `),n(0)},o=e=>{r(),e.response&&process.stdout.write(e.response+`
13
+ `),n(0)},s=e=>{r(),n(1)};e.on(`complete`,i),e.on(`interrupted`,o),e.on(`error`,s),a(e,t).then(i=>{if(i.kind===`command-result`){r(),process.stdout.write(i.result.message+`
14
+ `),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function p(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,o),e.off(`error`,s)},i=t=>{r(),u(d(e),t.response,`success`),n(0)},o=t=>{r(),u(d(e),t.response,`success`),n(0)},s=t=>{r(),u(d(e),``,`error`),n(1)};e.on(`complete`,i),e.on(`interrupted`,o),e.on(`error`,s),a(e,t).then(i=>{if(i.kind===`command-result`){r(),u(d(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function m(e,t){return new Promise(n=>{let r=s(e,d,u,n);a(e,t).then(i=>{if(i.kind===`command-result`){r(),u(d(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function h(e){let t=null,n=0;return{name:`headless`,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);n=await l({session:t,outputFormat:e.outputFormat}).run(e.prompt)},async stop(){},getExitCode(){return n}}}export{n as i,l as n,r,h as t};
15
+ //# sourceMappingURL=headless-B8yWkXW_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-B8yWkXW_.js","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-stream-json.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts"],"sourcesContent":["/**\n * ITerminalOutput implementation for print mode (-p).\n *\n * Writes to stdout/stderr directly. The readline-based prompt and select are\n * only invoked if the agent triggers a permission-gated tool, which is rare in\n * one-shot print mode but must still work correctly.\n */\n\nimport * as readline from 'node:readline';\n\nimport type { ITerminalOutput, ISpinner } from '@robota-sdk/agent-core';\n\nexport class PrintTerminal implements ITerminalOutput {\n write(text: string): void {\n process.stdout.write(text);\n }\n writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n }\n writeMarkdown(md: string): void {\n process.stdout.write(md);\n }\n writeError(text: string): void {\n process.stderr.write(text + '\\n');\n }\n prompt(question: string): Promise<string> {\n return new Promise<string>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n historySize: 0,\n });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n }\n async select(options: string[], initialIndex = 0): Promise<number> {\n for (let i = 0; i < options.length; i++) {\n const marker = i === initialIndex ? '>' : ' ';\n process.stdout.write(` ${marker} ${i + 1}) ${options[i]}\\n`);\n }\n const answer = await this.prompt(\n ` Choose [1-${options.length}] (default: ${options[initialIndex]}): `,\n );\n const trimmed = answer.trim().toLowerCase();\n if (trimmed === '') return initialIndex;\n const num = parseInt(trimmed, 10);\n if (!isNaN(num) && num >= 1 && num <= options.length) return num - 1;\n return initialIndex;\n }\n spinner(_message: string): ISpinner {\n return { stop(): void {}, update(): void {} };\n }\n}\n","const PRINTABLE_ASCII_START = 32;\n\nexport const promptInput = (label: string, masked = false): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n process.stdout.write(label);\n let input = '';\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (!stdin.isTTY) {\n reject(\n new Error(\n 'Cannot prompt for input: stdin is not a TTY.\\n' +\n 'Set your API key via environment variable instead:\\n' +\n ' ANTHROPIC_API_KEY=<key> robota\\n' +\n ' OPENAI_API_KEY=<key> robota',\n ),\n );\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n const onData = (data: string): void => {\n for (const ch of data) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n resolve(input.trim());\n return;\n } else if (ch === '\\x7f' || ch === '\\b') {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else if (ch === '\\x03') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n process.exit(0);\n } else if (ch.charCodeAt(0) >= PRINTABLE_ASCII_START) {\n input += ch;\n process.stdout.write(masked ? '*' : ch);\n }\n }\n };\n stdin.on('data', onData);\n });\n","import { randomUUID } from 'node:crypto';\n\nimport type {\n IInteractiveSession,\n IExecutionResult,\n ICommandResult,\n TBackgroundJobGroupEvent,\n TBackgroundTaskEvent,\n} from '@robota-sdk/agent-framework';\n\ntype TSlashCommandExecution =\n | { readonly kind: 'not-slash' }\n | { readonly kind: 'command-result'; readonly result: ICommandResult }\n | { readonly kind: 'session-execution' };\n\nfunction parseSlashCommand(prompt: string): { name: string; args: string } | null {\n const trimmed = prompt.trimStart();\n if (!trimmed.startsWith('/')) return null;\n const withoutSlash = trimmed.slice(1);\n const [name = '', ...args] = withoutSlash.split(/\\s+/);\n if (name.length === 0) return null;\n return { name, args: args.join(' ') };\n}\n\nexport async function executeSlashCommandIfPresent(\n session: IInteractiveSession,\n prompt: string,\n): Promise<TSlashCommandExecution> {\n const command = parseSlashCommand(prompt);\n if (!command) return { kind: 'not-slash' };\n\n const result = await session.executeCommand(command.name, command.args);\n if (result) {\n if (result.effects?.some((effect) => effect.type === 'session-execution-started')) {\n return { kind: 'session-execution' };\n }\n return { kind: 'command-result', result };\n }\n return {\n kind: 'command-result',\n result: { message: `Unknown command \"/${command.name}\".`, success: false },\n };\n}\n\ntype TStreamJsonEvent =\n | {\n type: 'content_block_delta';\n delta: { type: 'text_delta'; text: string };\n }\n | {\n type: 'background_task_event';\n background_task_event: TBackgroundTaskEvent;\n }\n | {\n type: 'background_job_group_event';\n background_job_group_event: TBackgroundJobGroupEvent;\n };\n\ninterface IStreamJsonHandlers {\n onTextDelta: (text: string) => void;\n onBackgroundTaskEvent: (event: TBackgroundTaskEvent) => void;\n onBackgroundJobGroupEvent: (event: TBackgroundJobGroupEvent) => void;\n onComplete: (result: IExecutionResult) => void;\n onInterrupted: (result: IExecutionResult) => void;\n onError: (error: Error) => void;\n}\n\nexport function writeStreamJsonEvent(\n session: IInteractiveSession,\n getSessionId: (s: IInteractiveSession) => string,\n event: TStreamJsonEvent,\n): void {\n const output = JSON.stringify({\n type: 'stream_event',\n event,\n session_id: getSessionId(session),\n uuid: randomUUID(),\n });\n process.stdout.write(output + '\\n');\n}\n\nexport function subscribeStreamJsonEvents(\n session: IInteractiveSession,\n getSessionId: (s: IInteractiveSession) => string,\n writeJsonResult: (sessionId: string, result: string, subtype: 'success' | 'error') => void,\n resolve: (exitCode: number) => void,\n): () => void {\n const emit = (event: TStreamJsonEvent): void =>\n writeStreamJsonEvent(session, getSessionId, event);\n\n const onTextDelta = (text: string): void =>\n emit({ type: 'content_block_delta', delta: { type: 'text_delta', text } });\n const onBackgroundTaskEvent = (event: TBackgroundTaskEvent): void =>\n emit({ type: 'background_task_event', background_task_event: event });\n const onBackgroundJobGroupEvent = (event: TBackgroundJobGroupEvent): void =>\n emit({ type: 'background_job_group_event', background_job_group_event: event });\n\n const cleanup = (): void =>\n unsubscribeStreamJsonEvents(session, {\n onTextDelta,\n onBackgroundTaskEvent,\n onBackgroundJobGroupEvent,\n onComplete,\n onInterrupted,\n onError,\n });\n\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n writeJsonResult(getSessionId(session), '', 'error');\n resolve(1);\n };\n\n session.on('text_delta', onTextDelta);\n session.on('background_task_event', onBackgroundTaskEvent);\n session.on('background_job_group_event', onBackgroundJobGroupEvent);\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n return cleanup;\n}\n\nfunction unsubscribeStreamJsonEvents(\n session: IInteractiveSession,\n handlers: IStreamJsonHandlers,\n): void {\n session.off('text_delta', handlers.onTextDelta);\n session.off('background_task_event', handlers.onBackgroundTaskEvent);\n session.off('background_job_group_event', handlers.onBackgroundJobGroupEvent);\n session.off('complete', handlers.onComplete);\n session.off('interrupted', handlers.onInterrupted);\n session.off('error', handlers.onError);\n}\n","import { executeSlashCommandIfPresent, subscribeStreamJsonEvents } from './headless-stream-json.js';\n\nimport type { IInteractiveSession, IExecutionResult } from '@robota-sdk/agent-framework';\n\nexport type TOutputFormat = 'text' | 'json' | 'stream-json';\n\nexport interface IHeadlessRunnerOptions {\n session: IInteractiveSession;\n outputFormat: TOutputFormat;\n}\n\nexport function createHeadlessRunner(options: IHeadlessRunnerOptions): {\n run: (prompt: string) => Promise<number>;\n} {\n const { session, outputFormat } = options;\n return {\n run: (prompt: string): Promise<number> => {\n if (outputFormat === 'text') return runTextFormat(session, prompt);\n if (outputFormat === 'json') return runJsonFormat(session, prompt);\n return runStreamJsonFormat(session, prompt);\n },\n };\n}\n\nexport function writeJsonResult(\n sessionId: string,\n result: string,\n subtype: 'success' | 'error',\n): void {\n const output = JSON.stringify({ type: 'result', result, session_id: sessionId, subtype });\n process.stdout.write(output + '\\n');\n}\n\nexport function getSessionId(session: IInteractiveSession): string {\n try {\n return session.getSession().getSessionId();\n } catch {\n // allow-fallback: session may not be initialized yet\n return '';\n }\n}\n\nfunction runTextFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = (): void => {\n session.off('complete', onComplete);\n session.off('interrupted', onInterrupted);\n session.off('error', onError);\n };\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n process.stdout.write(result.response + '\\n');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n if (result.response) process.stdout.write(result.response + '\\n');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n resolve(1);\n };\n\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n process.stdout.write(cmd.result.message + '\\n');\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n\nfunction runJsonFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = (): void => {\n session.off('complete', onComplete);\n session.off('interrupted', onInterrupted);\n session.off('error', onError);\n };\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n writeJsonResult(getSessionId(session), '', 'error');\n resolve(1);\n };\n\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n writeJsonResult(\n getSessionId(session),\n cmd.result.message,\n cmd.result.success ? 'success' : 'error',\n );\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n\nfunction runStreamJsonFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = subscribeStreamJsonEvents(session, getSessionId, writeJsonResult, resolve);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n writeJsonResult(\n getSessionId(session),\n cmd.result.message,\n cmd.result.success ? 'success' : 'error',\n );\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n","/**\n * ITransportAdapter implementation for headless transport.\n *\n * Wraps createHeadlessRunner into the unified ITransportAdapter interface.\n * After start() completes, getExitCode() returns the runner's exit code.\n */\n\nimport { createHeadlessRunner } from './headless-runner.js';\n\nimport type { TOutputFormat } from './headless-runner.js';\nimport type { IInteractiveSession } from '@robota-sdk/agent-framework';\nimport type { ITransportAdapter } from '@robota-sdk/agent-interface-transport';\n\nexport interface IHeadlessTransportOptions {\n /** Output format: 'text', 'json', or 'stream-json'. */\n outputFormat: TOutputFormat;\n /** The prompt to execute. */\n prompt: string;\n}\n\nexport function createHeadlessTransport(\n options: IHeadlessTransportOptions,\n): ITransportAdapter<IInteractiveSession> & { getExitCode(): number } {\n let session: IInteractiveSession | null = null;\n let exitCode = 0;\n\n return {\n name: 'headless',\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 runner = createHeadlessRunner({ session, outputFormat: options.outputFormat });\n exitCode = await runner.run(options.prompt);\n },\n async stop() {\n /* no-op: headless runner completes in start() */\n },\n getExitCode() {\n return exitCode;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ const e=require(`./chunk-Bmb41Sf3.cjs`);let t=require(`node:readline`);t=e.t(t,1);let n=require(`node:crypto`);var r=class{write(e){process.stdout.write(e)}writeLine(e){process.stdout.write(e+`
2
+ `)}writeMarkdown(e){process.stdout.write(e)}writeError(e){process.stderr.write(e+`
3
+ `)}prompt(e){return new Promise(n=>{let r=t.createInterface({input:process.stdin,output:process.stdout,terminal:!1,historySize:0});r.question(e,e=>{r.close(),n(e)})})}async select(e,t=0){for(let n=0;n<e.length;n++){let r=n===t?`>`:` `;process.stdout.write(` ${r} ${n+1}) ${e[n]}\n`)}let n=(await this.prompt(` Choose [1-${e.length}] (default: ${e[t]}): `)).trim().toLowerCase();if(n===``)return t;let r=parseInt(n,10);return!isNaN(r)&&r>=1&&r<=e.length?r-1:t}spinner(e){return{stop(){},update(){}}}};const i=(e,t=!1)=>new Promise((n,r)=>{process.stdout.write(e);let i=``,a=process.stdin,o=a.isRaw;if(!a.isTTY){r(Error(`Cannot prompt for input: stdin is not a TTY.
4
+ Set your API key via environment variable instead:
5
+ ANTHROPIC_API_KEY=<key> robota
6
+ OPENAI_API_KEY=<key> robota`));return}a.setRawMode(!0),a.resume(),a.setEncoding(`utf8`);let s=e=>{for(let r of e)if(r===`\r`||r===`
7
+ `){a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
8
+ `),n(i.trim());return}else r===``||r===`\b`?i.length>0&&(i=i.slice(0,-1),process.stdout.write(`\b \b`)):r===``?(a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
9
+ `),process.exit(0)):r.charCodeAt(0)>=32&&(i+=r,process.stdout.write(t?`*`:r))};a.on(`data`,s)});function a(e){let t=e.trimStart();if(!t.startsWith(`/`))return null;let[n=``,...r]=t.slice(1).split(/\s+/);return n.length===0?null:{name:n,args:r.join(` `)}}async function o(e,t){let n=a(t);if(!n)return{kind:`not-slash`};let r=await e.executeCommand(n.name,n.args);return r?r.effects?.some(e=>e.type===`session-execution-started`)?{kind:`session-execution`}:{kind:`command-result`,result:r}:{kind:`command-result`,result:{message:`Unknown command "/${n.name}".`,success:!1}}}function s(e,t,r){let i=JSON.stringify({type:`stream_event`,event:r,session_id:t(e),uuid:(0,n.randomUUID)()});process.stdout.write(i+`
10
+ `)}function c(e,t,n,r){let i=n=>s(e,t,n),a=e=>i({type:`content_block_delta`,delta:{type:`text_delta`,text:e}}),o=e=>i({type:`background_task_event`,background_task_event:e}),c=e=>i({type:`background_job_group_event`,background_job_group_event:e}),u=()=>l(e,{onTextDelta:a,onBackgroundTaskEvent:o,onBackgroundJobGroupEvent:c,onComplete:d,onInterrupted:f,onError:p}),d=i=>{u(),n(t(e),i.response,`success`),r(0)},f=i=>{u(),n(t(e),i.response,`success`),r(0)},p=i=>{u(),n(t(e),``,`error`),r(1)};return e.on(`text_delta`,a),e.on(`background_task_event`,o),e.on(`background_job_group_event`,c),e.on(`complete`,d),e.on(`interrupted`,f),e.on(`error`,p),u}function l(e,t){e.off(`text_delta`,t.onTextDelta),e.off(`background_task_event`,t.onBackgroundTaskEvent),e.off(`background_job_group_event`,t.onBackgroundJobGroupEvent),e.off(`complete`,t.onComplete),e.off(`interrupted`,t.onInterrupted),e.off(`error`,t.onError)}function u(e){let{session:t,outputFormat:n}=e;return{run:e=>n===`text`?p(t,e):n===`json`?m(t,e):h(t,e)}}function d(e,t,n){let r=JSON.stringify({type:`result`,result:t,session_id:e,subtype:n});process.stdout.write(r+`
11
+ `)}function f(e){try{return e.getSession().getSessionId()}catch{return``}}function p(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,s)},i=e=>{r(),process.stdout.write(e.response+`
12
+ `),n(0)},a=e=>{r(),e.response&&process.stdout.write(e.response+`
13
+ `),n(0)},s=e=>{r(),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,s),o(e,t).then(i=>{if(i.kind===`command-result`){r(),process.stdout.write(i.result.message+`
14
+ `),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function m(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,s)},i=t=>{r(),d(f(e),t.response,`success`),n(0)},a=t=>{r(),d(f(e),t.response,`success`),n(0)},s=t=>{r(),d(f(e),``,`error`),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,s),o(e,t).then(i=>{if(i.kind===`command-result`){r(),d(f(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function h(e,t){return new Promise(n=>{let r=c(e,f,d,n);o(e,t).then(i=>{if(i.kind===`command-result`){r(),d(f(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function g(e){let t=null,n=0;return{name:`headless`,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);n=await u({session:t,outputFormat:e.outputFormat}).run(e.prompt)},async stop(){},getExitCode(){return n}}}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return g}});
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../http-CuQE6V6t.cjs`);exports.createAgentRoutes=e.n,exports.createHttpTransport=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../http-Da6Kw4oy.cjs`);exports.createAgentRoutes=e.n,exports.createHttpTransport=e.t;
@@ -1,2 +1,2 @@
1
- import { a as createAgentRoutes, i as TSessionFactory, n as createHttpTransport, r as IAgentRoutesOptions, t as IHttpTransportOptions } from "../index-nBlMTFkZ.js";
1
+ import { a as createAgentRoutes, i as TSessionFactory, n as createHttpTransport, r as IAgentRoutesOptions, t as IHttpTransportOptions } from "../index-DOA2KIYt.js";
2
2
  export { type IAgentRoutesOptions, type IHttpTransportOptions, type TSessionFactory, createAgentRoutes, createHttpTransport };
@@ -1 +1 @@
1
- import{n as e,t}from"../http-DwO1AHG-.js";export{e as createAgentRoutes,t as createHttpTransport};
1
+ import{n as e,t}from"../http-Br10Ps8m.js";export{e as createAgentRoutes,t as createHttpTransport};
@@ -1,2 +1,2 @@
1
1
  import{Hono as e}from"hono";import{streamSSE as t}from"hono/streaming";function n(n){let{sessionFactory:r}=n,i=new e;return i.post(`/submit`,async e=>{let n=await r(e),i=await e.req.json();return!i.prompt||typeof i.prompt!=`string`?e.json({error:`prompt is required`},400):t(e,async e=>{let t=[],r=(e,r)=>{n.on(e,r),t.push(()=>n.off(e,r))},a=!1,o=new Promise(t=>{r(`text_delta`,t=>{e.writeSSE({event:`text_delta`,data:JSON.stringify({delta:t})})}),r(`tool_start`,t=>{e.writeSSE({event:`tool_start`,data:JSON.stringify(t)})}),r(`tool_end`,t=>{e.writeSSE({event:`tool_end`,data:JSON.stringify(t)})}),r(`thinking`,n=>{e.writeSSE({event:`thinking`,data:JSON.stringify({isThinking:n})}),!n&&a&&t()}),r(`complete`,t=>{a=!0,e.writeSSE({event:`complete`,data:JSON.stringify(t)})}),r(`interrupted`,t=>{a=!0,e.writeSSE({event:`interrupted`,data:JSON.stringify(t)})}),r(`error`,t=>{a=!0,e.writeSSE({event:`error`,data:JSON.stringify({message:t.message})})})});await n.submit(i.prompt),await o;for(let e of t)e()})}),i.post(`/command`,async e=>{let t=await r(e),n=await e.req.json();if(!n.name||typeof n.name!=`string`)return e.json({error:`name is required`},400);let i=await t.executeCommand(n.name,n.args??``);return i?e.json(i):e.json({error:`Unknown command: ${n.name}`},404)}),i.post(`/abort`,async e=>((await r(e)).abort(),e.json({ok:!0}))),i.post(`/cancel-queue`,async e=>((await r(e)).cancelQueue(),e.json({ok:!0}))),i.get(`/messages`,async e=>{let t=await r(e);return e.json(t.getMessages())}),i.get(`/context`,async e=>{let t=await r(e);return e.json(t.getContextState())}),i.get(`/executing`,async e=>{let t=await r(e);return e.json({executing:t.isExecuting()})}),i.get(`/pending`,async e=>{let t=await r(e);return e.json({pending:t.getPendingPrompt()})}),i}function r(e){let t=null,r=null;return{name:`http`,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);r=n({sessionFactory:()=>t})},async stop(){r=null},getApp(){if(!r)throw Error(`Transport not started. Call start() first.`);return r}}}export{n,r as t};
2
- //# sourceMappingURL=http-DwO1AHG-.js.map
2
+ //# sourceMappingURL=http-Br10Ps8m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-Br10Ps8m.js","names":[],"sources":["../../src/http/routes.ts","../../src/http/http-transport.ts"],"sourcesContent":["/**\n * HTTP transport adapter — exposes IInteractiveSession over REST API.\n *\n * Built on Hono for Cloudflare Workers + Node.js + AWS Lambda compatibility.\n * Each endpoint maps 1:1 to an IInteractiveSession API method.\n */\n\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\n\nimport type { IInteractiveSession } from '@robota-sdk/agent-framework';\nimport type { Context } from 'hono';\n\n/** Callback that resolves an IInteractiveSession from the request context. */\nexport type TSessionFactory = (c: Context) => IInteractiveSession | Promise<IInteractiveSession>;\n\nexport interface IAgentRoutesOptions {\n /** Resolve an IInteractiveSession per request (e.g., by auth token, session ID). */\n sessionFactory: TSessionFactory;\n}\n\n/**\n * Create a Hono router with all agent HTTP endpoints.\n *\n * Usage:\n * ```typescript\n * const routes = createAgentRoutes({ sessionFactory });\n * app.route('/agent', routes); // mount on existing app\n * export default routes; // or use standalone (CF Workers)\n * ```\n */\nexport function createAgentRoutes(options: IAgentRoutesOptions): Hono {\n const { sessionFactory } = options;\n const app = new Hono();\n\n // POST /submit — execute prompt, stream events via SSE\n app.post('/submit', async (c) => {\n const session = await sessionFactory(c);\n const body = await c.req.json<{ prompt: string }>();\n\n if (!body.prompt || typeof body.prompt !== 'string') {\n return c.json({ error: 'prompt is required' }, 400);\n }\n\n return streamSSE(c, async (stream) => {\n const cleanup: Array<() => void> = [];\n\n const subscribe = <T>(event: string, handler: (data: T) => void): void => {\n session.on(event as 'text_delta', handler as () => void);\n cleanup.push(() => session.off(event as 'text_delta', handler as () => void));\n };\n\n let completed = false;\n const done = new Promise<void>((resolve) => {\n subscribe('text_delta', (delta: string) => {\n stream.writeSSE({ event: 'text_delta', data: JSON.stringify({ delta }) });\n });\n\n subscribe('tool_start', (state) => {\n stream.writeSSE({ event: 'tool_start', data: JSON.stringify(state) });\n });\n\n subscribe('tool_end', (state) => {\n stream.writeSSE({ event: 'tool_end', data: JSON.stringify(state) });\n });\n\n subscribe('thinking', (isThinking: boolean) => {\n stream.writeSSE({ event: 'thinking', data: JSON.stringify({ isThinking }) });\n if (!isThinking && completed) {\n resolve();\n }\n });\n\n subscribe('complete', (result) => {\n completed = true;\n stream.writeSSE({ event: 'complete', data: JSON.stringify(result) });\n });\n\n subscribe('interrupted', (result) => {\n completed = true;\n stream.writeSSE({ event: 'interrupted', data: JSON.stringify(result) });\n });\n\n subscribe('error', (error: Error) => {\n completed = true;\n stream.writeSSE({ event: 'error', data: JSON.stringify({ message: error.message }) });\n });\n });\n\n await session.submit(body.prompt);\n await done;\n\n for (const fn of cleanup) fn();\n });\n });\n\n // POST /command — execute system command\n app.post('/command', async (c) => {\n const session = await sessionFactory(c);\n const body = await c.req.json<{ name: string; args?: string }>();\n\n if (!body.name || typeof body.name !== 'string') {\n return c.json({ error: 'name is required' }, 400);\n }\n\n const result = await session.executeCommand(body.name, body.args ?? '');\n if (!result) {\n return c.json({ error: `Unknown command: ${body.name}` }, 404);\n }\n return c.json(result);\n });\n\n // POST /abort — abort current execution\n app.post('/abort', async (c) => {\n const session = await sessionFactory(c);\n session.abort();\n return c.json({ ok: true });\n });\n\n // POST /cancel-queue — cancel queued prompt\n app.post('/cancel-queue', async (c) => {\n const session = await sessionFactory(c);\n session.cancelQueue();\n return c.json({ ok: true });\n });\n\n // GET /messages — get message history\n app.get('/messages', async (c) => {\n const session = await sessionFactory(c);\n return c.json(session.getMessages());\n });\n\n // GET /context — get context window state\n app.get('/context', async (c) => {\n const session = await sessionFactory(c);\n return c.json(session.getContextState());\n });\n\n // GET /executing — check if currently executing\n app.get('/executing', async (c) => {\n const session = await sessionFactory(c);\n return c.json({ executing: session.isExecuting() });\n });\n\n // GET /pending — get pending queued prompt\n app.get('/pending', async (c) => {\n const session = await sessionFactory(c);\n return c.json({ pending: session.getPendingPrompt() });\n });\n\n return app;\n}\n","/**\n * ITransportAdapter implementation for HTTP transport.\n *\n * Wraps createAgentRoutes into the unified ITransportAdapter interface\n * while exposing the underlying Hono app via getApp().\n */\n\nimport { createAgentRoutes } from './routes.js';\n\nimport type { IInteractiveSession } from '@robota-sdk/agent-framework';\nimport type { ITransportAdapter } from '@robota-sdk/agent-interface-transport';\nimport type { Hono } from 'hono';\n\nexport interface IHttpTransportOptions {\n /** Optional: base path prefix for routes. */\n basePath?: string;\n}\n\nexport function createHttpTransport(\n options?: IHttpTransportOptions,\n): ITransportAdapter<IInteractiveSession> & { getApp(): Hono } {\n let session: IInteractiveSession | null = null;\n let app: Hono | null = null;\n\n return {\n name: 'http',\n attach(s: IInteractiveSession) {\n session = s;\n },\n async start() {\n if (!session) throw new Error('No session attached. Call attach() first.');\n app = createAgentRoutes({ sessionFactory: () => session! });\n },\n async stop() {\n app = null;\n },\n getApp() {\n if (!app) throw new Error('Transport not started. Call start() first.');\n return app;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ require(`./chunk-Bmb41Sf3.cjs`);let e=require(`hono`),t=require(`hono/streaming`);function n(n){let{sessionFactory:r}=n,i=new e.Hono;return i.post(`/submit`,async e=>{let n=await r(e),i=await e.req.json();return!i.prompt||typeof i.prompt!=`string`?e.json({error:`prompt is required`},400):(0,t.streamSSE)(e,async e=>{let t=[],r=(e,r)=>{n.on(e,r),t.push(()=>n.off(e,r))},a=!1,o=new Promise(t=>{r(`text_delta`,t=>{e.writeSSE({event:`text_delta`,data:JSON.stringify({delta:t})})}),r(`tool_start`,t=>{e.writeSSE({event:`tool_start`,data:JSON.stringify(t)})}),r(`tool_end`,t=>{e.writeSSE({event:`tool_end`,data:JSON.stringify(t)})}),r(`thinking`,n=>{e.writeSSE({event:`thinking`,data:JSON.stringify({isThinking:n})}),!n&&a&&t()}),r(`complete`,t=>{a=!0,e.writeSSE({event:`complete`,data:JSON.stringify(t)})}),r(`interrupted`,t=>{a=!0,e.writeSSE({event:`interrupted`,data:JSON.stringify(t)})}),r(`error`,t=>{a=!0,e.writeSSE({event:`error`,data:JSON.stringify({message:t.message})})})});await n.submit(i.prompt),await o;for(let e of t)e()})}),i.post(`/command`,async e=>{let t=await r(e),n=await e.req.json();if(!n.name||typeof n.name!=`string`)return e.json({error:`name is required`},400);let i=await t.executeCommand(n.name,n.args??``);return i?e.json(i):e.json({error:`Unknown command: ${n.name}`},404)}),i.post(`/abort`,async e=>((await r(e)).abort(),e.json({ok:!0}))),i.post(`/cancel-queue`,async e=>((await r(e)).cancelQueue(),e.json({ok:!0}))),i.get(`/messages`,async e=>{let t=await r(e);return e.json(t.getMessages())}),i.get(`/context`,async e=>{let t=await r(e);return e.json(t.getContextState())}),i.get(`/executing`,async e=>{let t=await r(e);return e.json({executing:t.isExecuting()})}),i.get(`/pending`,async e=>{let t=await r(e);return e.json({pending:t.getPendingPrompt()})}),i}function r(e){let t=null,r=null;return{name:`http`,attach(e){t=e},async start(){if(!t)throw Error(`No session attached. Call attach() first.`);r=n({sessionFactory:()=>t})},async stop(){r=null},getApp(){if(!r)throw Error(`Transport not started. Call start() first.`);return r}}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
@@ -1,6 +1,6 @@
1
1
  import { IInteractiveSession } from "@robota-sdk/agent-framework";
2
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
2
  import { ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
4
 
5
5
  //#region src/mcp/mcp-server.d.ts
6
6
  interface IAgentMcpOptions {
@@ -44,4 +44,4 @@ declare function createMcpTransport(options: IMcpTransportOptions): ITransportAd
44
44
  };
45
45
  //#endregion
46
46
  export { createAgentMcpServer as i, createMcpTransport as n, IAgentMcpOptions as r, IMcpTransportOptions as t };
47
- //# sourceMappingURL=index-B_rcr14p.d.ts.map
47
+ //# sourceMappingURL=index-C5KNEBO9.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-B_rcr14p.d.ts","names":[],"sources":["../../src/mcp/mcp-server.ts","../../src/mcp/mcp-transport.ts"],"mappings":";;;;;UAYiB,gBAAA;EAIf;EAFA,IAAA;EAIS;EAFT,OAAA;EAIc;EAFd,OAAA,EAAS,mBAAmB;EAoBd;EAlBd,cAAA;AAAA;;;;;;AAkBqE;;;;AC1BvE;;;;;;iBD0BgB,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAM;;;UC1BtD,oBAAA;EDIf;ECFA,IAAA;EDIS;ECFT,OAAA;EDIc;ECFd,cAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,OAAA,EAAS,oBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,SAAA,IAAa,MAAA;AAAA"}
1
+ {"version":3,"file":"index-C5KNEBO9.d.ts","names":[],"sources":["../../src/mcp/mcp-server.ts","../../src/mcp/mcp-transport.ts"],"mappings":";;;;;UAaiB,gBAAA;EAIf;EAFA,IAAA;EAIS;EAFT,OAAA;EAIc;EAFd,OAAA,EAAS,mBAAmB;EAoBd;EAlBd,cAAA;AAAA;;;;;;AAkBqE;;;;AC1BvE;;;;;;iBD0BgB,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAM;;;UC1BtD,oBAAA;EDIf;ECFA,IAAA;EDIS;ECFT,OAAA;EDIc;ECFd,cAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,OAAA,EAAS,oBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,SAAA,IAAa,MAAA;AAAA"}
@@ -1,6 +1,6 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
1
2
  import { IInteractiveSession } from "@robota-sdk/agent-framework";
2
3
  import { ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
4
 
5
5
  //#region src/mcp/mcp-server.d.ts
6
6
  interface IAgentMcpOptions {
@@ -44,4 +44,4 @@ declare function createMcpTransport(options: IMcpTransportOptions): ITransportAd
44
44
  };
45
45
  //#endregion
46
46
  export { createAgentMcpServer as i, createMcpTransport as n, IAgentMcpOptions as r, IMcpTransportOptions as t };
47
- //# sourceMappingURL=index-Y0zHb1Bz.d.ts.map
47
+ //# sourceMappingURL=index-C7DvsmEg.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-Y0zHb1Bz.d.ts","names":[],"sources":["../../src/mcp/mcp-server.ts","../../src/mcp/mcp-transport.ts"],"mappings":";;;;;UAYiB,gBAAA;EAIf;EAFA,IAAA;EAIS;EAFT,OAAA;EAIc;EAFd,OAAA,EAAS,mBAAmB;EAoBd;EAlBd,cAAA;AAAA;;;;;;AAkBqE;;;;AC1BvE;;;;;;iBD0BgB,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAM;;;UC1BtD,oBAAA;EDIf;ECFA,IAAA;EDIS;ECFT,OAAA;EDIc;ECFd,cAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,OAAA,EAAS,oBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,SAAA,IAAa,MAAA;AAAA"}
1
+ {"version":3,"file":"index-C7DvsmEg.d.ts","names":[],"sources":["../../src/mcp/mcp-server.ts","../../src/mcp/mcp-transport.ts"],"mappings":";;;;;UAaiB,gBAAA;EAIf;EAFA,IAAA;EAIS;EAFT,OAAA;EAIc;EAFd,OAAA,EAAS,mBAAmB;EAoBd;EAlBd,cAAA;AAAA;;;;;;AAkBqE;;;;AC1BvE;;;;;;iBD0BgB,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAM;;;UC1BtD,oBAAA;EDIf;ECFA,IAAA;EDIS;ECFT,OAAA;EDIc;ECFd,cAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,OAAA,EAAS,oBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,SAAA,IAAa,MAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-C9LWCL4l.d.ts","names":[],"sources":["../../src/http/routes.ts","../../src/http/http-transport.ts"],"mappings":";;;;;;KAaY,eAAA,IAAmB,CAAA,EAAG,OAAA,KAAY,mBAAA,GAAsB,OAAA,CAAQ,mBAAA;AAAA,UAE3D,mBAAA;EAF0D;EAIzE,cAAA,EAAgB,eAAe;AAAA;;;;;;AAJ8D;AAE/F;;;;iBAegB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,IAAI;;;UCjBpD,qBAAA;EDA2D;ECE1E,QAAQ;AAAA;AAAA,iBAGM,mBAAA,CACd,OAAA,GAAU,qBAAA,GACT,iBAAA,CAAkB,mBAAA;EAAyB,MAAA,IAAU,IAAA;AAAA"}
1
+ {"version":3,"file":"index-C9LWCL4l.d.ts","names":[],"sources":["../../src/http/routes.ts","../../src/http/http-transport.ts"],"mappings":";;;;;;KAcY,eAAA,IAAmB,CAAA,EAAG,OAAA,KAAY,mBAAA,GAAsB,OAAA,CAAQ,mBAAA;AAAA,UAE3D,mBAAA;EAF0D;EAIzE,cAAA,EAAgB,eAAe;AAAA;;;;;;AAJ8D;AAE/F;;;;iBAegB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,IAAI;;;UClBpD,qBAAA;EDC2D;ECC1E,QAAQ;AAAA;AAAA,iBAGM,mBAAA,CACd,OAAA,GAAU,qBAAA,GACT,iBAAA,CAAkB,mBAAA;EAAyB,MAAA,IAAU,IAAA;AAAA"}
@@ -1,6 +1,21 @@
1
+ import { ISpinner, ITerminalOutput } from "@robota-sdk/agent-core";
1
2
  import { IInteractiveSession } from "@robota-sdk/agent-framework";
2
3
  import { ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
4
 
5
+ //#region src/headless/print-terminal.d.ts
6
+ declare class PrintTerminal implements ITerminalOutput {
7
+ write(text: string): void;
8
+ writeLine(text: string): void;
9
+ writeMarkdown(md: string): void;
10
+ writeError(text: string): void;
11
+ prompt(question: string): Promise<string>;
12
+ select(options: string[], initialIndex?: number): Promise<number>;
13
+ spinner(_message: string): ISpinner;
14
+ }
15
+ //#endregion
16
+ //#region src/headless/cli-input.d.ts
17
+ declare const promptInput: (label: string, masked?: boolean) => Promise<string>;
18
+ //#endregion
4
19
  //#region src/headless/headless-runner.d.ts
5
20
  type TOutputFormat = 'text' | 'json' | 'stream-json';
6
21
  interface IHeadlessRunnerOptions {
@@ -22,5 +37,5 @@ declare function createHeadlessTransport(options: IHeadlessTransportOptions): IT
22
37
  getExitCode(): number;
23
38
  };
24
39
  //#endregion
25
- export { createHeadlessRunner as a, TOutputFormat as i, createHeadlessTransport as n, IHeadlessRunnerOptions as r, IHeadlessTransportOptions as t };
26
- //# sourceMappingURL=index-k3TUjA-T.d.ts.map
40
+ export { createHeadlessRunner as a, TOutputFormat as i, createHeadlessTransport as n, promptInput as o, IHeadlessRunnerOptions as r, PrintTerminal as s, IHeadlessTransportOptions as t };
41
+ //# sourceMappingURL=index-CP7kaYMg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CP7kaYMg.d.ts","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts"],"mappings":";;;;;cAYa,aAAA,YAAyB,eAAA;EACpC,KAAA,CAAM,IAAA;EAGN,SAAA,CAAU,IAAA;EAGV,aAAA,CAAc,EAAA;EAGd,UAAA,CAAW,IAAA;EAGX,MAAA,CAAO,QAAA,WAAmB,OAAA;EAcpB,MAAA,CAAO,OAAA,YAAmB,YAAA,YAAmB,OAAA;EAcnD,OAAA,CAAQ,QAAA,WAAmB,QAAA;AAAA;;;cCnDhB,WAAA,GAAe,KAAA,UAAe,MAAA,eAAiB,OAAO;;;KCEvD,aAAA;AAAA,UAEK,sBAAA;EACf,OAAA,EAAS,mBAAA;EACT,YAAA,EAAc,aAAa;AAAA;AAAA,iBAGb,oBAAA,CAAqB,OAAA,EAAS,sBAAA;EAC5C,GAAA,GAAM,MAAA,aAAmB,OAAO;AAAA;;;UCCjB,yBAAA;EHwCY;EGtC3B,YAAA,EAAc,aAAa;EHHwB;EGKnD,MAAA;AAAA;AAAA,iBAGc,uBAAA,CACd,OAAA,EAAS,yBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,WAAA;AAAA"}
@@ -0,0 +1,67 @@
1
+ import { IProviderDefinition, TPermissionMode, TUniversalValue } from "@robota-sdk/agent-core";
2
+ import { CommandRegistry, IAgentRuntime, IInteractiveSession, IStatusLineCommandSettings, TShellExecFn, TStatusLineCommandSettingsPatch } from "@robota-sdk/agent-framework";
3
+ import { ITuiCommandInteraction, ITuiConfirmInteraction, ITuiPickerInteraction, ITuiPickerItem, TAnyTuiCommandInteraction, TOnMissingArgsAction } from "@robota-sdk/agent-interface-tui";
4
+ import { IConfigurableTransport } from "@robota-sdk/agent-interface-transport";
5
+
6
+ //#region src/tui/tui-cli-adapter.d.ts
7
+ interface ITuiCliAdapter {
8
+ getUserSettingsPath(): string;
9
+ readSettings(path: string): Record<string, TUniversalValue>;
10
+ writeSettings(path: string, settings: Record<string, TUniversalValue>): void;
11
+ deleteSettings(path: string): boolean;
12
+ applyStatusLineSettings(path: string, patch: TStatusLineCommandSettingsPatch): IStatusLineCommandSettings;
13
+ reloadPluginCommandSource(registry: CommandRegistry): void;
14
+ applyActiveModelChange(cwd: string, modelId: string, options?: {
15
+ providerOverride?: string;
16
+ }): {
17
+ applied: boolean;
18
+ };
19
+ getGitBranch(cwd: string): string | undefined;
20
+ getProviderDisplayName(type: string): string;
21
+ }
22
+ //#endregion
23
+ //#region src/tui/render.d.ts
24
+ interface ITuiRenderOptions {
25
+ runtime: IAgentRuntime;
26
+ providerOverride?: string | undefined;
27
+ providerType?: string | undefined;
28
+ modelId?: string;
29
+ language?: string;
30
+ permissionMode?: TPermissionMode;
31
+ maxTurns?: number;
32
+ version?: string;
33
+ resumeSessionId?: string;
34
+ showSessionPickerOnStart?: boolean;
35
+ forkSession?: boolean;
36
+ sessionName?: string;
37
+ shellExec?: TShellExecFn;
38
+ startupUpdateNotice?: Promise<string | undefined>;
39
+ cliAdapter: ITuiCliAdapter;
40
+ agentName?: string;
41
+ }
42
+ //#endregion
43
+ //#region src/tui/tui-transport.d.ts
44
+ declare class TuiTransport implements IConfigurableTransport<IInteractiveSession> {
45
+ readonly name = "tui";
46
+ readonly defaultEnabled = true;
47
+ readonly optionsSchema: {};
48
+ private readonly options;
49
+ constructor(options: ITuiRenderOptions);
50
+ attach(_session: IInteractiveSession): void;
51
+ start(): Promise<void>;
52
+ stop(): Promise<void>;
53
+ validateOptions(_options: Record<string, TUniversalValue>): boolean;
54
+ }
55
+ //#endregion
56
+ //#region src/tui/create-default-tui-cli-adapter.d.ts
57
+ interface IDefaultTuiCliAdapterOptions {
58
+ providerDefinitions: readonly IProviderDefinition[];
59
+ reloadPluginCommandSource: (registry: CommandRegistry) => void;
60
+ }
61
+ declare function createDefaultTuiCliAdapter({
62
+ providerDefinitions,
63
+ reloadPluginCommandSource
64
+ }: IDefaultTuiCliAdapterOptions): ITuiCliAdapter;
65
+ //#endregion
66
+ export { TAnyTuiCommandInteraction as a, createDefaultTuiCliAdapter as c, ITuiCliAdapter as d, ITuiPickerItem as i, TuiTransport as l, ITuiConfirmInteraction as n, TOnMissingArgsAction as o, ITuiPickerInteraction as r, IDefaultTuiCliAdapterOptions as s, ITuiCommandInteraction as t, ITuiRenderOptions as u };
67
+ //# sourceMappingURL=index-CQsMNXAh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CQsMNXAh.d.ts","names":[],"sources":["../../src/tui/tui-cli-adapter.ts","../../src/tui/render.tsx","../../src/tui/tui-transport.ts","../../src/tui/create-default-tui-cli-adapter.ts"],"mappings":";;;;;;UAOiB,cAAA;EACf,mBAAA;EACA,YAAA,CAAa,IAAA,WAAe,MAAA,SAAe,eAAA;EAC3C,aAAA,CAAc,IAAA,UAAc,QAAA,EAAU,MAAA,SAAe,eAAA;EACrD,cAAA,CAAe,IAAA;EACf,uBAAA,CACE,IAAA,UACA,KAAA,EAAO,+BAAA,GACN,0BAAA;EACH,yBAAA,CAA0B,QAAA,EAAU,eAAA;EACpC,sBAAA,CACE,GAAA,UACA,OAAA,UACA,OAAA;IAAY,gBAAA;EAAA;IACT,OAAA;EAAA;EACL,YAAA,CAAa,GAAA;EACb,sBAAA,CAAuB,IAAA;AAAA;;;UCTR,iBAAA;EACf,OAAA,EAAS,aAAA;EAET,gBAAA;EACA,YAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,WAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,mBAAA,GAAsB,OAAA;EACtB,UAAA,EAAY,cAAA;EACZ,SAAA;AAAA;;;cCzBW,YAAA,YAAwB,sBAAA,CAAuB,mBAAA;EAAA,SACjD,IAAA;EAAA,SACA,cAAA;EAAA,SACA,aAAA;EAAA,iBAEQ,OAAA;cAEL,OAAA,EAAS,iBAAA;EAIrB,MAAA,CAAO,QAAA,EAAU,mBAAA;EAIX,KAAA,CAAA,GAAS,OAAA;EAIT,IAAA,CAAA,GAAQ,OAAA;EAId,eAAA,CAAgB,QAAA,EAAU,MAAA,SAAe,eAAA;AAAA;;;UCd1B,4BAAA;EACf,mBAAA,WAA8B,mBAAA;EAC9B,yBAAA,GAA4B,QAAA,EAAU,eAAe;AAAA;AAAA,iBAGvC,0BAAA,CAAA;EACd,mBAAA;EACA;AAAA,GACC,4BAAA,GAA+B,cAAA"}
@@ -1,5 +1,5 @@
1
- import { IInteractiveSession } from "@robota-sdk/agent-framework";
2
1
  import { Context, Hono } from "hono";
2
+ import { IInteractiveSession } from "@robota-sdk/agent-framework";
3
3
  import { ITransportAdapter } from "@robota-sdk/agent-interface-transport";
4
4
 
5
5
  //#region src/http/routes.d.ts
@@ -31,4 +31,4 @@ declare function createHttpTransport(options?: IHttpTransportOptions): ITranspor
31
31
  };
32
32
  //#endregion
33
33
  export { createAgentRoutes as a, TSessionFactory as i, createHttpTransport as n, IAgentRoutesOptions as r, IHttpTransportOptions as t };
34
- //# sourceMappingURL=index-nBlMTFkZ.d.ts.map
34
+ //# sourceMappingURL=index-DOA2KIYt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-nBlMTFkZ.d.ts","names":[],"sources":["../../src/http/routes.ts","../../src/http/http-transport.ts"],"mappings":";;;;;;KAaY,eAAA,IAAmB,CAAA,EAAG,OAAA,KAAY,mBAAA,GAAsB,OAAA,CAAQ,mBAAA;AAAA,UAE3D,mBAAA;EAF0D;EAIzE,cAAA,EAAgB,eAAe;AAAA;;;;;;AAJ8D;AAE/F;;;;iBAegB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,IAAI;;;UCjBpD,qBAAA;EDA2D;ECE1E,QAAQ;AAAA;AAAA,iBAGM,mBAAA,CACd,OAAA,GAAU,qBAAA,GACT,iBAAA,CAAkB,mBAAA;EAAyB,MAAA,IAAU,IAAA;AAAA"}
1
+ {"version":3,"file":"index-DOA2KIYt.d.ts","names":[],"sources":["../../src/http/routes.ts","../../src/http/http-transport.ts"],"mappings":";;;;;;KAcY,eAAA,IAAmB,CAAA,EAAG,OAAA,KAAY,mBAAA,GAAsB,OAAA,CAAQ,mBAAA;AAAA,UAE3D,mBAAA;EAF0D;EAIzE,cAAA,EAAgB,eAAe;AAAA;;;;;;AAJ8D;AAE/F;;;;iBAegB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,IAAI;;;UClBpD,qBAAA;EDC2D;ECC1E,QAAQ;AAAA;AAAA,iBAGM,mBAAA,CACd,OAAA,GAAU,qBAAA,GACT,iBAAA,CAAkB,mBAAA;EAAyB,MAAA,IAAU,IAAA;AAAA"}
@@ -1,6 +1,21 @@
1
+ import { ISpinner, ITerminalOutput } from "@robota-sdk/agent-core";
1
2
  import { IInteractiveSession } from "@robota-sdk/agent-framework";
2
3
  import { ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
4
 
5
+ //#region src/headless/print-terminal.d.ts
6
+ declare class PrintTerminal implements ITerminalOutput {
7
+ write(text: string): void;
8
+ writeLine(text: string): void;
9
+ writeMarkdown(md: string): void;
10
+ writeError(text: string): void;
11
+ prompt(question: string): Promise<string>;
12
+ select(options: string[], initialIndex?: number): Promise<number>;
13
+ spinner(_message: string): ISpinner;
14
+ }
15
+ //#endregion
16
+ //#region src/headless/cli-input.d.ts
17
+ declare const promptInput: (label: string, masked?: boolean) => Promise<string>;
18
+ //#endregion
4
19
  //#region src/headless/headless-runner.d.ts
5
20
  type TOutputFormat = 'text' | 'json' | 'stream-json';
6
21
  interface IHeadlessRunnerOptions {
@@ -22,5 +37,5 @@ declare function createHeadlessTransport(options: IHeadlessTransportOptions): IT
22
37
  getExitCode(): number;
23
38
  };
24
39
  //#endregion
25
- export { createHeadlessRunner as a, TOutputFormat as i, createHeadlessTransport as n, IHeadlessRunnerOptions as r, IHeadlessTransportOptions as t };
26
- //# sourceMappingURL=index-D34WUfFH.d.ts.map
40
+ export { createHeadlessRunner as a, TOutputFormat as i, createHeadlessTransport as n, promptInput as o, IHeadlessRunnerOptions as r, PrintTerminal as s, IHeadlessTransportOptions as t };
41
+ //# sourceMappingURL=index-Gby9H4q2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Gby9H4q2.d.ts","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts"],"mappings":";;;;;cAYa,aAAA,YAAyB,eAAA;EACpC,KAAA,CAAM,IAAA;EAGN,SAAA,CAAU,IAAA;EAGV,aAAA,CAAc,EAAA;EAGd,UAAA,CAAW,IAAA;EAGX,MAAA,CAAO,QAAA,WAAmB,OAAA;EAcpB,MAAA,CAAO,OAAA,YAAmB,YAAA,YAAmB,OAAA;EAcnD,OAAA,CAAQ,QAAA,WAAmB,QAAA;AAAA;;;cCnDhB,WAAA,GAAe,KAAA,UAAe,MAAA,eAAiB,OAAO;;;KCEvD,aAAA;AAAA,UAEK,sBAAA;EACf,OAAA,EAAS,mBAAA;EACT,YAAA,EAAc,aAAa;AAAA;AAAA,iBAGb,oBAAA,CAAqB,OAAA,EAAS,sBAAA;EAC5C,GAAA,GAAM,MAAA,aAAmB,OAAO;AAAA;;;UCCjB,yBAAA;EHwCY;EGtC3B,YAAA,EAAc,aAAa;EHHwB;EGKnD,MAAA;AAAA;AAAA,iBAGc,uBAAA,CACd,OAAA,EAAS,yBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,WAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { IBackgroundJobGroupState, IBackgroundTaskInput, IBackgroundTaskListFilter, IBackgroundTaskLogCursor, IBackgroundTaskLogPage, IBackgroundTaskState, ICommandResult, IExecutionResult, IExecutionWorkspaceEntry, IExecutionWorkspaceSnapshot, IExecutionWorkspaceSnapshot as IExecutionWorkspaceSnapshot$1, IInteractiveSession, IToolState, InteractiveSession, TBackgroundJobGroupEvent, TBackgroundTaskEvent, TExecutionAttention, TExecutionWorkspaceStatus } from "@robota-sdk/agent-framework";
2
1
  import { TUniversalValue } from "@robota-sdk/agent-core";
2
+ import { IBackgroundJobGroupState, IBackgroundTaskInput, IBackgroundTaskListFilter, IBackgroundTaskLogCursor, IBackgroundTaskLogPage, IBackgroundTaskState, ICommandResult, IExecutionResult, IExecutionWorkspaceEntry, IExecutionWorkspaceSnapshot, IExecutionWorkspaceSnapshot as IExecutionWorkspaceSnapshot$1, IInteractiveSession, IToolState, InteractiveSession, TBackgroundJobGroupEvent, TBackgroundTaskEvent, TExecutionAttention, TExecutionWorkspaceStatus } from "@robota-sdk/agent-framework";
3
3
  import { IConfigurableTransport, ITransportAdapter } from "@robota-sdk/agent-interface-transport";
4
4
 
5
5
  //#region src/ws/ws-protocol.d.ts
@@ -210,4 +210,4 @@ declare class WsTransport implements IConfigurableTransport<IInteractiveSession>
210
210
  }
211
211
  //#endregion
212
212
  export { IWsTransportConfig as a, createWsTransport as c, TClientMessage as d, TServerMessage as f, TExecutionWorkspaceStatus as i, IWsHandlerOptions as l, IExecutionWorkspaceSnapshot$1 as n, WsTransport as o, TExecutionAttention as r, IWsTransportOptions as s, IExecutionWorkspaceEntry as t, createWsHandler as u };
213
- //# sourceMappingURL=index-CvXLpjJO.d.ts.map
213
+ //# sourceMappingURL=index-X2Zg8FEY.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CEs25wVk.d.ts","names":[],"sources":["../../src/ws/ws-protocol.ts","../../src/ws/ws-handler.ts","../../src/ws/ws-transport.ts","../../src/ws/ws-transport-configurable.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index-X2Zg8FEY.d.ts","names":[],"sources":["../../src/ws/ws-protocol.ts","../../src/ws/ws-handler.ts","../../src/ws/ws-transport.ts","../../src/ws/ws-transport-configurable.ts"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { IProviderDefinition, TPermissionMode, TUniversalValue } from "@robota-sdk/agent-core";
2
+ import { CommandRegistry, IAgentRuntime, IInteractiveSession, IStatusLineCommandSettings, TShellExecFn, TStatusLineCommandSettingsPatch } from "@robota-sdk/agent-framework";
3
+ import { IConfigurableTransport } from "@robota-sdk/agent-interface-transport";
4
+ import { ITuiCommandInteraction, ITuiConfirmInteraction, ITuiPickerInteraction, ITuiPickerItem, TAnyTuiCommandInteraction, TOnMissingArgsAction } from "@robota-sdk/agent-interface-tui";
5
+
6
+ //#region src/tui/tui-cli-adapter.d.ts
7
+ interface ITuiCliAdapter {
8
+ getUserSettingsPath(): string;
9
+ readSettings(path: string): Record<string, TUniversalValue>;
10
+ writeSettings(path: string, settings: Record<string, TUniversalValue>): void;
11
+ deleteSettings(path: string): boolean;
12
+ applyStatusLineSettings(path: string, patch: TStatusLineCommandSettingsPatch): IStatusLineCommandSettings;
13
+ reloadPluginCommandSource(registry: CommandRegistry): void;
14
+ applyActiveModelChange(cwd: string, modelId: string, options?: {
15
+ providerOverride?: string;
16
+ }): {
17
+ applied: boolean;
18
+ };
19
+ getGitBranch(cwd: string): string | undefined;
20
+ getProviderDisplayName(type: string): string;
21
+ }
22
+ //#endregion
23
+ //#region src/tui/render.d.ts
24
+ interface ITuiRenderOptions {
25
+ runtime: IAgentRuntime;
26
+ providerOverride?: string | undefined;
27
+ providerType?: string | undefined;
28
+ modelId?: string;
29
+ language?: string;
30
+ permissionMode?: TPermissionMode;
31
+ maxTurns?: number;
32
+ version?: string;
33
+ resumeSessionId?: string;
34
+ showSessionPickerOnStart?: boolean;
35
+ forkSession?: boolean;
36
+ sessionName?: string;
37
+ shellExec?: TShellExecFn;
38
+ startupUpdateNotice?: Promise<string | undefined>;
39
+ cliAdapter: ITuiCliAdapter;
40
+ agentName?: string;
41
+ }
42
+ //#endregion
43
+ //#region src/tui/tui-transport.d.ts
44
+ declare class TuiTransport implements IConfigurableTransport<IInteractiveSession> {
45
+ readonly name = "tui";
46
+ readonly defaultEnabled = true;
47
+ readonly optionsSchema: {};
48
+ private readonly options;
49
+ constructor(options: ITuiRenderOptions);
50
+ attach(_session: IInteractiveSession): void;
51
+ start(): Promise<void>;
52
+ stop(): Promise<void>;
53
+ validateOptions(_options: Record<string, TUniversalValue>): boolean;
54
+ }
55
+ //#endregion
56
+ //#region src/tui/create-default-tui-cli-adapter.d.ts
57
+ interface IDefaultTuiCliAdapterOptions {
58
+ providerDefinitions: readonly IProviderDefinition[];
59
+ reloadPluginCommandSource: (registry: CommandRegistry) => void;
60
+ }
61
+ declare function createDefaultTuiCliAdapter({
62
+ providerDefinitions,
63
+ reloadPluginCommandSource
64
+ }: IDefaultTuiCliAdapterOptions): ITuiCliAdapter;
65
+ //#endregion
66
+ export { TAnyTuiCommandInteraction as a, createDefaultTuiCliAdapter as c, ITuiCliAdapter as d, ITuiPickerItem as i, TuiTransport as l, ITuiConfirmInteraction as n, TOnMissingArgsAction as o, ITuiPickerInteraction as r, IDefaultTuiCliAdapterOptions as s, ITuiCommandInteraction as t, ITuiRenderOptions as u };
67
+ //# sourceMappingURL=index-rGmGTQ9o.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-rGmGTQ9o.d.ts","names":[],"sources":["../../src/tui/tui-cli-adapter.ts","../../src/tui/render.tsx","../../src/tui/tui-transport.ts","../../src/tui/create-default-tui-cli-adapter.ts"],"mappings":";;;;;;UAOiB,cAAA;EACf,mBAAA;EACA,YAAA,CAAa,IAAA,WAAe,MAAA,SAAe,eAAA;EAC3C,aAAA,CAAc,IAAA,UAAc,QAAA,EAAU,MAAA,SAAe,eAAA;EACrD,cAAA,CAAe,IAAA;EACf,uBAAA,CACE,IAAA,UACA,KAAA,EAAO,+BAAA,GACN,0BAAA;EACH,yBAAA,CAA0B,QAAA,EAAU,eAAA;EACpC,sBAAA,CACE,GAAA,UACA,OAAA,UACA,OAAA;IAAY,gBAAA;EAAA;IACT,OAAA;EAAA;EACL,YAAA,CAAa,GAAA;EACb,sBAAA,CAAuB,IAAA;AAAA;;;UCTR,iBAAA;EACf,OAAA,EAAS,aAAA;EAET,gBAAA;EACA,YAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,WAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,mBAAA,GAAsB,OAAA;EACtB,UAAA,EAAY,cAAA;EACZ,SAAA;AAAA;;;cCzBW,YAAA,YAAwB,sBAAA,CAAuB,mBAAA;EAAA,SACjD,IAAA;EAAA,SACA,cAAA;EAAA,SACA,aAAA;EAAA,iBAEQ,OAAA;cAEL,OAAA,EAAS,iBAAA;EAIrB,MAAA,CAAO,QAAA,EAAU,mBAAA;EAIX,KAAA,CAAA,GAAS,OAAA;EAIT,IAAA,CAAA,GAAQ,OAAA;EAId,eAAA,CAAgB,QAAA,EAAU,MAAA,SAAe,eAAA;AAAA;;;UCd1B,4BAAA;EACf,mBAAA,WAA8B,mBAAA;EAC9B,yBAAA,GAA4B,QAAA,EAAU,eAAe;AAAA;AAAA,iBAGvC,0BAAA,CAAA;EACd,mBAAA;EACA;AAAA,GACC,4BAAA,GAA+B,cAAA"}
@@ -1,6 +1,6 @@
1
+ import { TUniversalValue } from "@robota-sdk/agent-core";
1
2
  import { IBackgroundJobGroupState, IBackgroundTaskInput, IBackgroundTaskListFilter, IBackgroundTaskLogCursor, IBackgroundTaskLogPage, IBackgroundTaskState, ICommandResult, IExecutionResult, IExecutionWorkspaceEntry, IExecutionWorkspaceSnapshot, IExecutionWorkspaceSnapshot as IExecutionWorkspaceSnapshot$1, IInteractiveSession, IToolState, InteractiveSession, TBackgroundJobGroupEvent, TBackgroundTaskEvent, TExecutionAttention, TExecutionWorkspaceStatus } from "@robota-sdk/agent-framework";
2
3
  import { IConfigurableTransport, ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
- import { TUniversalValue } from "@robota-sdk/agent-core";
4
4
 
5
5
  //#region src/ws/ws-protocol.d.ts
6
6
  type TBackgroundControlAction = 'cancel' | 'close' | 'send';
@@ -210,4 +210,4 @@ declare class WsTransport implements IConfigurableTransport<IInteractiveSession>
210
210
  }
211
211
  //#endregion
212
212
  export { IWsTransportConfig as a, createWsTransport as c, TClientMessage as d, TServerMessage as f, TExecutionWorkspaceStatus as i, IWsHandlerOptions as l, IExecutionWorkspaceSnapshot$1 as n, WsTransport as o, TExecutionAttention as r, IWsTransportOptions as s, IExecutionWorkspaceEntry as t, createWsHandler as u };
213
- //# sourceMappingURL=index-CEs25wVk.d.ts.map
213
+ //# sourceMappingURL=index-yvGShbDx.d.ts.map