@kynetic-ai/spec 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/README.md +263 -0
  2. package/dist/acp/client.d.ts +159 -0
  3. package/dist/acp/client.d.ts.map +1 -0
  4. package/dist/acp/client.js +255 -0
  5. package/dist/acp/client.js.map +1 -0
  6. package/dist/acp/framing.d.ts +119 -0
  7. package/dist/acp/framing.d.ts.map +1 -0
  8. package/dist/acp/framing.js +302 -0
  9. package/dist/acp/framing.js.map +1 -0
  10. package/dist/acp/index.d.ts +14 -0
  11. package/dist/acp/index.d.ts.map +1 -0
  12. package/dist/acp/index.js +13 -0
  13. package/dist/acp/index.js.map +1 -0
  14. package/dist/acp/types.d.ts +89 -0
  15. package/dist/acp/types.d.ts.map +1 -0
  16. package/dist/acp/types.js +99 -0
  17. package/dist/acp/types.js.map +1 -0
  18. package/dist/agents/adapters.d.ts +55 -0
  19. package/dist/agents/adapters.d.ts.map +1 -0
  20. package/dist/agents/adapters.js +84 -0
  21. package/dist/agents/adapters.js.map +1 -0
  22. package/dist/agents/index.d.ts +8 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +10 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/spawner.d.ts +53 -0
  27. package/dist/agents/spawner.d.ts.map +1 -0
  28. package/dist/agents/spawner.js +83 -0
  29. package/dist/agents/spawner.js.map +1 -0
  30. package/dist/cli/batch.d.ts +82 -0
  31. package/dist/cli/batch.d.ts.map +1 -0
  32. package/dist/cli/batch.js +162 -0
  33. package/dist/cli/batch.js.map +1 -0
  34. package/dist/cli/commands/clone-for-testing.d.ts +6 -0
  35. package/dist/cli/commands/clone-for-testing.d.ts.map +1 -0
  36. package/dist/cli/commands/clone-for-testing.js +176 -0
  37. package/dist/cli/commands/clone-for-testing.js.map +1 -0
  38. package/dist/cli/commands/derive.d.ts +6 -0
  39. package/dist/cli/commands/derive.d.ts.map +1 -0
  40. package/dist/cli/commands/derive.js +450 -0
  41. package/dist/cli/commands/derive.js.map +1 -0
  42. package/dist/cli/commands/help.d.ts +6 -0
  43. package/dist/cli/commands/help.d.ts.map +1 -0
  44. package/dist/cli/commands/help.js +196 -0
  45. package/dist/cli/commands/help.js.map +1 -0
  46. package/dist/cli/commands/inbox.d.ts +6 -0
  47. package/dist/cli/commands/inbox.d.ts.map +1 -0
  48. package/dist/cli/commands/inbox.js +235 -0
  49. package/dist/cli/commands/inbox.js.map +1 -0
  50. package/dist/cli/commands/index.d.ts +20 -0
  51. package/dist/cli/commands/index.d.ts.map +1 -0
  52. package/dist/cli/commands/index.js +21 -0
  53. package/dist/cli/commands/index.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +6 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -0
  56. package/dist/cli/commands/init.js +245 -0
  57. package/dist/cli/commands/init.js.map +1 -0
  58. package/dist/cli/commands/item.d.ts +6 -0
  59. package/dist/cli/commands/item.d.ts.map +1 -0
  60. package/dist/cli/commands/item.js +1311 -0
  61. package/dist/cli/commands/item.js.map +1 -0
  62. package/dist/cli/commands/link.d.ts +6 -0
  63. package/dist/cli/commands/link.d.ts.map +1 -0
  64. package/dist/cli/commands/link.js +288 -0
  65. package/dist/cli/commands/link.js.map +1 -0
  66. package/dist/cli/commands/log.d.ts +16 -0
  67. package/dist/cli/commands/log.d.ts.map +1 -0
  68. package/dist/cli/commands/log.js +291 -0
  69. package/dist/cli/commands/log.js.map +1 -0
  70. package/dist/cli/commands/meta.d.ts +15 -0
  71. package/dist/cli/commands/meta.d.ts.map +1 -0
  72. package/dist/cli/commands/meta.js +1378 -0
  73. package/dist/cli/commands/meta.js.map +1 -0
  74. package/dist/cli/commands/module.d.ts +6 -0
  75. package/dist/cli/commands/module.d.ts.map +1 -0
  76. package/dist/cli/commands/module.js +102 -0
  77. package/dist/cli/commands/module.js.map +1 -0
  78. package/dist/cli/commands/ralph.d.ts +9 -0
  79. package/dist/cli/commands/ralph.d.ts.map +1 -0
  80. package/dist/cli/commands/ralph.js +465 -0
  81. package/dist/cli/commands/ralph.js.map +1 -0
  82. package/dist/cli/commands/search.d.ts +6 -0
  83. package/dist/cli/commands/search.d.ts.map +1 -0
  84. package/dist/cli/commands/search.js +134 -0
  85. package/dist/cli/commands/search.js.map +1 -0
  86. package/dist/cli/commands/session.d.ts +164 -0
  87. package/dist/cli/commands/session.d.ts.map +1 -0
  88. package/dist/cli/commands/session.js +745 -0
  89. package/dist/cli/commands/session.js.map +1 -0
  90. package/dist/cli/commands/setup.d.ts +26 -0
  91. package/dist/cli/commands/setup.d.ts.map +1 -0
  92. package/dist/cli/commands/setup.js +586 -0
  93. package/dist/cli/commands/setup.js.map +1 -0
  94. package/dist/cli/commands/shadow.d.ts +6 -0
  95. package/dist/cli/commands/shadow.d.ts.map +1 -0
  96. package/dist/cli/commands/shadow.js +299 -0
  97. package/dist/cli/commands/shadow.js.map +1 -0
  98. package/dist/cli/commands/task.d.ts +6 -0
  99. package/dist/cli/commands/task.d.ts.map +1 -0
  100. package/dist/cli/commands/task.js +1514 -0
  101. package/dist/cli/commands/task.js.map +1 -0
  102. package/dist/cli/commands/tasks.d.ts +6 -0
  103. package/dist/cli/commands/tasks.d.ts.map +1 -0
  104. package/dist/cli/commands/tasks.js +347 -0
  105. package/dist/cli/commands/tasks.js.map +1 -0
  106. package/dist/cli/commands/trait.d.ts +10 -0
  107. package/dist/cli/commands/trait.d.ts.map +1 -0
  108. package/dist/cli/commands/trait.js +295 -0
  109. package/dist/cli/commands/trait.js.map +1 -0
  110. package/dist/cli/commands/validate.d.ts +6 -0
  111. package/dist/cli/commands/validate.d.ts.map +1 -0
  112. package/dist/cli/commands/validate.js +626 -0
  113. package/dist/cli/commands/validate.js.map +1 -0
  114. package/dist/cli/exit-codes.d.ts +62 -0
  115. package/dist/cli/exit-codes.d.ts.map +1 -0
  116. package/dist/cli/exit-codes.js +65 -0
  117. package/dist/cli/exit-codes.js.map +1 -0
  118. package/dist/cli/help/content.d.ts +35 -0
  119. package/dist/cli/help/content.d.ts.map +1 -0
  120. package/dist/cli/help/content.js +312 -0
  121. package/dist/cli/help/content.js.map +1 -0
  122. package/dist/cli/index.d.ts +5 -0
  123. package/dist/cli/index.d.ts.map +1 -0
  124. package/dist/cli/index.js +85 -0
  125. package/dist/cli/index.js.map +1 -0
  126. package/dist/cli/introspection.d.ts +87 -0
  127. package/dist/cli/introspection.d.ts.map +1 -0
  128. package/dist/cli/introspection.js +127 -0
  129. package/dist/cli/introspection.js.map +1 -0
  130. package/dist/cli/output.d.ts +56 -0
  131. package/dist/cli/output.d.ts.map +1 -0
  132. package/dist/cli/output.js +467 -0
  133. package/dist/cli/output.js.map +1 -0
  134. package/dist/cli/suggest.d.ts +16 -0
  135. package/dist/cli/suggest.d.ts.map +1 -0
  136. package/dist/cli/suggest.js +72 -0
  137. package/dist/cli/suggest.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +5 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/parser/alignment.d.ts +113 -0
  143. package/dist/parser/alignment.d.ts.map +1 -0
  144. package/dist/parser/alignment.js +261 -0
  145. package/dist/parser/alignment.js.map +1 -0
  146. package/dist/parser/assess.d.ts +81 -0
  147. package/dist/parser/assess.d.ts.map +1 -0
  148. package/dist/parser/assess.js +197 -0
  149. package/dist/parser/assess.js.map +1 -0
  150. package/dist/parser/convention-validation.d.ts +48 -0
  151. package/dist/parser/convention-validation.d.ts.map +1 -0
  152. package/dist/parser/convention-validation.js +167 -0
  153. package/dist/parser/convention-validation.js.map +1 -0
  154. package/dist/parser/fix.d.ts +38 -0
  155. package/dist/parser/fix.d.ts.map +1 -0
  156. package/dist/parser/fix.js +185 -0
  157. package/dist/parser/fix.js.map +1 -0
  158. package/dist/parser/index.d.ts +12 -0
  159. package/dist/parser/index.d.ts.map +1 -0
  160. package/dist/parser/index.js +13 -0
  161. package/dist/parser/index.js.map +1 -0
  162. package/dist/parser/items.d.ts +138 -0
  163. package/dist/parser/items.d.ts.map +1 -0
  164. package/dist/parser/items.js +321 -0
  165. package/dist/parser/items.js.map +1 -0
  166. package/dist/parser/meta.d.ts +120 -0
  167. package/dist/parser/meta.d.ts.map +1 -0
  168. package/dist/parser/meta.js +441 -0
  169. package/dist/parser/meta.js.map +1 -0
  170. package/dist/parser/refs.d.ts +185 -0
  171. package/dist/parser/refs.d.ts.map +1 -0
  172. package/dist/parser/refs.js +404 -0
  173. package/dist/parser/refs.js.map +1 -0
  174. package/dist/parser/shadow.d.ts +253 -0
  175. package/dist/parser/shadow.d.ts.map +1 -0
  176. package/dist/parser/shadow.js +1053 -0
  177. package/dist/parser/shadow.js.map +1 -0
  178. package/dist/parser/traits.d.ts +72 -0
  179. package/dist/parser/traits.d.ts.map +1 -0
  180. package/dist/parser/traits.js +120 -0
  181. package/dist/parser/traits.js.map +1 -0
  182. package/dist/parser/validate.d.ts +89 -0
  183. package/dist/parser/validate.d.ts.map +1 -0
  184. package/dist/parser/validate.js +817 -0
  185. package/dist/parser/validate.js.map +1 -0
  186. package/dist/parser/yaml.d.ts +326 -0
  187. package/dist/parser/yaml.d.ts.map +1 -0
  188. package/dist/parser/yaml.js +1383 -0
  189. package/dist/parser/yaml.js.map +1 -0
  190. package/dist/ralph/cli-renderer.d.ts +20 -0
  191. package/dist/ralph/cli-renderer.d.ts.map +1 -0
  192. package/dist/ralph/cli-renderer.js +179 -0
  193. package/dist/ralph/cli-renderer.js.map +1 -0
  194. package/dist/ralph/events.d.ts +65 -0
  195. package/dist/ralph/events.d.ts.map +1 -0
  196. package/dist/ralph/events.js +397 -0
  197. package/dist/ralph/events.js.map +1 -0
  198. package/dist/ralph/index.d.ts +8 -0
  199. package/dist/ralph/index.d.ts.map +1 -0
  200. package/dist/ralph/index.js +10 -0
  201. package/dist/ralph/index.js.map +1 -0
  202. package/dist/schema/common.d.ts +46 -0
  203. package/dist/schema/common.d.ts.map +1 -0
  204. package/dist/schema/common.js +71 -0
  205. package/dist/schema/common.js.map +1 -0
  206. package/dist/schema/inbox.d.ts +90 -0
  207. package/dist/schema/inbox.d.ts.map +1 -0
  208. package/dist/schema/inbox.js +30 -0
  209. package/dist/schema/inbox.js.map +1 -0
  210. package/dist/schema/index.d.ts +6 -0
  211. package/dist/schema/index.d.ts.map +1 -0
  212. package/dist/schema/index.js +7 -0
  213. package/dist/schema/index.js.map +1 -0
  214. package/dist/schema/meta.d.ts +762 -0
  215. package/dist/schema/meta.d.ts.map +1 -0
  216. package/dist/schema/meta.js +144 -0
  217. package/dist/schema/meta.js.map +1 -0
  218. package/dist/schema/spec.d.ts +912 -0
  219. package/dist/schema/spec.d.ts.map +1 -0
  220. package/dist/schema/spec.js +104 -0
  221. package/dist/schema/spec.js.map +1 -0
  222. package/dist/schema/task.d.ts +664 -0
  223. package/dist/schema/task.d.ts.map +1 -0
  224. package/dist/schema/task.js +130 -0
  225. package/dist/schema/task.js.map +1 -0
  226. package/dist/sessions/index.d.ts +11 -0
  227. package/dist/sessions/index.d.ts.map +1 -0
  228. package/dist/sessions/index.js +13 -0
  229. package/dist/sessions/index.js.map +1 -0
  230. package/dist/sessions/store.d.ts +144 -0
  231. package/dist/sessions/store.d.ts.map +1 -0
  232. package/dist/sessions/store.js +325 -0
  233. package/dist/sessions/store.js.map +1 -0
  234. package/dist/sessions/types.d.ts +157 -0
  235. package/dist/sessions/types.d.ts.map +1 -0
  236. package/dist/sessions/types.js +90 -0
  237. package/dist/sessions/types.js.map +1 -0
  238. package/dist/strings/errors.d.ts +420 -0
  239. package/dist/strings/errors.d.ts.map +1 -0
  240. package/dist/strings/errors.js +282 -0
  241. package/dist/strings/errors.js.map +1 -0
  242. package/dist/strings/guidance.d.ts +65 -0
  243. package/dist/strings/guidance.d.ts.map +1 -0
  244. package/dist/strings/guidance.js +66 -0
  245. package/dist/strings/guidance.js.map +1 -0
  246. package/dist/strings/index.d.ts +12 -0
  247. package/dist/strings/index.d.ts.map +1 -0
  248. package/dist/strings/index.js +12 -0
  249. package/dist/strings/index.js.map +1 -0
  250. package/dist/strings/labels.d.ts +74 -0
  251. package/dist/strings/labels.d.ts.map +1 -0
  252. package/dist/strings/labels.js +75 -0
  253. package/dist/strings/labels.js.map +1 -0
  254. package/dist/strings/validation.d.ts +126 -0
  255. package/dist/strings/validation.d.ts.map +1 -0
  256. package/dist/strings/validation.js +135 -0
  257. package/dist/strings/validation.js.map +1 -0
  258. package/dist/utils/commit.d.ts +23 -0
  259. package/dist/utils/commit.d.ts.map +1 -0
  260. package/dist/utils/commit.js +67 -0
  261. package/dist/utils/commit.js.map +1 -0
  262. package/dist/utils/git.d.ts +57 -0
  263. package/dist/utils/git.d.ts.map +1 -0
  264. package/dist/utils/git.js +192 -0
  265. package/dist/utils/git.js.map +1 -0
  266. package/dist/utils/grep.d.ts +28 -0
  267. package/dist/utils/grep.d.ts.map +1 -0
  268. package/dist/utils/grep.js +86 -0
  269. package/dist/utils/grep.js.map +1 -0
  270. package/dist/utils/index.d.ts +8 -0
  271. package/dist/utils/index.d.ts.map +1 -0
  272. package/dist/utils/index.js +6 -0
  273. package/dist/utils/index.js.map +1 -0
  274. package/dist/utils/time.d.ts +18 -0
  275. package/dist/utils/time.d.ts.map +1 -0
  276. package/dist/utils/time.js +61 -0
  277. package/dist/utils/time.js.map +1 -0
  278. package/package.json +62 -0
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Ralph Event System
3
+ *
4
+ * Translates ACP SessionUpdate events into structured RalphEvents.
5
+ * This layer is pure data - no rendering concerns. Enables future
6
+ * TUI or other renderers to consume the same event stream.
7
+ */
8
+ // ============================================================================
9
+ // Tool Summary Extraction
10
+ // ============================================================================
11
+ /**
12
+ * Extract a human-readable summary for a tool call.
13
+ * Based on kynetic ui-event-translator.ts patterns.
14
+ */
15
+ function getToolSummary(tool, input) {
16
+ const inp = input;
17
+ switch (tool) {
18
+ case 'Bash': {
19
+ const cmd = inp.command;
20
+ if (cmd) {
21
+ return cmd.length > 50 ? cmd.slice(0, 47) + '...' : cmd;
22
+ }
23
+ return '';
24
+ }
25
+ case 'Read':
26
+ case 'Write':
27
+ case 'Edit': {
28
+ const filePath = inp.file_path;
29
+ if (filePath) {
30
+ // Extract filename from path
31
+ const parts = filePath.split('/');
32
+ return parts[parts.length - 1] || filePath;
33
+ }
34
+ return '';
35
+ }
36
+ case 'Grep': {
37
+ const pattern = inp.pattern;
38
+ return pattern ? `/${pattern}/` : '';
39
+ }
40
+ case 'Glob': {
41
+ const pattern = inp.pattern;
42
+ return pattern || '';
43
+ }
44
+ case 'WebSearch': {
45
+ const query = inp.query;
46
+ return query || '';
47
+ }
48
+ case 'Task': {
49
+ const desc = inp.description;
50
+ return desc || '';
51
+ }
52
+ case 'TodoWrite': {
53
+ const todos = inp.todos;
54
+ if (todos && todos.length > 0) {
55
+ return `${todos.length} item(s)`;
56
+ }
57
+ return '';
58
+ }
59
+ default:
60
+ return '';
61
+ }
62
+ }
63
+ /**
64
+ * Extract tool name from SessionUpdate.
65
+ * Handles Claude Code's _meta.claudeCode.toolName pattern and MCP prefixes.
66
+ */
67
+ function extractToolName(update) {
68
+ // Try _meta.claudeCode.toolName first (Claude Code pattern)
69
+ const meta = update._meta;
70
+ if (meta) {
71
+ const claudeCode = meta.claudeCode;
72
+ if (claudeCode?.toolName) {
73
+ return normalizeTool(claudeCode.toolName);
74
+ }
75
+ if (meta.toolName) {
76
+ return normalizeTool(meta.toolName);
77
+ }
78
+ }
79
+ // Fall back to name field
80
+ if (update.name) {
81
+ return normalizeTool(update.name);
82
+ }
83
+ // Fall back to title
84
+ if (update.title) {
85
+ return normalizeTool(update.title);
86
+ }
87
+ return 'unknown';
88
+ }
89
+ /**
90
+ * Normalize tool name by stripping MCP prefixes.
91
+ */
92
+ function normalizeTool(name) {
93
+ // Strip mcp__<namespace>__ prefix
94
+ const mcpMatch = name.match(/^mcp__[^_]+__(.+)$/);
95
+ if (mcpMatch) {
96
+ return mcpMatch[1];
97
+ }
98
+ return name;
99
+ }
100
+ /**
101
+ * Extract tool output, handling Claude Code's non-standard delivery.
102
+ */
103
+ function extractToolOutput(update) {
104
+ // Try rawOutput first
105
+ if (update.rawOutput !== undefined) {
106
+ return truncateOutput(String(update.rawOutput));
107
+ }
108
+ // Try _meta.claudeCode.toolResponse (Claude Code pattern)
109
+ // toolResponse is an object with stdout/stderr, not a string
110
+ const meta = update._meta;
111
+ if (meta) {
112
+ const claudeCode = meta.claudeCode;
113
+ if (claudeCode?.toolResponse !== undefined) {
114
+ const toolResponse = claudeCode.toolResponse;
115
+ // Extract stdout, falling back to stringifying the whole response
116
+ if (typeof toolResponse.stdout === 'string') {
117
+ const combined = toolResponse.stdout + (toolResponse.stderr ? `\n${toolResponse.stderr}` : '');
118
+ return truncateOutput(combined.trim());
119
+ }
120
+ return truncateOutput(String(toolResponse));
121
+ }
122
+ }
123
+ // Try output field
124
+ if (update.output !== undefined) {
125
+ return truncateOutput(String(update.output));
126
+ }
127
+ return undefined;
128
+ }
129
+ /**
130
+ * Extract original (non-truncated) output for truncation detection.
131
+ */
132
+ function extractOriginalOutput(update) {
133
+ if (update.rawOutput !== undefined) {
134
+ return String(update.rawOutput);
135
+ }
136
+ const meta = update._meta;
137
+ if (meta) {
138
+ const claudeCode = meta.claudeCode;
139
+ if (claudeCode?.toolResponse !== undefined) {
140
+ const toolResponse = claudeCode.toolResponse;
141
+ if (typeof toolResponse.stdout === 'string') {
142
+ return (toolResponse.stdout + (toolResponse.stderr ? `\n${toolResponse.stderr}` : '')).trim();
143
+ }
144
+ }
145
+ }
146
+ if (update.output !== undefined) {
147
+ return String(update.output);
148
+ }
149
+ return undefined;
150
+ }
151
+ /**
152
+ * Truncate output to reasonable size.
153
+ */
154
+ function truncateOutput(output) {
155
+ const MAX_LINES = 20;
156
+ const MAX_CHARS = 1000;
157
+ const lines = output.split('\n');
158
+ if (lines.length > MAX_LINES) {
159
+ return lines.slice(0, MAX_LINES).join('\n');
160
+ }
161
+ if (output.length > MAX_CHARS) {
162
+ return output.slice(0, MAX_CHARS);
163
+ }
164
+ return output;
165
+ }
166
+ /**
167
+ * Check if output was truncated.
168
+ */
169
+ function wasOutputTruncated(original, truncated) {
170
+ if (!original || !truncated)
171
+ return false;
172
+ return original.length > truncated.length;
173
+ }
174
+ // ============================================================================
175
+ // Noise Suppression
176
+ // ============================================================================
177
+ const SUPPRESSED_PATTERNS = [
178
+ /No onPostToolUseHook found/i,
179
+ /No onPreToolUseHook found/i,
180
+ ];
181
+ /**
182
+ * Check if a message should be suppressed from display.
183
+ */
184
+ function shouldSuppress(content) {
185
+ return SUPPRESSED_PATTERNS.some((pattern) => pattern.test(content));
186
+ }
187
+ export function createTranslator() {
188
+ const state = {
189
+ sessionStart: Date.now(),
190
+ activeMessage: null,
191
+ pendingTools: new Map(),
192
+ };
193
+ function getTimestamp() {
194
+ return Date.now() - state.sessionStart;
195
+ }
196
+ function translate(update) {
197
+ const updateType = update.sessionUpdate;
198
+ const timestamp = getTimestamp();
199
+ switch (updateType) {
200
+ // ─── Content Chunks ─────────────────────────────────────────────────────
201
+ case 'agent_message_chunk': {
202
+ const content = update.content;
203
+ if (content?.type === 'text' && typeof content.text === 'string') {
204
+ // Check for noise
205
+ if (shouldSuppress(content.text)) {
206
+ return null;
207
+ }
208
+ // Empty string signals finalization
209
+ if (content.text === '') {
210
+ if (state.activeMessage?.type === 'agent_message') {
211
+ const final = {
212
+ type: 'agent_message',
213
+ timestamp,
214
+ data: {
215
+ kind: 'agent_message',
216
+ content: state.activeMessage.content,
217
+ isStreaming: false,
218
+ },
219
+ };
220
+ state.activeMessage = null;
221
+ return final;
222
+ }
223
+ return null;
224
+ }
225
+ // Accumulate content
226
+ if (state.activeMessage?.type === 'agent_message') {
227
+ state.activeMessage.content += content.text;
228
+ }
229
+ else {
230
+ state.activeMessage = { type: 'agent_message', content: content.text };
231
+ }
232
+ return {
233
+ type: 'agent_message',
234
+ timestamp,
235
+ data: {
236
+ kind: 'agent_message',
237
+ content: content.text,
238
+ isStreaming: true,
239
+ },
240
+ };
241
+ }
242
+ return null;
243
+ }
244
+ case 'agent_thought_chunk': {
245
+ const content = update.content;
246
+ if (content?.type === 'text' && typeof content.text === 'string') {
247
+ if (shouldSuppress(content.text)) {
248
+ return null;
249
+ }
250
+ if (content.text === '') {
251
+ if (state.activeMessage?.type === 'agent_thought') {
252
+ const final = {
253
+ type: 'agent_thought',
254
+ timestamp,
255
+ data: {
256
+ kind: 'agent_thought',
257
+ content: state.activeMessage.content,
258
+ isStreaming: false,
259
+ },
260
+ };
261
+ state.activeMessage = null;
262
+ return final;
263
+ }
264
+ return null;
265
+ }
266
+ if (state.activeMessage?.type === 'agent_thought') {
267
+ state.activeMessage.content += content.text;
268
+ }
269
+ else {
270
+ state.activeMessage = { type: 'agent_thought', content: content.text };
271
+ }
272
+ return {
273
+ type: 'agent_thought',
274
+ timestamp,
275
+ data: {
276
+ kind: 'agent_thought',
277
+ content: content.text,
278
+ isStreaming: true,
279
+ },
280
+ };
281
+ }
282
+ return null;
283
+ }
284
+ case 'user_message_chunk': {
285
+ // User messages are typically the prompt we sent, skip display
286
+ return null;
287
+ }
288
+ // ─── Tool Events ────────────────────────────────────────────────────────
289
+ case 'tool_call': {
290
+ const u = update;
291
+ const toolCallId = (u.tool_call_id || u.toolCallId || u.id);
292
+ const tool = extractToolName(u);
293
+ const input = u.rawInput || u.input || u.params || {};
294
+ const summary = getToolSummary(tool, input);
295
+ // Check if this is an update to an existing tool call (phased events)
296
+ const existing = state.pendingTools.get(toolCallId);
297
+ if (existing) {
298
+ // Update existing entry with new input if present
299
+ const hadSummary = getToolSummary(existing.tool, existing.input);
300
+ existing.input = input;
301
+ existing.tool = tool;
302
+ // Only emit update if we now have a summary we didn't have before
303
+ if (summary && !hadSummary) {
304
+ return {
305
+ type: 'tool_update',
306
+ timestamp,
307
+ data: {
308
+ kind: 'tool_update',
309
+ toolCallId,
310
+ tool,
311
+ status: 'pending',
312
+ summary,
313
+ },
314
+ };
315
+ }
316
+ // No meaningful change, suppress event
317
+ return null;
318
+ }
319
+ // First time seeing this tool_call_id - create entry and emit tool_start
320
+ state.pendingTools.set(toolCallId, { tool, input, startTime: timestamp });
321
+ return {
322
+ type: 'tool_start',
323
+ timestamp,
324
+ data: {
325
+ kind: 'tool_start',
326
+ toolCallId,
327
+ tool,
328
+ summary,
329
+ input,
330
+ },
331
+ };
332
+ }
333
+ case 'tool_call_update': {
334
+ const u = update;
335
+ const toolCallId = (u.tool_call_id || u.toolCallId || u.id);
336
+ const status = u.status;
337
+ const pending = state.pendingTools.get(toolCallId);
338
+ const tool = pending?.tool || extractToolName(u);
339
+ // Non-terminal status update
340
+ if (status === 'pending' || status === 'in_progress' || status === 'running') {
341
+ return {
342
+ type: 'tool_update',
343
+ timestamp,
344
+ data: {
345
+ kind: 'tool_update',
346
+ toolCallId,
347
+ tool,
348
+ status: status === 'in_progress' ? 'running' : status,
349
+ },
350
+ };
351
+ }
352
+ // Terminal status - treat as result
353
+ if (status === 'completed' || status === 'failed' || status === 'cancelled') {
354
+ const rawOutput = extractToolOutput(u);
355
+ const originalOutput = extractOriginalOutput(u);
356
+ state.pendingTools.delete(toolCallId);
357
+ return {
358
+ type: 'tool_result',
359
+ timestamp,
360
+ data: {
361
+ kind: 'tool_result',
362
+ toolCallId,
363
+ tool,
364
+ status,
365
+ output: rawOutput,
366
+ truncated: wasOutputTruncated(originalOutput, rawOutput),
367
+ },
368
+ };
369
+ }
370
+ return null;
371
+ }
372
+ // Note: 'status' is not a SessionUpdate type in the ACP spec.
373
+ // Status changes come through other mechanisms (e.g., prompt completion).
374
+ default:
375
+ // Unknown update type - ignore
376
+ return null;
377
+ }
378
+ }
379
+ function finalize() {
380
+ if (state.activeMessage) {
381
+ const final = {
382
+ type: state.activeMessage.type,
383
+ timestamp: getTimestamp(),
384
+ data: {
385
+ kind: state.activeMessage.type,
386
+ content: state.activeMessage.content,
387
+ isStreaming: false,
388
+ },
389
+ };
390
+ state.activeMessage = null;
391
+ return final;
392
+ }
393
+ return null;
394
+ }
395
+ return { translate, finalize };
396
+ }
397
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/ralph/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Ralph Module
3
+ *
4
+ * Event translation and rendering for the ralph autonomous task loop.
5
+ */
6
+ export { type RalphEvent, type RalphEventType, type RalphEventData, type AgentMessageData, type AgentThoughtData, type ToolStartData, type ToolUpdateData, type ToolResultData, type StatusData, type RalphTranslator, createTranslator, } from './events.js';
7
+ export { type RalphRenderer, createCliRenderer } from './cli-renderer.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ralph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Ralph Module
3
+ *
4
+ * Event translation and rendering for the ralph autonomous task loop.
5
+ */
6
+ // Event types and translator
7
+ export { createTranslator, } from './events.js';
8
+ // CLI renderer
9
+ export { createCliRenderer } from './cli-renderer.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ralph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6BAA6B;AAC7B,OAAO,EAWL,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EAAsB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * ULID pattern - 26 character Crockford base32
4
+ * Excludes I, L, O, U to avoid confusion with 1, 1, 0, V
5
+ */
6
+ export declare const ulidPattern: RegExp;
7
+ /**
8
+ * Slug pattern - lowercase alphanumeric with hyphens
9
+ */
10
+ export declare const slugPattern: RegExp;
11
+ /**
12
+ * Reference pattern - @ prefix followed by slug or ULID (or short ULID)
13
+ */
14
+ export declare const refPattern: RegExp;
15
+ export declare const UlidSchema: z.ZodString;
16
+ export declare const SlugSchema: z.ZodString;
17
+ export declare const RefSchema: z.ZodString;
18
+ export declare const PrioritySchema: z.ZodUnion<[z.ZodEnum<["high", "medium", "low"]>, z.ZodNumber]>;
19
+ export declare const DateTimeSchema: z.ZodUnion<[z.ZodString, z.ZodString]>;
20
+ export declare const MaturitySchema: z.ZodEnum<["draft", "proposed", "stable", "deferred", "deprecated"]>;
21
+ export declare const ImplementationStatusSchema: z.ZodEnum<["not_started", "in_progress", "implemented", "verified"]>;
22
+ export declare const TaskStatusSchema: z.ZodEnum<["pending", "in_progress", "pending_review", "blocked", "completed", "cancelled"]>;
23
+ export declare const TaskTypeSchema: z.ZodEnum<["epic", "task", "bug", "spike", "infra"]>;
24
+ export declare const ItemTypeSchema: z.ZodEnum<["module", "feature", "requirement", "constraint", "decision", "task", "trait"]>;
25
+ export declare const VcsRefSchema: z.ZodObject<{
26
+ ref: z.ZodString;
27
+ type: z.ZodOptional<z.ZodEnum<["branch", "tag", "commit"]>>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ ref: string;
30
+ type?: "branch" | "tag" | "commit" | undefined;
31
+ }, {
32
+ ref: string;
33
+ type?: "branch" | "tag" | "commit" | undefined;
34
+ }>;
35
+ export type Ulid = z.infer<typeof UlidSchema>;
36
+ export type Slug = z.infer<typeof SlugSchema>;
37
+ export type Ref = z.infer<typeof RefSchema>;
38
+ export type Priority = z.infer<typeof PrioritySchema>;
39
+ export type DateTime = z.infer<typeof DateTimeSchema>;
40
+ export type Maturity = z.infer<typeof MaturitySchema>;
41
+ export type ImplementationStatus = z.infer<typeof ImplementationStatusSchema>;
42
+ export type TaskStatus = z.infer<typeof TaskStatusSchema>;
43
+ export type TaskType = z.infer<typeof TaskTypeSchema>;
44
+ export type ItemType = z.infer<typeof ItemTypeSchema>;
45
+ export type VcsRef = z.infer<typeof VcsRefSchema>;
46
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;GAGG;AACH,eAAO,MAAM,WAAW,QAA8B,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,WAAW,QAAsB,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,UAAU,QAAqB,CAAC;AAG7C,eAAO,MAAM,UAAU,aAAuD,CAAC;AAC/E,eAAO,MAAM,UAAU,aAAuD,CAAC;AAC/E,eAAO,MAAM,SAAS,aAA2D,CAAC;AAGlF,eAAO,MAAM,cAAc,iEAGzB,CAAC;AAGH,eAAO,MAAM,cAAc,wCAGzB,CAAC;AAGH,eAAO,MAAM,cAAc,sEAAoE,CAAC;AAGhG,eAAO,MAAM,0BAA0B,sEAKrC,CAAC;AAGH,eAAO,MAAM,gBAAgB,8FAO3B,CAAC;AAGH,eAAO,MAAM,cAAc,sDAMzB,CAAC;AAGH,eAAO,MAAM,cAAc,4FAQzB,CAAC;AAGH,eAAO,MAAM,YAAY;;;;;;;;;EAGvB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAC5C,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { z } from 'zod';
2
+ // Common types used across spec and task schemas
3
+ /**
4
+ * ULID pattern - 26 character Crockford base32
5
+ * Excludes I, L, O, U to avoid confusion with 1, 1, 0, V
6
+ */
7
+ export const ulidPattern = /^[0-9A-HJKMNP-TV-Z]{26}$/i;
8
+ /**
9
+ * Slug pattern - lowercase alphanumeric with hyphens
10
+ */
11
+ export const slugPattern = /^[a-z][a-z0-9-]*$/;
12
+ /**
13
+ * Reference pattern - @ prefix followed by slug or ULID (or short ULID)
14
+ */
15
+ export const refPattern = /^@[a-zA-Z0-9-]+$/;
16
+ // Base schemas
17
+ export const UlidSchema = z.string().regex(ulidPattern, 'Invalid ULID format');
18
+ export const SlugSchema = z.string().regex(slugPattern, 'Invalid slug format');
19
+ export const RefSchema = z.string().regex(refPattern, 'Invalid reference format');
20
+ // Priority can be string or number
21
+ export const PrioritySchema = z.union([
22
+ z.enum(['high', 'medium', 'low']),
23
+ z.number().int().min(1).max(5),
24
+ ]);
25
+ // ISO 8601 date or datetime
26
+ export const DateTimeSchema = z.union([
27
+ z.string().datetime(),
28
+ z.string().date(),
29
+ ]);
30
+ // Maturity status
31
+ export const MaturitySchema = z.enum(['draft', 'proposed', 'stable', 'deferred', 'deprecated']);
32
+ // Implementation status
33
+ export const ImplementationStatusSchema = z.enum([
34
+ 'not_started',
35
+ 'in_progress',
36
+ 'implemented',
37
+ 'verified',
38
+ ]);
39
+ // Task status
40
+ export const TaskStatusSchema = z.enum([
41
+ 'pending',
42
+ 'in_progress',
43
+ 'pending_review',
44
+ 'blocked',
45
+ 'completed',
46
+ 'cancelled',
47
+ ]);
48
+ // Task type
49
+ export const TaskTypeSchema = z.enum([
50
+ 'epic',
51
+ 'task',
52
+ 'bug',
53
+ 'spike',
54
+ 'infra',
55
+ ]);
56
+ // Item type
57
+ export const ItemTypeSchema = z.enum([
58
+ 'module',
59
+ 'feature',
60
+ 'requirement',
61
+ 'constraint',
62
+ 'decision',
63
+ 'task',
64
+ 'trait',
65
+ ]);
66
+ // VCS reference
67
+ export const VcsRefSchema = z.object({
68
+ ref: z.string(),
69
+ type: z.enum(['branch', 'tag', 'commit']).optional(),
70
+ });
71
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schema/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE7C,eAAe;AACf,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;AAElF,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC;IACpC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC,CAAC;AAEH,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC;IACpC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrB,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CAClB,CAAC,CAAC;AAEH,kBAAkB;AAClB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AAEhG,wBAAwB;AACxB,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/C,aAAa;IACb,aAAa;IACb,aAAa;IACb,UAAU;CACX,CAAC,CAAC;AAEH,cAAc;AACd,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,SAAS;IACT,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAEH,YAAY;AACZ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACnC,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;CACR,CAAC,CAAC;AAEH,YAAY;AACZ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACnC,QAAQ;IACR,SAAS;IACT,aAAa;IACb,YAAY;IACZ,UAAU;IACV,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Inbox item - low-friction capture for ideas that aren't tasks yet.
4
+ * Intentionally simple: just text, timestamp, optional tags, and who added it.
5
+ */
6
+ export declare const InboxItemSchema: z.ZodObject<{
7
+ _ulid: z.ZodString;
8
+ text: z.ZodString;
9
+ created_at: z.ZodUnion<[z.ZodString, z.ZodString]>;
10
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
11
+ added_by: z.ZodOptional<z.ZodString>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ _ulid: string;
14
+ created_at: string;
15
+ text: string;
16
+ tags: string[];
17
+ added_by?: string | undefined;
18
+ }, {
19
+ _ulid: string;
20
+ created_at: string;
21
+ text: string;
22
+ added_by?: string | undefined;
23
+ tags?: string[] | undefined;
24
+ }>;
25
+ /**
26
+ * Inbox item input schema (for creating new items)
27
+ */
28
+ export declare const InboxItemInputSchema: z.ZodObject<{
29
+ _ulid: z.ZodOptional<z.ZodString>;
30
+ text: z.ZodString;
31
+ created_at: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodString]>>;
32
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
33
+ added_by: z.ZodOptional<z.ZodString>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ text: string;
36
+ _ulid?: string | undefined;
37
+ created_at?: string | undefined;
38
+ added_by?: string | undefined;
39
+ tags?: string[] | undefined;
40
+ }, {
41
+ text: string;
42
+ _ulid?: string | undefined;
43
+ created_at?: string | undefined;
44
+ added_by?: string | undefined;
45
+ tags?: string[] | undefined;
46
+ }>;
47
+ /**
48
+ * Inbox file schema (collection of inbox items)
49
+ */
50
+ export declare const InboxFileSchema: z.ZodObject<{
51
+ inbox: z.ZodArray<z.ZodObject<{
52
+ _ulid: z.ZodString;
53
+ text: z.ZodString;
54
+ created_at: z.ZodUnion<[z.ZodString, z.ZodString]>;
55
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
56
+ added_by: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ _ulid: string;
59
+ created_at: string;
60
+ text: string;
61
+ tags: string[];
62
+ added_by?: string | undefined;
63
+ }, {
64
+ _ulid: string;
65
+ created_at: string;
66
+ text: string;
67
+ added_by?: string | undefined;
68
+ tags?: string[] | undefined;
69
+ }>, "many">;
70
+ }, "strip", z.ZodTypeAny, {
71
+ inbox: {
72
+ _ulid: string;
73
+ created_at: string;
74
+ text: string;
75
+ tags: string[];
76
+ added_by?: string | undefined;
77
+ }[];
78
+ }, {
79
+ inbox: {
80
+ _ulid: string;
81
+ created_at: string;
82
+ text: string;
83
+ added_by?: string | undefined;
84
+ tags?: string[] | undefined;
85
+ }[];
86
+ }>;
87
+ export type InboxItem = z.infer<typeof InboxItemSchema>;
88
+ export type InboxItemInput = z.infer<typeof InboxItemInputSchema>;
89
+ export type InboxFile = z.infer<typeof InboxFileSchema>;
90
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/schema/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}