@n1k1t/pipelain 0.4.14 → 1.0.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 (187) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/AGENTS.md +20 -0
  3. package/README.md +185 -12
  4. package/assets/report/index.hbs +201 -79
  5. package/assets/report/main.css +135 -3
  6. package/cli/index.ts +77 -0
  7. package/lib/src/index.d.ts +2 -0
  8. package/lib/src/index.d.ts.map +1 -1
  9. package/lib/src/index.js +2 -0
  10. package/lib/src/index.js.map +1 -1
  11. package/lib/src/models/content/factory.d.ts +7 -1
  12. package/lib/src/models/content/factory.d.ts.map +1 -1
  13. package/lib/src/models/content/factory.js +15 -0
  14. package/lib/src/models/content/factory.js.map +1 -1
  15. package/lib/src/models/content/kinds/article.d.ts +3 -1
  16. package/lib/src/models/content/kinds/article.d.ts.map +1 -1
  17. package/lib/src/models/content/kinds/article.js +7 -0
  18. package/lib/src/models/content/kinds/article.js.map +1 -1
  19. package/lib/src/models/content/kinds/attachment.d.ts +3 -1
  20. package/lib/src/models/content/kinds/attachment.d.ts.map +1 -1
  21. package/lib/src/models/content/kinds/attachment.js +7 -0
  22. package/lib/src/models/content/kinds/attachment.js.map +1 -1
  23. package/lib/src/models/content/kinds/group.d.ts +3 -1
  24. package/lib/src/models/content/kinds/group.d.ts.map +1 -1
  25. package/lib/src/models/content/kinds/group.js +7 -0
  26. package/lib/src/models/content/kinds/group.js.map +1 -1
  27. package/lib/src/models/content/kinds/model.d.ts +5 -0
  28. package/lib/src/models/content/kinds/model.d.ts.map +1 -1
  29. package/lib/src/models/content/kinds/model.js +6 -0
  30. package/lib/src/models/content/kinds/model.js.map +1 -1
  31. package/lib/src/models/content/kinds/plain.d.ts +3 -1
  32. package/lib/src/models/content/kinds/plain.d.ts.map +1 -1
  33. package/lib/src/models/content/kinds/plain.js +7 -0
  34. package/lib/src/models/content/kinds/plain.js.map +1 -1
  35. package/lib/src/models/content/kinds/rules.d.ts +3 -1
  36. package/lib/src/models/content/kinds/rules.d.ts.map +1 -1
  37. package/lib/src/models/content/kinds/rules.js +7 -0
  38. package/lib/src/models/content/kinds/rules.js.map +1 -1
  39. package/lib/src/models/content/kinds/sources.d.ts +3 -1
  40. package/lib/src/models/content/kinds/sources.d.ts.map +1 -1
  41. package/lib/src/models/content/kinds/sources.js +7 -0
  42. package/lib/src/models/content/kinds/sources.js.map +1 -1
  43. package/lib/src/models/content/kinds/tasks.d.ts +3 -1
  44. package/lib/src/models/content/kinds/tasks.d.ts.map +1 -1
  45. package/lib/src/models/content/kinds/tasks.js +7 -0
  46. package/lib/src/models/content/kinds/tasks.js.map +1 -1
  47. package/lib/src/models/index.d.ts +1 -0
  48. package/lib/src/models/index.d.ts.map +1 -1
  49. package/lib/src/models/index.js +1 -0
  50. package/lib/src/models/index.js.map +1 -1
  51. package/lib/src/models/llm/hook.d.ts +128 -0
  52. package/lib/src/models/llm/hook.d.ts.map +1 -0
  53. package/lib/src/models/llm/hook.js +129 -0
  54. package/lib/src/models/llm/hook.js.map +1 -0
  55. package/lib/src/models/llm/index.d.ts +1 -0
  56. package/lib/src/models/llm/index.d.ts.map +1 -1
  57. package/lib/src/models/llm/index.js +1 -0
  58. package/lib/src/models/llm/index.js.map +1 -1
  59. package/lib/src/models/llm/mcp.d.ts +4 -0
  60. package/lib/src/models/llm/mcp.d.ts.map +1 -1
  61. package/lib/src/models/llm/mcp.js +5 -2
  62. package/lib/src/models/llm/mcp.js.map +1 -1
  63. package/lib/src/models/llm/providers/model.d.ts +1 -1
  64. package/lib/src/models/llm/providers/model.d.ts.map +1 -1
  65. package/lib/src/models/llm/providers/proxy.d.ts +6 -0
  66. package/lib/src/models/llm/providers/proxy.d.ts.map +1 -1
  67. package/lib/src/models/llm/providers/proxy.js +5 -3
  68. package/lib/src/models/llm/providers/proxy.js.map +1 -1
  69. package/lib/src/models/llm/router.d.ts +6 -0
  70. package/lib/src/models/llm/router.d.ts.map +1 -1
  71. package/lib/src/models/llm/router.js +12 -0
  72. package/lib/src/models/llm/router.js.map +1 -1
  73. package/lib/src/models/llm/tools/attachment.js +2 -2
  74. package/lib/src/models/llm/tools/attachment.js.map +1 -1
  75. package/lib/src/models/llm/tools/edit.js +3 -3
  76. package/lib/src/models/llm/tools/edit.js.map +1 -1
  77. package/lib/src/models/llm/tools/fetch.js +4 -4
  78. package/lib/src/models/llm/tools/fetch.js.map +1 -1
  79. package/lib/src/models/llm/tools/grep.js +2 -2
  80. package/lib/src/models/llm/tools/grep.js.map +1 -1
  81. package/lib/src/models/llm/tools/ls.js +2 -2
  82. package/lib/src/models/llm/tools/ls.js.map +1 -1
  83. package/lib/src/models/llm/tools/mkdir.js +2 -2
  84. package/lib/src/models/llm/tools/mkdir.js.map +1 -1
  85. package/lib/src/models/llm/tools/model.d.ts +4 -4
  86. package/lib/src/models/llm/tools/model.d.ts.map +1 -1
  87. package/lib/src/models/llm/tools/model.js +19 -10
  88. package/lib/src/models/llm/tools/model.js.map +1 -1
  89. package/lib/src/models/llm/tools/npm.js +1 -1
  90. package/lib/src/models/llm/tools/npm.js.map +1 -1
  91. package/lib/src/models/llm/tools/npx.js +1 -1
  92. package/lib/src/models/llm/tools/npx.js.map +1 -1
  93. package/lib/src/models/llm/tools/read.js +3 -3
  94. package/lib/src/models/llm/tools/read.js.map +1 -1
  95. package/lib/src/models/llm/tools/rm.js +4 -4
  96. package/lib/src/models/llm/tools/rm.js.map +1 -1
  97. package/lib/src/models/llm/tools/search.js +2 -2
  98. package/lib/src/models/llm/tools/search.js.map +1 -1
  99. package/lib/src/models/llm/tools/skill.js +2 -2
  100. package/lib/src/models/llm/tools/skill.js.map +1 -1
  101. package/lib/src/models/llm/tools/write.js +3 -3
  102. package/lib/src/models/llm/tools/write.js.map +1 -1
  103. package/lib/src/models/meta.d.ts +12 -0
  104. package/lib/src/models/meta.d.ts.map +1 -0
  105. package/lib/src/models/meta.js +32 -0
  106. package/lib/src/models/meta.js.map +1 -0
  107. package/lib/src/models/pipeline/model.d.ts +2 -0
  108. package/lib/src/models/pipeline/model.d.ts.map +1 -1
  109. package/lib/src/models/pipeline/model.js +8 -4
  110. package/lib/src/models/pipeline/model.js.map +1 -1
  111. package/lib/src/models/pipeline/parameters.d.ts.map +1 -1
  112. package/lib/src/models/pipeline/parameters.js +5 -1
  113. package/lib/src/models/pipeline/parameters.js.map +1 -1
  114. package/lib/src/models/pipeline/report/index.d.ts.map +1 -1
  115. package/lib/src/models/pipeline/report/index.js +28 -10
  116. package/lib/src/models/pipeline/report/index.js.map +1 -1
  117. package/lib/src/models/pipeline/report/types.d.ts +15 -7
  118. package/lib/src/models/pipeline/report/types.d.ts.map +1 -1
  119. package/lib/src/models/pipeline/session.d.ts +16 -36
  120. package/lib/src/models/pipeline/session.d.ts.map +1 -1
  121. package/lib/src/models/pipeline/session.js +15 -10
  122. package/lib/src/models/pipeline/session.js.map +1 -1
  123. package/lib/src/models/pipeline/stdout/compiled/console.js +16 -13
  124. package/lib/src/models/pipeline/stdout/compiled/console.js.map +1 -1
  125. package/lib/src/models/pipeline/stdout/model.d.ts +1 -1
  126. package/lib/src/models/pipeline/stdout/model.d.ts.map +1 -1
  127. package/lib/src/models/pipeline/stdout/model.js +12 -7
  128. package/lib/src/models/pipeline/stdout/model.js.map +1 -1
  129. package/lib/src/models/pipeline/steps/ai/actions/fallback.d.ts +31 -0
  130. package/lib/src/models/pipeline/steps/ai/actions/fallback.d.ts.map +1 -0
  131. package/lib/src/models/pipeline/steps/ai/actions/fallback.js +51 -0
  132. package/lib/src/models/pipeline/steps/ai/actions/fallback.js.map +1 -0
  133. package/lib/src/models/pipeline/steps/ai/actions/index.d.ts +1 -0
  134. package/lib/src/models/pipeline/steps/ai/actions/index.d.ts.map +1 -1
  135. package/lib/src/models/pipeline/steps/ai/actions/index.js +1 -0
  136. package/lib/src/models/pipeline/steps/ai/actions/index.js.map +1 -1
  137. package/lib/src/models/pipeline/steps/ai/actions/model.d.ts +3 -6
  138. package/lib/src/models/pipeline/steps/ai/actions/model.d.ts.map +1 -1
  139. package/lib/src/models/pipeline/steps/ai/actions/model.js +3 -11
  140. package/lib/src/models/pipeline/steps/ai/actions/model.js.map +1 -1
  141. package/lib/src/models/pipeline/steps/ai/actions/reasoning.d.ts +1 -1
  142. package/lib/src/models/pipeline/steps/ai/actions/reasoning.d.ts.map +1 -1
  143. package/lib/src/models/pipeline/steps/ai/actions/reasoning.js +6 -4
  144. package/lib/src/models/pipeline/steps/ai/actions/reasoning.js.map +1 -1
  145. package/lib/src/models/pipeline/steps/ai/actions/tool.d.ts +1 -1
  146. package/lib/src/models/pipeline/steps/ai/actions/tool.d.ts.map +1 -1
  147. package/lib/src/models/pipeline/steps/ai/actions/tool.js +4 -3
  148. package/lib/src/models/pipeline/steps/ai/actions/tool.js.map +1 -1
  149. package/lib/src/models/pipeline/steps/ai/index.d.ts +5 -1
  150. package/lib/src/models/pipeline/steps/ai/index.d.ts.map +1 -1
  151. package/lib/src/models/pipeline/steps/ai/index.js +134 -97
  152. package/lib/src/models/pipeline/steps/ai/index.js.map +1 -1
  153. package/lib/src/models/pipeline/steps/ai/types.d.ts +5 -1
  154. package/lib/src/models/pipeline/steps/ai/types.d.ts.map +1 -1
  155. package/lib/src/models/pipeline/steps/ai/utils.js +1 -1
  156. package/lib/src/models/pipeline/steps/ai/utils.js.map +1 -1
  157. package/lib/src/models/pipeline/steps/loop.d.ts.map +1 -1
  158. package/lib/src/models/pipeline/steps/loop.js +10 -7
  159. package/lib/src/models/pipeline/steps/loop.js.map +1 -1
  160. package/lib/src/models/pipeline/steps/model.d.ts +2 -0
  161. package/lib/src/models/pipeline/steps/model.d.ts.map +1 -1
  162. package/lib/src/models/pipeline/steps/model.js +2 -0
  163. package/lib/src/models/pipeline/steps/model.js.map +1 -1
  164. package/lib/src/models/pipeline/steps/self.d.ts.map +1 -1
  165. package/lib/src/models/pipeline/steps/self.js +6 -5
  166. package/lib/src/models/pipeline/steps/self.js.map +1 -1
  167. package/lib/src/models/pipeline/steps/swarm.d.ts +13 -6
  168. package/lib/src/models/pipeline/steps/swarm.d.ts.map +1 -1
  169. package/lib/src/models/pipeline/steps/swarm.js +46 -23
  170. package/lib/src/models/pipeline/steps/swarm.js.map +1 -1
  171. package/lib/src/models/pipeline/types.d.ts +1 -0
  172. package/lib/src/models/pipeline/types.d.ts.map +1 -1
  173. package/lib/src/setup.js +30 -3
  174. package/lib/src/setup.js.map +1 -1
  175. package/lib/src/utils/common.d.ts +8 -0
  176. package/lib/src/utils/common.d.ts.map +1 -1
  177. package/lib/src/utils/common.js +14 -1
  178. package/lib/src/utils/common.js.map +1 -1
  179. package/lib/src/utils/index.d.ts +0 -1
  180. package/lib/src/utils/index.d.ts.map +1 -1
  181. package/lib/src/utils/index.js +0 -1
  182. package/lib/src/utils/index.js.map +1 -1
  183. package/package.json +13 -12
  184. package/lib/src/utils/meta.d.ts +0 -9
  185. package/lib/src/utils/meta.d.ts.map +0 -1
  186. package/lib/src/utils/meta.js +0 -15
  187. package/lib/src/utils/meta.js.map +0 -1
@@ -22,13 +22,21 @@
22
22
  PipelAIn Report
23
23
  </h1>
24
24
  <div class="session-info">
25
- <div class="info-item">
26
- <span class="info-label">Session ID:</span>
27
- <span class="info-value text-mono">{{session.id}}</span>
25
+ <div class="info-column">
26
+ <div class="info-item">
27
+ <span class="info-label">Session ID:</span>
28
+ <span class="info-value text-mono">{{session.id}}</span>
29
+ </div>
28
30
  </div>
29
- <div class="info-item">
30
- <span class="info-label">Timestamp:</span>
31
- <span class="info-value">{{formatDate session.timestamp}} {{formatTime session.timestamp}}</span>
31
+ <div class="info-column">
32
+ <div class="info-item">
33
+ <span class="info-label">Timestamp:</span>
34
+ <span class="info-value">{{formatDate session.timestamp}} {{formatTime session.timestamp}}</span>
35
+ </div>
36
+ <div class="info-item">
37
+ <span class="info-label">Spent:</span>
38
+ <span class="info-value">{{formatDuration session.spent}}</span>
39
+ </div>
32
40
  </div>
33
41
  </div>
34
42
  </div>
@@ -37,12 +45,16 @@
37
45
  <div class="metrics-grid">
38
46
  <div class="metric-card">
39
47
  <div class="metric-label">Total Tokens</div>
40
- <div class="metric-value">{{sum usage.llm.total.prompt usage.llm.total.completion}}</div>
48
+ <div class="metric-value">{{sum (sum usage.llm.total.prompt usage.llm.total.cached) usage.llm.total.completion}}</div>
41
49
  </div>
42
50
  <div class="metric-card">
43
51
  <div class="metric-label">Prompt Tokens</div>
44
52
  <div class="metric-value">{{usage.llm.total.prompt}}</div>
45
53
  </div>
54
+ <div class="metric-card">
55
+ <div class="metric-label">Cached Tokens</div>
56
+ <div class="metric-value">{{usage.llm.total.cached}}</div>
57
+ </div>
46
58
  <div class="metric-card">
47
59
  <div class="metric-label">Completion Tokens</div>
48
60
  <div class="metric-value">{{usage.llm.total.completion}}</div>
@@ -52,31 +64,69 @@
52
64
 
53
65
  <!-- Snapshots -->
54
66
  <main class="snapshots-section">
55
- <h2 class="section-title">Steps <span class="text-muted">({{snapshots.length}})</span></h2>
67
+ <h2 class="section-title">Snapshots <span class="text-muted">({{snapshots.length}})</span></h2>
56
68
 
57
69
  <div class="snapshots-list">
58
70
  {{#each snapshots}}
59
- <details class="snapshot-card {{#if error}}state-error{{else}}state-done{{/if}}">
71
+ {{#if (eq type "log")}}
72
+ <!-- Log -->
73
+ <details class="snapshot-card state-log log-{{level}}">
74
+ <summary class="snapshot-summary">
75
+ <div class="summary-left">
76
+ <span class="expand-arrow">▶</span>
77
+ <span class="action-type-badge badge-log-{{level}}">{{level}}</span>
78
+ <span class="log-preview text-mono">{{message}}</span>
79
+ </div>
80
+ </summary>
81
+
82
+ <div class="snapshot-content">
83
+ <pre class="log-message"><code>{{message}}</code></pre>
84
+ </div>
85
+ </details>
86
+ {{else}}
87
+ <details class="snapshot-card {{#if (eq type "step:error")}}state-error{{else}}state-done{{/if}}">
60
88
  <summary class="snapshot-summary">
61
89
  <div class="summary-left">
62
90
  <span class="expand-arrow">▶</span>
91
+ {{#if (eq type "step:error")}}
92
+ <span class="action-type-badge badge-error">ERROR</span>
93
+ {{else}}
94
+ <span class="action-type-badge badge-success">DONE</span>
95
+ {{/if}}
63
96
  <span class="step-title">{{step.title}}</span>
64
97
  </div>
65
98
  <div class="summary-right">
66
99
  <span class="llm-tag text-muted">{{llm.name}}/{{llm.model}}</span>
67
- {{#if error}}
68
- <span class="badge badge-error">ERROR</span>
69
- {{else}}
70
- {{#if usage.totalTokens}}
71
- <span class="usage-tag">{{usage.totalTokens}} tokens</span>
72
- {{/if}}
73
- <span class="badge badge-success">DONE</span>
100
+ {{#if (tokens usage "total")}}
101
+ <span class="usage-tag">{{tokens usage "total"}} tokens</span>
74
102
  {{/if}}
75
- <span class="time-tag text-muted">{{formatTime timestamp}}</span>
103
+ <span class="time-tag text-muted">{{formatDuration meta.spent}}</span>
76
104
  </div>
77
105
  </summary>
78
106
 
79
107
  <div class="snapshot-content">
108
+ {{#if usage}}
109
+ <!-- Step Tokens -->
110
+ <div class="tokens-grid">
111
+ <div class="token-cell">
112
+ <span class="token-label">Total Tokens</span>
113
+ <span class="token-value text-mono">{{tokens usage "total"}}</span>
114
+ </div>
115
+ <div class="token-cell">
116
+ <span class="token-label">Prompt Tokens</span>
117
+ <span class="token-value text-mono">{{tokens usage "prompt"}}</span>
118
+ </div>
119
+ <div class="token-cell">
120
+ <span class="token-label">Cached Tokens</span>
121
+ <span class="token-value text-mono">{{tokens usage "cached"}}</span>
122
+ </div>
123
+ <div class="token-cell">
124
+ <span class="token-label">Completion Tokens</span>
125
+ <span class="token-value text-mono">{{tokens usage "completion"}}</span>
126
+ </div>
127
+ </div>
128
+ {{/if}}
129
+
80
130
  <!-- Step Metrics -->
81
131
  <div class="step-meta">
82
132
  <div class="meta-row">
@@ -84,15 +134,14 @@
84
134
  <span class="meta-value text-mono">{{llm.name}}/{{llm.model}}</span>
85
135
  </div>
86
136
 
87
- {{#if usage}}
88
- <div class="meta-row">
89
- <span class="meta-label">Usage:</span>
90
- <span class="meta-value text-mono">{{usage.inputTokens}} (prompt) + {{usage.outputTokens}} (completion)</span>
91
- </div>
92
- {{/if}}
137
+ <div class="meta-row">
138
+ <span class="meta-label">Started:</span>
139
+ <span class="meta-value text-mono">{{formatTime meta.timestamp}}</span>
140
+ </div>
93
141
  </div>
94
142
 
95
- {{#if error}}
143
+
144
+ {{#if (eq type "step:error")}}
96
145
  <div class="error-box">
97
146
  <div class="error-header">
98
147
  <svg class="error-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -167,85 +216,157 @@
167
216
  {{#if (eq type "ai:tool")}}
168
217
  <span class="action-type-badge badge-tool">TOOL</span>
169
218
  <span class="action-name text-mono">{{name}}</span>
219
+ {{#if (previewInput input)}}
220
+ <span class="action-preview text-mono">{{previewInput input}}</span>
221
+ {{/if}}
222
+ {{else if (eq type "ai:fallback")}}
223
+ <span class="action-type-badge badge-fallback">FALLBACK</span>
224
+ <span class="action-name text-mono">{{llm.old.model}}</span>
170
225
  {{else}}
171
226
  <span class="action-type-badge badge-reasoning">REASONING</span>
172
227
  {{/if}}
173
228
  </div>
174
229
  <div class="summary-right">
175
- <span class="llm-tag text-muted">{{llm.name}}/{{llm.model}}</span>
176
- <span class="badge badge-{{meta.state}}">{{meta.state}}</span>
177
- <span class="time-tag">{{formatDuration meta.spent}}</span>
230
+ {{#if (eq type "ai:fallback")}}
231
+ <span class="badge badge-error">{{error.type}}</span>
232
+ <span class="time-tag">{{formatDuration meta.spent}}</span>
233
+ {{else}}
234
+ <span class="llm-tag text-muted">{{llm.name}}/{{llm.model}}</span>
235
+ <span class="badge badge-{{meta.state}}">{{meta.state}}</span>
236
+ <span class="time-tag">{{formatDuration meta.spent}}</span>
237
+ {{/if}}
178
238
  </div>
179
239
  </summary>
180
240
 
181
241
  <div class="action-content">
182
- <!-- Action LLM & Details -->
183
- <div class="io-title">Info</div>
184
- <div class="action-meta-grid">
185
- <div class="meta-row">
186
- <span class="meta-label">Model:</span>
187
- <span class="meta-value text-mono">{{llm.name}}/{{llm.model}}</span>
188
- </div>
189
- {{#if id}}
242
+ {{#if (eq type "ai:fallback")}}
243
+ <!-- Fallback LLM Info -->
244
+ <div class="io-title">Transition</div>
245
+ <div class="action-meta-grid">
190
246
  <div class="meta-row">
191
- <span class="meta-label">Action ID:</span>
192
- <span class="meta-value text-mono">{{id}}</span>
247
+ <span class="meta-label">From:</span>
248
+ <span class="meta-value text-mono">{{llm.old.name}}/{{llm.old.model}}</span>
193
249
  </div>
194
- {{/if}}
195
- </div>
250
+ <div class="meta-row">
251
+ <span class="meta-label">To:</span>
252
+ <span class="meta-value text-mono">{{llm.new.name}}/{{llm.new.model}}</span>
253
+ </div>
254
+ </div>
196
255
 
197
- <!-- Tool Input/Output -->
198
- {{#if (eq type "ai:tool")}}
199
- <div class="action-io">
200
- <div class="io-block">
201
- <div class="io-title">Input ({{input.type}})</div>
202
- <pre><code class="{{#if (eq input.type "json")}}language-json{{/if}}">{{#if (eq input.type "json")}}{{json input.value}}{{else}}{{input.value}}{{/if}}</code></pre>
256
+ <!-- Fallback Reason -->
257
+ <div class="io-title">Reason</div>
258
+ <div class="error-box error-box-fallback">
259
+ <div class="error-header">
260
+ <svg class="error-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
261
+ <circle cx="12" cy="12" r="10" />
262
+ <line x1="12" y1="8" x2="12" y2="12" />
263
+ <line x1="12" y1="16" x2="12.01" y2="16" />
264
+ </svg>
265
+ <span class="error-type">{{error.type}}</span>
203
266
  </div>
267
+ <div class="error-message">{{error.reason}}</div>
268
+ </div>
204
269
 
205
- {{#if output}}
206
- <div class="io-block {{#if (eq output.type "error")}}io-error{{/if}}">
207
- <div class="io-title">Output ({{output.type}})</div>
208
- {{#if (eq output.type "error")}}
209
- <div class="error-output">
210
- <pre><code>{{#if (eq output.value.type "json")}}{{json output.value.payload}}{{else}}{{output.value.payload}}{{/if}}</code></pre>
211
- </div>
212
- {{else}}
213
- <pre><code class="{{#if (eq output.type "json")}}language-json{{/if}}">{{#if (eq output.type "json")}}{{json output.value}}{{else}}{{output.value}}{{/if}}</code></pre>
214
- {{/if}}
270
+ <div class="io-title">Previous Provider</div>
271
+ <div class="action-meta-grid">
272
+ {{#if llm.old.parameters}}
273
+ <div class="span-all">
274
+ <span class="meta-label">Parameters:</span>
275
+ <pre><code class="language-json">{{json llm.old.parameters}}</code></pre>
276
+ </div>
277
+ {{/if}}
278
+ {{#if llm.old.options}}
279
+ <div class="span-all">
280
+ <span class="meta-label">Options:</span>
281
+ <pre><code class="language-json">{{json llm.old.options}}</code></pre>
282
+ </div>
283
+ {{/if}}
284
+ </div>
285
+
286
+ <div class="io-title">fallback Provider</div>
287
+ <div class="action-meta-grid">
288
+ {{#if llm.new.parameters}}
289
+ <div class="span-all">
290
+ <span class="meta-label">Parameters:</span>
291
+ <pre><code class="language-json">{{json llm.new.parameters}}</code></pre>
292
+ </div>
293
+ {{/if}}
294
+ {{#if llm.new.options}}
295
+ <div class="span-all">
296
+ <span class="meta-label">Options:</span>
297
+ <pre><code class="language-json">{{json llm.new.options}}</code></pre>
215
298
  </div>
216
299
  {{/if}}
217
300
  </div>
218
301
  {{else}}
219
- <!-- Reasoning Output -->
220
- <div class="action-io">
221
- <div class="io-block">
222
- <div class="io-title">Reasoning Output</div>
223
- <pre class="reasoning-output"><code>{{output}}</code></pre>
302
+ <!-- Action LLM & Details -->
303
+ <div class="io-title">Info</div>
304
+ <div class="action-meta-grid">
305
+ <div class="meta-row">
306
+ <span class="meta-label">Model:</span>
307
+ <span class="meta-value text-mono">{{llm.name}}/{{llm.model}}</span>
224
308
  </div>
309
+ {{#if id}}
310
+ <div class="meta-row">
311
+ <span class="meta-label">Action ID:</span>
312
+ <span class="meta-value text-mono">{{id}}</span>
313
+ </div>
314
+ {{/if}}
225
315
  </div>
226
- {{/if}}
227
316
 
228
- <div class="io-title">Provider</div>
229
- <div class="action-meta-grid">
230
- {{#if llm.parameters}}
231
- <div class="span-all">
232
- <span class="meta-label">Parameters:</span>
233
- <pre><code class="language-json">{{json llm.parameters}}</code></pre>
234
- </div>
235
- {{/if}}
236
- {{#if llm.options}}
237
- <div class="span-all">
238
- <span class="meta-label">Options:</span>
239
- <pre><code class="language-json">{{json llm.options}}</code></pre>
317
+ <!-- Tool Input/Output -->
318
+ {{#if (eq type "ai:tool")}}
319
+ <div class="action-io">
320
+ <div class="io-block">
321
+ <div class="io-title">Input ({{input.type}})</div>
322
+ <pre><code class="{{#if (eq input.type "json")}}language-json{{/if}}">{{#if (eq input.type "json")}}{{json input.value}}{{else}}{{input.value}}{{/if}}</code></pre>
323
+ </div>
324
+
325
+ {{#if output}}
326
+ <div class="io-block {{#if (eq output.type "error")}}io-error{{/if}}">
327
+ <div class="io-title">Output ({{output.type}})</div>
328
+ {{#if (eq output.type "error")}}
329
+ <div class="error-output">
330
+ <pre><code>{{#if (eq output.value.type "json")}}{{json output.value.payload}}{{else}}{{output.value.payload}}{{/if}}</code></pre>
331
+ </div>
332
+ {{else}}
333
+ <pre><code class="{{#if (eq output.type "json")}}language-json{{/if}}">{{#if (eq output.type "json")}}{{json output.value}}{{else}}{{output.value}}{{/if}}</code></pre>
334
+ {{/if}}
335
+ </div>
336
+ {{/if}}
240
337
  </div>
241
- {{/if}}
242
- {{#if trace}}
243
- <div class="span-all">
244
- <span class="meta-label">Trace Metadata:</span>
245
- <pre><code class="language-json">{{json trace}}</code></pre>
338
+ {{else}}
339
+ <!-- Reasoning Output -->
340
+ <div class="action-io">
341
+ <div class="io-block">
342
+ <div class="io-title">Reasoning Output</div>
343
+ <pre class="reasoning-output"><code>{{output}}</code></pre>
344
+ </div>
246
345
  </div>
247
346
  {{/if}}
248
- </div>
347
+
348
+ <div class="io-title">Provider</div>
349
+ <div class="action-meta-grid">
350
+ {{#if llm.parameters}}
351
+ <div class="span-all">
352
+ <span class="meta-label">Parameters:</span>
353
+ <pre><code class="language-json">{{json llm.parameters}}</code></pre>
354
+ </div>
355
+ {{/if}}
356
+ {{#if llm.options}}
357
+ <div class="span-all">
358
+ <span class="meta-label">Options:</span>
359
+ <pre><code class="language-json">{{json llm.options}}</code></pre>
360
+ </div>
361
+ {{/if}}
362
+ {{#if trace}}
363
+ <div class="span-all">
364
+ <span class="meta-label">Trace Metadata:</span>
365
+ <pre><code class="language-json">{{json trace}}</code></pre>
366
+ </div>
367
+ {{/if}}
368
+ </div>
369
+ {{/if}}
249
370
  </div>
250
371
  </details>
251
372
  {{/each}}
@@ -253,6 +374,7 @@
253
374
  </div>
254
375
  </div>
255
376
  </details>
377
+ {{/if}}
256
378
  {{/each}}
257
379
  </div>
258
380
  </main>
@@ -72,14 +72,25 @@ body {
72
72
 
73
73
  .session-info {
74
74
  display: flex;
75
- flex-direction: column;
76
- gap: 10px;
75
+ flex-wrap: wrap;
76
+ gap: 10px 20px;
77
77
  background: var(--card-bg);
78
78
  padding: 10px 20px;
79
79
  border-radius: 8px;
80
80
  border: 1px solid var(--border);
81
81
  }
82
82
 
83
+ .info-column {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: 10px;
87
+ }
88
+
89
+ .info-column + .info-column {
90
+ padding-left: 20px;
91
+ border-left: 1px solid var(--border);
92
+ }
93
+
83
94
  .info-item {
84
95
  display: flex;
85
96
  gap: 10px;
@@ -200,6 +211,46 @@ details[open] > summary .expand-arrow {
200
211
  border-left: 4px solid var(--color-error);
201
212
  }
202
213
 
214
+ .snapshot-card.state-log {
215
+ border-left: 4px solid var(--color-info);
216
+ }
217
+
218
+ .snapshot-card.state-log.log-WARN {
219
+ border-left-color: var(--color-warning);
220
+ }
221
+
222
+ .snapshot-card.state-log.log-DEBUG {
223
+ border-left-color: var(--border);
224
+ }
225
+
226
+ .snapshot-card.state-log .summary-left {
227
+ min-width: 0;
228
+ flex: 1;
229
+ }
230
+
231
+ .log-preview {
232
+ font-size: 12px;
233
+ color: var(--text-muted);
234
+ white-space: nowrap;
235
+ overflow: hidden;
236
+ text-overflow: ellipsis;
237
+ min-width: 0;
238
+ }
239
+
240
+ .log-message {
241
+ margin: 0;
242
+ white-space: pre-wrap;
243
+ word-break: break-word;
244
+ }
245
+
246
+ .snapshot-summary {
247
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
248
+ }
249
+
250
+ .snapshot-summary .summary-right {
251
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
252
+ }
253
+
203
254
  .snapshot-summary .step-title {
204
255
  font-size: 14px;
205
256
  font-weight: 600;
@@ -274,6 +325,26 @@ details[open] > summary .expand-arrow {
274
325
  color: var(--color-reasoning);
275
326
  }
276
327
 
328
+ .badge-log-INFO {
329
+ background: var(--color-info-bg);
330
+ color: var(--color-info);
331
+ }
332
+
333
+ .badge-log-WARN {
334
+ background: var(--color-warning-bg);
335
+ color: var(--color-warning);
336
+ }
337
+
338
+ .badge-log-DEBUG {
339
+ background: var(--border);
340
+ color: var(--text-muted);
341
+ }
342
+
343
+ .badge-fallback {
344
+ background: var(--color-warning-bg);
345
+ color: var(--color-warning);
346
+ }
347
+
277
348
  /* Tags */
278
349
  .llm-tag, .usage-tag, .time-tag, .duration-tag {
279
350
  font-size: 12px;
@@ -311,7 +382,37 @@ details[open] > summary .expand-arrow {
311
382
  padding: 10px 20px;
312
383
  border-radius: 6px;
313
384
  border: 1px solid rgba(255, 255, 255, 0.03);
314
- margin-bottom: 20px;
385
+ }
386
+
387
+ .tokens-grid {
388
+ display: grid;
389
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
390
+ gap: 10px;
391
+ }
392
+
393
+ .token-cell {
394
+ display: flex;
395
+ flex-direction: column;
396
+ align-items: center;
397
+ text-align: center;
398
+ gap: 4px;
399
+ padding: 8px 12px;
400
+ border-radius: 6px;
401
+ border: 1px solid rgba(255, 255, 255, 0.03);
402
+ background: rgba(255, 255, 255, 0.02);
403
+ }
404
+
405
+ .token-label {
406
+ color: var(--text-muted);
407
+ font-size: 11px;
408
+ text-transform: uppercase;
409
+ letter-spacing: 0.05em;
410
+ }
411
+
412
+ .token-value {
413
+ color: var(--color-info);
414
+ font-size: 16px;
415
+ font-weight: 700;
315
416
  }
316
417
 
317
418
  .text-muted {
@@ -350,6 +451,10 @@ details[open] > summary .expand-arrow {
350
451
  border-left: 3px solid var(--color-reasoning);
351
452
  }
352
453
 
454
+ .action-card.action-type-ai\:fallback {
455
+ border-left: 3px solid var(--color-warning);
456
+ }
457
+
353
458
  .action-summary {
354
459
  padding: 10px 20px;
355
460
  font-size: 14px;
@@ -368,6 +473,29 @@ details[open] > summary .expand-arrow {
368
473
  flex-shrink: 0;
369
474
  }
370
475
 
476
+ .action-card.action-type-ai\:tool > summary {
477
+ flex-wrap: nowrap;
478
+ gap: 10px;
479
+ }
480
+
481
+ .action-card.action-type-ai\:tool .summary-left {
482
+ min-width: 0;
483
+ flex: 1;
484
+ }
485
+
486
+ .action-card.action-type-ai\:tool .summary-right {
487
+ flex-shrink: 0;
488
+ }
489
+
490
+ .action-preview {
491
+ font-size: 11px;
492
+ color: var(--text-muted);
493
+ white-space: nowrap;
494
+ overflow: hidden;
495
+ text-overflow: ellipsis;
496
+ min-width: 0;
497
+ }
498
+
371
499
  .action-content {
372
500
  padding: 10px 20px;
373
501
  border-top: 1px solid var(--border);
@@ -470,6 +598,10 @@ code {
470
598
  gap: 10px;
471
599
  }
472
600
 
601
+ .error-box-fallback {
602
+ margin-bottom: 20px;
603
+ }
604
+
473
605
  .error-header {
474
606
  display: flex;
475
607
  align-items: center;
package/cli/index.ts ADDED
@@ -0,0 +1,77 @@
1
+ import { Command, program } from 'commander';
2
+ import fs from 'fs/promises';
3
+
4
+ import { PipelineCompiler, Project, stdout, TLlmProviderReasoning } from '../src';
5
+ import { cast } from '../src/utils';
6
+
7
+ program
8
+ .description('PipelAIn')
9
+ .addCommand(
10
+ new Command()
11
+ .command('exec')
12
+ .description('Executes prompt/pipeline by provided params')
13
+ .option('-p --prompt <text>', 'User prompt text')
14
+ .option('-s --silent [boolean]', 'Hides logs of pipeline execution', false)
15
+ .option('-o --output [path]', 'Output file path')
16
+ .option('-l --limit [number]', 'Tool calls limit')
17
+ .option('-r --reasoning [level]', 'Reasoning level', cast<TLlmProviderReasoning>('provider-default'))
18
+ .option('--system [text]', 'System prompt text')
19
+ .option('--cwd [path]', 'Working directory', process.cwd())
20
+ .action(async (options: {
21
+ reasoning: TLlmProviderReasoning;
22
+ silent: boolean;
23
+ prompt: string;
24
+ cwd: string;
25
+
26
+ system?: string;
27
+ output?: string;
28
+ limit?: string;
29
+ }) => {
30
+ const pipeline = PipelineCompiler
31
+ .build('Executor')
32
+ .step('output', ({ factory }) => factory
33
+ .ai('Execution')
34
+ .llm(({ context }) =>
35
+ context.llm.assign({
36
+ reasoning: options.reasoning,
37
+ tools: factory.tools.all().provide(),
38
+
39
+ ...(options.limit && { limit: Number(options.limit) }),
40
+ })
41
+ )
42
+ .prompt(({ utils }) => [
43
+ utils.content.system(options.system ?? ''),
44
+ utils.content.user(options.prompt),
45
+ ])
46
+ );
47
+
48
+ const project = await Project.build({ cwd: options.cwd });
49
+ const compiled = await pipeline.compile({
50
+ project,
51
+ stdout: options.silent ? undefined : stdout.console,
52
+ });
53
+
54
+ const result = await compiled.run();
55
+
56
+ if (options.output) {
57
+ await fs.writeFile(options.output, result.output, 'utf8');
58
+ }
59
+ if (!options.silent) {
60
+ console.log('\n');
61
+ }
62
+
63
+ process.stdout.write(result.output);
64
+ process.exit(0);
65
+ })
66
+ )
67
+ .addCommand(
68
+ new Command()
69
+ .command('serve')
70
+ .description('Starts server')
71
+ .option('-h --host [host]', 'Host address', 'localhost')
72
+ .option('-p --port [port]', 'Port', '8080')
73
+ .action(async (input, command) => {
74
+
75
+ })
76
+ )
77
+ .parse();
@@ -12,12 +12,14 @@ export * from './models/pipeline/steps/ai/errors';
12
12
  export * from './models/project';
13
13
  export * from './models/file';
14
14
  export * from './models/bash';
15
+ export * from './models/meta';
15
16
  export * from './models/content/factory';
16
17
  export * from './models/content/types';
17
18
  export * from './models/llm/providers/model';
18
19
  export * from './models/llm/tools/model';
19
20
  export * from './models/llm/factory';
20
21
  export * from './models/llm/router';
22
+ export * from './models/llm/hook';
21
23
  export * from './models/llm/mcp';
22
24
  export * as content from './models/content/kinds';
23
25
  export * as stdout from './models/pipeline/stdout/compiled';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AAEjB,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAE5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAElD,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAE9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,mCAAmC,CAAC;AAE5D,eAAO,MAAM,GAAG;;;CAGf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AAEjB,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAE5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAElD,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAE9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAEjC,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,mCAAmC,CAAC;AAE5D,eAAO,MAAM,GAAG;;;CAGf,CAAC"}