@entelligentsia/forgecli 0.6.6 → 0.7.7

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/CHANGELOG.md +112 -0
  2. package/README.md +99 -190
  3. package/dist/bin/forge.js +20 -0
  4. package/dist/bin/forge.js.map +1 -1
  5. package/dist/extensions/forgecli/approve.d.ts +24 -0
  6. package/dist/extensions/forgecli/approve.js +202 -0
  7. package/dist/extensions/forgecli/approve.js.map +1 -0
  8. package/dist/extensions/forgecli/audience-gate.d.ts +4 -0
  9. package/dist/extensions/forgecli/audience-gate.js +8 -5
  10. package/dist/extensions/forgecli/audience-gate.js.map +1 -1
  11. package/dist/extensions/forgecli/collate.d.ts +24 -0
  12. package/dist/extensions/forgecli/collate.js +199 -0
  13. package/dist/extensions/forgecli/collate.js.map +1 -0
  14. package/dist/extensions/forgecli/commit.d.ts +24 -0
  15. package/dist/extensions/forgecli/commit.js +202 -0
  16. package/dist/extensions/forgecli/commit.js.map +1 -0
  17. package/dist/extensions/forgecli/fix-bug.d.ts +75 -0
  18. package/dist/extensions/forgecli/fix-bug.js +1133 -0
  19. package/dist/extensions/forgecli/fix-bug.js.map +1 -0
  20. package/dist/extensions/forgecli/forge-commands.js +7 -0
  21. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-header.js +10 -4
  23. package/dist/extensions/forgecli/forge-header.js.map +1 -1
  24. package/dist/extensions/forgecli/forge-init.js +16 -8
  25. package/dist/extensions/forgecli/forge-init.js.map +1 -1
  26. package/dist/extensions/forgecli/forge-subagent.d.ts +29 -0
  27. package/dist/extensions/forgecli/forge-subagent.js +14 -1
  28. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.d.ts +53 -1
  30. package/dist/extensions/forgecli/hook-dispatcher.js +47 -1
  31. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  32. package/dist/extensions/forgecli/hooks/post-init-hook.d.ts +15 -0
  33. package/dist/extensions/forgecli/hooks/post-init-hook.js +127 -0
  34. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -0
  35. package/dist/extensions/forgecli/hooks/post-sprint-hook.d.ts +37 -0
  36. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +166 -0
  37. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -0
  38. package/dist/extensions/forgecli/index.js +56 -5
  39. package/dist/extensions/forgecli/index.js.map +1 -1
  40. package/dist/extensions/forgecli/review-code.d.ts +24 -0
  41. package/dist/extensions/forgecli/review-code.js +202 -0
  42. package/dist/extensions/forgecli/review-code.js.map +1 -0
  43. package/dist/extensions/forgecli/review-plan.d.ts +24 -0
  44. package/dist/extensions/forgecli/review-plan.js +203 -0
  45. package/dist/extensions/forgecli/review-plan.js.map +1 -0
  46. package/dist/extensions/forgecli/run-sprint.d.ts +18 -0
  47. package/dist/extensions/forgecli/run-sprint.js +33 -1
  48. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  49. package/dist/extensions/forgecli/run-task.d.ts +21 -2
  50. package/dist/extensions/forgecli/run-task.js +33 -9
  51. package/dist/extensions/forgecli/run-task.js.map +1 -1
  52. package/dist/extensions/forgecli/session-registry.d.ts +10 -0
  53. package/dist/extensions/forgecli/session-registry.js +9 -0
  54. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  55. package/dist/extensions/forgecli/validate.d.ts +24 -0
  56. package/dist/extensions/forgecli/validate.js +202 -0
  57. package/dist/extensions/forgecli/validate.js.map +1 -0
  58. package/dist/extensions/forgecli/wf-engine/engine.d.ts +23 -0
  59. package/dist/extensions/forgecli/wf-engine/engine.js +384 -0
  60. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -0
  61. package/dist/extensions/forgecli/wf-engine/event-parser.d.ts +6 -0
  62. package/dist/extensions/forgecli/wf-engine/event-parser.js +29 -0
  63. package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -0
  64. package/dist/extensions/forgecli/wf-engine/id-gen.d.ts +6 -0
  65. package/dist/extensions/forgecli/wf-engine/id-gen.js +17 -0
  66. package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -0
  67. package/dist/extensions/forgecli/wf-engine/loader.d.ts +2 -0
  68. package/dist/extensions/forgecli/wf-engine/loader.js +100 -0
  69. package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -0
  70. package/dist/extensions/forgecli/wf-engine/predicate.d.ts +7 -0
  71. package/dist/extensions/forgecli/wf-engine/predicate.js +36 -0
  72. package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -0
  73. package/dist/extensions/forgecli/wf-engine/prompt-compiler.d.ts +15 -0
  74. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js +23 -0
  75. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -0
  76. package/dist/extensions/forgecli/wf-engine/register.d.ts +9 -0
  77. package/dist/extensions/forgecli/wf-engine/register.js +59 -0
  78. package/dist/extensions/forgecli/wf-engine/register.js.map +1 -0
  79. package/dist/extensions/forgecli/wf-engine/remit-check.d.ts +6 -0
  80. package/dist/extensions/forgecli/wf-engine/remit-check.js +42 -0
  81. package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -0
  82. package/dist/extensions/forgecli/wf-engine/state-store.d.ts +13 -0
  83. package/dist/extensions/forgecli/wf-engine/state-store.js +43 -0
  84. package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -0
  85. package/dist/extensions/forgecli/wf-engine/types.d.ts +66 -0
  86. package/dist/extensions/forgecli/wf-engine/types.js +2 -0
  87. package/dist/extensions/forgecli/wf-engine/types.js.map +1 -0
  88. package/dist/extensions/forgecli/wf-engine/worker.d.ts +11 -0
  89. package/dist/extensions/forgecli/wf-engine/worker.js +50 -0
  90. package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -0
  91. package/dist/forge-payload/.base-pack/workflows/_fragments/context-injection.md +10 -4
  92. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +12 -0
  93. package/dist/forge-payload/.schemas/bug.schema.json +4 -2
  94. package/dist/forge-payload/.schemas/event.schema.json +22 -3
  95. package/dist/forge-payload/commands/add-pipeline.md +342 -0
  96. package/dist/forge-payload/commands/add-task.md +269 -0
  97. package/dist/forge-payload/commands/ask.md +43 -0
  98. package/dist/forge-payload/commands/calibrate.md +356 -0
  99. package/dist/forge-payload/commands/config.md +202 -0
  100. package/dist/forge-payload/commands/enhance.md +38 -0
  101. package/dist/forge-payload/commands/health.md +225 -0
  102. package/dist/forge-payload/commands/init.md +165 -0
  103. package/dist/forge-payload/commands/materialize.md +119 -0
  104. package/dist/forge-payload/commands/migrate.md +160 -0
  105. package/dist/forge-payload/commands/quiz-agent.md +38 -0
  106. package/dist/forge-payload/commands/regenerate.md +673 -0
  107. package/dist/forge-payload/commands/remove.md +174 -0
  108. package/dist/forge-payload/commands/report-bug.md +191 -0
  109. package/dist/forge-payload/commands/store-query.md +73 -0
  110. package/dist/forge-payload/commands/store-repair.md +187 -0
  111. package/dist/forge-payload/commands/update-tools.md +56 -0
  112. package/dist/forge-payload/commands/update.md +1376 -0
  113. package/dist/forge-payload/tools/preflight-gate.cjs +2 -1
  114. package/dist/forge-payload/tools/read-verdict.cjs +41 -8
  115. package/dist/forge-payload/tools/store-cli.cjs +4 -3
  116. package/node_modules/argparse/CHANGELOG.md +216 -0
  117. package/node_modules/argparse/LICENSE +254 -0
  118. package/node_modules/argparse/README.md +84 -0
  119. package/node_modules/argparse/argparse.js +3707 -0
  120. package/node_modules/argparse/lib/sub.js +67 -0
  121. package/node_modules/argparse/lib/textwrap.js +440 -0
  122. package/node_modules/argparse/package.json +31 -0
  123. package/node_modules/cliui/CHANGELOG.md +121 -0
  124. package/node_modules/color-convert/CHANGELOG.md +54 -0
  125. package/node_modules/esprima/ChangeLog +235 -0
  126. package/node_modules/js-yaml/LICENSE +21 -0
  127. package/node_modules/js-yaml/README.md +247 -0
  128. package/node_modules/js-yaml/bin/js-yaml.js +126 -0
  129. package/node_modules/js-yaml/dist/js-yaml.js +3880 -0
  130. package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
  131. package/node_modules/js-yaml/dist/js-yaml.mjs +3856 -0
  132. package/node_modules/js-yaml/index.js +47 -0
  133. package/node_modules/js-yaml/lib/common.js +59 -0
  134. package/node_modules/js-yaml/lib/dumper.js +965 -0
  135. package/node_modules/js-yaml/lib/exception.js +55 -0
  136. package/node_modules/js-yaml/lib/loader.js +1733 -0
  137. package/node_modules/js-yaml/lib/schema/core.js +11 -0
  138. package/node_modules/js-yaml/lib/schema/default.js +22 -0
  139. package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
  140. package/node_modules/js-yaml/lib/schema/json.js +19 -0
  141. package/node_modules/js-yaml/lib/schema.js +121 -0
  142. package/node_modules/js-yaml/lib/snippet.js +101 -0
  143. package/node_modules/js-yaml/lib/type/binary.js +125 -0
  144. package/node_modules/js-yaml/lib/type/bool.js +35 -0
  145. package/node_modules/js-yaml/lib/type/float.js +97 -0
  146. package/node_modules/js-yaml/lib/type/int.js +156 -0
  147. package/node_modules/js-yaml/lib/type/map.js +8 -0
  148. package/node_modules/js-yaml/lib/type/merge.js +12 -0
  149. package/node_modules/js-yaml/lib/type/null.js +35 -0
  150. package/node_modules/js-yaml/lib/type/omap.js +44 -0
  151. package/node_modules/js-yaml/lib/type/pairs.js +53 -0
  152. package/node_modules/js-yaml/lib/type/seq.js +8 -0
  153. package/node_modules/js-yaml/lib/type/set.js +29 -0
  154. package/node_modules/js-yaml/lib/type/str.js +8 -0
  155. package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
  156. package/node_modules/js-yaml/lib/type.js +66 -0
  157. package/node_modules/js-yaml/package.json +66 -0
  158. package/node_modules/mz/HISTORY.md +66 -0
  159. package/node_modules/proper-lockfile/CHANGELOG.md +108 -0
  160. package/node_modules/source-map/CHANGELOG.md +301 -0
  161. package/node_modules/thenify/History.md +11 -0
  162. package/node_modules/thenify-all/History.md +11 -0
  163. package/node_modules/y18n/CHANGELOG.md +100 -0
  164. package/node_modules/yargs/CHANGELOG.md +88 -0
  165. package/node_modules/yargs-parser/CHANGELOG.md +263 -0
  166. package/package.json +6 -2
  167. package/themes/forge-matrix.json +89 -0
  168. package/themes/forge-mono.json +86 -0
  169. package/workflows/lead-qualifier/prompts/digest.md +44 -0
  170. package/workflows/lead-qualifier/prompts/draft-outreach.md +44 -0
  171. package/workflows/lead-qualifier/prompts/enrich.md +52 -0
  172. package/workflows/lead-qualifier/prompts/intake.md +48 -0
  173. package/workflows/lead-qualifier/prompts/mark-cold.md +38 -0
  174. package/workflows/lead-qualifier/prompts/score.md +45 -0
  175. package/workflows/lead-qualifier/workflow.yaml +95 -0
  176. package/workflows/research-brief/prompts/brief-synthesize.md +43 -0
  177. package/workflows/research-brief/prompts/intake.md +51 -0
  178. package/workflows/research-brief/prompts/source-critique.md +38 -0
  179. package/workflows/research-brief/prompts/source-score.md +38 -0
  180. package/workflows/research-brief/prompts/source-summarize.md +54 -0
  181. package/workflows/research-brief/workflow.yaml +66 -0
  182. package/dist/extensions/forgecli/session-monitor-widget.d.ts +0 -37
  183. package/dist/extensions/forgecli/session-monitor-widget.js +0 -320
  184. package/dist/extensions/forgecli/session-monitor-widget.js.map +0 -1
  185. package/dist/extensions/forgecli/session-monitor.d.ts +0 -2
  186. package/dist/extensions/forgecli/session-monitor.js +0 -135
  187. package/dist/extensions/forgecli/session-monitor.js.map +0 -1
@@ -1,320 +0,0 @@
1
- // session-monitor-widget.ts — embedded TUI for live subagent sessions.
2
- //
3
- // Renders below the input swimline via ctx.ui.setWidget(..., { placement: "belowEditor" }).
4
- // Two-pane layout: sessions list (left) and events list (right), with a details
5
- // footer for the highlighted event. Arrow keys navigate within the focused pane;
6
- // Tab / →/← switch focus between panes; Esc closes.
7
- //
8
- // Subscribes to the shared SessionRegistry — every run-task subagent event causes
9
- // a re-render request.
10
- import { SelectList } from "@entelligentsia/pi-tui";
11
- import { getSessionRegistry, } from "./session-registry.js";
12
- const MAX_VISIBLE_ROWS = 10;
13
- const DETAIL_LINES = 8;
14
- /**
15
- * Build the widget factory expected by ctx.ui.setWidget.
16
- * The factory captures dependencies (theme, render hook, close hook) and
17
- * returns a fresh Component on each setWidget() call.
18
- */
19
- export function buildSessionMonitorWidget(deps) {
20
- return (_tui, theme) => {
21
- const w = new SessionMonitorWidget({
22
- theme,
23
- requestRender: deps.requestRender,
24
- onClose: deps.onClose,
25
- });
26
- deps.onMount?.(w);
27
- return w;
28
- };
29
- }
30
- export class SessionMonitorWidget {
31
- registry;
32
- listener;
33
- focusedPane = "sessions";
34
- selectedTaskId;
35
- selectedEventIndex = 0;
36
- sessionsList;
37
- eventsList;
38
- deps;
39
- disposed = false;
40
- constructor(deps) {
41
- this.deps = deps;
42
- this.registry = getSessionRegistry();
43
- const selectTheme = buildSelectListTheme(deps.theme);
44
- this.sessionsList = new SelectList([], MAX_VISIBLE_ROWS, selectTheme);
45
- this.eventsList = new SelectList([], MAX_VISIBLE_ROWS, selectTheme);
46
- this.sessionsList.onSelectionChange = (item) => {
47
- this.selectedTaskId = item.value;
48
- this.selectedEventIndex = 0;
49
- this.rebuildEvents();
50
- this.deps.requestRender();
51
- };
52
- this.eventsList.onSelectionChange = (item) => {
53
- const idx = Number.parseInt(item.value, 10);
54
- if (!Number.isNaN(idx)) {
55
- this.selectedEventIndex = idx;
56
- this.deps.requestRender();
57
- }
58
- };
59
- this.refreshSessions();
60
- this.listener = (_taskId) => {
61
- if (this.disposed)
62
- return;
63
- this.refreshSessions();
64
- if (this.focusedPane === "events" || this.selectedTaskId)
65
- this.rebuildEvents();
66
- this.deps.requestRender();
67
- };
68
- this.registry.on("change", this.listener);
69
- }
70
- dispose() {
71
- this.disposed = true;
72
- this.registry.off("change", this.listener);
73
- }
74
- invalidate() {
75
- this.sessionsList.invalidate();
76
- this.eventsList.invalidate();
77
- }
78
- handleInput(data) {
79
- // Tab or → → focus events pane; ← → focus sessions pane.
80
- // Esc closes the widget.
81
- // Anything else is delegated to the focused pane.
82
- if (data === "") {
83
- this.deps.onClose();
84
- return;
85
- }
86
- if (data === "\t" || data === "" /* right arrow */) {
87
- if (this.focusedPane === "sessions") {
88
- this.focusedPane = "events";
89
- this.deps.requestRender();
90
- return;
91
- }
92
- }
93
- if (data === "" /* left arrow */) {
94
- if (this.focusedPane === "events") {
95
- this.focusedPane = "sessions";
96
- this.deps.requestRender();
97
- return;
98
- }
99
- }
100
- if (this.focusedPane === "sessions")
101
- this.sessionsList.handleInput(data);
102
- else
103
- this.eventsList.handleInput(data);
104
- }
105
- render(width) {
106
- const theme = this.deps.theme;
107
- const sessions = this.registry.listSessions();
108
- // Layout: left pane = 40 cols (or 40% if narrow), right pane = remainder.
109
- const leftWidth = Math.max(28, Math.min(44, Math.floor(width * 0.4)));
110
- const rightWidth = Math.max(20, width - leftWidth - 3); // 3 cols for gutter "│ "
111
- const header = theme.bold(theme.fg("accent", "Forge Sessions ") +
112
- theme.fg("muted", `(${sessions.length}) `) +
113
- theme.fg("muted", "[↑↓ nav Tab/→ pane Esc close]"));
114
- const sessionLines = sessions.length === 0
115
- ? [theme.fg("muted", " (no live subagent sessions yet)")]
116
- : this.sessionsList.render(leftWidth);
117
- const focusedSession = this.selectedTaskId
118
- ? this.registry.getSession(this.selectedTaskId)
119
- : undefined;
120
- const rightHeaderText = focusedSession
121
- ? `Events: ${focusedSession.taskId} (${focusedSession.events.length})`
122
- : "Events";
123
- const rightHeader = theme.bold(theme.fg("accent", rightHeaderText));
124
- const eventLines = focusedSession
125
- ? this.eventsList.render(rightWidth)
126
- : [theme.fg("muted", " (select a session on the left)")];
127
- const sessionsPaneTitle = this.focusedPane === "sessions" ? theme.inverse(" sessions ") : theme.fg("muted", " sessions ");
128
- const eventsPaneTitle = this.focusedPane === "events" ? theme.inverse(" events ") : theme.fg("muted", " events ");
129
- const leftPane = [sessionsPaneTitle, ...sessionLines];
130
- const rightPane = [eventsPaneTitle, rightHeader, ...eventLines];
131
- const stitched = stitchPanes(leftPane, rightPane, leftWidth, rightWidth, theme);
132
- const detailLines = renderDetails(focusedSession, this.selectedEventIndex, width, theme);
133
- return [header, "", ...stitched, "", ...detailLines];
134
- }
135
- refreshSessions() {
136
- const sessions = this.registry.listSessions();
137
- const items = sessions.map((s) => ({
138
- value: s.taskId,
139
- label: formatSessionLabel(s),
140
- description: formatSessionDescription(s),
141
- }));
142
- this.sessionsList.invalidate();
143
- // SelectList has no public setItems(); rebuild via constructor isn't ideal,
144
- // but mutating its private items[] would be even uglier. Easiest: replace
145
- // the instance. Keep the selected taskId stable across rebuilds.
146
- const prior = this.selectedTaskId;
147
- const selectedIndex = prior
148
- ? Math.max(0, items.findIndex((i) => i.value === prior))
149
- : 0;
150
- this.sessionsList = new SelectList(items, MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
151
- this.sessionsList.setSelectedIndex(selectedIndex);
152
- this.sessionsList.onSelectionChange = (item) => {
153
- this.selectedTaskId = item.value;
154
- this.selectedEventIndex = 0;
155
- this.rebuildEvents();
156
- this.deps.requestRender();
157
- };
158
- if (!this.selectedTaskId && items[0]) {
159
- this.selectedTaskId = items[0].value;
160
- this.rebuildEvents();
161
- }
162
- }
163
- rebuildEvents() {
164
- const s = this.selectedTaskId ? this.registry.getSession(this.selectedTaskId) : undefined;
165
- if (!s) {
166
- this.eventsList = new SelectList([], MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
167
- return;
168
- }
169
- // Pair tool_start + tool_end into a single line; show errors with a marker.
170
- const items = [];
171
- const startsByCallId = new Map();
172
- s.events.forEach((ev, idx) => {
173
- if (ev.kind === "tool_start") {
174
- startsByCallId.set(ev.toolCallId, ev);
175
- items.push({
176
- value: String(idx),
177
- label: formatEventLabel(ev, undefined, this.deps.theme),
178
- description: shortArgHint(ev.args),
179
- });
180
- }
181
- else {
182
- const start = startsByCallId.get(ev.toolCallId);
183
- if (start) {
184
- // Update the existing item's label with completion marker.
185
- const lastIdx = items.findIndex((i) => i.value === String(idx - 1));
186
- if (lastIdx >= 0) {
187
- items[lastIdx] = {
188
- ...items[lastIdx],
189
- label: formatEventLabel(start, ev, this.deps.theme),
190
- };
191
- }
192
- }
193
- else {
194
- items.push({
195
- value: String(idx),
196
- label: formatEventLabel(ev, ev, this.deps.theme),
197
- description: ev.isError ? "errored" : "ok",
198
- });
199
- }
200
- }
201
- });
202
- this.eventsList = new SelectList(items, MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
203
- const idx = Math.min(this.selectedEventIndex, Math.max(0, items.length - 1));
204
- this.eventsList.setSelectedIndex(idx);
205
- this.eventsList.onSelectionChange = (item) => {
206
- const i = Number.parseInt(item.value, 10);
207
- if (!Number.isNaN(i)) {
208
- this.selectedEventIndex = i;
209
- this.deps.requestRender();
210
- }
211
- };
212
- }
213
- }
214
- function formatSessionLabel(s) {
215
- const phase = s.currentPhaseRole ?? s.phases[s.phases.length - 1]?.role ?? "—";
216
- const marker = s.status === "running" ? "▶" : s.status === "failed" || s.status === "escalated" ? "✗" : "✓";
217
- return `${marker} ${s.taskId} ${phase}`;
218
- }
219
- function formatSessionDescription(s) {
220
- const p = s.phases[s.phases.length - 1];
221
- if (!p)
222
- return "";
223
- const errPart = p.errCount ? ` · err ${p.errCount}` : "";
224
- const elapsed = Math.floor(((p.endedAt ?? Date.now()) - p.startedAt) / 1000);
225
- return `t${p.turn} · tools ${p.toolCount}${errPart} · ${elapsed}s`;
226
- }
227
- function formatEventLabel(start, end, theme) {
228
- const ts = new Date(start.ts).toISOString().slice(11, 19);
229
- const hint = shortArgHint(start.args);
230
- const status = end ? (end.isError ? theme.fg("error", "✗") : theme.fg("success", "✓")) : "·";
231
- return `${ts} ${status} ${start.toolName}${hint ? ` ${hint}` : ""}`;
232
- }
233
- function shortArgHint(args) {
234
- if (!args || typeof args !== "object")
235
- return "";
236
- const a = args;
237
- const fp = (a.file_path ?? a.path);
238
- if (typeof fp === "string") {
239
- const base = fp.split("/").pop() ?? fp;
240
- return base.length > 28 ? `${base.slice(0, 28)}…` : base;
241
- }
242
- if (typeof a.command === "string") {
243
- const head = a.command.split(/\s+/).slice(0, 3).join(" ");
244
- return head.length > 36 ? `${head.slice(0, 36)}…` : head;
245
- }
246
- if (typeof a.pattern === "string")
247
- return a.pattern.slice(0, 36);
248
- if (typeof a.query === "string")
249
- return a.query.slice(0, 36);
250
- return "";
251
- }
252
- function renderDetails(session, eventIndex, width, theme) {
253
- if (!session)
254
- return [];
255
- const ev = session.events[eventIndex];
256
- if (!ev)
257
- return [theme.fg("muted", " (no event selected)")];
258
- const lines = [];
259
- lines.push(theme.bold(theme.fg("accent", `Details: ${ev.toolName}`)));
260
- if (ev.args !== undefined) {
261
- lines.push(theme.fg("muted", " args:"));
262
- lines.push(...indent(jsonLines(ev.args), 4));
263
- }
264
- if (ev.kind === "tool_end") {
265
- const label = ev.isError ? theme.fg("error", " result (errored):") : theme.fg("muted", " result:");
266
- lines.push(label);
267
- lines.push(...indent(jsonLines(ev.result), 4));
268
- }
269
- // Truncate to DETAIL_LINES so the widget doesn't grow unbounded.
270
- const truncated = lines.slice(0, DETAIL_LINES + 1);
271
- if (lines.length > DETAIL_LINES + 1) {
272
- truncated.push(theme.fg("muted", ` … (${lines.length - DETAIL_LINES - 1} more lines; see .forge/cache/run-task-debug-${session.taskId}.jsonl)`));
273
- }
274
- // Hard-wrap any line that exceeds width.
275
- return truncated.map((l) => (visibleLen(l) > width ? l.slice(0, Math.max(0, width - 1)) + "…" : l));
276
- }
277
- function jsonLines(value) {
278
- try {
279
- const s = typeof value === "string" ? value : JSON.stringify(value, null, 2);
280
- return s.split("\n");
281
- }
282
- catch {
283
- return [String(value)];
284
- }
285
- }
286
- function indent(lines, spaces) {
287
- const pad = " ".repeat(spaces);
288
- return lines.map((l) => pad + l);
289
- }
290
- function visibleLen(s) {
291
- // Strip ANSI escape sequences for a rough visible-width estimate.
292
- return s.replace(/\[[0-9;]*m/g, "").length;
293
- }
294
- function stitchPanes(left, right, leftWidth, rightWidth, theme) {
295
- const rows = Math.max(left.length, right.length);
296
- const gutter = theme.fg("borderMuted", " │ ");
297
- const out = [];
298
- for (let i = 0; i < rows; i++) {
299
- const l = padVisible(left[i] ?? "", leftWidth);
300
- const r = padVisible(right[i] ?? "", rightWidth);
301
- out.push(l + gutter + r);
302
- }
303
- return out;
304
- }
305
- function padVisible(s, width) {
306
- const len = visibleLen(s);
307
- if (len >= width)
308
- return s;
309
- return s + " ".repeat(width - len);
310
- }
311
- function buildSelectListTheme(theme) {
312
- return {
313
- selectedPrefix: (t) => theme.fg("accent", "▸") + " " + t,
314
- selectedText: (t) => theme.bold(theme.fg("accent", t)),
315
- description: (t) => theme.fg("muted", t),
316
- scrollInfo: (t) => theme.fg("muted", t),
317
- noMatch: (t) => theme.fg("muted", t),
318
- };
319
- }
320
- //# sourceMappingURL=session-monitor-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-monitor-widget.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/session-monitor-widget.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { ExtensionAPI } from "@entelligentsia/pi-coding-agent";
2
- export declare function registerSessionMonitor(pi: ExtensionAPI): void;
@@ -1,135 +0,0 @@
1
- // session-monitor.ts — register /forge:sessions slash command and Ctrl+Shift+S
2
- // shortcut that toggle the session-monitor widget below the input swimline.
3
- //
4
- // Focus model: pi keeps keyboard focus on the editor when an extension widget
5
- // is mounted via setWidget(). To route arrow keys / Tab / Esc to the widget
6
- // while it is open, we install a ctx.ui.onTerminalInput handler that consumes
7
- // those keys and forwards them to the widget's handleInput. Letter keys and
8
- // Enter pass through to the editor so the user can still type and submit
9
- // prompts while monitoring sessions.
10
- import { Key } from "@entelligentsia/pi-tui";
11
- import { buildSessionMonitorWidget, } from "./session-monitor-widget.js";
12
- const WIDGET_KEY = "forge-sessions";
13
- // Process-global state. The slash command and the shortcut share one toggle
14
- // state; pi only paints one widget per key at a time.
15
- let isOpen = false;
16
- let widgetRef;
17
- let unsubscribeInput;
18
- // Keys that should always route to the widget while it is open.
19
- function isWidgetKey(data) {
20
- if (data === "")
21
- return true; // bare Esc
22
- if (data === "\t")
23
- return true; // Tab
24
- if (data === "" || data === "OA")
25
- return true; // up
26
- if (data === "" || data === "OB")
27
- return true; // down
28
- if (data === "" || data === "OC")
29
- return true; // right
30
- if (data === "" || data === "OD")
31
- return true; // left
32
- if (data === "" || data === "")
33
- return true; // Home / End
34
- if (data === "[5~" || data === "[6~")
35
- return true; // PgUp / PgDn
36
- return false;
37
- }
38
- function closeWidget(ctx) {
39
- unsubscribeInput?.();
40
- unsubscribeInput = undefined;
41
- widgetRef = undefined;
42
- ctx.ui.setWidget(WIDGET_KEY, undefined);
43
- isOpen = false;
44
- }
45
- function toggle(ctx) {
46
- if (isOpen) {
47
- closeWidget(ctx);
48
- ctx.ui.notify("forge:sessions closed", "info");
49
- return;
50
- }
51
- ctx.ui.notify("forge:sessions opening…", "info");
52
- if (process.env.FORGE_SESSIONS_PROBE === "1") {
53
- // Plain string[] form — confirms whether widgets render at all in this
54
- // pi build. Set FORGE_SESSIONS_PROBE=1 before launching forge to use.
55
- ctx.ui.setWidget(WIDGET_KEY, [
56
- "── Forge Sessions (probe) ──────────────────────────",
57
- " This is the string[] form of setWidget.",
58
- " If you see this, widgets render.",
59
- " Press /forge:sessions again to close.",
60
- ], { placement: "belowEditor" });
61
- isOpen = true;
62
- return;
63
- }
64
- try {
65
- const factory = buildSessionMonitorWidget({
66
- requestRender: () => {
67
- // pi re-renders widgets on its own tick when they emit lines from
68
- // render(); the SessionRegistry "change" listener calls
69
- // invalidate() on the SelectLists inside the widget.
70
- },
71
- onClose: () => {
72
- closeWidget(ctx);
73
- },
74
- onMount: (w) => {
75
- widgetRef = w;
76
- },
77
- });
78
- ctx.ui.setWidget(WIDGET_KEY, factory, { placement: "belowEditor" });
79
- isOpen = true;
80
- // Install raw input interceptor so arrow keys / Tab / Esc reach the
81
- // widget instead of the editor. Letter keys & Enter pass through.
82
- unsubscribeInput = ctx.ui.onTerminalInput((data) => {
83
- if (!widgetRef || !isOpen)
84
- return undefined;
85
- if (!isWidgetKey(data))
86
- return undefined;
87
- try {
88
- widgetRef.handleInput(data);
89
- }
90
- catch (err) {
91
- const e = err;
92
- process.stderr.write(`[forge:sessions] widget.handleInput threw: ${e.message ?? "unknown"}\n`);
93
- }
94
- return { consume: true };
95
- });
96
- }
97
- catch (err) {
98
- const e = err;
99
- ctx.ui.notify(`forge:sessions failed to mount: ${e.message ?? "unknown"}\n${e.stack ?? ""}`, "error");
100
- isOpen = false;
101
- }
102
- }
103
- export function registerSessionMonitor(pi) {
104
- process.stderr.write("[forge:sessions] registerSessionMonitor: registering command + shortcut\n");
105
- pi.registerCommand("forge:sessions", {
106
- description: "Toggle the Forge session monitor: live list of run-task subagent sessions " +
107
- "with per-event details. Below the input. Shortcut: Ctrl+Shift+S. " +
108
- "While open: ↑↓ navigate, Tab/→ switch panes, Esc closes.",
109
- async handler(_args, ctx) {
110
- process.stderr.write("[forge:sessions] command handler invoked\n");
111
- try {
112
- toggle(ctx);
113
- }
114
- catch (err) {
115
- const e = err;
116
- process.stderr.write(`[forge:sessions] handler threw: ${e.message ?? "unknown"}\n${e.stack ?? ""}\n`);
117
- try {
118
- ctx.ui.notify(`forge:sessions handler threw: ${e.message ?? "unknown"}`, "error");
119
- }
120
- catch {
121
- /* notify itself failed; stderr line above is the durable trace */
122
- }
123
- }
124
- },
125
- });
126
- // Ctrl+L is reserved by pi (terminal clear). Use Ctrl+Shift+S — unbound by
127
- // default in pi and unlikely to clash with shell/terminal muscle memory.
128
- pi.registerShortcut(Key.ctrlShift("s"), {
129
- description: "Toggle Forge session monitor",
130
- handler: (ctx) => {
131
- toggle(ctx);
132
- },
133
- });
134
- }
135
- //# sourceMappingURL=session-monitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-monitor.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/session-monitor.ts"],"names":[],"mappings":"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"}