@robota-sdk/agent-transport 3.0.0-beta.75 → 3.0.0-beta.77

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 (231) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +17 -14
  3. package/dist/node/headless/index.cjs +1 -1
  4. package/dist/node/headless/index.d.ts +1 -1
  5. package/dist/node/headless/index.js +1 -1
  6. package/dist/node/{headless-mRYilLfC.js → headless-DG_MEbf0.js} +7 -4
  7. package/dist/node/headless-DG_MEbf0.js.map +1 -0
  8. package/dist/node/headless-xq77JBq0.cjs +18 -0
  9. package/dist/node/{index-E8Gx4-lc.d.ts → index-CrJ2Lhn3.d.ts} +16 -3
  10. package/dist/node/index-CrJ2Lhn3.d.ts.map +1 -0
  11. package/dist/node/index-JIvzrtaA.d.ts +52 -0
  12. package/dist/node/index-JIvzrtaA.d.ts.map +1 -0
  13. package/dist/node/{index-CYl7ksS6.d.ts → index-JTD_xtEQ.d.ts} +15 -2
  14. package/dist/node/index-JTD_xtEQ.d.ts.map +1 -0
  15. package/dist/node/index-y_HBOfzO.d.ts +52 -0
  16. package/dist/node/index-y_HBOfzO.d.ts.map +1 -0
  17. package/dist/node/index.cjs +1 -1
  18. package/dist/node/index.d.ts +10 -9
  19. package/dist/node/index.d.ts.map +1 -1
  20. package/dist/node/index.js +1 -1
  21. package/dist/node/index.js.map +1 -1
  22. package/dist/node/programmatic/index.cjs +1 -0
  23. package/dist/node/programmatic/index.d.ts +2 -0
  24. package/dist/node/programmatic/index.js +1 -0
  25. package/dist/node/programmatic-6wLf68qJ.cjs +1 -0
  26. package/dist/node/programmatic-70dxIXtS.js +2 -0
  27. package/dist/node/programmatic-70dxIXtS.js.map +1 -0
  28. package/dist/node/testing/index.cjs +1 -1
  29. package/dist/node/testing/index.d.ts +2 -21
  30. package/dist/node/testing/index.js +1 -2
  31. package/package.json +15 -71
  32. package/src/__tests__/programmatic/programmatic-ask-user.test.ts +32 -0
  33. package/src/__tests__/programmatic/programmatic-driver.test.ts +107 -0
  34. package/src/__tests__/programmatic/programmatic-flows.test.ts +140 -0
  35. package/src/__tests__/transport-registry.stop-all.test.ts +53 -0
  36. package/src/headless/HeadlessInteractionChannel.ts +22 -5
  37. package/src/headless/__tests__/headless-goal-runner.test.ts +108 -0
  38. package/src/headless/__tests__/headless-runner.test.ts +2 -1
  39. package/src/headless/headless-runner.ts +67 -1
  40. package/src/headless/headless-stream-json.ts +1 -1
  41. package/src/headless/print-terminal.ts +1 -0
  42. package/src/index.ts +2 -5
  43. package/src/programmatic/ProgrammaticInteractionChannel.ts +82 -0
  44. package/src/programmatic/createProgrammaticAgent.ts +71 -0
  45. package/src/programmatic/index.ts +5 -0
  46. package/src/testing/index.ts +7 -4
  47. package/src/transport-registry.ts +15 -12
  48. package/dist/node/headless-CT2ibQnr.cjs +0 -15
  49. package/dist/node/headless-mRYilLfC.js.map +0 -1
  50. package/dist/node/http/index.cjs +0 -1
  51. package/dist/node/http/index.d.ts +0 -2
  52. package/dist/node/http/index.js +0 -1
  53. package/dist/node/http-2Jiuflc1.js +0 -2
  54. package/dist/node/http-2Jiuflc1.js.map +0 -1
  55. package/dist/node/http-CBAvefLw.cjs +0 -1
  56. package/dist/node/index-BNccqSpv.d.ts +0 -86
  57. package/dist/node/index-BNccqSpv.d.ts.map +0 -1
  58. package/dist/node/index-BUhHIf7X.d.ts +0 -86
  59. package/dist/node/index-BUhHIf7X.d.ts.map +0 -1
  60. package/dist/node/index-BnAGE-u9.d.ts +0 -33
  61. package/dist/node/index-BnAGE-u9.d.ts.map +0 -1
  62. package/dist/node/index-BrQ4gGw0.d.ts +0 -213
  63. package/dist/node/index-BrQ4gGw0.d.ts.map +0 -1
  64. package/dist/node/index-CYl7ksS6.d.ts.map +0 -1
  65. package/dist/node/index-CoeBF21y.d.ts +0 -213
  66. package/dist/node/index-CoeBF21y.d.ts.map +0 -1
  67. package/dist/node/index-DHt-2VQ-.d.ts +0 -46
  68. package/dist/node/index-DHt-2VQ-.d.ts.map +0 -1
  69. package/dist/node/index-DMwKN5Le.d.ts +0 -33
  70. package/dist/node/index-DMwKN5Le.d.ts.map +0 -1
  71. package/dist/node/index-E8Gx4-lc.d.ts.map +0 -1
  72. package/dist/node/index-c0M42fsA.d.ts +0 -46
  73. package/dist/node/index-c0M42fsA.d.ts.map +0 -1
  74. package/dist/node/mcp/index.cjs +0 -1
  75. package/dist/node/mcp/index.d.ts +0 -2
  76. package/dist/node/mcp/index.js +0 -1
  77. package/dist/node/mcp-BOglBJNy.cjs +0 -1
  78. package/dist/node/mcp-D3BBVK7C.js +0 -2
  79. package/dist/node/mcp-D3BBVK7C.js.map +0 -1
  80. package/dist/node/rolldown-runtime-CMqjfN_6.cjs +0 -1
  81. package/dist/node/testing/index.d.ts.map +0 -1
  82. package/dist/node/testing/index.js.map +0 -1
  83. package/dist/node/tui/index.cjs +0 -1
  84. package/dist/node/tui/index.d.ts +0 -2
  85. package/dist/node/tui/index.js +0 -1
  86. package/dist/node/tui-CcH5EsQh.js +0 -25
  87. package/dist/node/tui-CcH5EsQh.js.map +0 -1
  88. package/dist/node/tui-DznRbcku.cjs +0 -24
  89. package/dist/node/ws/index.cjs +0 -1
  90. package/dist/node/ws/index.d.ts +0 -2
  91. package/dist/node/ws/index.js +0 -1
  92. package/dist/node/ws-Dc2RUwVs.js +0 -2
  93. package/dist/node/ws-Dc2RUwVs.js.map +0 -1
  94. package/dist/node/ws-QNMQn5kg.cjs +0 -1
  95. package/src/http/__tests__/http-transport.test.ts +0 -55
  96. package/src/http/__tests__/routes.test.ts +0 -168
  97. package/src/http/http-transport.ts +0 -41
  98. package/src/http/index.ts +0 -4
  99. package/src/http/routes.ts +0 -152
  100. package/src/mcp/__tests__/mcp-server.test.ts +0 -66
  101. package/src/mcp/__tests__/mcp-transport.test.ts +0 -46
  102. package/src/mcp/index.ts +0 -4
  103. package/src/mcp/mcp-server.ts +0 -163
  104. package/src/mcp/mcp-transport.ts +0 -48
  105. package/src/testing/__tests__/scripted-provider.test.ts +0 -73
  106. package/src/testing/scripted-provider.ts +0 -73
  107. package/src/tui/App.tsx +0 -491
  108. package/src/tui/BackgroundTaskPanel.tsx +0 -36
  109. package/src/tui/CjkTextInput.tsx +0 -199
  110. package/src/tui/ConfirmPrompt.tsx +0 -70
  111. package/src/tui/ContextWarningBanner.tsx +0 -34
  112. package/src/tui/ExecutionWorkspaceDetailPane.tsx +0 -64
  113. package/src/tui/ExecutionWorkspaceSwitcher.tsx +0 -187
  114. package/src/tui/InputArea.tsx +0 -310
  115. package/src/tui/InteractivePrompt.tsx +0 -59
  116. package/src/tui/ListPicker.tsx +0 -95
  117. package/src/tui/MenuSelect.tsx +0 -104
  118. package/src/tui/MessageList.tsx +0 -284
  119. package/src/tui/PermissionPrompt.tsx +0 -86
  120. package/src/tui/PluginTUI.tsx +0 -258
  121. package/src/tui/SessionPicker.tsx +0 -68
  122. package/src/tui/SessionStatusBar.tsx +0 -73
  123. package/src/tui/SlashAutocomplete.tsx +0 -110
  124. package/src/tui/StatusBar.tsx +0 -236
  125. package/src/tui/StreamingIndicator.tsx +0 -93
  126. package/src/tui/TextPrompt.tsx +0 -81
  127. package/src/tui/ToolCommandOutput.tsx +0 -39
  128. package/src/tui/ToolDiffBlock.tsx +0 -32
  129. package/src/tui/TransportTUI.tsx +0 -117
  130. package/src/tui/TuiInteractionChannel.ts +0 -495
  131. package/src/tui/UpdateNotice.tsx +0 -14
  132. package/src/tui/UsageSummaryEntry.tsx +0 -39
  133. package/src/tui/WaveText.tsx +0 -44
  134. package/src/tui/__tests__/InteractivePrompt.test.tsx +0 -82
  135. package/src/tui/__tests__/ListPicker.test.tsx +0 -159
  136. package/src/tui/__tests__/MenuSelect.test.tsx +0 -103
  137. package/src/tui/__tests__/PluginTUI.test.tsx +0 -167
  138. package/src/tui/__tests__/SlashAutocomplete.test.tsx +0 -140
  139. package/src/tui/__tests__/TextPrompt.test.tsx +0 -98
  140. package/src/tui/__tests__/TuiInteractionChannel.display-contract.test.ts +0 -239
  141. package/src/tui/__tests__/TuiInteractionChannel.lifecycle.test.ts +0 -297
  142. package/src/tui/__tests__/TuiInteractionChannel.requestAction.test.ts +0 -124
  143. package/src/tui/__tests__/UpdateNotice.test.tsx +0 -15
  144. package/src/tui/__tests__/abort-after-permission.test.tsx +0 -169
  145. package/src/tui/__tests__/abort-streaming-e2e.test.tsx +0 -183
  146. package/src/tui/__tests__/background-task-panel.test.tsx +0 -53
  147. package/src/tui/__tests__/background-task-row-format.test.ts +0 -59
  148. package/src/tui/__tests__/channel-factory-integration.test.ts +0 -138
  149. package/src/tui/__tests__/cjk-text-input-flow.test.ts +0 -109
  150. package/src/tui/__tests__/cjk-text-input.test.ts +0 -191
  151. package/src/tui/__tests__/command-effect-handler.test.ts +0 -127
  152. package/src/tui/__tests__/command-output-summary.test.ts +0 -95
  153. package/src/tui/__tests__/compact-event-bridge.test.ts +0 -20
  154. package/src/tui/__tests__/confirm-permission-flow.test.ts +0 -130
  155. package/src/tui/__tests__/confirm-prompt.test.tsx +0 -87
  156. package/src/tui/__tests__/execution-workspace-switcher.test.tsx +0 -110
  157. package/src/tui/__tests__/execution-workspace-view-model.test.ts +0 -93
  158. package/src/tui/__tests__/fixtures/provider-setup-prompt-driver.tsx +0 -125
  159. package/src/tui/__tests__/input-area-flow.test.ts +0 -164
  160. package/src/tui/__tests__/message-list-rendering.test.tsx +0 -353
  161. package/src/tui/__tests__/prompt-queue.test.tsx +0 -255
  162. package/src/tui/__tests__/provider-setup-pty-e2e.test.ts +0 -233
  163. package/src/tui/__tests__/pty/pty-driver.ts +0 -135
  164. package/src/tui/__tests__/pty/tui-pty.ptytest.ts +0 -61
  165. package/src/tui/__tests__/render-channel-options.test.ts +0 -32
  166. package/src/tui/__tests__/render-markdown.test.ts +0 -72
  167. package/src/tui/__tests__/selection-flow.test.ts +0 -61
  168. package/src/tui/__tests__/session-init-poller.test.ts +0 -102
  169. package/src/tui/__tests__/session-naming.test.ts +0 -64
  170. package/src/tui/__tests__/session-switch-channel.test.tsx +0 -307
  171. package/src/tui/__tests__/slash-routing-effects.test.ts +0 -228
  172. package/src/tui/__tests__/status-activity.test.ts +0 -71
  173. package/src/tui/__tests__/status-bar.test.tsx +0 -177
  174. package/src/tui/__tests__/streaming-indicator.test.tsx +0 -137
  175. package/src/tui/__tests__/text-prompt-flow.test.ts +0 -77
  176. package/src/tui/__tests__/tui-channel-init-failure.test.ts +0 -57
  177. package/src/tui/__tests__/tui-state-manager.test.ts +0 -401
  178. package/src/tui/background-task-row-format.ts +0 -53
  179. package/src/tui/command-interaction.ts +0 -9
  180. package/src/tui/command-output-summary.ts +0 -122
  181. package/src/tui/create-default-tui-cli-adapter.ts +0 -41
  182. package/src/tui/execution-workspace-view-model.ts +0 -123
  183. package/src/tui/flows/cjk-text-input-flow.ts +0 -285
  184. package/src/tui/flows/confirm-prompt-flow.ts +0 -45
  185. package/src/tui/flows/input-area-flow.ts +0 -189
  186. package/src/tui/flows/permission-prompt-flow.ts +0 -85
  187. package/src/tui/flows/selection-flow.ts +0 -126
  188. package/src/tui/flows/session-init-poller.ts +0 -77
  189. package/src/tui/flows/text-prompt-flow.ts +0 -98
  190. package/src/tui/hooks/command-effect-handler.ts +0 -97
  191. package/src/tui/hooks/command-effect-queue.ts +0 -39
  192. package/src/tui/hooks/side-effects-types.ts +0 -35
  193. package/src/tui/hooks/useAutocomplete.ts +0 -87
  194. package/src/tui/hooks/usePluginCallbacks.ts +0 -31
  195. package/src/tui/hooks/usePluginScreenData.ts +0 -85
  196. package/src/tui/hooks/useSideEffects.ts +0 -175
  197. package/src/tui/hooks/useSlashRouting.ts +0 -118
  198. package/src/tui/hooks/useStatusLineSettings.ts +0 -37
  199. package/src/tui/hooks/useTuiChannel.ts +0 -95
  200. package/src/tui/index.ts +0 -14
  201. package/src/tui/interactions/CommandConfirm.tsx +0 -36
  202. package/src/tui/interactions/CommandPicker.tsx +0 -77
  203. package/src/tui/interactions/__tests__/CommandConfirm.test.tsx +0 -124
  204. package/src/tui/interactions/__tests__/CommandPicker.test.tsx +0 -138
  205. package/src/tui/plugin-tui-handlers.ts +0 -163
  206. package/src/tui/render-markdown.ts +0 -130
  207. package/src/tui/render.tsx +0 -129
  208. package/src/tui/session-naming.ts +0 -33
  209. package/src/tui/status-activity.ts +0 -63
  210. package/src/tui/tui-cli-adapter-context.tsx +0 -13
  211. package/src/tui/tui-cli-adapter.ts +0 -25
  212. package/src/tui/tui-state-manager.ts +0 -226
  213. package/src/tui/tui-transport.ts +0 -35
  214. package/src/tui/types.ts +0 -15
  215. package/src/tui/utils/__tests__/edit-diff.test.ts +0 -426
  216. package/src/tui/utils/__tests__/paste-detection.test.ts +0 -116
  217. package/src/tui/utils/__tests__/paste-labels.test.ts +0 -46
  218. package/src/tui/utils/__tests__/tool-call-extractor.test.ts +0 -227
  219. package/src/tui/utils/__tests__/tool-diff-summary.test.ts +0 -104
  220. package/src/tui/utils/edit-diff.ts +0 -153
  221. package/src/tui/utils/paste-labels.ts +0 -9
  222. package/src/tui/utils/tool-call-extractor.ts +0 -92
  223. package/src/tui/utils/tool-diff-summary.ts +0 -75
  224. package/src/ws/__tests__/ws-handler.test.ts +0 -409
  225. package/src/ws/__tests__/ws-transport.test.ts +0 -53
  226. package/src/ws/index.ts +0 -13
  227. package/src/ws/ws-background-messages.ts +0 -170
  228. package/src/ws/ws-handler.ts +0 -280
  229. package/src/ws/ws-protocol.ts +0 -78
  230. package/src/ws/ws-transport-configurable.ts +0 -128
  231. package/src/ws/ws-transport.ts +0 -42
package/README.md CHANGED
@@ -25,13 +25,13 @@ npm install @robota-sdk/agent-transport
25
25
  ```typescript
26
26
  import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';
27
27
 
28
- const transport = createHeadlessTransport({ format: 'text' });
28
+ const transport = createHeadlessTransport({ outputFormat: 'text', prompt: 'Hello!' });
29
29
  ```
30
30
 
31
31
  ### WebSocket
32
32
 
33
33
  ```typescript
34
- import { WsTransport } from '@robota-sdk/agent-transport/ws';
34
+ import { WsTransport } from '@robota-sdk/agent-transport-ws';
35
35
 
36
36
  const transport = new WsTransport({ port: 3001 });
37
37
  ```
@@ -39,26 +39,27 @@ const transport = new WsTransport({ port: 3001 });
39
39
  ### HTTP
40
40
 
41
41
  ```typescript
42
- import { createHttpTransport } from '@robota-sdk/agent-transport/http';
42
+ import { createHttpTransport } from '@robota-sdk/agent-transport-http';
43
43
 
44
- const transport = createHttpTransport({ port: 8080 });
44
+ const transport = createHttpTransport({ basePath: '/agent' }); // mount on your own server
45
45
  ```
46
46
 
47
47
  ### MCP
48
48
 
49
49
  ```typescript
50
- import { createMcpTransport } from '@robota-sdk/agent-transport/mcp';
50
+ import { createMcpTransport } from '@robota-sdk/agent-transport-mcp';
51
51
 
52
- const transport = createMcpTransport({ name: 'my-agent' });
52
+ const transport = createMcpTransport({ name: 'my-agent', version: '1.0.0' });
53
53
  ```
54
54
 
55
55
  ### TUI (Ink/React)
56
56
 
57
57
  ```typescript
58
- import { TuiTransport } from '@robota-sdk/agent-transport/tui';
59
- import type { ITuiCliAdapter } from '@robota-sdk/agent-transport/tui';
58
+ import { TuiTransport } from '@robota-sdk/agent-transport-tui';
59
+ import type { IRenderOptions } from '@robota-sdk/agent-transport-tui';
60
60
 
61
- const transport = new TuiTransport(adapter);
61
+ declare const options: IRenderOptions;
62
+ const transport = new TuiTransport(options);
62
63
  ```
63
64
 
64
65
  > React and Ink dependencies are confined to the `./tui` sub-path. Importing from
@@ -70,15 +71,17 @@ Import only what you need to keep bundles small:
70
71
 
71
72
  ```typescript
72
73
  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';
74
+ import { WsTransport } from '@robota-sdk/agent-transport-ws';
75
+ import type { TServerMessage } from '@robota-sdk/agent-transport-ws';
76
+ import { createHttpTransport } from '@robota-sdk/agent-transport-http';
77
+ import { createMcpTransport } from '@robota-sdk/agent-transport-mcp';
78
+ import { TuiTransport } from '@robota-sdk/agent-transport-tui';
78
79
  ```
79
80
 
80
81
  Root import re-exports all transports:
81
82
 
83
+ <!-- doc-example-skip: intentional ellipsis fragment (import surface overview, not runnable) -->
84
+
82
85
  ```typescript
83
86
  import { createHeadlessTransport, WsTransport, TuiTransport, ... } from '@robota-sdk/agent-transport';
84
87
  ```
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../headless-CT2ibQnr.cjs");exports.HeadlessInteractionChannel=e.t,exports.PrintTerminal=e.a,exports.createHeadlessRunner=e.r,exports.createHeadlessTransport=e.n,exports.promptInput=e.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../headless-xq77JBq0.cjs");exports.HeadlessInteractionChannel=e.t,exports.PrintTerminal=e.a,exports.createHeadlessRunner=e.r,exports.createHeadlessTransport=e.n,exports.promptInput=e.i;
@@ -1,2 +1,2 @@
1
- import { a as IHeadlessRunnerOptions, c as promptInput, i as createHeadlessTransport, l as PrintTerminal, n as IHeadlessInteractionChannelOptions, o as TOutputFormat, r as IHeadlessTransportOptions, s as createHeadlessRunner, t as HeadlessInteractionChannel } from "../index-E8Gx4-lc.js";
1
+ import { a as IHeadlessRunnerOptions, c as promptInput, i as createHeadlessTransport, l as PrintTerminal, n as IHeadlessInteractionChannelOptions, o as TOutputFormat, r as IHeadlessTransportOptions, s as createHeadlessRunner, t as HeadlessInteractionChannel } from "../index-JTD_xtEQ.js";
2
2
  export { HeadlessInteractionChannel, type IHeadlessInteractionChannelOptions, type IHeadlessRunnerOptions, type IHeadlessTransportOptions, PrintTerminal, type TOutputFormat, createHeadlessRunner, createHeadlessTransport, promptInput };
@@ -1 +1 @@
1
- import{a as e,i as t,n,r,t as i}from"../headless-mRYilLfC.js";export{i as HeadlessInteractionChannel,e as PrintTerminal,r as createHeadlessRunner,n as createHeadlessTransport,t as promptInput};
1
+ import{a as e,i as t,n,r,t as i}from"../headless-DG_MEbf0.js";export{i as HeadlessInteractionChannel,e as PrintTerminal,r as createHeadlessRunner,n as createHeadlessTransport,t as promptInput};
@@ -7,10 +7,13 @@ Set your API key via environment variable instead:
7
7
  `){a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
8
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
9
  `),process.exit(0)):r.charCodeAt(0)>=32&&(i+=r,process.stdout.write(t?`*`:r))};a.on(`data`,s)});function o(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 s(e,t){let n=o(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 c(e,n,r){let i=JSON.stringify({type:`stream_event`,event:r,session_id:n(e),uuid:t()});process.stdout.write(i+`
10
- `)}function l(e,t,n,r){let i=n=>c(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}),s=e=>i({type:`background_job_group_event`,background_job_group_event:e}),l=()=>u(e,{onTextDelta:a,onBackgroundTaskEvent:o,onBackgroundJobGroupEvent:s,onComplete:d,onInterrupted:f,onError:p}),d=i=>{l(),n(t(e),i.response,`success`),r(0)},f=i=>{l(),n(t(e),i.response,`success`),r(0)},p=i=>{l(),n(t(e),``,`error`,i),r(1)};return e.on(`text_delta`,a),e.on(`background_task_event`,o),e.on(`background_job_group_event`,s),e.on(`complete`,d),e.on(`interrupted`,f),e.on(`error`,p),l}function u(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 d(e){let{session:t,outputFormat:n}=e;return{run:e=>n===`text`?h(t,e):n===`json`?g(t,e):_(t,e)}}function f(e){let t=e.message.toLowerCase();return t.includes(`api key`)||t.includes(`no provider`)||t.includes(`provider`)?`config_error`:t.includes(`tool`)||t.includes(`execution`)?`tool_error`:`api_error`}function p(e,t,n,r){let i={type:`result`,result:t,session_id:e,subtype:n};n===`error`&&r!==void 0&&(i.error_code=f(r));let a=JSON.stringify(i);process.stdout.write(a+`
11
- `)}function m(e){try{return e.getSession().getSessionId()}catch{return``}}function h(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=e=>{r(),process.stdout.write(e.response+`
10
+ `)}function l(e,t,n,r){let i=n=>c(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}),s=e=>i({type:`background_job_group_event`,background_job_group_event:e}),l=()=>u(e,{onTextDelta:a,onBackgroundTaskEvent:o,onBackgroundJobGroupEvent:s,onComplete:d,onInterrupted:f,onError:p}),d=i=>{l(),n(t(e),i.response,`success`),r(0)},f=i=>{l(),n(t(e),i.response,`success`),r(0)},p=i=>{l(),n(t(e),``,`error`,i),r(1)};return e.on(`text_delta`,a),e.on(`background_task_event`,o),e.on(`background_job_group_event`,s),e.on(`complete`,d),e.on(`interrupted`,f),e.on(`error`,p),l}function u(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 d(e){let{session:t,outputFormat:n}=e;return{run:e=>n===`text`?g(t,e):n===`json`?_(t,e):v(t,e),runGoal:(e,r={})=>f(t,e,r,n)}}function f(e,t,n,r){return new Promise(i=>{let a=()=>{e.off(`complete`,o),e.off(`error`,s),e.off(`goal_event`,c)},o=e=>{e.response&&process.stdout.write(e.response+`
11
+ `)},s=t=>{a(),r===`text`?process.stderr.write(t.message+`
12
+ `):m(h(e),``,`error`,t),i(1)},c=t=>{if(t.type!==`goal_stopped`)return;a();let n=t.goal,o=n.stopReason===`satisfied`,s=o?`Goal satisfied after ${n.iterations} iteration(s).`:`Goal stopped: ${n.stopReason} (after ${n.iterations} iteration(s)).`;r===`text`?(o?process.stdout:process.stderr).write(s+`
13
+ `):m(h(e),s,o?`success`:`error`),i(o?0:2)};e.on(`complete`,o),e.on(`error`,s),e.on(`goal_event`,c),e.setGoal(t,n.maxIterations?{maxIterations:n.maxIterations}:{})})}function p(e){let t=e.message.toLowerCase();return t.includes(`api key`)||t.includes(`no provider`)||t.includes(`provider`)?`config_error`:t.includes(`tool`)||t.includes(`execution`)?`tool_error`:`api_error`}function m(e,t,n,r){let i={type:`result`,result:t,session_id:e,subtype:n};n===`error`&&r!==void 0&&(i.error_code=p(r));let a=JSON.stringify(i);process.stdout.write(a+`
14
+ `)}function h(e){try{return e.getSession().getSessionId()}catch{return``}}function g(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=e=>{r(),process.stdout.write(e.response+`
12
15
  `),n(0)},a=e=>{r(),e.response&&process.stdout.write(e.response+`
13
16
  `),n(0)},o=e=>{r(),process.stderr.write(e.message+`
14
17
  `),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,o),s(e,t).then(i=>{if(i.kind===`command-result`){r(),process.stdout.write(i.result.message+`
15
- `),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function g(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=t=>{r(),p(m(e),t.response,`success`),n(0)},a=t=>{r(),p(m(e),t.response,`success`),n(0)},o=t=>{r(),p(m(e),``,`error`,t),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,o),s(e,t).then(i=>{if(i.kind===`command-result`){r(),p(m(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function _(e,t){return new Promise(n=>{let r=l(e,m,p,n);s(e,t).then(i=>{if(i.kind===`command-result`){r(),p(m(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function v(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 d({session:t,outputFormat:e.outputFormat}).run(e.prompt)},async stop(){},getExitCode(){return n}}}var y=class{opts;exitCode=0;constructor(e){this.opts=e}async run(e){let t=this.opts.shellExec??(e=>n(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()),i=new r({cwd:this.opts.cwd,provider:this.opts.provider,permissionMode:this.opts.permissionMode??`bypassPermissions`,maxTurns:this.opts.maxTurns,sessionStore:this.opts.sessionStore,resumeSessionId:this.opts.resumeSessionId,forkSession:this.opts.forkSession,sessionName:this.opts.sessionName,bare:this.opts.bare||void 0,allowedTools:this.opts.allowedTools,deniedTools:this.opts.deniedTools,appendSystemPrompt:this.opts.appendSystemPrompt,...this.opts.persona===void 0?{}:{persona:this.opts.persona},...this.opts.systemPrompt?{systemPrompt:this.opts.systemPrompt}:{},backgroundTaskRunners:this.opts.backgroundTaskRunners,subagentRunnerFactory:this.opts.subagentRunnerFactory,commandModules:this.opts.commandModules,commandHostAdapters:this.opts.commandHostAdapters,shellExec:t,agentName:this.opts.agentName,...this.opts.activePresetId===void 0?{}:{activePresetId:this.opts.activePresetId},...this.opts.enableParallelSubagents===void 0?{}:{enableParallelSubagents:this.opts.enableParallelSubagents},...this.opts.selfVerification===void 0?{}:{selfVerification:this.opts.selfVerification}}),a=d({session:i,outputFormat:this.opts.outputFormat});this.exitCode=await a.run(e),await i.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`})}getExitCode(){return this.exitCode}};export{i as a,a as i,v as n,d as r,y as t};
16
- //# sourceMappingURL=headless-mRYilLfC.js.map
18
+ `),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function _(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=t=>{r(),m(h(e),t.response,`success`),n(0)},a=t=>{r(),m(h(e),t.response,`success`),n(0)},o=t=>{r(),m(h(e),``,`error`,t),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,o),s(e,t).then(i=>{if(i.kind===`command-result`){r(),m(h(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function v(e,t){return new Promise(n=>{let r=l(e,h,m,n);s(e,t).then(i=>{if(i.kind===`command-result`){r(),m(h(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function y(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 d({session:t,outputFormat:e.outputFormat}).run(e.prompt)},async stop(){},getExitCode(){return n}}}var b=class{opts;exitCode=0;constructor(e){this.opts=e}async run(e){let t=this.createSession(),n=d({session:t,outputFormat:this.opts.outputFormat});this.exitCode=await n.run(e),await t.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`})}async runGoal(e,t={}){let n=this.createSession(),r=d({session:n,outputFormat:this.opts.outputFormat});this.exitCode=await r.runGoal(e,t),await n.shutdown({reason:`prompt_input_exit`,message:`Headless goal complete`})}createSession(){let e=this.opts.shellExec??(e=>n(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd());return new r({cwd:this.opts.cwd,provider:this.opts.provider,permissionMode:this.opts.permissionMode??`bypassPermissions`,maxTurns:this.opts.maxTurns,sessionStore:this.opts.sessionStore,resumeSessionId:this.opts.resumeSessionId,forkSession:this.opts.forkSession,sessionName:this.opts.sessionName,bare:this.opts.bare||void 0,allowedTools:this.opts.allowedTools,deniedTools:this.opts.deniedTools,appendSystemPrompt:this.opts.appendSystemPrompt,...this.opts.persona===void 0?{}:{persona:this.opts.persona},...this.opts.systemPrompt?{systemPrompt:this.opts.systemPrompt}:{},backgroundTaskRunners:this.opts.backgroundTaskRunners,subagentRunnerFactory:this.opts.subagentRunnerFactory,commandModules:this.opts.commandModules,commandHostAdapters:this.opts.commandHostAdapters,shellExec:e,agentName:this.opts.agentName,...this.opts.activePresetId===void 0?{}:{activePresetId:this.opts.activePresetId},...this.opts.enableParallelSubagents===void 0?{}:{enableParallelSubagents:this.opts.enableParallelSubagents},...this.opts.selfVerification===void 0?{}:{selfVerification:this.opts.selfVerification}})}getExitCode(){return this.exitCode}};export{i as a,a as i,y as n,d as r,b as t};
19
+ //# sourceMappingURL=headless-DG_MEbf0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-DG_MEbf0.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","../../src/headless/HeadlessInteractionChannel.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 ICommandResult,\n IExecutionResult,\n IInteractiveSession,\n TBackgroundJobGroupEvent,\n} from '@robota-sdk/agent-interface-transport';\nimport type { TBackgroundTaskEvent } from '@robota-sdk/agent-interface-transport';\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\nfunction 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: (\n sessionId: string,\n result: string,\n subtype: 'success' | 'error',\n error?: Error,\n ) => 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', 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 {\n IExecutionResult,\n IGoalEvent,\n IInteractiveSession,\n} from '@robota-sdk/agent-interface-transport';\n\nexport type TOutputFormat = 'text' | 'json' | 'stream-json';\n\n/** GOAL-001: options for an autonomous headless goal run. */\nexport interface IHeadlessGoalOptions {\n maxIterations?: number;\n}\n\nexport interface IHeadlessRunnerOptions {\n session: IInteractiveSession;\n outputFormat: TOutputFormat;\n}\n\n/** Exit code for a goal that stopped cleanly without being satisfied (bound/convergence/cancel). */\nexport const GOAL_NOT_SATISFIED_EXIT_CODE = 2;\n\nexport function createHeadlessRunner(options: IHeadlessRunnerOptions): {\n run: (prompt: string) => Promise<number>;\n runGoal: (objective: string, goalOptions?: IHeadlessGoalOptions) => 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 runGoal: (objective: string, goalOptions: IHeadlessGoalOptions = {}): Promise<number> =>\n runGoalFormat(session, objective, goalOptions, outputFormat),\n };\n}\n\n/**\n * GOAL-001: drive an autonomous goal to completion in headless mode. Streams each turn's response\n * for progress, then resolves when the goal stops: exit 0 if satisfied, {@link GOAL_NOT_SATISFIED_EXIT_CODE}\n * if it stopped at a bound (max-iterations / no-progress / cancelled), or 1 on a turn error.\n */\nfunction runGoalFormat(\n session: IInteractiveSession,\n objective: string,\n goalOptions: IHeadlessGoalOptions,\n outputFormat: TOutputFormat,\n): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = (): void => {\n session.off('complete', onComplete);\n session.off('error', onError);\n session.off('goal_event', onGoal);\n };\n const onComplete = (result: IExecutionResult): void => {\n if (result.response) process.stdout.write(result.response + '\\n');\n };\n const onError = (error: Error): void => {\n cleanup();\n if (outputFormat === 'text') process.stderr.write(error.message + '\\n');\n else writeJsonResult(getSessionId(session), '', 'error', error);\n resolve(1);\n };\n const onGoal = (event: IGoalEvent): void => {\n if (event.type !== 'goal_stopped') return;\n cleanup();\n const goal = event.goal;\n const satisfied = goal.stopReason === 'satisfied';\n const summary = satisfied\n ? `Goal satisfied after ${goal.iterations} iteration(s).`\n : `Goal stopped: ${goal.stopReason} (after ${goal.iterations} iteration(s)).`;\n if (outputFormat === 'text')\n (satisfied ? process.stdout : process.stderr).write(summary + '\\n');\n else writeJsonResult(getSessionId(session), summary, satisfied ? 'success' : 'error');\n resolve(satisfied ? 0 : GOAL_NOT_SATISFIED_EXIT_CODE);\n };\n\n session.on('complete', onComplete);\n session.on('error', onError);\n session.on('goal_event', onGoal);\n\n void session.setGoal(\n objective,\n goalOptions.maxIterations ? { maxIterations: goalOptions.maxIterations } : {},\n );\n });\n}\n\nexport function resolveErrorCode(error: Error): string {\n const msg = error.message.toLowerCase();\n if (msg.includes('api key') || msg.includes('no provider') || msg.includes('provider')) {\n return 'config_error';\n }\n if (msg.includes('tool') || msg.includes('execution')) {\n return 'tool_error';\n }\n return 'api_error';\n}\n\nexport function writeJsonResult(\n sessionId: string,\n result: string,\n subtype: 'success' | 'error',\n error?: Error,\n): void {\n const payload: Record<string, unknown> = {\n type: 'result',\n result,\n session_id: sessionId,\n subtype,\n };\n if (subtype === 'error' && error !== undefined) {\n payload['error_code'] = resolveErrorCode(error);\n }\n const output = JSON.stringify(payload);\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 process.stderr.write(error.message + '\\n');\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', 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, 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","/**\n * HeadlessInteractionChannel — owns session lifecycle for non-interactive (print) mode.\n *\n * Mirrors TuiInteractionChannel's ownership pattern: session creation lives here,\n * not in the caller. print-mode.ts constructs this and calls run().\n */\n\nimport { execSync } from 'node:child_process';\n\nimport { InteractiveSession } from '@robota-sdk/agent-framework';\n\nimport { createHeadlessRunner, type TOutputFormat } from './headless-runner.js';\n\nimport type { IAIProvider, TPermissionMode } from '@robota-sdk/agent-core';\nimport type {\n IBackgroundTaskRunner,\n ICommandHostAdapters,\n ICommandModule,\n TSubagentRunnerFactory,\n TShellExecFn,\n} from '@robota-sdk/agent-framework';\nimport type { IInteractiveSessionStore } from '@robota-sdk/agent-interface-transport';\n\nexport interface IHeadlessInteractionChannelOptions {\n cwd: string;\n provider: IAIProvider;\n outputFormat: TOutputFormat;\n permissionMode?: TPermissionMode;\n maxTurns?: number;\n sessionStore?: IInteractiveSessionStore;\n /** Continue/resume an existing session by id (print-mode parity with TUI). */\n resumeSessionId?: string;\n /** Fork the resumed session into a new independent session instead of appending. */\n forkSession?: boolean;\n sessionName?: string;\n bare?: boolean;\n allowedTools?: string[];\n deniedTools?: string[];\n appendSystemPrompt?: string;\n systemPrompt?: string;\n /** Name reported to the underlying agent config (resolved by the CLI, e.g. preset agentName). */\n agentName?: string;\n /** Active preset id selected at startup (PRESET-011 runtime state). Defaults to 'default'. */\n activePresetId?: string;\n /** Preset persona block composed as a `source: 'persona'` system-prompt section (priority 5). */\n persona?: string;\n /** Preset execution capability: activate agent runtime + subagent/background dispatch. */\n enableParallelSubagents?: boolean;\n /** Preset execution capability: run a post-task self-verification step. */\n selfVerification?: boolean;\n backgroundTaskRunners?: IBackgroundTaskRunner[];\n subagentRunnerFactory?: TSubagentRunnerFactory;\n commandModules?: readonly ICommandModule[];\n commandHostAdapters?: ICommandHostAdapters;\n shellExec?: TShellExecFn;\n}\n\nexport class HeadlessInteractionChannel {\n private readonly opts: IHeadlessInteractionChannelOptions;\n private exitCode = 0;\n\n constructor(options: IHeadlessInteractionChannelOptions) {\n this.opts = options;\n }\n\n async run(prompt: string): Promise<void> {\n const session = this.createSession();\n const runner = createHeadlessRunner({ session, outputFormat: this.opts.outputFormat });\n this.exitCode = await runner.run(prompt);\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n }\n\n /**\n * GOAL-001: run an autonomous goal to completion (or a stop condition) in headless mode.\n * Mirrors {@link run} but drives the framework goal loop instead of a single prompt.\n */\n async runGoal(objective: string, options: { maxIterations?: number } = {}): Promise<void> {\n const session = this.createSession();\n const runner = createHeadlessRunner({ session, outputFormat: this.opts.outputFormat });\n this.exitCode = await runner.runGoal(objective, options);\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless goal complete' });\n }\n\n private createSession(): InteractiveSession {\n const shellExec: TShellExecFn =\n this.opts.shellExec ??\n ((command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd());\n\n return new InteractiveSession({\n cwd: this.opts.cwd,\n provider: this.opts.provider,\n permissionMode: this.opts.permissionMode ?? 'bypassPermissions',\n // CMD-004: headless has no interactive renderer, so it injects no askHandler — the session's\n // getUserInteraction() returns undefined and each command applies its explicit no-human path\n // (e.g. /mode reports current, /exit and /clear proceed — never a silent guess).\n maxTurns: this.opts.maxTurns,\n sessionStore: this.opts.sessionStore,\n resumeSessionId: this.opts.resumeSessionId,\n forkSession: this.opts.forkSession,\n sessionName: this.opts.sessionName,\n bare: this.opts.bare || undefined,\n allowedTools: this.opts.allowedTools,\n deniedTools: this.opts.deniedTools,\n appendSystemPrompt: this.opts.appendSystemPrompt,\n ...(this.opts.persona !== undefined ? { persona: this.opts.persona } : {}),\n ...(this.opts.systemPrompt ? { systemPrompt: this.opts.systemPrompt } : {}),\n backgroundTaskRunners: this.opts.backgroundTaskRunners,\n subagentRunnerFactory: this.opts.subagentRunnerFactory,\n commandModules: this.opts.commandModules,\n commandHostAdapters: this.opts.commandHostAdapters,\n shellExec,\n agentName: this.opts.agentName,\n ...(this.opts.activePresetId !== undefined\n ? { activePresetId: this.opts.activePresetId }\n : {}),\n ...(this.opts.enableParallelSubagents !== undefined\n ? { enableParallelSubagents: this.opts.enableParallelSubagents }\n : {}),\n ...(this.opts.selfVerification !== undefined\n ? { selfVerification: this.opts.selfVerification }\n : {}),\n });\n }\n\n getExitCode(): number {\n return this.exitCode;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
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));let c=require("node:readline");c=s(c,1);let l=require("node:crypto"),u=require("node:child_process"),d=require("@robota-sdk/agent-framework");var f=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(t=>{let n=c.createInterface({input:process.stdin,output:process.stdout,terminal:!1,historySize:0});n.question(e,e=>{n.close(),t(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 p=(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 m(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 h(e,t){let n=m(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 g(e,t,n){let r=JSON.stringify({type:`stream_event`,event:n,session_id:t(e),uuid:(0,l.randomUUID)()});process.stdout.write(r+`
10
+ `)}function _(e,t,n,r){let i=n=>g(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}),s=e=>i({type:`background_job_group_event`,background_job_group_event:e}),c=()=>v(e,{onTextDelta:a,onBackgroundTaskEvent:o,onBackgroundJobGroupEvent:s,onComplete:l,onInterrupted:u,onError:d}),l=i=>{c(),n(t(e),i.response,`success`),r(0)},u=i=>{c(),n(t(e),i.response,`success`),r(0)},d=i=>{c(),n(t(e),``,`error`,i),r(1)};return e.on(`text_delta`,a),e.on(`background_task_event`,o),e.on(`background_job_group_event`,s),e.on(`complete`,l),e.on(`interrupted`,u),e.on(`error`,d),c}function v(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 y(e){let{session:t,outputFormat:n}=e;return{run:e=>n===`text`?w(t,e):n===`json`?T(t,e):E(t,e),runGoal:(e,r={})=>b(t,e,r,n)}}function b(e,t,n,r){return new Promise(i=>{let a=()=>{e.off(`complete`,o),e.off(`error`,s),e.off(`goal_event`,c)},o=e=>{e.response&&process.stdout.write(e.response+`
11
+ `)},s=t=>{a(),r===`text`?process.stderr.write(t.message+`
12
+ `):S(C(e),``,`error`,t),i(1)},c=t=>{if(t.type!==`goal_stopped`)return;a();let n=t.goal,o=n.stopReason===`satisfied`,s=o?`Goal satisfied after ${n.iterations} iteration(s).`:`Goal stopped: ${n.stopReason} (after ${n.iterations} iteration(s)).`;r===`text`?(o?process.stdout:process.stderr).write(s+`
13
+ `):S(C(e),s,o?`success`:`error`),i(o?0:2)};e.on(`complete`,o),e.on(`error`,s),e.on(`goal_event`,c),e.setGoal(t,n.maxIterations?{maxIterations:n.maxIterations}:{})})}function x(e){let t=e.message.toLowerCase();return t.includes(`api key`)||t.includes(`no provider`)||t.includes(`provider`)?`config_error`:t.includes(`tool`)||t.includes(`execution`)?`tool_error`:`api_error`}function S(e,t,n,r){let i={type:`result`,result:t,session_id:e,subtype:n};n===`error`&&r!==void 0&&(i.error_code=x(r));let a=JSON.stringify(i);process.stdout.write(a+`
14
+ `)}function C(e){try{return e.getSession().getSessionId()}catch{return``}}function w(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=e=>{r(),process.stdout.write(e.response+`
15
+ `),n(0)},a=e=>{r(),e.response&&process.stdout.write(e.response+`
16
+ `),n(0)},o=e=>{r(),process.stderr.write(e.message+`
17
+ `),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,o),h(e,t).then(i=>{if(i.kind===`command-result`){r(),process.stdout.write(i.result.message+`
18
+ `),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function T(e,t){return new Promise(n=>{let r=()=>{e.off(`complete`,i),e.off(`interrupted`,a),e.off(`error`,o)},i=t=>{r(),S(C(e),t.response,`success`),n(0)},a=t=>{r(),S(C(e),t.response,`success`),n(0)},o=t=>{r(),S(C(e),``,`error`,t),n(1)};e.on(`complete`,i),e.on(`interrupted`,a),e.on(`error`,o),h(e,t).then(i=>{if(i.kind===`command-result`){r(),S(C(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function E(e,t){return new Promise(n=>{let r=_(e,C,S,n);h(e,t).then(i=>{if(i.kind===`command-result`){r(),S(C(e),i.result.message,i.result.success?`success`:`error`),n(+!i.result.success);return}i.kind!==`session-execution`&&e.submit(t)})})}function D(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 y({session:t,outputFormat:e.outputFormat}).run(e.prompt)},async stop(){},getExitCode(){return n}}}var O=class{opts;exitCode=0;constructor(e){this.opts=e}async run(e){let t=this.createSession(),n=y({session:t,outputFormat:this.opts.outputFormat});this.exitCode=await n.run(e),await t.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`})}async runGoal(e,t={}){let n=this.createSession(),r=y({session:n,outputFormat:this.opts.outputFormat});this.exitCode=await r.runGoal(e,t),await n.shutdown({reason:`prompt_input_exit`,message:`Headless goal complete`})}createSession(){let e=this.opts.shellExec??(e=>(0,u.execSync)(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd());return new d.InteractiveSession({cwd:this.opts.cwd,provider:this.opts.provider,permissionMode:this.opts.permissionMode??`bypassPermissions`,maxTurns:this.opts.maxTurns,sessionStore:this.opts.sessionStore,resumeSessionId:this.opts.resumeSessionId,forkSession:this.opts.forkSession,sessionName:this.opts.sessionName,bare:this.opts.bare||void 0,allowedTools:this.opts.allowedTools,deniedTools:this.opts.deniedTools,appendSystemPrompt:this.opts.appendSystemPrompt,...this.opts.persona===void 0?{}:{persona:this.opts.persona},...this.opts.systemPrompt?{systemPrompt:this.opts.systemPrompt}:{},backgroundTaskRunners:this.opts.backgroundTaskRunners,subagentRunnerFactory:this.opts.subagentRunnerFactory,commandModules:this.opts.commandModules,commandHostAdapters:this.opts.commandHostAdapters,shellExec:e,agentName:this.opts.agentName,...this.opts.activePresetId===void 0?{}:{activePresetId:this.opts.activePresetId},...this.opts.enableParallelSubagents===void 0?{}:{enableParallelSubagents:this.opts.enableParallelSubagents},...this.opts.selfVerification===void 0?{}:{selfVerification:this.opts.selfVerification}})}getExitCode(){return this.exitCode}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return O}});
@@ -1,6 +1,6 @@
1
- import { IAIProvider, ISpinner, ITerminalOutput, TPermissionMode } from "@robota-sdk/agent-core";
2
- import { IInteractiveSession, IInteractiveSessionStore, ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
1
  import { IBackgroundTaskRunner, ICommandHostAdapters, ICommandModule, TShellExecFn, TSubagentRunnerFactory } from "@robota-sdk/agent-framework";
2
+ import { IInteractiveSession, IInteractiveSessionStore, ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
+ import { IAIProvider, ISpinner, ITerminalOutput, TPermissionMode } from "@robota-sdk/agent-core";
4
4
 
5
5
  //#region src/headless/print-terminal.d.ts
6
6
  declare class PrintTerminal implements ITerminalOutput {
@@ -18,12 +18,17 @@ declare const promptInput: (label: string, masked?: boolean) => Promise<string>;
18
18
  //#endregion
19
19
  //#region src/headless/headless-runner.d.ts
20
20
  type TOutputFormat = 'text' | 'json' | 'stream-json';
21
+ /** GOAL-001: options for an autonomous headless goal run. */
22
+ interface IHeadlessGoalOptions {
23
+ maxIterations?: number;
24
+ }
21
25
  interface IHeadlessRunnerOptions {
22
26
  session: IInteractiveSession;
23
27
  outputFormat: TOutputFormat;
24
28
  }
25
29
  declare function createHeadlessRunner(options: IHeadlessRunnerOptions): {
26
30
  run: (prompt: string) => Promise<number>;
31
+ runGoal: (objective: string, goalOptions?: IHeadlessGoalOptions) => Promise<number>;
27
32
  };
28
33
  //#endregion
29
34
  //#region src/headless/headless-transport.d.ts
@@ -76,8 +81,16 @@ declare class HeadlessInteractionChannel {
76
81
  private exitCode;
77
82
  constructor(options: IHeadlessInteractionChannelOptions);
78
83
  run(prompt: string): Promise<void>;
84
+ /**
85
+ * GOAL-001: run an autonomous goal to completion (or a stop condition) in headless mode.
86
+ * Mirrors {@link run} but drives the framework goal loop instead of a single prompt.
87
+ */
88
+ runGoal(objective: string, options?: {
89
+ maxIterations?: number;
90
+ }): Promise<void>;
91
+ private createSession;
79
92
  getExitCode(): number;
80
93
  }
81
94
  //#endregion
82
95
  export { IHeadlessRunnerOptions as a, promptInput as c, createHeadlessTransport as i, PrintTerminal as l, IHeadlessInteractionChannelOptions as n, TOutputFormat as o, IHeadlessTransportOptions as r, createHeadlessRunner as s, HeadlessInteractionChannel as t };
83
- //# sourceMappingURL=index-E8Gx4-lc.d.ts.map
96
+ //# sourceMappingURL=index-CrJ2Lhn3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CrJ2Lhn3.d.ts","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts","../../src/headless/HeadlessInteractionChannel.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;;;KCMvD,aAAA;;UAGK,oBAAA;EACf,aAAa;AAAA;AAAA,UAGE,sBAAA;EACf,OAAA,EAAS,mBAAA;EACT,YAAA,EAAc,aAAa;AAAA;AAAA,iBAMb,oBAAA,CAAqB,OAAA,EAAS,sBAAA;EAC5C,GAAA,GAAM,MAAA,aAAmB,OAAA;EACzB,OAAA,GAAU,SAAA,UAAmB,WAAA,GAAc,oBAAA,KAAyB,OAAA;AAAA;;;UCbrD,yBAAA;EH2BoC;EGzBnD,YAAA,EAAc,aAAa;EHFS;EGIpC,MAAA;AAAA;AAAA,iBAGc,uBAAA,CACd,OAAA,EAAS,yBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,WAAA;AAAA;;;UCE7B,kCAAA;EACf,GAAA;EACA,QAAA,EAAU,WAAA;EACV,YAAA,EAAc,aAAA;EACd,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,YAAA,GAAe,wBAAA;EJbf;EIeA,eAAA;EJZA;EIcA,WAAA;EACA,WAAA;EACA,IAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,YAAA;EJAa;EIEb,SAAA;EJFmD;EIInD,cAAA;EJUQ;EIRR,OAAA;EJQmC;EINnC,uBAAA;;EAEA,gBAAA;EACA,qBAAA,GAAwB,qBAAA;EACxB,qBAAA,GAAwB,sBAAA;EACxB,cAAA,YAA0B,cAAA;EAC1B,mBAAA,GAAsB,oBAAA;EACtB,SAAA,GAAY,YAAA;AAAA;AAAA,cAGD,0BAAA;EAAA,iBACM,IAAA;EAAA,QACT,QAAA;cAEI,OAAA,EAAS,kCAAA;EAIf,GAAA,CAAI,MAAA,WAAiB,OAAA;;;AFzD7B;;EEoEQ,OAAA,CAAQ,SAAA,UAAmB,OAAA;IAAW,aAAA;EAAA,IAAgC,OAAA;EAAA,QAOpE,aAAA;EA0CR,WAAA;AAAA"}
@@ -0,0 +1,52 @@
1
+ import { ICommandModule } from "@robota-sdk/agent-framework";
2
+ import { IAgentDriver, ICommandInfo, IInteractionChannel, IInteractiveSessionStore, InteractionEvent } from "@robota-sdk/agent-interface-transport";
3
+ import { IAIProvider, IActionRequest, TActionResponse, TPermissionMode } from "@robota-sdk/agent-core";
4
+
5
+ //#region src/programmatic/ProgrammaticInteractionChannel.d.ts
6
+ declare class ProgrammaticInteractionChannel implements IInteractionChannel {
7
+ /** Full structured event stream pushed by the framework, in order. */
8
+ readonly events: InteractionEvent[];
9
+ availableCommands: ICommandInfo[];
10
+ busy: boolean;
11
+ started: boolean;
12
+ stopped: boolean;
13
+ private submitHandler;
14
+ private readonly userActionResponses;
15
+ onSubmit(handler: (text: string) => Promise<void>): void;
16
+ write(event: InteractionEvent): void;
17
+ /**
18
+ * CMD-004 unified ask. Resolves from the pre-supplied queue (FIFO); an empty queue resolves
19
+ * `{ type: 'cancelled' }` so a programmatic run never blocks on an un-answered question.
20
+ */
21
+ askUser(_request: IActionRequest): Promise<TActionResponse>;
22
+ setAvailableCommands(commands: ICommandInfo[]): void;
23
+ setBusy(busy: boolean): void;
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ /** Push a user submission into the framework (the programmatic "user types and presses enter"). */
27
+ submit(text: string): Promise<void>;
28
+ /** Pre-answer the next `askUser` (CMD-004 unified ask). */
29
+ queueUserAction(response: TActionResponse): void;
30
+ }
31
+ //#endregion
32
+ //#region src/programmatic/createProgrammaticAgent.d.ts
33
+ interface ICreateProgrammaticAgentOptions {
34
+ /** Provider that answers the agent loop (e.g. a real provider, or the scripted provider in tests). */
35
+ provider: IAIProvider;
36
+ /** Working directory for session creation. */
37
+ cwd: string;
38
+ /** Slash-command modules to register (defaults to none). */
39
+ commandModules?: readonly ICommandModule[];
40
+ /** Optional session store for persistence. */
41
+ sessionStore?: IInteractiveSessionStore;
42
+ /** Permission mode for tool execution (e.g. `'bypassPermissions'` for unattended driving). */
43
+ permissionMode?: TPermissionMode;
44
+ }
45
+ /**
46
+ * Construct an in-process {@link IAgentDriver} bound to a real `InteractiveSession`. The returned
47
+ * driver's accessors are the shared `read*` helpers applied to the captured event stream.
48
+ */
49
+ declare function createProgrammaticAgent(options: ICreateProgrammaticAgentOptions): IAgentDriver;
50
+ //#endregion
51
+ export { createProgrammaticAgent as n, ProgrammaticInteractionChannel as r, ICreateProgrammaticAgentOptions as t };
52
+ //# sourceMappingURL=index-JIvzrtaA.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-JIvzrtaA.d.ts","names":[],"sources":["../../src/programmatic/ProgrammaticInteractionChannel.ts","../../src/programmatic/createProgrammaticAgent.ts"],"mappings":";;;;;cAmBa,8BAAA,YAA0C,mBAAA;EA0BZ;EAAA,SAxBhC,MAAA,EAAQ,gBAAA;EAEjB,iBAAA,EAAmB,YAAA;EACnB,IAAA;EACA,OAAA;EACA,OAAA;EAAA,QAEQ,aAAA;EAAA,iBACS,mBAAA;EAIjB,QAAA,CAAS,OAAA,GAAU,IAAA,aAAiB,OAAA;EAIpC,KAAA,CAAM,KAAA,EAAO,gBAAA;EAhBJ;;;;EAwBH,OAAA,CAAQ,QAAA,EAAU,cAAA,GAAiB,OAAA,CAAQ,eAAA;EAIjD,oBAAA,CAAqB,QAAA,EAAU,YAAA;EAI/B,OAAA,CAAQ,IAAA;EAIF,KAAA,IAAS,OAAA;EAIT,IAAA,IAAQ,OAAA;EA5Bd;EAmCM,MAAA,CAAO,IAAA,WAAe,OAAA;EAnCQ;EA6CpC,eAAA,CAAgB,QAAA,EAAU,eAAA;AAAA;;;UCrDX,+BAAA;EDoB0B;EClBzC,QAAA,EAAU,WAAA;ED8BK;EC5Bf,GAAA;EDuC4B;ECrC5B,cAAA,YAA0B,cAAA;EDZ2B;ECcrD,YAAA,GAAe,wBAAA;EDdyD;ECgBxE,cAAA,GAAiB,eAAA;AAAA;;;;;iBAOH,uBAAA,CAAwB,OAAA,EAAS,+BAAA,GAAkC,YAAY"}
@@ -1,6 +1,6 @@
1
- import { IBackgroundTaskRunner, ICommandHostAdapters, ICommandModule, TShellExecFn, TSubagentRunnerFactory } from "@robota-sdk/agent-framework";
2
1
  import { IAIProvider, ISpinner, ITerminalOutput, TPermissionMode } from "@robota-sdk/agent-core";
3
2
  import { IInteractiveSession, IInteractiveSessionStore, ITransportAdapter } from "@robota-sdk/agent-interface-transport";
3
+ import { IBackgroundTaskRunner, ICommandHostAdapters, ICommandModule, TShellExecFn, TSubagentRunnerFactory } from "@robota-sdk/agent-framework";
4
4
 
5
5
  //#region src/headless/print-terminal.d.ts
6
6
  declare class PrintTerminal implements ITerminalOutput {
@@ -18,12 +18,17 @@ declare const promptInput: (label: string, masked?: boolean) => Promise<string>;
18
18
  //#endregion
19
19
  //#region src/headless/headless-runner.d.ts
20
20
  type TOutputFormat = 'text' | 'json' | 'stream-json';
21
+ /** GOAL-001: options for an autonomous headless goal run. */
22
+ interface IHeadlessGoalOptions {
23
+ maxIterations?: number;
24
+ }
21
25
  interface IHeadlessRunnerOptions {
22
26
  session: IInteractiveSession;
23
27
  outputFormat: TOutputFormat;
24
28
  }
25
29
  declare function createHeadlessRunner(options: IHeadlessRunnerOptions): {
26
30
  run: (prompt: string) => Promise<number>;
31
+ runGoal: (objective: string, goalOptions?: IHeadlessGoalOptions) => Promise<number>;
27
32
  };
28
33
  //#endregion
29
34
  //#region src/headless/headless-transport.d.ts
@@ -76,8 +81,16 @@ declare class HeadlessInteractionChannel {
76
81
  private exitCode;
77
82
  constructor(options: IHeadlessInteractionChannelOptions);
78
83
  run(prompt: string): Promise<void>;
84
+ /**
85
+ * GOAL-001: run an autonomous goal to completion (or a stop condition) in headless mode.
86
+ * Mirrors {@link run} but drives the framework goal loop instead of a single prompt.
87
+ */
88
+ runGoal(objective: string, options?: {
89
+ maxIterations?: number;
90
+ }): Promise<void>;
91
+ private createSession;
79
92
  getExitCode(): number;
80
93
  }
81
94
  //#endregion
82
95
  export { IHeadlessRunnerOptions as a, promptInput as c, createHeadlessTransport as i, PrintTerminal as l, IHeadlessInteractionChannelOptions as n, TOutputFormat as o, IHeadlessTransportOptions as r, createHeadlessRunner as s, HeadlessInteractionChannel as t };
83
- //# sourceMappingURL=index-CYl7ksS6.d.ts.map
96
+ //# sourceMappingURL=index-JTD_xtEQ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-JTD_xtEQ.d.ts","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts","../../src/headless/HeadlessInteractionChannel.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;;;KCMvD,aAAA;;UAGK,oBAAA;EACf,aAAa;AAAA;AAAA,UAGE,sBAAA;EACf,OAAA,EAAS,mBAAA;EACT,YAAA,EAAc,aAAa;AAAA;AAAA,iBAMb,oBAAA,CAAqB,OAAA,EAAS,sBAAA;EAC5C,GAAA,GAAM,MAAA,aAAmB,OAAA;EACzB,OAAA,GAAU,SAAA,UAAmB,WAAA,GAAc,oBAAA,KAAyB,OAAA;AAAA;;;UCbrD,yBAAA;EH2BoC;EGzBnD,YAAA,EAAc,aAAa;EHFS;EGIpC,MAAA;AAAA;AAAA,iBAGc,uBAAA,CACd,OAAA,EAAS,yBAAA,GACR,iBAAA,CAAkB,mBAAA;EAAyB,WAAA;AAAA;;;UCE7B,kCAAA;EACf,GAAA;EACA,QAAA,EAAU,WAAA;EACV,YAAA,EAAc,aAAA;EACd,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,YAAA,GAAe,wBAAA;EJbf;EIeA,eAAA;EJZA;EIcA,WAAA;EACA,WAAA;EACA,IAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,YAAA;EJAa;EIEb,SAAA;EJFmD;EIInD,cAAA;EJUQ;EIRR,OAAA;EJQmC;EINnC,uBAAA;;EAEA,gBAAA;EACA,qBAAA,GAAwB,qBAAA;EACxB,qBAAA,GAAwB,sBAAA;EACxB,cAAA,YAA0B,cAAA;EAC1B,mBAAA,GAAsB,oBAAA;EACtB,SAAA,GAAY,YAAA;AAAA;AAAA,cAGD,0BAAA;EAAA,iBACM,IAAA;EAAA,QACT,QAAA;cAEI,OAAA,EAAS,kCAAA;EAIf,GAAA,CAAI,MAAA,WAAiB,OAAA;;;AFzD7B;;EEoEQ,OAAA,CAAQ,SAAA,UAAmB,OAAA;IAAW,aAAA;EAAA,IAAgC,OAAA;EAAA,QAOpE,aAAA;EA0CR,WAAA;AAAA"}
@@ -0,0 +1,52 @@
1
+ import { IAIProvider, IActionRequest, TActionResponse, TPermissionMode } from "@robota-sdk/agent-core";
2
+ import { IAgentDriver, ICommandInfo, IInteractionChannel, IInteractiveSessionStore, InteractionEvent } from "@robota-sdk/agent-interface-transport";
3
+ import { ICommandModule } from "@robota-sdk/agent-framework";
4
+
5
+ //#region src/programmatic/ProgrammaticInteractionChannel.d.ts
6
+ declare class ProgrammaticInteractionChannel implements IInteractionChannel {
7
+ /** Full structured event stream pushed by the framework, in order. */
8
+ readonly events: InteractionEvent[];
9
+ availableCommands: ICommandInfo[];
10
+ busy: boolean;
11
+ started: boolean;
12
+ stopped: boolean;
13
+ private submitHandler;
14
+ private readonly userActionResponses;
15
+ onSubmit(handler: (text: string) => Promise<void>): void;
16
+ write(event: InteractionEvent): void;
17
+ /**
18
+ * CMD-004 unified ask. Resolves from the pre-supplied queue (FIFO); an empty queue resolves
19
+ * `{ type: 'cancelled' }` so a programmatic run never blocks on an un-answered question.
20
+ */
21
+ askUser(_request: IActionRequest): Promise<TActionResponse>;
22
+ setAvailableCommands(commands: ICommandInfo[]): void;
23
+ setBusy(busy: boolean): void;
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ /** Push a user submission into the framework (the programmatic "user types and presses enter"). */
27
+ submit(text: string): Promise<void>;
28
+ /** Pre-answer the next `askUser` (CMD-004 unified ask). */
29
+ queueUserAction(response: TActionResponse): void;
30
+ }
31
+ //#endregion
32
+ //#region src/programmatic/createProgrammaticAgent.d.ts
33
+ interface ICreateProgrammaticAgentOptions {
34
+ /** Provider that answers the agent loop (e.g. a real provider, or the scripted provider in tests). */
35
+ provider: IAIProvider;
36
+ /** Working directory for session creation. */
37
+ cwd: string;
38
+ /** Slash-command modules to register (defaults to none). */
39
+ commandModules?: readonly ICommandModule[];
40
+ /** Optional session store for persistence. */
41
+ sessionStore?: IInteractiveSessionStore;
42
+ /** Permission mode for tool execution (e.g. `'bypassPermissions'` for unattended driving). */
43
+ permissionMode?: TPermissionMode;
44
+ }
45
+ /**
46
+ * Construct an in-process {@link IAgentDriver} bound to a real `InteractiveSession`. The returned
47
+ * driver's accessors are the shared `read*` helpers applied to the captured event stream.
48
+ */
49
+ declare function createProgrammaticAgent(options: ICreateProgrammaticAgentOptions): IAgentDriver;
50
+ //#endregion
51
+ export { createProgrammaticAgent as n, ProgrammaticInteractionChannel as r, ICreateProgrammaticAgentOptions as t };
52
+ //# sourceMappingURL=index-y_HBOfzO.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-y_HBOfzO.d.ts","names":[],"sources":["../../src/programmatic/ProgrammaticInteractionChannel.ts","../../src/programmatic/createProgrammaticAgent.ts"],"mappings":";;;;;cAmBa,8BAAA,YAA0C,mBAAA;EA0BZ;EAAA,SAxBhC,MAAA,EAAQ,gBAAA;EAEjB,iBAAA,EAAmB,YAAA;EACnB,IAAA;EACA,OAAA;EACA,OAAA;EAAA,QAEQ,aAAA;EAAA,iBACS,mBAAA;EAIjB,QAAA,CAAS,OAAA,GAAU,IAAA,aAAiB,OAAA;EAIpC,KAAA,CAAM,KAAA,EAAO,gBAAA;EAhBJ;;;;EAwBH,OAAA,CAAQ,QAAA,EAAU,cAAA,GAAiB,OAAA,CAAQ,eAAA;EAIjD,oBAAA,CAAqB,QAAA,EAAU,YAAA;EAI/B,OAAA,CAAQ,IAAA;EAIF,KAAA,IAAS,OAAA;EAIT,IAAA,IAAQ,OAAA;EA5Bd;EAmCM,MAAA,CAAO,IAAA,WAAe,OAAA;EAnCQ;EA6CpC,eAAA,CAAgB,QAAA,EAAU,eAAA;AAAA;;;UCrDX,+BAAA;EDoB0B;EClBzC,QAAA,EAAU,WAAA;ED8BK;EC5Bf,GAAA;EDuC4B;ECrC5B,cAAA,YAA0B,cAAA;EDZ2B;ECcrD,YAAA,GAAe,wBAAA;EDdyD;ECgBxE,cAAA,GAAiB,eAAA;AAAA;;;;;iBAOH,uBAAA,CAAwB,OAAA,EAAS,+BAAA,GAAkC,YAAY"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./headless-CT2ibQnr.cjs"),t=require("./http-CBAvefLw.cjs"),n=require("./ws-QNMQn5kg.cjs"),r=require("./mcp-BOglBJNy.cjs"),i=require("./tui-DznRbcku.cjs");let a=require("@robota-sdk/agent-framework");var o=class{entries=new Map;settingsPath;constructor(e){this.settingsPath=e}register(e){this.entries.set(e.name,e)}getAll(){let e=this.readTransportSettings();return Array.from(this.entries.values()).map(t=>({transport:t,config:this.resolveConfig(t,e[t.name])}))}getEnabled(){return this.getAll().filter(e=>e.config.enabled).map(e=>e.transport)}async setEnabled(e,t){let n=(0,a.readSettings)(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},enabled:t},n.transports=r,(0,a.writeSettings)(this.settingsPath,n)}async setOptions(e,t){let n=(0,a.readSettings)(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},options:t},n.transports=r,(0,a.writeSettings)(this.settingsPath,n)}async startAll(e){let t=this.getEnabled();for(let n of t)n.attach(e),await n.start()}async stopAll(){for(let e of this.entries.values())await e.stop()}resolveConfig(e,t){return{enabled:t?.enabled??e.defaultEnabled,options:t?.options??{}}}readTransportSettings(){let e=(0,a.readSettings)(this.settingsPath).transports;return!e||typeof e!=`object`||Array.isArray(e)?{}:e}};function s(){let e=new o((0,a.getUserSettingsPath)());return e.register(new n.t),e}exports.HeadlessInteractionChannel=e.t,exports.PrintTerminal=e.a,exports.TransportRegistry=o,exports.TuiTransport=i.n,exports.WsTransport=n.t,exports.createAgentMcpServer=r.n,exports.createAgentRoutes=t.n,exports.createDefaultTransportRegistry=s,exports.createDefaultTuiCliAdapter=i.t,exports.createHeadlessRunner=e.r,exports.createHeadlessTransport=e.n,exports.createHttpTransport=t.t,exports.createMcpTransport=r.t,exports.createWsHandler=n.r,exports.createWsTransport=n.n,exports.promptInput=e.i,exports.renderApp=i.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./headless-xq77JBq0.cjs"),t=require("./programmatic-6wLf68qJ.cjs");let n=require("@robota-sdk/agent-framework");var r=class{entries=new Map;settingsPath;constructor(e){this.settingsPath=e}register(e){this.entries.set(e.name,e)}getAll(){let e=this.readTransportSettings();return Array.from(this.entries.values()).map(t=>({transport:t,config:this.resolveConfig(t,e[t.name])}))}getEnabled(){return this.getAll().filter(e=>e.config.enabled).map(e=>e.transport)}async setEnabled(e,t){let r=(0,n.readSettings)(this.settingsPath),i=r.transports??{};i[e]={...i[e]??{},enabled:t},r.transports=i,(0,n.writeSettings)(this.settingsPath,r)}async setOptions(e,t){let r=(0,n.readSettings)(this.settingsPath),i=r.transports??{};i[e]={...i[e]??{},options:t},r.transports=i,(0,n.writeSettings)(this.settingsPath,r)}async startAll(e){let t=this.getEnabled();for(let n of t)n.attach(e),await n.start()}async stopAll(){let e=[];for(let t of this.entries.values())try{await t.stop()}catch(t){e.push(t instanceof Error?t:Error(String(t)))}return{errors:e}}resolveConfig(e,t){return{enabled:t?.enabled??e.defaultEnabled,options:t?.options??{}}}readTransportSettings(){let e=(0,n.readSettings)(this.settingsPath).transports;return!e||typeof e!=`object`||Array.isArray(e)?{}:e}};exports.HeadlessInteractionChannel=e.t,exports.PrintTerminal=e.a,exports.ProgrammaticInteractionChannel=t.n,exports.TransportRegistry=r,exports.createHeadlessRunner=e.r,exports.createHeadlessTransport=e.n,exports.createProgrammaticAgent=t.t,exports.promptInput=e.i;
@@ -1,9 +1,6 @@
1
- import { a as IHeadlessRunnerOptions, c as promptInput, i as createHeadlessTransport, l as PrintTerminal, n as IHeadlessInteractionChannelOptions, o as TOutputFormat, r as IHeadlessTransportOptions, s as createHeadlessRunner, t as HeadlessInteractionChannel } from "./index-E8Gx4-lc.js";
2
- import { a as createAgentRoutes, i as TSessionFactory, n as createHttpTransport, r as IAgentRoutesOptions, t as IHttpTransportOptions } from "./index-BnAGE-u9.js";
3
- 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-CoeBF21y.js";
4
- import { i as createAgentMcpServer, n as createMcpTransport, r as IAgentMcpOptions, t as IMcpTransportOptions } from "./index-c0M42fsA.js";
5
- import { a as TAnyTuiCommandInteraction, c as createDefaultTuiCliAdapter, d as renderApp, f as ITuiCliAdapter, i as ITuiPickerItem, l as TuiTransport, n as ITuiConfirmInteraction, o as TOnMissingArgsAction, r as ITuiPickerInteraction, s as IDefaultTuiCliAdapterOptions, t as ITuiCommandInteraction, u as IRenderOptions } from "./index-BUhHIf7X.js";
6
- import { TUniversalValue } from "@robota-sdk/agent-core";
1
+ import { a as IHeadlessRunnerOptions, c as promptInput, i as createHeadlessTransport, l as PrintTerminal, n as IHeadlessInteractionChannelOptions, o as TOutputFormat, r as IHeadlessTransportOptions, s as createHeadlessRunner, t as HeadlessInteractionChannel } from "./index-JTD_xtEQ.js";
2
+ import { n as createProgrammaticAgent, r as ProgrammaticInteractionChannel, t as ICreateProgrammaticAgentOptions } from "./index-y_HBOfzO.js";
3
+ import { IDestroyResult, TUniversalValue } from "@robota-sdk/agent-core";
7
4
  import { IConfigurableTransport, IInteractiveSession, ITransportEntry } from "@robota-sdk/agent-interface-transport";
8
5
 
9
6
  //#region src/transport-registry.d.ts
@@ -17,11 +14,15 @@ declare class TransportRegistry {
17
14
  setEnabled(name: string, enabled: boolean): Promise<void>;
18
15
  setOptions(name: string, options: Record<string, TUniversalValue>): Promise<void>;
19
16
  startAll(session: IInteractiveSession): Promise<void>;
20
- stopAll(): Promise<void>;
17
+ /**
18
+ * Stop every registered transport — **best-effort** (CORE-013 disposal convention): one
19
+ * transport's stop failure must not skip the others or reject a fire-and-forget caller.
20
+ * Failures are collected into the returned result.
21
+ */
22
+ stopAll(): Promise<IDestroyResult>;
21
23
  private resolveConfig;
22
24
  private readTransportSettings;
23
25
  }
24
- declare function createDefaultTransportRegistry(): TransportRegistry;
25
26
  //#endregion
26
- export { HeadlessInteractionChannel, type IAgentMcpOptions, type IAgentRoutesOptions, type IDefaultTuiCliAdapterOptions, type IExecutionWorkspaceEntry, type IExecutionWorkspaceSnapshot, type IHeadlessInteractionChannelOptions, type IHeadlessRunnerOptions, type IHeadlessTransportOptions, type IHttpTransportOptions, type IMcpTransportOptions, type IRenderOptions, type ITuiCliAdapter, type ITuiCommandInteraction, type ITuiConfirmInteraction, type ITuiPickerInteraction, type ITuiPickerItem, type IWsHandlerOptions, type IWsTransportConfig, type IWsTransportOptions, PrintTerminal, type TAnyTuiCommandInteraction, type TClientMessage, type TExecutionAttention, type TExecutionWorkspaceStatus, type TOnMissingArgsAction, type TOutputFormat, type TServerMessage, type TSessionFactory, TransportRegistry, TuiTransport, WsTransport, createAgentMcpServer, createAgentRoutes, createDefaultTransportRegistry, createDefaultTuiCliAdapter, createHeadlessRunner, createHeadlessTransport, createHttpTransport, createMcpTransport, createWsHandler, createWsTransport, promptInput, renderApp };
27
+ export { HeadlessInteractionChannel, type ICreateProgrammaticAgentOptions, type IHeadlessInteractionChannelOptions, type IHeadlessRunnerOptions, type IHeadlessTransportOptions, PrintTerminal, ProgrammaticInteractionChannel, type TOutputFormat, TransportRegistry, createHeadlessRunner, createHeadlessTransport, createProgrammaticAgent, promptInput };
27
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/transport-registry.ts"],"mappings":";;;;;;;;;cAoBa,iBAAA;EAAA,iBACM,OAAA;EAAA,iBACA,YAAA;cAEL,YAAA;EAIZ,QAAA,CAAS,SAAA,EAAW,sBAAA,CAAuB,mBAAA;EAI3C,MAAA,IAAU,eAAA,CAAgB,mBAAA;EAQ1B,UAAA,IAAc,sBAAA,CAAuB,mBAAA;EAM/B,UAAA,CAAW,IAAA,UAAc,OAAA,YAAmB,OAAA;EAS5C,UAAA,CAAW,IAAA,UAAc,OAAA,EAAS,MAAA,SAAe,eAAA,IAAmB,OAAA;EASpE,QAAA,CAAS,OAAA,EAAS,mBAAA,GAAsB,OAAA;EAQxC,OAAA,IAAW,OAAA;EAAA,QAMT,aAAA;EAAA,QASA,qBAAA;AAAA;AAAA,iBAQM,8BAAA,IAAkC,iBAAiB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/transport-registry.ts"],"mappings":";;;;;;cAiBa,iBAAA;EAAA,iBACM,OAAA;EAAA,iBACA,YAAA;cAEL,YAAA;EAIZ,QAAA,CAAS,SAAA,EAAW,sBAAA,CAAuB,mBAAA;EAI3C,MAAA,IAAU,eAAA,CAAgB,mBAAA;EAQ1B,UAAA,IAAc,sBAAA,CAAuB,mBAAA;EAM/B,UAAA,CAAW,IAAA,UAAc,OAAA,YAAmB,OAAA;EAS5C,UAAA,CAAW,IAAA,UAAc,OAAA,EAAS,MAAA,SAAe,eAAA,IAAmB,OAAA;EASpE,QAAA,CAAS,OAAA,EAAS,mBAAA,GAAsB,OAAA;EAT4B;;;;;EAsBpE,OAAA,IAAW,OAAA,CAAQ,cAAA;EAAA,QAajB,aAAA;EAAA,QASA,qBAAA;AAAA"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r,t as i}from"./headless-mRYilLfC.js";import{n as a,t as o}from"./http-2Jiuflc1.js";import{n as s,r as c,t as l}from"./ws-Dc2RUwVs.js";import{n as u,t as d}from"./mcp-D3BBVK7C.js";import{n as f,r as p,t as m}from"./tui-CcH5EsQh.js";import{getUserSettingsPath as h,readSettings as g,writeSettings as _}from"@robota-sdk/agent-framework";var v=class{entries=new Map;settingsPath;constructor(e){this.settingsPath=e}register(e){this.entries.set(e.name,e)}getAll(){let e=this.readTransportSettings();return Array.from(this.entries.values()).map(t=>({transport:t,config:this.resolveConfig(t,e[t.name])}))}getEnabled(){return this.getAll().filter(e=>e.config.enabled).map(e=>e.transport)}async setEnabled(e,t){let n=g(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},enabled:t},n.transports=r,_(this.settingsPath,n)}async setOptions(e,t){let n=g(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},options:t},n.transports=r,_(this.settingsPath,n)}async startAll(e){let t=this.getEnabled();for(let n of t)n.attach(e),await n.start()}async stopAll(){for(let e of this.entries.values())await e.stop()}resolveConfig(e,t){return{enabled:t?.enabled??e.defaultEnabled,options:t?.options??{}}}readTransportSettings(){let e=g(this.settingsPath).transports;return!e||typeof e!=`object`||Array.isArray(e)?{}:e}};function y(){let e=new v(h());return e.register(new l),e}export{i as HeadlessInteractionChannel,e as PrintTerminal,v as TransportRegistry,f as TuiTransport,l as WsTransport,u as createAgentMcpServer,a as createAgentRoutes,y as createDefaultTransportRegistry,m as createDefaultTuiCliAdapter,r as createHeadlessRunner,n as createHeadlessTransport,o as createHttpTransport,d as createMcpTransport,c as createWsHandler,s as createWsTransport,t as promptInput,p as renderApp};
1
+ import{a as e,i as t,n,r,t as i}from"./headless-DG_MEbf0.js";import{n as a,t as o}from"./programmatic-70dxIXtS.js";import{readSettings as s,writeSettings as c}from"@robota-sdk/agent-framework";var l=class{entries=new Map;settingsPath;constructor(e){this.settingsPath=e}register(e){this.entries.set(e.name,e)}getAll(){let e=this.readTransportSettings();return Array.from(this.entries.values()).map(t=>({transport:t,config:this.resolveConfig(t,e[t.name])}))}getEnabled(){return this.getAll().filter(e=>e.config.enabled).map(e=>e.transport)}async setEnabled(e,t){let n=s(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},enabled:t},n.transports=r,c(this.settingsPath,n)}async setOptions(e,t){let n=s(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},options:t},n.transports=r,c(this.settingsPath,n)}async startAll(e){let t=this.getEnabled();for(let n of t)n.attach(e),await n.start()}async stopAll(){let e=[];for(let t of this.entries.values())try{await t.stop()}catch(t){e.push(t instanceof Error?t:Error(String(t)))}return{errors:e}}resolveConfig(e,t){return{enabled:t?.enabled??e.defaultEnabled,options:t?.options??{}}}readTransportSettings(){let e=s(this.settingsPath).transports;return!e||typeof e!=`object`||Array.isArray(e)?{}:e}};export{i as HeadlessInteractionChannel,e as PrintTerminal,a as ProgrammaticInteractionChannel,l as TransportRegistry,r as createHeadlessRunner,n as createHeadlessTransport,o as createProgrammaticAgent,t as promptInput};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/transport-registry.ts"],"sourcesContent":["/**\n * TransportRegistry — manages IConfigurableTransport instances with settings-backed enable/disable.\n *\n * Settings file shape (under `transports` key in settings.json):\n * { \"ws\": { \"enabled\": true, \"options\": { \"port\": 7070 } } }\n */\n\nimport { getUserSettingsPath } from '@robota-sdk/agent-framework';\nimport { readSettings, writeSettings, type TSettingsData } from '@robota-sdk/agent-framework';\n\nimport { WsTransport } from './ws/index.js';\n\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\nimport type {\n IConfigurableTransport,\n IInteractiveSession,\n ITransportConfig,\n ITransportEntry,\n} from '@robota-sdk/agent-interface-transport';\n\nexport class TransportRegistry {\n private readonly entries = new Map<string, IConfigurableTransport<IInteractiveSession>>();\n private readonly settingsPath: string;\n\n constructor(settingsPath: string) {\n this.settingsPath = settingsPath;\n }\n\n register(transport: IConfigurableTransport<IInteractiveSession>): void {\n this.entries.set(transport.name, transport);\n }\n\n getAll(): ITransportEntry<IInteractiveSession>[] {\n const saved = this.readTransportSettings();\n return Array.from(this.entries.values()).map((transport) => ({\n transport,\n config: this.resolveConfig(transport, saved[transport.name]),\n }));\n }\n\n getEnabled(): IConfigurableTransport<IInteractiveSession>[] {\n return this.getAll()\n .filter((e) => e.config.enabled)\n .map((e) => e.transport);\n }\n\n async setEnabled(name: string, enabled: boolean): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, enabled } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async setOptions(name: string, options: Record<string, TUniversalValue>): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, options: options as TSettingsData } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async startAll(session: IInteractiveSession): Promise<void> {\n const enabled = this.getEnabled();\n for (const transport of enabled) {\n transport.attach(session);\n await transport.start();\n }\n }\n\n async stopAll(): Promise<void> {\n for (const transport of this.entries.values()) {\n await transport.stop();\n }\n }\n\n private resolveConfig(\n transport: IConfigurableTransport<IInteractiveSession>,\n saved?: TSettingsData,\n ): ITransportConfig {\n const enabled = (saved?.enabled as boolean | undefined) ?? transport.defaultEnabled;\n const options = (saved?.options as Record<string, TUniversalValue> | undefined) ?? {};\n return { enabled, options };\n }\n\n private readTransportSettings(): Record<string, TSettingsData> {\n const settings = readSettings(this.settingsPath);\n const raw = settings.transports;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n return raw as Record<string, TSettingsData>;\n }\n}\n\nexport function createDefaultTransportRegistry(): TransportRegistry {\n const registry = new TransportRegistry(getUserSettingsPath());\n registry.register(new WsTransport());\n return registry;\n}\n"],"mappings":"sWAoBA,IAAa,EAAb,KAA+B,CAC7B,QAA2B,IAAI,IAC/B,aAEA,YAAY,EAAsB,CAChC,KAAK,aAAe,CACtB,CAEA,SAAS,EAA8D,CACrE,KAAK,QAAQ,IAAI,EAAU,KAAM,CAAS,CAC5C,CAEA,QAAiD,CAC/C,IAAM,EAAQ,KAAK,sBAAsB,EACzC,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAK,IAAe,CAC3D,YACA,OAAQ,KAAK,cAAc,EAAW,EAAM,EAAU,KAAK,CAC7D,EAAE,CACJ,CAEA,YAA4D,CAC1D,OAAO,KAAK,OAAO,CAAC,CACjB,OAAQ,GAAM,EAAE,OAAO,OAAO,CAAC,CAC/B,IAAK,GAAM,EAAE,SAAS,CAC3B,CAEA,MAAM,WAAW,EAAc,EAAiC,CAC9D,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACL,SAAQ,EACvC,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,WAAW,EAAc,EAAyD,CACtF,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACI,SAAyB,EACjE,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,SAAS,EAA6C,CAC1D,IAAM,EAAU,KAAK,WAAW,EAChC,IAAK,IAAM,KAAa,EACtB,EAAU,OAAO,CAAO,EACxB,MAAM,EAAU,MAAM,CAE1B,CAEA,MAAM,SAAyB,CAC7B,IAAK,IAAM,KAAa,KAAK,QAAQ,OAAO,EAC1C,MAAM,EAAU,KAAK,CAEzB,CAEA,cACE,EACA,EACkB,CAGlB,MAAO,CAAE,QAFQ,GAAO,SAAmC,EAAU,eAEnD,QADD,GAAO,SAA2D,CAAC,CAC1D,CAC5B,CAEA,uBAA+D,CAE7D,IAAM,EADW,EAAa,KAAK,YAChB,CAAC,CAAC,WAErB,MADI,CAAC,GAAO,OAAO,GAAQ,UAAY,MAAM,QAAQ,CAAG,EAAU,CAAC,EAC5D,CACT,CACF,EAEA,SAAgB,GAAoD,CAClE,IAAM,EAAW,IAAI,EAAkB,EAAoB,CAAC,EAE5D,OADA,EAAS,SAAS,IAAI,CAAa,EAC5B,CACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/transport-registry.ts"],"sourcesContent":["/**\n * TransportRegistry — manages IConfigurableTransport instances with settings-backed enable/disable.\n *\n * Settings file shape (under `transports` key in settings.json):\n * { \"ws\": { \"enabled\": true, \"options\": { \"port\": 7070 } } }\n */\n\nimport { readSettings, writeSettings, type TSettingsData } from '@robota-sdk/agent-framework';\n\nimport type { IDestroyResult, TUniversalValue } from '@robota-sdk/agent-core';\nimport type {\n IConfigurableTransport,\n IInteractiveSession,\n ITransportConfig,\n ITransportEntry,\n} from '@robota-sdk/agent-interface-transport';\n\nexport class TransportRegistry {\n private readonly entries = new Map<string, IConfigurableTransport<IInteractiveSession>>();\n private readonly settingsPath: string;\n\n constructor(settingsPath: string) {\n this.settingsPath = settingsPath;\n }\n\n register(transport: IConfigurableTransport<IInteractiveSession>): void {\n this.entries.set(transport.name, transport);\n }\n\n getAll(): ITransportEntry<IInteractiveSession>[] {\n const saved = this.readTransportSettings();\n return Array.from(this.entries.values()).map((transport) => ({\n transport,\n config: this.resolveConfig(transport, saved[transport.name]),\n }));\n }\n\n getEnabled(): IConfigurableTransport<IInteractiveSession>[] {\n return this.getAll()\n .filter((e) => e.config.enabled)\n .map((e) => e.transport);\n }\n\n async setEnabled(name: string, enabled: boolean): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, enabled } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async setOptions(name: string, options: Record<string, TUniversalValue>): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, options: options as TSettingsData } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async startAll(session: IInteractiveSession): Promise<void> {\n const enabled = this.getEnabled();\n for (const transport of enabled) {\n transport.attach(session);\n await transport.start();\n }\n }\n\n /**\n * Stop every registered transport — **best-effort** (CORE-013 disposal convention): one\n * transport's stop failure must not skip the others or reject a fire-and-forget caller.\n * Failures are collected into the returned result.\n */\n async stopAll(): Promise<IDestroyResult> {\n const errors: Error[] = [];\n for (const transport of this.entries.values()) {\n try {\n await transport.stop();\n } catch (error) {\n // allow-fallback: best-effort disposal IS the contract — the failure is collected into the returned result and the remaining transports still stop (CORE-013 convention)\n errors.push(error instanceof Error ? error : new Error(String(error)));\n }\n }\n return { errors };\n }\n\n private resolveConfig(\n transport: IConfigurableTransport<IInteractiveSession>,\n saved?: TSettingsData,\n ): ITransportConfig {\n const enabled = (saved?.enabled as boolean | undefined) ?? transport.defaultEnabled;\n const options = (saved?.options as Record<string, TUniversalValue> | undefined) ?? {};\n return { enabled, options };\n }\n\n private readTransportSettings(): Record<string, TSettingsData> {\n const settings = readSettings(this.settingsPath);\n const raw = settings.transports;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n return raw as Record<string, TSettingsData>;\n }\n}\n"],"mappings":"iMAiBA,IAAa,EAAb,KAA+B,CAC7B,QAA2B,IAAI,IAC/B,aAEA,YAAY,EAAsB,CAChC,KAAK,aAAe,CACtB,CAEA,SAAS,EAA8D,CACrE,KAAK,QAAQ,IAAI,EAAU,KAAM,CAAS,CAC5C,CAEA,QAAiD,CAC/C,IAAM,EAAQ,KAAK,sBAAsB,EACzC,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAK,IAAe,CAC3D,YACA,OAAQ,KAAK,cAAc,EAAW,EAAM,EAAU,KAAK,CAC7D,EAAE,CACJ,CAEA,YAA4D,CAC1D,OAAO,KAAK,OAAO,CAAC,CACjB,OAAQ,GAAM,EAAE,OAAO,OAAO,CAAC,CAC/B,IAAK,GAAM,EAAE,SAAS,CAC3B,CAEA,MAAM,WAAW,EAAc,EAAiC,CAC9D,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACL,SAAQ,EACvC,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,WAAW,EAAc,EAAyD,CACtF,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACI,SAAyB,EACjE,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,SAAS,EAA6C,CAC1D,IAAM,EAAU,KAAK,WAAW,EAChC,IAAK,IAAM,KAAa,EACtB,EAAU,OAAO,CAAO,EACxB,MAAM,EAAU,MAAM,CAE1B,CAOA,MAAM,SAAmC,CACvC,IAAM,EAAkB,CAAC,EACzB,IAAK,IAAM,KAAa,KAAK,QAAQ,OAAO,EAC1C,GAAI,CACF,MAAM,EAAU,KAAK,CACvB,OAAS,EAAO,CAEd,EAAO,KAAK,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAAC,CACvE,CAEF,MAAO,CAAE,QAAO,CAClB,CAEA,cACE,EACA,EACkB,CAGlB,MAAO,CAAE,QAFQ,GAAO,SAAmC,EAAU,eAEnD,QADD,GAAO,SAA2D,CAAC,CAC1D,CAC5B,CAEA,uBAA+D,CAE7D,IAAM,EADW,EAAa,KAAK,YAChB,CAAC,CAAC,WAErB,MADI,CAAC,GAAO,OAAO,GAAQ,UAAY,MAAM,QAAQ,CAAG,EAAU,CAAC,EAC5D,CACT,CACF"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../programmatic-6wLf68qJ.cjs");exports.ProgrammaticInteractionChannel=e.n,exports.createProgrammaticAgent=e.t;
@@ -0,0 +1,2 @@
1
+ import { n as createProgrammaticAgent, r as ProgrammaticInteractionChannel, t as ICreateProgrammaticAgentOptions } from "../index-y_HBOfzO.js";
2
+ export { type ICreateProgrammaticAgentOptions, ProgrammaticInteractionChannel, createProgrammaticAgent };
@@ -0,0 +1 @@
1
+ import{n as e,t}from"../programmatic-70dxIXtS.js";export{e as ProgrammaticInteractionChannel,t as createProgrammaticAgent};
@@ -0,0 +1 @@
1
+ let e=require("@robota-sdk/agent-framework"),t=require("@robota-sdk/agent-interface-transport");var n=class{events=[];availableCommands=[];busy=!1;started=!1;stopped=!1;submitHandler=null;userActionResponses=[];onSubmit(e){this.submitHandler=e}write(e){this.events.push(e)}async askUser(e){return this.userActionResponses.shift()??{type:`cancelled`}}setAvailableCommands(e){this.availableCommands=e}setBusy(e){this.busy=e}async start(){this.started=!0}async stop(){this.stopped=!0}async submit(e){if(!this.submitHandler)throw Error(`ProgrammaticInteractionChannel: no submit handler registered — start the runtime first`);await this.submitHandler(e)}queueUserAction(e){this.userActionResponses.push(e)}};function r(r){let i=new n,a=(0,e.createInteractiveRuntime)({channel:i,commandModules:r.commandModules??[],provider:r.provider,cwd:r.cwd,sessionStore:r.sessionStore,permissionMode:r.permissionMode}),o=!1;return{events:i.events,start:async()=>{o||(o=!0,await a.start())},send:e=>i.submit(e),queueUserAction:e=>i.queueUserAction(e),assistantReplies:()=>(0,t.readAssistantReplies)(i.events),lastAssistantText:()=>(0,t.readLastAssistantText)(i.events),toolCalls:()=>(0,t.readToolCalls)(i.events),errors:()=>(0,t.readErrors)(i.events),stop:()=>a.stop()}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
@@ -0,0 +1,2 @@
1
+ import{createInteractiveRuntime as e}from"@robota-sdk/agent-framework";import{readAssistantReplies as t,readErrors as n,readLastAssistantText as r,readToolCalls as i}from"@robota-sdk/agent-interface-transport";var a=class{events=[];availableCommands=[];busy=!1;started=!1;stopped=!1;submitHandler=null;userActionResponses=[];onSubmit(e){this.submitHandler=e}write(e){this.events.push(e)}async askUser(e){return this.userActionResponses.shift()??{type:`cancelled`}}setAvailableCommands(e){this.availableCommands=e}setBusy(e){this.busy=e}async start(){this.started=!0}async stop(){this.stopped=!0}async submit(e){if(!this.submitHandler)throw Error(`ProgrammaticInteractionChannel: no submit handler registered — start the runtime first`);await this.submitHandler(e)}queueUserAction(e){this.userActionResponses.push(e)}};function o(o){let s=new a,c=e({channel:s,commandModules:o.commandModules??[],provider:o.provider,cwd:o.cwd,sessionStore:o.sessionStore,permissionMode:o.permissionMode}),l=!1;return{events:s.events,start:async()=>{l||(l=!0,await c.start())},send:e=>s.submit(e),queueUserAction:e=>s.queueUserAction(e),assistantReplies:()=>t(s.events),lastAssistantText:()=>r(s.events),toolCalls:()=>i(s.events),errors:()=>n(s.events),stop:()=>c.stop()}}export{a as n,o as t};
2
+ //# sourceMappingURL=programmatic-70dxIXtS.js.map