@pi-unipi/subagents 2.6.1 → 2.9.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 (107) hide show
  1. package/README.md +89 -78
  2. package/agents/delegate.md +14 -0
  3. package/agents/oracle.md +78 -0
  4. package/agents/researcher.md +52 -0
  5. package/agents/reviewer.md +79 -0
  6. package/agents/scout.md +50 -0
  7. package/agents/worker.md +59 -0
  8. package/package.json +22 -20
  9. package/prompts/council.md +48 -0
  10. package/prompts/gather-context-and-clarify.md +13 -0
  11. package/prompts/parallel-cleanup.md +59 -0
  12. package/prompts/parallel-research.md +50 -0
  13. package/prompts/parallel-review.md +54 -0
  14. package/prompts/review-loop.md +43 -0
  15. package/skills/council-mode/SKILL.md +230 -0
  16. package/skills/subagents/SKILL.md +49 -0
  17. package/skills/subagents/references/constraints-and-recipes.md +259 -0
  18. package/skills/subagents/references/execution-controls.md +454 -0
  19. package/skills/subagents/references/management-authoring-rpc.md +161 -0
  20. package/skills/subagents/references/multi-lane-orchestration.md +39 -0
  21. package/skills/subagents/references/prompting-and-roles.md +267 -0
  22. package/src/acceptance.ts +331 -0
  23. package/src/agent-manager.ts +405 -0
  24. package/src/agent-memory.ts +300 -0
  25. package/src/agent-overrides.ts +183 -0
  26. package/src/agent-runner.ts +271 -0
  27. package/src/async-runner.ts +417 -0
  28. package/src/authority-policy.ts +47 -0
  29. package/src/budgets.ts +285 -0
  30. package/src/child-safety.ts +140 -0
  31. package/src/config.ts +226 -0
  32. package/src/conversation-viewer.ts +281 -0
  33. package/src/core-compat.ts +94 -0
  34. package/src/custom-agents.ts +323 -0
  35. package/src/file-system-retry.ts +50 -0
  36. package/src/fleet-data.ts +61 -0
  37. package/src/fleet-view.ts +316 -0
  38. package/src/foreground-detach.ts +59 -0
  39. package/src/fork-context.ts +285 -0
  40. package/src/global.d.ts +7 -0
  41. package/src/guide.ts +129 -0
  42. package/src/index.ts +1149 -0
  43. package/src/mission-state.ts +133 -0
  44. package/src/mission-store.ts +434 -0
  45. package/src/model-resolver.ts +79 -0
  46. package/src/output-limits.ts +142 -0
  47. package/src/parity-types.ts +315 -0
  48. package/src/pi-args.ts +161 -0
  49. package/src/pi-spawn.ts +147 -0
  50. package/src/result-files.ts +232 -0
  51. package/src/result-watcher.ts +221 -0
  52. package/src/retained-children.ts +176 -0
  53. package/src/run-fanout-budget.ts +356 -0
  54. package/src/scheduled-runs.ts +351 -0
  55. package/src/schemas.ts +263 -0
  56. package/src/slash-commands.ts +77 -0
  57. package/src/supervisor-channel.ts +249 -0
  58. package/src/tool-handler.ts +1144 -0
  59. package/src/types.ts +238 -0
  60. package/src/widget.ts +447 -0
  61. package/src/workflow-script.ts +737 -0
  62. package/src/workflow-worker.ts +384 -0
  63. package/src/worktree.ts +614 -0
  64. package/dist/agent-manager.d.ts +0 -81
  65. package/dist/agent-manager.d.ts.map +0 -1
  66. package/dist/agent-manager.js +0 -295
  67. package/dist/agent-manager.js.map +0 -1
  68. package/dist/agent-runner.d.ts +0 -51
  69. package/dist/agent-runner.d.ts.map +0 -1
  70. package/dist/agent-runner.js +0 -262
  71. package/dist/agent-runner.js.map +0 -1
  72. package/dist/config.d.ts +0 -24
  73. package/dist/config.d.ts.map +0 -1
  74. package/dist/config.js +0 -132
  75. package/dist/config.js.map +0 -1
  76. package/dist/conversation-viewer.d.ts +0 -40
  77. package/dist/conversation-viewer.d.ts.map +0 -1
  78. package/dist/conversation-viewer.js +0 -276
  79. package/dist/conversation-viewer.js.map +0 -1
  80. package/dist/core-compat.d.ts +0 -21
  81. package/dist/core-compat.d.ts.map +0 -1
  82. package/dist/core-compat.js +0 -86
  83. package/dist/core-compat.js.map +0 -1
  84. package/dist/custom-agents.d.ts +0 -14
  85. package/dist/custom-agents.d.ts.map +0 -1
  86. package/dist/custom-agents.js +0 -113
  87. package/dist/custom-agents.js.map +0 -1
  88. package/dist/file-lock.d.ts +0 -42
  89. package/dist/file-lock.d.ts.map +0 -1
  90. package/dist/file-lock.js +0 -91
  91. package/dist/file-lock.js.map +0 -1
  92. package/dist/index.d.ts +0 -10
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/index.js +0 -758
  95. package/dist/index.js.map +0 -1
  96. package/dist/model-resolver.d.ts +0 -19
  97. package/dist/model-resolver.d.ts.map +0 -1
  98. package/dist/model-resolver.js +0 -61
  99. package/dist/model-resolver.js.map +0 -1
  100. package/dist/types.d.ts +0 -98
  101. package/dist/types.d.ts.map +0 -1
  102. package/dist/types.js +0 -47
  103. package/dist/types.js.map +0 -1
  104. package/dist/widget.d.ts +0 -56
  105. package/dist/widget.d.ts.map +0 -1
  106. package/dist/widget.js +0 -396
  107. package/dist/widget.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsElD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAyCvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAI9E"}
package/dist/config.js DELETED
@@ -1,132 +0,0 @@
1
- /**
2
- * @pi-unipi/subagents — Config management
3
- *
4
- * Loads config from ~/.unipi/config/subagents.json (global)
5
- * and <workspace>/.unipi/config/subagents.json (override).
6
- * Auto-generates on first run. Repairs corrupted files.
7
- */
8
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
9
- import { join } from "node:path";
10
- import { homedir } from "node:os";
11
- const DEFAULT_CONFIG = {
12
- maxConcurrent: 4,
13
- enabled: true,
14
- types: {
15
- explore: { enabled: true },
16
- work: { enabled: true },
17
- },
18
- };
19
- /** Get global config path: ~/.unipi/config/subagents.json */
20
- function getGlobalConfigPath() {
21
- return join(homedir(), ".unipi", "config", "subagents.json");
22
- }
23
- /** Get workspace config path: <cwd>/.unipi/config/subagents.json */
24
- function getWorkspaceConfigPath(cwd) {
25
- return join(cwd, ".unipi", "config", "subagents.json");
26
- }
27
- /** Ensure directory exists. */
28
- function ensureDir(filePath) {
29
- const dir = filePath.substring(0, filePath.lastIndexOf("/"));
30
- if (!existsSync(dir)) {
31
- mkdirSync(dir, { recursive: true });
32
- }
33
- }
34
- /** Ensure a directory exists (not a file path). */
35
- function ensureDirExists(dirPath) {
36
- if (!existsSync(dirPath)) {
37
- mkdirSync(dirPath, { recursive: true });
38
- }
39
- }
40
- /** Write config atomically (write then rename). */
41
- function writeConfigAtomic(filePath, config) {
42
- const tmpPath = filePath + ".tmp";
43
- writeFileSync(tmpPath, JSON.stringify(config, null, 2), "utf-8");
44
- renameSync(tmpPath, filePath);
45
- }
46
- /** Load and parse config from a path. Returns null on failure. */
47
- function loadConfigFromPath(filePath) {
48
- if (!existsSync(filePath))
49
- return null;
50
- try {
51
- const content = readFileSync(filePath, "utf-8");
52
- const parsed = JSON.parse(content);
53
- // Basic validation
54
- if (typeof parsed !== "object" || parsed === null)
55
- return null;
56
- return parsed;
57
- }
58
- catch {
59
- return null;
60
- }
61
- }
62
- /** Repair corrupted config: rename to .bak and generate fresh. */
63
- function repairCorrupted(filePath) {
64
- const backupPath = filePath + ".bak";
65
- try {
66
- renameSync(filePath, backupPath);
67
- }
68
- catch {
69
- // If rename fails, just overwrite
70
- }
71
- writeConfigAtomic(filePath, DEFAULT_CONFIG);
72
- return DEFAULT_CONFIG;
73
- }
74
- /**
75
- * Initialize config on extension start.
76
- * - If missing: generate with defaults
77
- * - If corrupted: rename to .bak, generate fresh
78
- * - If valid: load
79
- */
80
- export function initConfig(cwd) {
81
- const globalPath = getGlobalConfigPath();
82
- const globalDir = join(homedir(), ".unipi", "config");
83
- const globalAgentsDir = join(homedir(), ".unipi", "config", "agents");
84
- // Ensure directories exist
85
- ensureDirExists(globalDir);
86
- ensureDirExists(globalAgentsDir);
87
- // Load or create global config
88
- let globalConfig = loadConfigFromPath(globalPath);
89
- if (globalConfig === null) {
90
- globalConfig = repairCorrupted(globalPath);
91
- }
92
- // Ensure workspace directories exist if workspace exists
93
- const workspaceDir = join(cwd, ".unipi", "config");
94
- const workspaceAgentsDir = join(cwd, ".unipi", "config", "agents");
95
- if (cwd && !cwd.startsWith(homedir())) {
96
- // Only create workspace dirs if not in home directory
97
- ensureDirExists(workspaceDir);
98
- ensureDirExists(workspaceAgentsDir);
99
- }
100
- // Load workspace override if exists
101
- const workspacePath = getWorkspaceConfigPath(cwd);
102
- const workspaceConfig = loadConfigFromPath(workspacePath);
103
- if (workspaceConfig) {
104
- // Merge: workspace overrides global on any field present
105
- return {
106
- ...globalConfig,
107
- ...workspaceConfig,
108
- types: {
109
- ...globalConfig.types,
110
- ...workspaceConfig.types,
111
- },
112
- };
113
- }
114
- return globalConfig;
115
- }
116
- /**
117
- * Save global config.
118
- */
119
- export function saveGlobalConfig(config) {
120
- const globalPath = getGlobalConfigPath();
121
- ensureDir(globalPath);
122
- writeConfigAtomic(globalPath, config);
123
- }
124
- /**
125
- * Save workspace config.
126
- */
127
- export function saveWorkspaceConfig(cwd, config) {
128
- const workspacePath = getWorkspaceConfigPath(cwd);
129
- ensureDir(workspacePath);
130
- writeConfigAtomic(workspacePath, config);
131
- }
132
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- /**
2
- * @pi-unipi/subagents — Conversation Viewer
3
- *
4
- * Live-scrolling overlay for viewing agent conversations.
5
- * Subscribes to session events for real-time streaming updates.
6
- * Supports keyboard navigation: ↑↓, PgUp/PgDn, Home/End, Esc/q to close.
7
- */
8
- import type { AgentSession } from "@earendil-works/pi-coding-agent";
9
- import { type Component, type TUI } from "@earendil-works/pi-tui";
10
- import type { AgentActivity } from "./types.js";
11
- interface ViewerRecord {
12
- type: string;
13
- description: string;
14
- status: string;
15
- toolUses: number;
16
- startedAt: number;
17
- completedAt?: number;
18
- }
19
- export declare class ConversationViewer implements Component {
20
- private tui;
21
- private session;
22
- private record;
23
- private activity;
24
- private theme;
25
- private done;
26
- private scrollOffset;
27
- private autoScroll;
28
- private unsubscribe;
29
- private lastInnerW;
30
- private closed;
31
- constructor(tui: TUI, session: AgentSession, record: ViewerRecord, activity: AgentActivity | undefined, theme: any, done: (result: undefined) => void);
32
- handleInput(data: string): void;
33
- render(width: number): string[];
34
- invalidate(): void;
35
- dispose(): void;
36
- private viewportHeight;
37
- private buildContentLines;
38
- }
39
- export {};
40
- //# sourceMappingURL=conversation-viewer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-viewer.d.ts","sourceRoot":"","sources":["../src/conversation-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,GAAG,EAIT,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2ChD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,kBAAmB,YAAW,SAAS;IAQhD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,IAAI;IAZd,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAS;gBAGb,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;IAQ3C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgC/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAmF/B,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;CA2E1B"}
@@ -1,276 +0,0 @@
1
- /**
2
- * @pi-unipi/subagents — Conversation Viewer
3
- *
4
- * Live-scrolling overlay for viewing agent conversations.
5
- * Subscribes to session events for real-time streaming updates.
6
- * Supports keyboard navigation: ↑↓, PgUp/PgDn, Home/End, Esc/q to close.
7
- */
8
- import { matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "@earendil-works/pi-tui";
9
- /** Lines consumed by chrome: top border + header + header sep + footer sep + footer + bottom border. */
10
- const CHROME_LINES = 6;
11
- const MIN_VIEWPORT = 3;
12
- /** Extract text from content array. */
13
- function extractText(content) {
14
- if (typeof content === "string")
15
- return content;
16
- return content
17
- .filter((p) => p.type === "text" && typeof p.text === "string")
18
- .map((p) => p.text)
19
- .join("");
20
- }
21
- /** Format duration. */
22
- function formatMs(ms) {
23
- if (ms >= 60_000)
24
- return `${(ms / 60_000).toFixed(1)}m`;
25
- if (ms >= 1_000)
26
- return `${(ms / 1_000).toFixed(1)}s`;
27
- return `${ms}ms`;
28
- }
29
- /** Format tokens compactly. */
30
- function formatTokens(count) {
31
- if (count >= 1_000_000)
32
- return `${(count / 1_000_000).toFixed(1)}M token`;
33
- if (count >= 1_000)
34
- return `${(count / 1_000).toFixed(1)}k token`;
35
- return `${count} token`;
36
- }
37
- /** Describe current activity from active tools. */
38
- function describeActivity(activeTools, responseText) {
39
- if (activeTools.size > 0) {
40
- const names = [...new Set(activeTools.values())];
41
- return names.join(", ") + "…";
42
- }
43
- if (responseText && responseText.trim().length > 0) {
44
- const lastLine = responseText.split("\n").find((l) => l.trim())?.trim() ?? "";
45
- if (lastLine.length > 60)
46
- return lastLine.slice(0, 60) + "…";
47
- if (lastLine.length > 0)
48
- return lastLine;
49
- }
50
- return "thinking…";
51
- }
52
- export class ConversationViewer {
53
- tui;
54
- session;
55
- record;
56
- activity;
57
- theme;
58
- done;
59
- scrollOffset = 0;
60
- autoScroll = true;
61
- unsubscribe;
62
- lastInnerW = 0;
63
- closed = false;
64
- constructor(tui, session, record, activity, theme, done) {
65
- this.tui = tui;
66
- this.session = session;
67
- this.record = record;
68
- this.activity = activity;
69
- this.theme = theme;
70
- this.done = done;
71
- this.unsubscribe = session.subscribe(() => {
72
- if (this.closed)
73
- return;
74
- this.tui.requestRender();
75
- });
76
- }
77
- handleInput(data) {
78
- if (matchesKey(data, "escape") || matchesKey(data, "q")) {
79
- this.closed = true;
80
- this.done(undefined);
81
- return;
82
- }
83
- const totalLines = this.buildContentLines(this.lastInnerW).length;
84
- const viewportHeight = this.viewportHeight();
85
- const maxScroll = Math.max(0, totalLines - viewportHeight);
86
- if (matchesKey(data, "up") || matchesKey(data, "k")) {
87
- this.scrollOffset = Math.max(0, this.scrollOffset - 1);
88
- this.autoScroll = this.scrollOffset >= maxScroll;
89
- }
90
- else if (matchesKey(data, "down") || matchesKey(data, "j")) {
91
- this.scrollOffset = Math.min(maxScroll, this.scrollOffset + 1);
92
- this.autoScroll = this.scrollOffset >= maxScroll;
93
- }
94
- else if (matchesKey(data, "pageUp")) {
95
- this.scrollOffset = Math.max(0, this.scrollOffset - viewportHeight);
96
- this.autoScroll = false;
97
- }
98
- else if (matchesKey(data, "pageDown")) {
99
- this.scrollOffset = Math.min(maxScroll, this.scrollOffset + viewportHeight);
100
- this.autoScroll = this.scrollOffset >= maxScroll;
101
- }
102
- else if (matchesKey(data, "home")) {
103
- this.scrollOffset = 0;
104
- this.autoScroll = false;
105
- }
106
- else if (matchesKey(data, "end")) {
107
- this.scrollOffset = maxScroll;
108
- this.autoScroll = true;
109
- }
110
- }
111
- render(width) {
112
- if (width < 6)
113
- return [];
114
- const th = this.theme;
115
- const innerW = width - 4; // border + padding
116
- this.lastInnerW = innerW;
117
- const lines = [];
118
- const pad = (s, len) => {
119
- const vis = visibleWidth(s);
120
- return s + " ".repeat(Math.max(0, len - vis));
121
- };
122
- const row = (content) => th.fg("border", "│") + " " + truncateToWidth(pad(content, innerW), innerW) + " " + th.fg("border", "│");
123
- const hrTop = th.fg("border", `╭${"─".repeat(width - 2)}╮`);
124
- const hrBot = th.fg("border", `╰${"─".repeat(width - 2)}╯`);
125
- const hrMid = row(th.fg("dim", "─".repeat(innerW)));
126
- // Header
127
- lines.push(hrTop);
128
- const name = this.record.type;
129
- const statusIcon = this.record.status === "running"
130
- ? th.fg("accent", "●")
131
- : this.record.status === "completed"
132
- ? th.fg("success", "✓")
133
- : this.record.status === "error"
134
- ? th.fg("error", "✗")
135
- : th.fg("dim", "○");
136
- const duration = this.record.completedAt
137
- ? formatMs(this.record.completedAt - this.record.startedAt)
138
- : `${formatMs(Date.now() - this.record.startedAt)} (running)`;
139
- const headerParts = [duration];
140
- const toolUses = this.activity?.toolUses ?? this.record.toolUses;
141
- if (toolUses > 0)
142
- headerParts.unshift(`${toolUses} tool${toolUses === 1 ? "" : "s"}`);
143
- if (this.activity?.session) {
144
- try {
145
- const tokens = this.activity.session.getSessionStats().tokens.total;
146
- if (tokens > 0)
147
- headerParts.push(formatTokens(tokens));
148
- }
149
- catch {
150
- /* */
151
- }
152
- }
153
- lines.push(row(`${statusIcon} ${th.bold(name)} ${th.fg("muted", this.record.description)} ${th.fg("dim", "·")} ${th.fg("dim", headerParts.join(" · "))}`));
154
- lines.push(hrMid);
155
- // Content area
156
- const contentLines = this.buildContentLines(innerW);
157
- const viewportHeight = this.viewportHeight();
158
- const maxScroll = Math.max(0, contentLines.length - viewportHeight);
159
- if (this.autoScroll) {
160
- this.scrollOffset = maxScroll;
161
- }
162
- const visibleStart = Math.min(this.scrollOffset, maxScroll);
163
- const visible = contentLines.slice(visibleStart, visibleStart + viewportHeight);
164
- for (let i = 0; i < viewportHeight; i++) {
165
- lines.push(row(visible[i] ?? ""));
166
- }
167
- // Footer
168
- lines.push(hrMid);
169
- const scrollPct = contentLines.length <= viewportHeight
170
- ? "100%"
171
- : `${Math.round(((visibleStart + viewportHeight) / contentLines.length) * 100)}%`;
172
- const footerLeft = th.fg("dim", `${contentLines.length} lines · ${scrollPct}`);
173
- const footerRight = th.fg("dim", "↑↓ scroll · PgUp/PgDn · Esc close");
174
- const footerGap = Math.max(1, innerW - visibleWidth(footerLeft) - visibleWidth(footerRight));
175
- lines.push(row(footerLeft + " ".repeat(footerGap) + footerRight));
176
- lines.push(hrBot);
177
- return lines;
178
- }
179
- invalidate() {
180
- /* no cached state to clear */
181
- }
182
- dispose() {
183
- this.closed = true;
184
- if (this.unsubscribe) {
185
- this.unsubscribe();
186
- this.unsubscribe = undefined;
187
- }
188
- }
189
- // ---- Private ----
190
- viewportHeight() {
191
- return Math.max(MIN_VIEWPORT, this.tui.terminal.rows - CHROME_LINES);
192
- }
193
- buildContentLines(width) {
194
- if (width <= 0)
195
- return [];
196
- const th = this.theme;
197
- const messages = this.session.messages;
198
- const lines = [];
199
- if (!messages || messages.length === 0) {
200
- lines.push(th.fg("dim", "(waiting for first message...)"));
201
- return lines;
202
- }
203
- let needsSeparator = false;
204
- for (const msg of messages) {
205
- if (msg.role === "user") {
206
- const text = typeof msg.content === "string" ? msg.content : extractText(msg.content);
207
- if (!text.trim())
208
- continue;
209
- if (needsSeparator)
210
- lines.push(th.fg("dim", "───"));
211
- lines.push(th.fg("accent", "[User]"));
212
- for (const line of wrapTextWithAnsi(text.trim(), width)) {
213
- lines.push(line);
214
- }
215
- }
216
- else if (msg.role === "assistant") {
217
- const textParts = [];
218
- const toolCalls = [];
219
- for (const c of msg.content) {
220
- if (c.type === "text" && c.text)
221
- textParts.push(c.text);
222
- else if (c.type === "tool_use" || c.type === "toolCall") {
223
- toolCalls.push(c.name ?? c.toolName ?? "unknown");
224
- }
225
- }
226
- if (needsSeparator)
227
- lines.push(th.fg("dim", "───"));
228
- lines.push(th.bold("[Assistant]"));
229
- if (textParts.length > 0) {
230
- for (const line of wrapTextWithAnsi(textParts.join("\n").trim(), width)) {
231
- lines.push(line);
232
- }
233
- }
234
- for (const name of toolCalls) {
235
- lines.push(truncateToWidth(th.fg("muted", ` [Tool: ${name}]`), width));
236
- }
237
- }
238
- else if (msg.role === "toolResult") {
239
- const text = extractText(msg.content);
240
- const truncated = text.length > 500 ? text.slice(0, 500) + "... (truncated)" : text;
241
- if (!truncated.trim())
242
- continue;
243
- if (needsSeparator)
244
- lines.push(th.fg("dim", "───"));
245
- lines.push(th.fg("dim", "[Result]"));
246
- for (const line of wrapTextWithAnsi(truncated.trim(), width)) {
247
- lines.push(th.fg("dim", line));
248
- }
249
- }
250
- else if (msg.role === "bashExecution") {
251
- const bash = msg;
252
- if (needsSeparator)
253
- lines.push(th.fg("dim", "───"));
254
- lines.push(truncateToWidth(th.fg("muted", ` $ ${bash.command}`), width));
255
- if (bash.output?.trim()) {
256
- const out = bash.output.length > 500 ? bash.output.slice(0, 500) + "... (truncated)" : bash.output;
257
- for (const line of wrapTextWithAnsi(out.trim(), width)) {
258
- lines.push(th.fg("dim", line));
259
- }
260
- }
261
- }
262
- else {
263
- continue;
264
- }
265
- needsSeparator = true;
266
- }
267
- // Streaming indicator for running agents
268
- if (this.record.status === "running" && this.activity) {
269
- const act = describeActivity(this.activity.activeTools, this.activity.responseText);
270
- lines.push("");
271
- lines.push(truncateToWidth(th.fg("accent", "▍ ") + th.fg("dim", act), width));
272
- }
273
- return lines.map((l) => truncateToWidth(l, width));
274
- }
275
- }
276
- //# sourceMappingURL=conversation-viewer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-viewer.js","sourceRoot":"","sources":["../src/conversation-viewer.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export declare const MODULES: {
3
- readonly SUBAGENTS: "subagents";
4
- };
5
- export declare const UNIPI_EVENTS: {
6
- readonly MODULE_READY: "unipi:module:ready";
7
- readonly BADGE_GENERATE_REQUEST: "unipi:badge:generate:request";
8
- };
9
- export interface UnipiBadgeGenerateRequestEvent {
10
- conversationSummary?: string;
11
- }
12
- export declare function emitEvent(pi: Pick<ExtensionAPI, "events">, eventName: string, payload: unknown): boolean;
13
- export interface BoundedHelperOutput {
14
- text: string;
15
- truncated: boolean;
16
- originalBytes: number;
17
- artifactPath?: string;
18
- }
19
- export declare function boundHelperOutput(text: string, maxBytes?: number, existingArtifactPath?: string): BoundedHelperOutput;
20
- export declare function withHerdrBlocked<T>(pi: Pick<ExtensionAPI, "events">, label: string, fn: () => Promise<T>): Promise<T>;
21
- //# sourceMappingURL=core-compat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-compat.d.ts","sourceRoot":"","sources":["../src/core-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAMpE,eAAO,MAAM,OAAO;;CAAsC,CAAC;AAE3D,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,MAAM,WAAW,8BAA8B;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAOT;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAY,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,mBAAmB,CAqDrB;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
@@ -1,86 +0,0 @@
1
- import { chmodSync, lstatSync, mkdirSync, writeFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { randomUUID } from "node:crypto";
5
- export const MODULES = { SUBAGENTS: "subagents" };
6
- export const UNIPI_EVENTS = {
7
- MODULE_READY: "unipi:module:ready",
8
- BADGE_GENERATE_REQUEST: "unipi:badge:generate:request",
9
- };
10
- export function emitEvent(pi, eventName, payload) {
11
- try {
12
- pi.events.emit(eventName, payload);
13
- return true;
14
- }
15
- catch {
16
- return false;
17
- }
18
- }
19
- /** Standalone-package twin of core's bounded-output policy. */
20
- const MAX_RAW_HELPER_ARTIFACT_BYTES = 16 * 1024 * 1024;
21
- export function boundHelperOutput(text, maxBytes = 64 * 1024, existingArtifactPath) {
22
- const originalBytes = Buffer.byteLength(text, "utf8");
23
- if (originalBytes <= maxBytes)
24
- return { text, truncated: false, originalBytes };
25
- let artifactPath = existingArtifactPath;
26
- let artifactWarning;
27
- if (!artifactPath && originalBytes <= MAX_RAW_HELPER_ARTIFACT_BYTES) {
28
- try {
29
- const dir = join(homedir(), ".unipi", "tool-results");
30
- mkdirSync(dir, { recursive: true, mode: 0o700 });
31
- let stat = lstatSync(dir);
32
- if (!stat.isDirectory() || stat.isSymbolicLink()) {
33
- throw new Error(`Refusing unsafe tool-result directory: ${dir}`);
34
- }
35
- if ((stat.mode & 0o077) !== 0) {
36
- chmodSync(dir, 0o700);
37
- stat = lstatSync(dir);
38
- if ((stat.mode & 0o077) !== 0)
39
- throw new Error(`Refusing non-private tool-result directory: ${dir}`);
40
- }
41
- artifactPath = join(dir, `helper-${randomUUID()}.txt`);
42
- writeFileSync(artifactPath, text, { encoding: "utf8", mode: 0o600, flag: "wx" });
43
- }
44
- catch (error) {
45
- artifactWarning = `Full-output artifact unavailable: ${error instanceof Error ? error.message : String(error)}`;
46
- artifactPath = undefined;
47
- }
48
- }
49
- else if (!artifactPath) {
50
- artifactWarning = `Full output exceeded the ${MAX_RAW_HELPER_ARTIFACT_BYTES}-byte local artifact safety cap and was not retained.`;
51
- }
52
- const marker = [
53
- "",
54
- "--- output bounded by UniPi ---",
55
- artifactPath ? `Full output: ${artifactPath}` : artifactWarning,
56
- `Original size: ${originalBytes} bytes; model-visible ceiling: ${maxBytes} bytes.`,
57
- ...(artifactPath ? ["Use the read tool with offset/limit to inspect only the needed region."] : []),
58
- ].join("\n");
59
- const markerBytes = Buffer.byteLength(marker, "utf8");
60
- const contentBudget = Math.max(1, maxBytes - markerBytes - 80);
61
- const bytes = Buffer.from(text, "utf8");
62
- const headBytes = Math.ceil(contentBudget * 0.75);
63
- const tailBytes = Math.max(0, contentBudget - headBytes);
64
- const head = bytes.subarray(0, headBytes).toString("utf8").replace(/\uFFFD+$/u, "");
65
- const tail = bytes.subarray(originalBytes - tailBytes).toString("utf8").replace(/^\uFFFD+/u, "");
66
- let bounded = `${head}\n… ${Math.max(0, originalBytes - contentBudget)} bytes omitted …\n${tail}${marker}`;
67
- if (Buffer.byteLength(bounded, "utf8") > maxBytes) {
68
- bounded = Buffer.from(bounded, "utf8").subarray(0, maxBytes).toString("utf8").replace(/\uFFFD+$/u, "");
69
- }
70
- return {
71
- text: bounded,
72
- truncated: true,
73
- originalBytes,
74
- artifactPath,
75
- };
76
- }
77
- export async function withHerdrBlocked(pi, label, fn) {
78
- emitEvent(pi, "herdr:blocked", { active: true, label });
79
- try {
80
- return await fn();
81
- }
82
- finally {
83
- emitEvent(pi, "herdr:blocked", { active: false, label });
84
- }
85
- }
86
- //# sourceMappingURL=core-compat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-compat.js","sourceRoot":"","sources":["../src/core-compat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,WAAW,EAAW,CAAC;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,oBAAoB;IAClC,sBAAsB,EAAE,8BAA8B;CAC9C,CAAC;AAMX,MAAM,UAAU,SAAS,CACvB,EAAgC,EAChC,SAAiB,EACjB,OAAgB;IAEhB,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AASD,+DAA+D;AAC/D,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAQ,GAAG,EAAE,GAAG,IAAI,EACpB,oBAA6B;IAE7B,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,aAAa,IAAI,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAEhF,IAAI,YAAY,GAAG,oBAAoB,CAAC;IACxC,IAAI,eAAmC,CAAC;IACxC,IAAI,CAAC,YAAY,IAAI,aAAa,IAAI,6BAA6B,EAAE,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;YACtD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBACjD,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACtB,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,EAAE,CAAC,CAAC;YACvG,CAAC;YACD,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,UAAU,EAAE,MAAM,CAAC,CAAC;YACvD,aAAa,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,GAAG,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChH,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACzB,eAAe,GAAG,4BAA4B,6BAA6B,uDAAuD,CAAC;IACrI,CAAC;IAED,MAAM,MAAM,GAAG;QACb,EAAE;QACF,iCAAiC;QACjC,YAAY,CAAC,CAAC,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC,CAAC,eAAgB;QAChE,kBAAkB,aAAa,kCAAkC,QAAQ,SAAS;QAClF,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,wEAAwE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjG,IAAI,OAAO,GAAG,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC,qBAAqB,IAAI,GAAG,MAAM,EAAE,CAAC;IAC3G,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QAClD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,IAAI;QACf,aAAa;QACb,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAgC,EAChC,KAAa,EACb,EAAoB;IAEpB,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * @pi-unipi/subagents — Custom agent loader
3
- *
4
- * Discovers agent types from:
5
- * - <workspace>/.unipi/config/agents/*.md (project, highest priority)
6
- * - ~/.unipi/config/agents/*.md (global)
7
- */
8
- import type { AgentConfig } from "./types.js";
9
- /**
10
- * Load all custom agents from project and global directories.
11
- * Project agents override global agents with the same name.
12
- */
13
- export declare function loadCustomAgents(cwd: string): Map<string, AgentConfig>;
14
- //# sourceMappingURL=custom-agents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"custom-agents.d.ts","sourceRoot":"","sources":["../src/custom-agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6E9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAgCtE"}