@nex-ai/nex 0.1.21 → 0.1.23

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 (295) hide show
  1. package/README.md +11 -2
  2. package/dist/agent/adoption.d.ts +23 -0
  3. package/dist/agent/adoption.js +87 -0
  4. package/dist/agent/adoption.js.map +1 -0
  5. package/dist/agent/gossip.d.ts +17 -0
  6. package/dist/agent/gossip.js +48 -0
  7. package/dist/agent/gossip.js.map +1 -0
  8. package/dist/agent/loop.d.ts +59 -0
  9. package/dist/agent/loop.js +389 -0
  10. package/dist/agent/loop.js.map +1 -0
  11. package/dist/agent/queues.d.ts +16 -0
  12. package/dist/agent/queues.js +44 -0
  13. package/dist/agent/queues.js.map +1 -0
  14. package/dist/agent/session-store.d.ts +21 -0
  15. package/dist/agent/session-store.js +96 -0
  16. package/dist/agent/session-store.js.map +1 -0
  17. package/dist/agent/templates.d.ts +5 -0
  18. package/dist/agent/templates.js +48 -0
  19. package/dist/agent/templates.js.map +1 -0
  20. package/dist/agent/tools.d.ts +25 -0
  21. package/dist/agent/tools.js +238 -0
  22. package/dist/agent/tools.js.map +1 -0
  23. package/dist/agent/types.d.ts +59 -0
  24. package/dist/agent/types.js +5 -0
  25. package/dist/agent/types.js.map +1 -0
  26. package/dist/calendar/scheduler.d.ts +32 -0
  27. package/dist/calendar/scheduler.js +178 -0
  28. package/dist/calendar/scheduler.js.map +1 -0
  29. package/dist/calendar/store.d.ts +15 -0
  30. package/dist/calendar/store.js +50 -0
  31. package/dist/calendar/store.js.map +1 -0
  32. package/dist/calendar/types.d.ts +17 -0
  33. package/dist/calendar/types.js +5 -0
  34. package/dist/calendar/types.js.map +1 -0
  35. package/dist/chat/channel.d.ts +20 -0
  36. package/dist/chat/channel.js +84 -0
  37. package/dist/chat/channel.js.map +1 -0
  38. package/dist/chat/message-store.d.ts +18 -0
  39. package/dist/chat/message-store.js +82 -0
  40. package/dist/chat/message-store.js.map +1 -0
  41. package/dist/chat/router.d.ts +17 -0
  42. package/dist/chat/router.js +65 -0
  43. package/dist/chat/router.js.map +1 -0
  44. package/dist/chat/suggested-responses.d.ts +6 -0
  45. package/dist/chat/suggested-responses.js +99 -0
  46. package/dist/chat/suggested-responses.js.map +1 -0
  47. package/dist/chat/types.d.ts +28 -0
  48. package/dist/chat/types.js +5 -0
  49. package/dist/chat/types.js.map +1 -0
  50. package/dist/cli.js +3 -1
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/dispatch.d.ts +39 -0
  53. package/dist/commands/dispatch.js +1293 -0
  54. package/dist/commands/dispatch.js.map +1 -0
  55. package/dist/commands/init.d.ts +49 -0
  56. package/dist/commands/init.js +315 -0
  57. package/dist/commands/init.js.map +1 -0
  58. package/dist/commands/parse-input.d.ts +5 -0
  59. package/dist/commands/parse-input.js +37 -0
  60. package/dist/commands/parse-input.js.map +1 -0
  61. package/dist/index.d.ts +6 -23
  62. package/dist/index.js +118 -50
  63. package/dist/index.js.map +1 -1
  64. package/dist/lib/client.js +1 -1
  65. package/dist/lib/client.js.map +1 -1
  66. package/dist/lib/errors.js +1 -1
  67. package/dist/lib/errors.js.map +1 -1
  68. package/dist/lib/graph-html.d.ts +1 -0
  69. package/dist/lib/graph-html.js +16 -3
  70. package/dist/lib/graph-html.js.map +1 -1
  71. package/dist/lib/integrations.d.ts +23 -0
  72. package/dist/lib/integrations.js +25 -0
  73. package/dist/lib/integrations.js.map +1 -0
  74. package/dist/lib/nex-mcp-config.d.ts +14 -0
  75. package/dist/lib/nex-mcp-config.js +26 -0
  76. package/dist/lib/nex-mcp-config.js.map +1 -0
  77. package/dist/orchestration/budget.d.ts +32 -0
  78. package/dist/orchestration/budget.js +72 -0
  79. package/dist/orchestration/budget.js.map +1 -0
  80. package/dist/orchestration/executor.d.ts +59 -0
  81. package/dist/orchestration/executor.js +197 -0
  82. package/dist/orchestration/executor.js.map +1 -0
  83. package/dist/orchestration/router.d.ts +30 -0
  84. package/dist/orchestration/router.js +98 -0
  85. package/dist/orchestration/router.js.map +1 -0
  86. package/dist/orchestration/templates.d.ts +11 -0
  87. package/dist/orchestration/templates.js +99 -0
  88. package/dist/orchestration/templates.js.map +1 -0
  89. package/dist/orchestration/types.d.ts +58 -0
  90. package/dist/orchestration/types.js +7 -0
  91. package/dist/orchestration/types.js.map +1 -0
  92. package/dist/plugin/shared.js +1 -1
  93. package/dist/plugin/shared.js.map +1 -1
  94. package/dist/tui/agent-colors.d.ts +19 -0
  95. package/dist/tui/agent-colors.js +34 -0
  96. package/dist/tui/agent-colors.js.map +1 -0
  97. package/dist/tui/app.d.ts +14 -0
  98. package/dist/tui/app.js +267 -0
  99. package/dist/tui/app.js.map +1 -0
  100. package/dist/tui/channel-colors.d.ts +16 -0
  101. package/dist/tui/channel-colors.js +43 -0
  102. package/dist/tui/channel-colors.js.map +1 -0
  103. package/dist/tui/components/agent-card.d.ts +11 -0
  104. package/dist/tui/components/agent-card.js +40 -0
  105. package/dist/tui/components/agent-card.js.map +1 -0
  106. package/dist/tui/components/banner.d.ts +44 -0
  107. package/dist/tui/components/banner.js +130 -0
  108. package/dist/tui/components/banner.js.map +1 -0
  109. package/dist/tui/components/channel-colors.d.ts +21 -0
  110. package/dist/tui/components/channel-colors.js +53 -0
  111. package/dist/tui/components/channel-colors.js.map +1 -0
  112. package/dist/tui/components/channel-message.d.ts +53 -0
  113. package/dist/tui/components/channel-message.js +66 -0
  114. package/dist/tui/components/channel-message.js.map +1 -0
  115. package/dist/tui/components/chat-input.d.ts +11 -0
  116. package/dist/tui/components/chat-input.js +19 -0
  117. package/dist/tui/components/chat-input.js.map +1 -0
  118. package/dist/tui/components/data-table.d.ts +11 -0
  119. package/dist/tui/components/data-table.js +47 -0
  120. package/dist/tui/components/data-table.js.map +1 -0
  121. package/dist/tui/components/error-box.d.ts +11 -0
  122. package/dist/tui/components/error-box.js +59 -0
  123. package/dist/tui/components/error-box.js.map +1 -0
  124. package/dist/tui/components/help-screen.d.ts +3 -0
  125. package/dist/tui/components/help-screen.js +63 -0
  126. package/dist/tui/components/help-screen.js.map +1 -0
  127. package/dist/tui/components/index.d.ts +17 -0
  128. package/dist/tui/components/index.js +10 -0
  129. package/dist/tui/components/index.js.map +1 -0
  130. package/dist/tui/components/inline-confirm.d.ts +14 -0
  131. package/dist/tui/components/inline-confirm.js +13 -0
  132. package/dist/tui/components/inline-confirm.js.map +1 -0
  133. package/dist/tui/components/inline-select.d.ts +21 -0
  134. package/dist/tui/components/inline-select.js +20 -0
  135. package/dist/tui/components/inline-select.js.map +1 -0
  136. package/dist/tui/components/markdown.d.ts +6 -0
  137. package/dist/tui/components/markdown.js +179 -0
  138. package/dist/tui/components/markdown.js.map +1 -0
  139. package/dist/tui/components/mention-autocomplete.d.ts +77 -0
  140. package/dist/tui/components/mention-autocomplete.js +235 -0
  141. package/dist/tui/components/mention-autocomplete.js.map +1 -0
  142. package/dist/tui/components/message-list.d.ts +18 -0
  143. package/dist/tui/components/message-list.js +29 -0
  144. package/dist/tui/components/message-list.js.map +1 -0
  145. package/dist/tui/components/picker.d.ts +16 -0
  146. package/dist/tui/components/picker.js +32 -0
  147. package/dist/tui/components/picker.js.map +1 -0
  148. package/dist/tui/components/progress-steps.d.ts +13 -0
  149. package/dist/tui/components/progress-steps.js +21 -0
  150. package/dist/tui/components/progress-steps.js.map +1 -0
  151. package/dist/tui/components/slack/compose.d.ts +27 -0
  152. package/dist/tui/components/slack/compose.js +123 -0
  153. package/dist/tui/components/slack/compose.js.map +1 -0
  154. package/dist/tui/components/slack/layout.d.ts +36 -0
  155. package/dist/tui/components/slack/layout.js +96 -0
  156. package/dist/tui/components/slack/layout.js.map +1 -0
  157. package/dist/tui/components/slack/messages.d.ts +72 -0
  158. package/dist/tui/components/slack/messages.js +177 -0
  159. package/dist/tui/components/slack/messages.js.map +1 -0
  160. package/dist/tui/components/slack/quick-switcher.d.ts +33 -0
  161. package/dist/tui/components/slack/quick-switcher.js +98 -0
  162. package/dist/tui/components/slack/quick-switcher.js.map +1 -0
  163. package/dist/tui/components/slack/sidebar-types.d.ts +65 -0
  164. package/dist/tui/components/slack/sidebar-types.js +7 -0
  165. package/dist/tui/components/slack/sidebar-types.js.map +1 -0
  166. package/dist/tui/components/slack/sidebar.d.ts +46 -0
  167. package/dist/tui/components/slack/sidebar.js +52 -0
  168. package/dist/tui/components/slack/sidebar.js.map +1 -0
  169. package/dist/tui/components/slack/thread-panel.d.ts +45 -0
  170. package/dist/tui/components/slack/thread-panel.js +47 -0
  171. package/dist/tui/components/slack/thread-panel.js.map +1 -0
  172. package/dist/tui/components/slash-autocomplete.d.ts +81 -0
  173. package/dist/tui/components/slash-autocomplete.js +218 -0
  174. package/dist/tui/components/slash-autocomplete.js.map +1 -0
  175. package/dist/tui/components/spinner.d.ts +17 -0
  176. package/dist/tui/components/spinner.js +30 -0
  177. package/dist/tui/components/spinner.js.map +1 -0
  178. package/dist/tui/components/status-bar.d.ts +23 -0
  179. package/dist/tui/components/status-bar.js +55 -0
  180. package/dist/tui/components/status-bar.js.map +1 -0
  181. package/dist/tui/components/success-box.d.ts +7 -0
  182. package/dist/tui/components/success-box.js +10 -0
  183. package/dist/tui/components/success-box.js.map +1 -0
  184. package/dist/tui/components/tool-indicator.d.ts +12 -0
  185. package/dist/tui/components/tool-indicator.js +18 -0
  186. package/dist/tui/components/tool-indicator.js.map +1 -0
  187. package/dist/tui/components/viewport.d.ts +9 -0
  188. package/dist/tui/components/viewport.js +24 -0
  189. package/dist/tui/components/viewport.js.map +1 -0
  190. package/dist/tui/generative/bindings.d.ts +27 -0
  191. package/dist/tui/generative/bindings.js +152 -0
  192. package/dist/tui/generative/bindings.js.map +1 -0
  193. package/dist/tui/generative/registry.d.ts +19 -0
  194. package/dist/tui/generative/registry.js +31 -0
  195. package/dist/tui/generative/registry.js.map +1 -0
  196. package/dist/tui/generative/renderer.d.ts +24 -0
  197. package/dist/tui/generative/renderer.js +160 -0
  198. package/dist/tui/generative/renderer.js.map +1 -0
  199. package/dist/tui/generative/types.d.ts +68 -0
  200. package/dist/tui/generative/types.js +7 -0
  201. package/dist/tui/generative/types.js.map +1 -0
  202. package/dist/tui/hooks/use-cancellable.d.ts +28 -0
  203. package/dist/tui/hooks/use-cancellable.js +51 -0
  204. package/dist/tui/hooks/use-cancellable.js.map +1 -0
  205. package/dist/tui/hooks/use-streaming.d.ts +44 -0
  206. package/dist/tui/hooks/use-streaming.js +105 -0
  207. package/dist/tui/hooks/use-streaming.js.map +1 -0
  208. package/dist/tui/index.d.ts +4 -0
  209. package/dist/tui/index.js +7 -0
  210. package/dist/tui/index.js.map +1 -0
  211. package/dist/tui/keybindings.d.ts +25 -0
  212. package/dist/tui/keybindings.js +277 -0
  213. package/dist/tui/keybindings.js.map +1 -0
  214. package/dist/tui/register-views.d.ts +8 -0
  215. package/dist/tui/register-views.js +116 -0
  216. package/dist/tui/register-views.js.map +1 -0
  217. package/dist/tui/router.d.ts +29 -0
  218. package/dist/tui/router.js +87 -0
  219. package/dist/tui/router.js.map +1 -0
  220. package/dist/tui/services/agent-service.d.ts +58 -0
  221. package/dist/tui/services/agent-service.js +197 -0
  222. package/dist/tui/services/agent-service.js.map +1 -0
  223. package/dist/tui/services/calendar-service.d.ts +31 -0
  224. package/dist/tui/services/calendar-service.js +133 -0
  225. package/dist/tui/services/calendar-service.js.map +1 -0
  226. package/dist/tui/services/chat-service.d.ts +28 -0
  227. package/dist/tui/services/chat-service.js +91 -0
  228. package/dist/tui/services/chat-service.js.map +1 -0
  229. package/dist/tui/services/orchestration-service.d.ts +42 -0
  230. package/dist/tui/services/orchestration-service.js +153 -0
  231. package/dist/tui/services/orchestration-service.js.map +1 -0
  232. package/dist/tui/slash-commands.d.ts +106 -0
  233. package/dist/tui/slash-commands.js +1421 -0
  234. package/dist/tui/slash-commands.js.map +1 -0
  235. package/dist/tui/store.d.ts +96 -0
  236. package/dist/tui/store.js +120 -0
  237. package/dist/tui/store.js.map +1 -0
  238. package/dist/tui/theme.d.ts +40 -0
  239. package/dist/tui/theme.js +39 -0
  240. package/dist/tui/theme.js.map +1 -0
  241. package/dist/tui/tui-context.d.ts +22 -0
  242. package/dist/tui/tui-context.js +17 -0
  243. package/dist/tui/tui-context.js.map +1 -0
  244. package/dist/tui/views/agent-list.d.ts +8 -0
  245. package/dist/tui/views/agent-list.js +11 -0
  246. package/dist/tui/views/agent-list.js.map +1 -0
  247. package/dist/tui/views/ask-chat.d.ts +9 -0
  248. package/dist/tui/views/ask-chat.js +40 -0
  249. package/dist/tui/views/ask-chat.js.map +1 -0
  250. package/dist/tui/views/calendar.d.ts +15 -0
  251. package/dist/tui/views/calendar.js +29 -0
  252. package/dist/tui/views/calendar.js.map +1 -0
  253. package/dist/tui/views/chat.d.ts +18 -0
  254. package/dist/tui/views/chat.js +28 -0
  255. package/dist/tui/views/chat.js.map +1 -0
  256. package/dist/tui/views/generative.d.ts +14 -0
  257. package/dist/tui/views/generative.js +37 -0
  258. package/dist/tui/views/generative.js.map +1 -0
  259. package/dist/tui/views/help.d.ts +6 -0
  260. package/dist/tui/views/help.js +9 -0
  261. package/dist/tui/views/help.js.map +1 -0
  262. package/dist/tui/views/home-screen.d.ts +67 -0
  263. package/dist/tui/views/home-screen.js +192 -0
  264. package/dist/tui/views/home-screen.js.map +1 -0
  265. package/dist/tui/views/home.d.ts +33 -0
  266. package/dist/tui/views/home.js +60 -0
  267. package/dist/tui/views/home.js.map +1 -0
  268. package/dist/tui/views/index.d.ts +20 -0
  269. package/dist/tui/views/index.js +11 -0
  270. package/dist/tui/views/index.js.map +1 -0
  271. package/dist/tui/views/insights.d.ts +19 -0
  272. package/dist/tui/views/insights.js +46 -0
  273. package/dist/tui/views/insights.js.map +1 -0
  274. package/dist/tui/views/orchestration.d.ts +18 -0
  275. package/dist/tui/views/orchestration.js +73 -0
  276. package/dist/tui/views/orchestration.js.map +1 -0
  277. package/dist/tui/views/record-detail.d.ts +10 -0
  278. package/dist/tui/views/record-detail.js +22 -0
  279. package/dist/tui/views/record-detail.js.map +1 -0
  280. package/dist/tui/views/record-list.d.ts +15 -0
  281. package/dist/tui/views/record-list.js +22 -0
  282. package/dist/tui/views/record-list.js.map +1 -0
  283. package/dist/tui/views/slack-channel-header.d.ts +15 -0
  284. package/dist/tui/views/slack-channel-header.js +16 -0
  285. package/dist/tui/views/slack-channel-header.js.map +1 -0
  286. package/dist/tui/views/slack-home.d.ts +21 -0
  287. package/dist/tui/views/slack-home.js +572 -0
  288. package/dist/tui/views/slack-home.js.map +1 -0
  289. package/dist/tui/views/task-board.d.ts +21 -0
  290. package/dist/tui/views/task-board.js +33 -0
  291. package/dist/tui/views/task-board.js.map +1 -0
  292. package/dist/tui/views/timeline.d.ts +17 -0
  293. package/dist/tui/views/timeline.js +24 -0
  294. package/dist/tui/views/timeline.js.map +1 -0
  295. package/package.json +8 -3
@@ -0,0 +1,152 @@
1
+ /**
2
+ * RFC 6901 JSON Pointer implementation for A2UI data binding.
3
+ * Provides resolve/set/apply operations over a flat data model.
4
+ */
5
+ /**
6
+ * Parse a JSON Pointer string into path segments.
7
+ * Handles RFC 6901 escaping: ~1 -> /, ~0 -> ~
8
+ */
9
+ function parseSegments(pointer) {
10
+ if (pointer === '' || pointer === '/')
11
+ return [];
12
+ // Strip leading /
13
+ const raw = pointer.startsWith('/') ? pointer.slice(1) : pointer;
14
+ return raw.split('/').map((seg) => seg.replace(/~1/g, '/').replace(/~0/g, '~'));
15
+ }
16
+ /**
17
+ * Resolve a JSON Pointer against a data object.
18
+ *
19
+ * @example
20
+ * resolvePointer({ user: { name: "Alice" } }, "/user/name") // "Alice"
21
+ * resolvePointer({ items: [{ status: "done" }] }, "/items/0/status") // "done"
22
+ */
23
+ export function resolvePointer(data, pointer) {
24
+ const segments = parseSegments(pointer);
25
+ let current = data;
26
+ for (const seg of segments) {
27
+ if (current === null || current === undefined)
28
+ return undefined;
29
+ if (Array.isArray(current)) {
30
+ const idx = Number(seg);
31
+ if (Number.isNaN(idx))
32
+ return undefined;
33
+ current = current[idx];
34
+ }
35
+ else if (typeof current === 'object') {
36
+ current = current[seg];
37
+ }
38
+ else {
39
+ return undefined;
40
+ }
41
+ }
42
+ return current;
43
+ }
44
+ /**
45
+ * Set a value at a JSON Pointer path, creating intermediate objects as needed.
46
+ * Mutates the data object in place.
47
+ */
48
+ export function setPointer(data, pointer, value) {
49
+ const segments = parseSegments(pointer);
50
+ if (segments.length === 0)
51
+ return;
52
+ let current = data;
53
+ for (let i = 0; i < segments.length - 1; i++) {
54
+ const seg = segments[i];
55
+ const nextSeg = segments[i + 1];
56
+ const isNextArray = /^\d+$/.test(nextSeg);
57
+ if (!(seg in current) || current[seg] === null || current[seg] === undefined) {
58
+ current[seg] = isNextArray ? [] : {};
59
+ }
60
+ const next = current[seg];
61
+ if (Array.isArray(next)) {
62
+ const idx = Number(segments[i + 1]);
63
+ // Ensure array is long enough
64
+ while (next.length <= idx)
65
+ next.push(undefined);
66
+ if (i + 1 === segments.length - 1) {
67
+ next[idx] = value;
68
+ return;
69
+ }
70
+ if (typeof next[idx] !== 'object' || next[idx] === null) {
71
+ next[idx] = {};
72
+ }
73
+ current = next[idx];
74
+ i++; // skip the array index segment
75
+ }
76
+ else if (typeof next === 'object') {
77
+ current = next;
78
+ }
79
+ else {
80
+ current[seg] = {};
81
+ current = current[seg];
82
+ }
83
+ }
84
+ const lastSeg = segments[segments.length - 1];
85
+ if (Array.isArray(current)) {
86
+ const idx = Number(lastSeg);
87
+ if (!Number.isNaN(idx)) {
88
+ while (current.length <= idx)
89
+ current.push(undefined);
90
+ current[idx] = value;
91
+ }
92
+ }
93
+ else {
94
+ current[lastSeg] = value;
95
+ }
96
+ }
97
+ /**
98
+ * Check if a string looks like a JSON Pointer (starts with "/").
99
+ */
100
+ export function isPointer(value) {
101
+ return value.startsWith('/');
102
+ }
103
+ /**
104
+ * Apply a batch of updates to a data model.
105
+ * Returns a shallow copy of the model with updates applied.
106
+ */
107
+ export function applyUpdates(model, updates) {
108
+ const result = { ...model };
109
+ for (const update of updates) {
110
+ switch (update.type) {
111
+ case 'set':
112
+ setPointer(result, update.path, update.value);
113
+ break;
114
+ case 'merge': {
115
+ const existing = resolvePointer(result, update.path);
116
+ if (typeof existing === 'object' &&
117
+ existing !== null &&
118
+ typeof update.value === 'object' &&
119
+ update.value !== null &&
120
+ !Array.isArray(existing)) {
121
+ setPointer(result, update.path, {
122
+ ...existing,
123
+ ...update.value,
124
+ });
125
+ }
126
+ else {
127
+ // Fallback to set if not mergeable
128
+ setPointer(result, update.path, update.value);
129
+ }
130
+ break;
131
+ }
132
+ case 'delete': {
133
+ const segments = update.path.startsWith('/')
134
+ ? update.path.slice(1).split('/')
135
+ : [];
136
+ if (segments.length === 1) {
137
+ delete result[segments[0]];
138
+ }
139
+ else if (segments.length > 1) {
140
+ const parentPath = '/' + segments.slice(0, -1).join('/');
141
+ const parent = resolvePointer(result, parentPath);
142
+ if (typeof parent === 'object' && parent !== null && !Array.isArray(parent)) {
143
+ delete parent[segments[segments.length - 1]];
144
+ }
145
+ }
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ //# sourceMappingURL=bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../../src/tui/generative/bindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Component registry: maps A2UI component type strings to their
3
+ * Ink renderer components.
4
+ */
5
+ import type React from 'react';
6
+ import type { A2UIComponent } from './types.js';
7
+ export type RendererComponent = React.ComponentType<{
8
+ schema: A2UIComponent;
9
+ data: Record<string, unknown>;
10
+ onAction?: (action: string, payload?: unknown) => void;
11
+ }>;
12
+ /** Register a renderer for a component type. */
13
+ export declare function registerRenderer(type: string, component: RendererComponent): void;
14
+ /** Look up the renderer for a component type. */
15
+ export declare function getRenderer(type: string): RendererComponent | undefined;
16
+ /** Get all registered type names. */
17
+ export declare function getRegisteredTypes(): string[];
18
+ /** Known A2UI component types. */
19
+ export declare const COMPONENT_TYPES: readonly ["row", "column", "card", "text", "textfield", "list", "table", "progress", "spacer"];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Component registry: maps A2UI component type strings to their
3
+ * Ink renderer components.
4
+ */
5
+ // Registry is populated by renderer.tsx at module load time
6
+ const registry = new Map();
7
+ /** Register a renderer for a component type. */
8
+ export function registerRenderer(type, component) {
9
+ registry.set(type, component);
10
+ }
11
+ /** Look up the renderer for a component type. */
12
+ export function getRenderer(type) {
13
+ return registry.get(type);
14
+ }
15
+ /** Get all registered type names. */
16
+ export function getRegisteredTypes() {
17
+ return [...registry.keys()];
18
+ }
19
+ /** Known A2UI component types. */
20
+ export const COMPONENT_TYPES = [
21
+ 'row',
22
+ 'column',
23
+ 'card',
24
+ 'text',
25
+ 'textfield',
26
+ 'list',
27
+ 'table',
28
+ 'progress',
29
+ 'spacer',
30
+ ];
31
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tui/generative/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,4DAA4D;AAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEtD,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,SAA4B;IAE5B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAChC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK;IACL,QAAQ;IACR,MAAM;IACN,MAAM;IACN,WAAW;IACX,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;CACA,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Generative TUI renderer: converts A2UI JSON schema into an Ink
3
+ * component tree at runtime.
4
+ *
5
+ * Agents emit JSON matching the A2UIComponent schema; this module
6
+ * validates it, resolves JSON Pointer data bindings, and renders
7
+ * the corresponding Ink components.
8
+ */
9
+ import React from 'react';
10
+ import type { A2UIComponent, A2UIDataModel } from './types.js';
11
+ export declare function validateSchema(schema: unknown): {
12
+ valid: boolean;
13
+ errors?: string[];
14
+ };
15
+ export interface GenerativeRendererProps {
16
+ schema: A2UIComponent;
17
+ data: A2UIDataModel;
18
+ onAction?: (action: string, payload?: unknown) => void;
19
+ }
20
+ /**
21
+ * Validates schema, resolves data bindings, and renders the
22
+ * A2UI component tree as Ink components.
23
+ */
24
+ export declare function GenerativeRenderer({ schema, data, onAction, }: GenerativeRendererProps): React.JSX.Element;
@@ -0,0 +1,160 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { resolvePointer, isPointer } from './bindings.js';
4
+ import { COMPONENT_TYPES } from './registry.js';
5
+ // ── Schema validation ───────────────────────────────────────────────
6
+ export function validateSchema(schema) {
7
+ const errors = [];
8
+ if (typeof schema !== 'object' || schema === null) {
9
+ return { valid: false, errors: ['Schema must be a non-null object'] };
10
+ }
11
+ const obj = schema;
12
+ if (typeof obj.type !== 'string') {
13
+ errors.push('Component must have a "type" string property');
14
+ return { valid: false, errors };
15
+ }
16
+ if (!COMPONENT_TYPES.includes(obj.type)) {
17
+ errors.push(`Unknown component type "${obj.type}". Valid types: ${COMPONENT_TYPES.join(', ')}`);
18
+ }
19
+ // Container types must have children array
20
+ if (['row', 'column', 'card'].includes(obj.type)) {
21
+ if (!Array.isArray(obj.children)) {
22
+ errors.push(`"${obj.type}" component must have a "children" array`);
23
+ }
24
+ }
25
+ // Text must have content
26
+ if (obj.type === 'text') {
27
+ if (typeof obj.content !== 'string') {
28
+ errors.push('"text" component must have a "content" string');
29
+ }
30
+ }
31
+ // Progress must have numeric value
32
+ if (obj.type === 'progress') {
33
+ if (typeof obj.value !== 'number') {
34
+ errors.push('"progress" component must have a numeric "value"');
35
+ }
36
+ }
37
+ // Table must have headers
38
+ if (obj.type === 'table') {
39
+ if (!Array.isArray(obj.headers)) {
40
+ errors.push('"table" component must have a "headers" array');
41
+ }
42
+ }
43
+ // List must have items
44
+ if (obj.type === 'list') {
45
+ if (!Array.isArray(obj.items) && typeof obj.items !== 'string') {
46
+ errors.push('"list" component must have "items" (array or string pointer)');
47
+ }
48
+ }
49
+ return errors.length === 0 ? { valid: true } : { valid: false, errors };
50
+ }
51
+ // ── Resolve helper ──────────────────────────────────────────────────
52
+ function resolveString(value, data) {
53
+ if (isPointer(value)) {
54
+ const resolved = resolvePointer(data, value);
55
+ return resolved !== undefined ? String(resolved) : value;
56
+ }
57
+ return value;
58
+ }
59
+ function RenderChildren({ children, data, onAction, }) {
60
+ return (_jsx(_Fragment, { children: children.map((child, i) => (_jsx(RenderComponent, { schema: child, data: data, onAction: onAction }, i))) }));
61
+ }
62
+ function RowRenderer({ schema, data, onAction, }) {
63
+ return (_jsx(Box, { flexDirection: "row", gap: schema.gap, padding: schema.padding, children: _jsx(RenderChildren, { children: schema.children, data: data, onAction: onAction }) }));
64
+ }
65
+ function ColumnRenderer({ schema, data, onAction, }) {
66
+ return (_jsx(Box, { flexDirection: "column", gap: schema.gap, padding: schema.padding, children: _jsx(RenderChildren, { children: schema.children, data: data, onAction: onAction }) }));
67
+ }
68
+ function CardRenderer({ schema, data, onAction, }) {
69
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: schema.borderColor ?? 'white', paddingX: 1, children: [schema.title && (_jsx(Text, { bold: true, children: resolveString(schema.title, data) })), _jsx(RenderChildren, { children: schema.children, data: data, onAction: onAction })] }));
70
+ }
71
+ function TextRenderer({ schema, data, }) {
72
+ const content = resolveString(schema.content, data);
73
+ return (_jsx(Text, { bold: schema.bold, color: schema.color, dimColor: schema.dimmed, children: content }));
74
+ }
75
+ function TextFieldRenderer({ schema, data, }) {
76
+ const value = schema.value
77
+ ? resolveString(schema.value, data)
78
+ : '';
79
+ const display = value || schema.placeholder || '';
80
+ return (_jsx(Box, { children: _jsx(Text, { color: value ? undefined : 'gray', children: display }) }));
81
+ }
82
+ function ListRenderer({ schema, data, onAction, }) {
83
+ let items;
84
+ if (typeof schema.items === 'string') {
85
+ const resolved = resolvePointer(data, schema.items);
86
+ items = Array.isArray(resolved) ? resolved.map(String) : [];
87
+ }
88
+ else {
89
+ items = schema.items;
90
+ }
91
+ return (_jsx(Box, { flexDirection: "column", children: items.map((item, i) => {
92
+ const isSelected = schema.selected === i;
93
+ return (_jsx(Box, { children: _jsxs(Text, { color: isSelected ? 'cyan' : undefined, children: [isSelected ? '> ' : ' ', item] }) }, i));
94
+ }) }));
95
+ }
96
+ function TableRenderer({ schema, data, }) {
97
+ let rows;
98
+ if (typeof schema.rows === 'string') {
99
+ const resolved = resolvePointer(data, schema.rows);
100
+ rows = Array.isArray(resolved)
101
+ ? resolved.map((r) => (Array.isArray(r) ? r.map(String) : [String(r)]))
102
+ : [];
103
+ }
104
+ else if (Array.isArray(schema.rows)) {
105
+ rows = schema.rows;
106
+ }
107
+ else {
108
+ rows = [];
109
+ }
110
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: schema.headers.map((h, i) => (_jsx(Box, { minWidth: 16, children: _jsx(Text, { bold: true, children: h }) }, i))) }), rows.map((row, ri) => (_jsx(Box, { children: row.map((cell, ci) => (_jsx(Box, { minWidth: 16, children: _jsx(Text, { children: cell }) }, ci))) }, ri)))] }));
111
+ }
112
+ function ProgressRenderer({ schema, }) {
113
+ const pct = Math.max(0, Math.min(100, schema.value));
114
+ const filled = Math.round(pct / 5);
115
+ const empty = 20 - filled;
116
+ const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(empty);
117
+ const label = schema.label ? `${schema.label} ` : '';
118
+ return (_jsxs(Text, { children: [label, "[", bar, "] ", Math.round(pct), "%"] }));
119
+ }
120
+ function SpacerRenderer({ schema, }) {
121
+ return _jsx(Box, { height: schema.height ?? 1 });
122
+ }
123
+ // ── Main dispatcher ─────────────────────────────────────────────────
124
+ function RenderComponent({ schema, data, onAction, }) {
125
+ const childProps = { data, onAction };
126
+ switch (schema.type) {
127
+ case 'row':
128
+ return _jsx(RowRenderer, { schema: schema, ...childProps });
129
+ case 'column':
130
+ return _jsx(ColumnRenderer, { schema: schema, ...childProps });
131
+ case 'card':
132
+ return _jsx(CardRenderer, { schema: schema, ...childProps });
133
+ case 'text':
134
+ return _jsx(TextRenderer, { schema: schema, ...childProps });
135
+ case 'textfield':
136
+ return _jsx(TextFieldRenderer, { schema: schema, ...childProps });
137
+ case 'list':
138
+ return _jsx(ListRenderer, { schema: schema, ...childProps });
139
+ case 'table':
140
+ return _jsx(TableRenderer, { schema: schema, ...childProps });
141
+ case 'progress':
142
+ return _jsx(ProgressRenderer, { schema: schema, ...childProps });
143
+ case 'spacer':
144
+ return _jsx(SpacerRenderer, { schema: schema });
145
+ default:
146
+ return _jsxs(Text, { color: "red", children: ["Unknown component: ", schema.type] });
147
+ }
148
+ }
149
+ /**
150
+ * Validates schema, resolves data bindings, and renders the
151
+ * A2UI component tree as Ink components.
152
+ */
153
+ export function GenerativeRenderer({ schema, data, onAction, }) {
154
+ const validation = validateSchema(schema);
155
+ if (!validation.valid) {
156
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "red", bold: true, children: "Invalid A2UI schema:" }), validation.errors?.map((err, i) => (_jsxs(Text, { color: "red", children: [" - ", err] }, i)))] }));
157
+ }
158
+ return _jsx(RenderComponent, { schema: schema, data: data, onAction: onAction });
159
+ }
160
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/tui/generative/renderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * A2UI-compatible component schema for the generative TUI.
3
+ * Agents emit JSON matching these types; the renderer converts them
4
+ * to Ink component trees at runtime.
5
+ */
6
+ export type A2UIComponent = A2UIRow | A2UIColumn | A2UICard | A2UIText | A2UITextField | A2UIList | A2UITable | A2UIProgress | A2UISpacer;
7
+ export interface A2UIRow {
8
+ type: 'row';
9
+ children: A2UIComponent[];
10
+ gap?: number;
11
+ padding?: number;
12
+ }
13
+ export interface A2UIColumn {
14
+ type: 'column';
15
+ children: A2UIComponent[];
16
+ gap?: number;
17
+ padding?: number;
18
+ }
19
+ export interface A2UICard {
20
+ type: 'card';
21
+ title?: string;
22
+ children: A2UIComponent[];
23
+ borderColor?: string;
24
+ }
25
+ export interface A2UIText {
26
+ type: 'text';
27
+ content: string;
28
+ bold?: boolean;
29
+ color?: string;
30
+ dimmed?: boolean;
31
+ }
32
+ export interface A2UITextField {
33
+ type: 'textfield';
34
+ placeholder?: string;
35
+ value?: string;
36
+ onSubmit?: string;
37
+ }
38
+ export interface A2UIList {
39
+ type: 'list';
40
+ items: string[] | string;
41
+ selected?: number;
42
+ onSelect?: string;
43
+ }
44
+ export interface A2UITable {
45
+ type: 'table';
46
+ headers: string[];
47
+ rows: string[][] | string;
48
+ onRowSelect?: string;
49
+ }
50
+ export interface A2UIProgress {
51
+ type: 'progress';
52
+ value: number;
53
+ label?: string;
54
+ }
55
+ export interface A2UISpacer {
56
+ type: 'spacer';
57
+ height?: number;
58
+ }
59
+ /** Data model that components bind to via JSON Pointers. */
60
+ export interface A2UIDataModel {
61
+ [path: string]: unknown;
62
+ }
63
+ /** Streaming update message for modifying the data model. */
64
+ export interface A2UIUpdate {
65
+ type: 'set' | 'merge' | 'delete';
66
+ path: string;
67
+ value?: unknown;
68
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A2UI-compatible component schema for the generative TUI.
3
+ * Agents emit JSON matching these types; the renderer converts them
4
+ * to Ink component trees at runtime.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/generative/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Hook for cancellable async operations with AbortController pattern.
3
+ *
4
+ * Provides:
5
+ * - `signal` — pass to fetch / async operations
6
+ * - `cancel()` — aborts the current controller
7
+ * - `reset()` — creates a fresh AbortController
8
+ * - `isCancelled` — true after cancel(), cleared on reset()
9
+ */
10
+ export interface UseCancellableReturn {
11
+ signal: AbortSignal;
12
+ cancel: () => void;
13
+ reset: () => void;
14
+ isCancelled: boolean;
15
+ }
16
+ export declare function useCancellable(): UseCancellableReturn;
17
+ /**
18
+ * Creates a Ctrl+C handler with the following behavior:
19
+ * - During loading: first Ctrl+C cancels the operation
20
+ * - When idle: first Ctrl+C records timestamp and returns "pending_exit",
21
+ * second Ctrl+C within `windowMs` exits the process
22
+ *
23
+ * Returns "cancelled" | "exit" | "pending_exit".
24
+ */
25
+ export interface CtrlCHandler {
26
+ handle: () => "cancelled" | "exit" | "pending_exit";
27
+ }
28
+ export declare function createCtrlCHandler(cancelFn: () => boolean, exitFn?: () => void, windowMs?: number): CtrlCHandler;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Hook for cancellable async operations with AbortController pattern.
3
+ *
4
+ * Provides:
5
+ * - `signal` — pass to fetch / async operations
6
+ * - `cancel()` — aborts the current controller
7
+ * - `reset()` — creates a fresh AbortController
8
+ * - `isCancelled` — true after cancel(), cleared on reset()
9
+ */
10
+ import { useState, useRef, useCallback } from "react";
11
+ export function useCancellable() {
12
+ const controllerRef = useRef(new AbortController());
13
+ const [isCancelled, setIsCancelled] = useState(false);
14
+ const cancel = useCallback(() => {
15
+ controllerRef.current.abort();
16
+ setIsCancelled(true);
17
+ }, []);
18
+ const reset = useCallback(() => {
19
+ controllerRef.current = new AbortController();
20
+ setIsCancelled(false);
21
+ }, []);
22
+ return {
23
+ signal: controllerRef.current.signal,
24
+ cancel,
25
+ reset,
26
+ isCancelled,
27
+ };
28
+ }
29
+ export function createCtrlCHandler(cancelFn, exitFn = () => process.exit(0), windowMs = 1000) {
30
+ let lastPressTime = 0;
31
+ return {
32
+ handle() {
33
+ const now = Date.now();
34
+ // Try to cancel a running operation first
35
+ const wasCancelled = cancelFn();
36
+ if (wasCancelled) {
37
+ lastPressTime = now;
38
+ return "cancelled";
39
+ }
40
+ // Nothing to cancel — double-press check
41
+ if (now - lastPressTime <= windowMs) {
42
+ exitFn();
43
+ return "exit";
44
+ }
45
+ // First idle press — record time, show hint
46
+ lastPressTime = now;
47
+ return "pending_exit";
48
+ },
49
+ };
50
+ }
51
+ //# sourceMappingURL=use-cancellable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-cancellable.js","sourceRoot":"","sources":["../../../src/tui/hooks/use-cancellable.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAWtD,MAAM,UAAU,cAAc;IAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9B,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,aAAa,CAAC,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;QACpC,MAAM;QACN,KAAK;QACL,WAAW;KACZ,CAAC;AACJ,CAAC;AAgBD,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,SAAqB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAC1C,WAAmB,IAAI;IAEvB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,OAAO;QACL,MAAM;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,0CAA0C;YAC1C,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;YAChC,IAAI,YAAY,EAAE,CAAC;gBACjB,aAAa,GAAG,GAAG,CAAC;gBACpB,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,yCAAyC;YACzC,IAAI,GAAG,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;gBACpC,MAAM,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4CAA4C;YAC5C,aAAa,GAAG,GAAG,CAAC;YACpB,OAAO,cAAc,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Hook for simulated streaming text reveal.
3
+ *
4
+ * Reveals text word-by-word using setInterval, giving an
5
+ * animated "typing" appearance. When real SSE streaming is available,
6
+ * this can be replaced with actual token-level streaming.
7
+ *
8
+ * Features:
9
+ * - Word-level chunking at configurable interval (default 30ms)
10
+ * - `isStreaming` flag for trailing cursor display
11
+ * - `stopStreaming()` immediately shows full text
12
+ */
13
+ export interface UseStreamingReturn {
14
+ /** The currently visible portion of the text */
15
+ text: string;
16
+ /** Whether text is still being revealed */
17
+ isStreaming: boolean;
18
+ /**
19
+ * Start streaming a text string word-by-word.
20
+ * @param fullText The complete text to reveal
21
+ * @param chunkMs Interval between word reveals in ms (default 30)
22
+ */
23
+ startStreaming: (fullText: string, chunkMs?: number) => void;
24
+ /** Immediately show all remaining text and stop streaming */
25
+ stopStreaming: () => void;
26
+ }
27
+ /**
28
+ * Split text into word-level chunks, preserving whitespace.
29
+ * Each chunk is a word plus its trailing whitespace.
30
+ * E.g. "hello world" → ["hello ", "world"]
31
+ */
32
+ export declare function splitIntoWordChunks(text: string): string[];
33
+ export declare function useStreaming(): UseStreamingReturn;
34
+ export interface StreamingOptions {
35
+ /** Interval between word reveals in ms. Default: 30 */
36
+ chunkMs?: number;
37
+ }
38
+ /**
39
+ * Async generator that yields progressively revealed text, word by word.
40
+ */
41
+ export declare function streamText(fullText: string, options?: StreamingOptions, signal?: AbortSignal): AsyncGenerator<{
42
+ text: string;
43
+ isStreaming: boolean;
44
+ }>;