@pi-unipi/subagents 0.1.13 → 0.2.3

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 (48) hide show
  1. package/package.json +1 -1
  2. package/src/__tests__/badge-generation.test.ts +244 -0
  3. package/src/agent-manager.ts +12 -1
  4. package/src/agent-runner.ts +23 -8
  5. package/src/conversation-viewer.ts +299 -0
  6. package/src/index.ts +432 -49
  7. package/src/types.ts +49 -0
  8. package/src/widget.ts +332 -72
  9. package/dist/agent-manager.d.ts +0 -72
  10. package/dist/agent-manager.d.ts.map +0 -1
  11. package/dist/agent-manager.js +0 -258
  12. package/dist/agent-manager.js.map +0 -1
  13. package/dist/agent-runner.d.ts +0 -50
  14. package/dist/agent-runner.d.ts.map +0 -1
  15. package/dist/agent-runner.js +0 -238
  16. package/dist/agent-runner.js.map +0 -1
  17. package/dist/config.d.ts +0 -24
  18. package/dist/config.d.ts.map +0 -1
  19. package/dist/config.js +0 -132
  20. package/dist/config.js.map +0 -1
  21. package/dist/custom-agents.d.ts +0 -14
  22. package/dist/custom-agents.d.ts.map +0 -1
  23. package/dist/custom-agents.js +0 -106
  24. package/dist/custom-agents.js.map +0 -1
  25. package/dist/file-lock.d.ts +0 -42
  26. package/dist/file-lock.d.ts.map +0 -1
  27. package/dist/file-lock.js +0 -91
  28. package/dist/file-lock.js.map +0 -1
  29. package/dist/index.d.ts +0 -9
  30. package/dist/index.d.ts.map +0 -1
  31. package/dist/index.js +0 -301
  32. package/dist/index.js.map +0 -1
  33. package/dist/model-resolver.d.ts +0 -19
  34. package/dist/model-resolver.d.ts.map +0 -1
  35. package/dist/model-resolver.js +0 -61
  36. package/dist/model-resolver.js.map +0 -1
  37. package/dist/prompts.d.ts +0 -13
  38. package/dist/prompts.d.ts.map +0 -1
  39. package/dist/prompts.js +0 -31
  40. package/dist/prompts.js.map +0 -1
  41. package/dist/types.d.ts +0 -79
  42. package/dist/types.d.ts.map +0 -1
  43. package/dist/types.js +0 -6
  44. package/dist/types.js.map +0 -1
  45. package/dist/widget.d.ts +0 -26
  46. package/dist/widget.d.ts.map +0 -1
  47. package/dist/widget.js +0 -162
  48. package/dist/widget.js.map +0 -1
package/dist/widget.js DELETED
@@ -1,162 +0,0 @@
1
- /**
2
- * @pi-unipi/subagents — Live widget
3
- *
4
- * Shows running agents above the editor.
5
- * Uses setWidget with tui.requestRender() for updates.
6
- */
7
- /** Spinner frames (braille). */
8
- const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
9
- /** Format duration. */
10
- function formatMs(ms) {
11
- if (ms >= 60_000)
12
- return `${(ms / 60_000).toFixed(1)}m`;
13
- if (ms >= 1_000)
14
- return `${(ms / 1_000).toFixed(1)}s`;
15
- return `${ms}ms`;
16
- }
17
- /** Format turns. */
18
- function formatTurns(turn, max) {
19
- return max ? `⟳${turn}≤${max}` : `⟳${turn}`;
20
- }
21
- /** Describe current activity from active tools. */
22
- function describeActivity(activeTools, responseText) {
23
- if (activeTools.size > 0) {
24
- const names = [...new Set(activeTools.values())];
25
- return names.join(", ") + "…";
26
- }
27
- if (responseText) {
28
- const lastLine = responseText.split("\n").pop()?.trim() ?? "";
29
- if (lastLine.length > 0)
30
- return lastLine.slice(0, 60) + (lastLine.length > 60 ? "…" : "");
31
- }
32
- return "thinking…";
33
- }
34
- export class AgentWidget {
35
- manager;
36
- activity;
37
- spinnerFrame = 0;
38
- timer;
39
- uiCtx;
40
- tui;
41
- widgetRegistered = false;
42
- constructor(manager, activity) {
43
- this.manager = manager;
44
- this.activity = activity;
45
- }
46
- setUICtx(ctx) {
47
- if (ctx !== this.uiCtx) {
48
- this.uiCtx = ctx;
49
- this.widgetRegistered = false;
50
- this.tui = undefined;
51
- }
52
- }
53
- ensureTimer() {
54
- if (this.timer)
55
- return;
56
- this.timer = setInterval(() => {
57
- this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER.length;
58
- this.triggerRender();
59
- }, 80);
60
- }
61
- markFinished(_id) {
62
- if (!this.manager.hasRunning()) {
63
- if (this.timer) {
64
- clearInterval(this.timer);
65
- this.timer = undefined;
66
- }
67
- // Clear widget after agent finishes
68
- this.triggerRender();
69
- }
70
- }
71
- update() {
72
- this.triggerRender();
73
- }
74
- triggerRender() {
75
- if (!this.uiCtx)
76
- return;
77
- const allAgents = this.manager.listAgents();
78
- const running = allAgents.filter((a) => a.status === "running" || a.status === "queued");
79
- const hasActive = running.length > 0;
80
- // Nothing to show — clear widget
81
- if (!hasActive) {
82
- if (this.widgetRegistered) {
83
- this.uiCtx.setWidget("unipi-agents", undefined);
84
- this.widgetRegistered = false;
85
- this.tui = undefined;
86
- }
87
- return;
88
- }
89
- // Register widget callback once
90
- if (!this.widgetRegistered) {
91
- this.uiCtx.setWidget("unipi-agents", (tui, theme) => {
92
- this.tui = tui;
93
- return {
94
- render: () => this.renderWidget(tui, theme),
95
- invalidate: () => {
96
- this.widgetRegistered = false;
97
- this.tui = undefined;
98
- },
99
- };
100
- }, { placement: "aboveEditor" });
101
- this.widgetRegistered = true;
102
- }
103
- // Request re-render via TUI
104
- this.tui?.requestRender?.();
105
- }
106
- renderWidget(tui, theme) {
107
- const allAgents = this.manager.listAgents();
108
- const running = allAgents.filter((a) => a.status === "running");
109
- const queued = allAgents.filter((a) => a.status === "queued");
110
- if (running.length === 0 && queued.length === 0)
111
- return [];
112
- const w = tui.terminal?.columns ?? 80;
113
- const truncate = (line) => {
114
- if (line.length <= w)
115
- return line;
116
- return line.slice(0, w - 1) + "…";
117
- };
118
- const frame = SPINNER[this.spinnerFrame % SPINNER.length];
119
- const lines = [];
120
- // Heading
121
- lines.push(truncate(theme.fg("accent", "●") + " " + theme.fg("accent", "Agents")));
122
- // Running agents (2 lines each: header + activity)
123
- for (let i = 0; i < running.length; i++) {
124
- const a = running[i];
125
- const act = this.activity.get(a.id);
126
- const toolCount = a.toolUses;
127
- const tokens = act?.tokens ?? "";
128
- const duration = formatMs(Date.now() - a.startedAt);
129
- const activity = act ? describeActivity(act.activeTools, act.responseText) : "starting…";
130
- const parts = [];
131
- if (act?.turnCount)
132
- parts.push(formatTurns(act.turnCount, act.maxTurns));
133
- if (toolCount > 0)
134
- parts.push(`${toolCount} tool uses`);
135
- if (tokens)
136
- parts.push(tokens);
137
- parts.push(duration);
138
- const connector = i === running.length - 1 && queued.length === 0 ? "└─" : "├─";
139
- const activityConnector = i === running.length - 1 && queued.length === 0 ? " " : "│ ";
140
- lines.push(truncate(theme.fg("dim", connector) +
141
- ` ${theme.fg("accent", frame)} ${theme.bold(a.type)} ${theme.fg("dim", a.description)} · ${theme.fg("dim", parts.join(" · "))}`));
142
- lines.push(truncate(theme.fg("dim", activityConnector) + theme.fg("dim", `⎿ ${activity}`)));
143
- }
144
- // Queued
145
- if (queued.length > 0) {
146
- lines.push(truncate(theme.fg("dim", "└─") + ` ${theme.fg("muted", "◦")} ${theme.fg("dim", `${queued.length} queued`)}`));
147
- }
148
- return lines;
149
- }
150
- dispose() {
151
- if (this.timer) {
152
- clearInterval(this.timer);
153
- this.timer = undefined;
154
- }
155
- if (this.uiCtx && this.widgetRegistered) {
156
- this.uiCtx.setWidget("unipi-agents", undefined);
157
- this.widgetRegistered = false;
158
- this.tui = undefined;
159
- }
160
- }
161
- }
162
- //# sourceMappingURL=widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}