@melihmucuk/pi-crew 1.0.13 → 1.0.14
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.
- package/docs/architecture.md +0 -1
- package/extension/agent-discovery.ts +791 -0
- package/extension/bootstrap-session.ts +131 -0
- package/extension/index.ts +65 -0
- package/extension/integration/register-command.ts +59 -0
- package/extension/integration/register-renderers.ts +77 -0
- package/extension/integration/register-tools.ts +39 -0
- package/extension/integration/tool-presentation.ts +50 -0
- package/extension/integration/tools/crew-abort.ts +121 -0
- package/extension/integration/tools/crew-done.ts +42 -0
- package/extension/integration/tools/crew-list.ts +91 -0
- package/extension/integration/tools/crew-respond.ts +57 -0
- package/extension/integration/tools/crew-spawn.ts +88 -0
- package/extension/integration/tools/tool-deps.ts +16 -0
- package/extension/integration.ts +15 -0
- package/extension/runtime/crew-runtime.ts +426 -0
- package/extension/runtime/delivery-coordinator.ts +131 -0
- package/extension/runtime/overflow-recovery.ts +211 -0
- package/extension/runtime/subagent-registry.ts +85 -0
- package/extension/runtime/subagent-state.ts +73 -0
- package/extension/status-widget.ts +107 -0
- package/extension/subagent-messages.ts +124 -0
- package/extension/tool-registry.ts +19 -0
- package/package.json +8 -11
- package/dist/agent-discovery.d.ts +0 -29
- package/dist/agent-discovery.js +0 -527
- package/dist/bootstrap-session.d.ts +0 -21
- package/dist/bootstrap-session.js +0 -74
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -46
- package/dist/integration/register-command.d.ts +0 -3
- package/dist/integration/register-command.js +0 -51
- package/dist/integration/register-renderers.d.ts +0 -2
- package/dist/integration/register-renderers.js +0 -59
- package/dist/integration/register-tools.d.ts +0 -3
- package/dist/integration/register-tools.js +0 -25
- package/dist/integration/tool-presentation.d.ts +0 -27
- package/dist/integration/tool-presentation.js +0 -29
- package/dist/integration/tools/crew-abort.d.ts +0 -2
- package/dist/integration/tools/crew-abort.js +0 -79
- package/dist/integration/tools/crew-done.d.ts +0 -2
- package/dist/integration/tools/crew-done.js +0 -28
- package/dist/integration/tools/crew-list.d.ts +0 -2
- package/dist/integration/tools/crew-list.js +0 -74
- package/dist/integration/tools/crew-respond.d.ts +0 -2
- package/dist/integration/tools/crew-respond.js +0 -32
- package/dist/integration/tools/crew-spawn.d.ts +0 -2
- package/dist/integration/tools/crew-spawn.js +0 -48
- package/dist/integration/tools/tool-deps.d.ts +0 -9
- package/dist/integration/tools/tool-deps.js +0 -1
- package/dist/integration.d.ts +0 -3
- package/dist/integration.js +0 -8
- package/dist/runtime/crew-runtime.d.ts +0 -62
- package/dist/runtime/crew-runtime.js +0 -285
- package/dist/runtime/delivery-coordinator.d.ts +0 -26
- package/dist/runtime/delivery-coordinator.js +0 -86
- package/dist/runtime/overflow-recovery.d.ts +0 -3
- package/dist/runtime/overflow-recovery.js +0 -155
- package/dist/runtime/subagent-registry.d.ts +0 -14
- package/dist/runtime/subagent-registry.js +0 -58
- package/dist/runtime/subagent-state.d.ts +0 -35
- package/dist/runtime/subagent-state.js +0 -32
- package/dist/status-widget.d.ts +0 -3
- package/dist/status-widget.js +0 -84
- package/dist/subagent-messages.d.ts +0 -37
- package/dist/subagent-messages.js +0 -68
- package/dist/tool-registry.d.ts +0 -5
- package/dist/tool-registry.js +0 -13
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { randomBytes } from "node:crypto";
|
|
2
|
-
export function generateId(name, existingIds) {
|
|
3
|
-
for (let i = 0; i < 10; i++) {
|
|
4
|
-
const id = `${name}-${randomBytes(4).toString("hex")}`;
|
|
5
|
-
if (!existingIds.has(id))
|
|
6
|
-
return id;
|
|
7
|
-
}
|
|
8
|
-
return `${name}-${randomBytes(8).toString("hex")}`;
|
|
9
|
-
}
|
|
10
|
-
// Status may change externally via abort(). Standalone function avoids TS narrowing.
|
|
11
|
-
export function isAborted(state) {
|
|
12
|
-
return state.status === "aborted";
|
|
13
|
-
}
|
|
14
|
-
export function isAbortableStatus(status) {
|
|
15
|
-
return status === "running" || status === "waiting";
|
|
16
|
-
}
|
|
17
|
-
export function buildActiveAgentSummary(state) {
|
|
18
|
-
return {
|
|
19
|
-
id: state.id,
|
|
20
|
-
agentName: state.agentConfig.name,
|
|
21
|
-
status: state.status,
|
|
22
|
-
turns: state.turns,
|
|
23
|
-
contextTokens: state.contextTokens,
|
|
24
|
-
model: state.model,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
export function buildAbortableAgentSummary(state) {
|
|
28
|
-
return {
|
|
29
|
-
id: state.id,
|
|
30
|
-
agentName: state.agentConfig.name,
|
|
31
|
-
};
|
|
32
|
-
}
|
package/dist/status-widget.d.ts
DELETED
package/dist/status-widget.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Text } from "@mariozechner/pi-tui";
|
|
2
|
-
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
3
|
-
const SPINNER_INTERVAL_MS = 80;
|
|
4
|
-
function formatTokens(tokens) {
|
|
5
|
-
if (tokens >= 1_000_000)
|
|
6
|
-
return `${(tokens / 1_000_000).toFixed(1)}M`;
|
|
7
|
-
if (tokens >= 1_000)
|
|
8
|
-
return `${(tokens / 1_000).toFixed(1)}k`;
|
|
9
|
-
return String(tokens);
|
|
10
|
-
}
|
|
11
|
-
function buildLine(agent, frame) {
|
|
12
|
-
const model = agent.model ?? "…";
|
|
13
|
-
const icon = agent.status === "waiting" ? "⏳" : frame;
|
|
14
|
-
return `${icon} ${agent.id} (${model}) · turn ${agent.turns} · ${formatTokens(agent.contextTokens)} ctx`;
|
|
15
|
-
}
|
|
16
|
-
let widget;
|
|
17
|
-
function disposeWidget(state) {
|
|
18
|
-
clearInterval(state.timer);
|
|
19
|
-
if (widget === state) {
|
|
20
|
-
widget = undefined;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function clearWidget() {
|
|
24
|
-
const current = widget;
|
|
25
|
-
if (!current)
|
|
26
|
-
return;
|
|
27
|
-
disposeWidget(current);
|
|
28
|
-
current.ctx.ui.setWidget("crew-status", undefined);
|
|
29
|
-
}
|
|
30
|
-
function hasRunningAgent(agents) {
|
|
31
|
-
return agents.some((agent) => agent.status === "running");
|
|
32
|
-
}
|
|
33
|
-
function syncWidgetText(state, agents) {
|
|
34
|
-
const frame = SPINNER_FRAMES[state.frameIndex % SPINNER_FRAMES.length];
|
|
35
|
-
const lines = agents.map((agent) => buildLine(agent, frame));
|
|
36
|
-
state.text.setText(lines.join("\n"));
|
|
37
|
-
state.tui.requestRender();
|
|
38
|
-
}
|
|
39
|
-
export function updateWidget(ctx, crew) {
|
|
40
|
-
if (!ctx.hasUI) {
|
|
41
|
-
clearWidget();
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const ownerSessionId = ctx.sessionManager.getSessionId();
|
|
45
|
-
const running = crew.getActiveSummariesForOwner(ownerSessionId);
|
|
46
|
-
if (running.length === 0) {
|
|
47
|
-
clearWidget();
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
if (widget && widget.ctx !== ctx) {
|
|
51
|
-
clearWidget();
|
|
52
|
-
}
|
|
53
|
-
if (widget) {
|
|
54
|
-
syncWidgetText(widget, running);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
ctx.ui.setWidget("crew-status", (tui, _theme) => {
|
|
58
|
-
const text = new Text("", 1, 0);
|
|
59
|
-
const state = {
|
|
60
|
-
ctx,
|
|
61
|
-
text,
|
|
62
|
-
tui,
|
|
63
|
-
frameIndex: 0,
|
|
64
|
-
timer: setInterval(() => {
|
|
65
|
-
const agents = crew.getActiveSummariesForOwner(ownerSessionId);
|
|
66
|
-
if (agents.length === 0) {
|
|
67
|
-
clearWidget();
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (!hasRunningAgent(agents))
|
|
71
|
-
return;
|
|
72
|
-
state.frameIndex++;
|
|
73
|
-
syncWidgetText(state, agents);
|
|
74
|
-
}, SPINNER_INTERVAL_MS),
|
|
75
|
-
};
|
|
76
|
-
widget = state;
|
|
77
|
-
syncWidgetText(state, running);
|
|
78
|
-
return Object.assign(text, {
|
|
79
|
-
dispose() {
|
|
80
|
-
disposeWidget(state);
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
2
|
-
export type SubagentStatus = "running" | "waiting" | "done" | "error" | "aborted";
|
|
3
|
-
export type SendMessageFn = ExtensionAPI["sendMessage"];
|
|
4
|
-
export declare const STATUS_ICON: Record<SubagentStatus, string>;
|
|
5
|
-
export declare const STATUS_LABEL: Record<SubagentStatus, string>;
|
|
6
|
-
export interface SteeringPayload {
|
|
7
|
-
id: string;
|
|
8
|
-
agentName: string;
|
|
9
|
-
sessionFile?: string;
|
|
10
|
-
status: SubagentStatus;
|
|
11
|
-
result?: string;
|
|
12
|
-
error?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface CrewResultMessageDetails {
|
|
15
|
-
agentId: string;
|
|
16
|
-
agentName: string;
|
|
17
|
-
sessionFile?: string;
|
|
18
|
-
status: SubagentStatus;
|
|
19
|
-
body?: string;
|
|
20
|
-
}
|
|
21
|
-
export declare function getCrewResultTitle(details: {
|
|
22
|
-
agentId: string;
|
|
23
|
-
agentName: string;
|
|
24
|
-
status: SubagentStatus;
|
|
25
|
-
}): string;
|
|
26
|
-
export declare function sendSteeringMessage(payload: SteeringPayload, sendMessage: SendMessageFn, opts: {
|
|
27
|
-
isIdle: boolean;
|
|
28
|
-
triggerTurn: boolean;
|
|
29
|
-
}): void;
|
|
30
|
-
export declare function sendRemainingNote(remainingCount: number, sendMessage: SendMessageFn, opts: {
|
|
31
|
-
isIdle: boolean;
|
|
32
|
-
triggerTurn: boolean;
|
|
33
|
-
}): void;
|
|
34
|
-
export declare function sendCrewListActiveWarning(sendMessage: SendMessageFn, opts: {
|
|
35
|
-
isIdle: boolean;
|
|
36
|
-
triggerTurn: boolean;
|
|
37
|
-
}): void;
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export const STATUS_ICON = {
|
|
2
|
-
running: "⏳",
|
|
3
|
-
waiting: "⏳",
|
|
4
|
-
done: "✅",
|
|
5
|
-
error: "❌",
|
|
6
|
-
aborted: "⏹️",
|
|
7
|
-
};
|
|
8
|
-
export const STATUS_LABEL = {
|
|
9
|
-
running: "running",
|
|
10
|
-
waiting: "waiting for response",
|
|
11
|
-
done: "done",
|
|
12
|
-
error: "failed",
|
|
13
|
-
aborted: "aborted",
|
|
14
|
-
};
|
|
15
|
-
export function getCrewResultTitle(details) {
|
|
16
|
-
return `Subagent '${details.agentName}' (${details.agentId}) ${STATUS_LABEL[details.status]}`;
|
|
17
|
-
}
|
|
18
|
-
function getSteeringBody(payload) {
|
|
19
|
-
return (payload.status === "error" || payload.status === "aborted")
|
|
20
|
-
? (payload.error ?? payload.result)
|
|
21
|
-
: (payload.result ?? payload.error);
|
|
22
|
-
}
|
|
23
|
-
export function sendSteeringMessage(payload, sendMessage, opts) {
|
|
24
|
-
const body = getSteeringBody(payload);
|
|
25
|
-
const title = getCrewResultTitle({
|
|
26
|
-
agentId: payload.id,
|
|
27
|
-
agentName: payload.agentName,
|
|
28
|
-
status: payload.status,
|
|
29
|
-
});
|
|
30
|
-
const content = body
|
|
31
|
-
? `**${STATUS_ICON[payload.status]} ${title}**\n\n${body}`
|
|
32
|
-
: `**${STATUS_ICON[payload.status]} ${title}**`;
|
|
33
|
-
const message = {
|
|
34
|
-
customType: "crew-result",
|
|
35
|
-
content,
|
|
36
|
-
display: true,
|
|
37
|
-
details: {
|
|
38
|
-
agentId: payload.id,
|
|
39
|
-
agentName: payload.agentName,
|
|
40
|
-
sessionFile: payload.sessionFile,
|
|
41
|
-
status: payload.status,
|
|
42
|
-
body,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
sendMessage(message, opts.isIdle
|
|
46
|
-
? { triggerTurn: opts.triggerTurn }
|
|
47
|
-
: { deliverAs: "steer", triggerTurn: opts.triggerTurn });
|
|
48
|
-
}
|
|
49
|
-
export function sendRemainingNote(remainingCount, sendMessage, opts) {
|
|
50
|
-
if (remainingCount <= 0)
|
|
51
|
-
return;
|
|
52
|
-
sendMessage({
|
|
53
|
-
customType: "crew-remaining",
|
|
54
|
-
content: `⏳ ${remainingCount} subagent(s) still running`,
|
|
55
|
-
display: true,
|
|
56
|
-
}, opts.isIdle
|
|
57
|
-
? { triggerTurn: opts.triggerTurn }
|
|
58
|
-
: { deliverAs: "steer", triggerTurn: opts.triggerTurn });
|
|
59
|
-
}
|
|
60
|
-
export function sendCrewListActiveWarning(sendMessage, opts) {
|
|
61
|
-
sendMessage({
|
|
62
|
-
customType: "crew-list-warning",
|
|
63
|
-
content: "⚠ Active subagents detected. Do not poll crew_list for completion — results arrive as steering messages. Continue with unrelated work or end your turn and wait for the steering messages.",
|
|
64
|
-
display: true,
|
|
65
|
-
}, opts.isIdle
|
|
66
|
-
? { triggerTurn: opts.triggerTurn }
|
|
67
|
-
: { deliverAs: "steer", triggerTurn: opts.triggerTurn });
|
|
68
|
-
}
|
package/dist/tool-registry.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
declare const SUPPORTED_TOOL_NAMES_LITERAL: readonly ["read", "bash", "edit", "write", "grep", "find", "ls"];
|
|
2
|
-
export type SupportedToolName = (typeof SUPPORTED_TOOL_NAMES_LITERAL)[number];
|
|
3
|
-
export declare const SUPPORTED_TOOL_NAMES: readonly ("read" | "bash" | "edit" | "write" | "grep" | "find" | "ls")[];
|
|
4
|
-
export declare function isSupportedToolName(name: string): name is SupportedToolName;
|
|
5
|
-
export {};
|
package/dist/tool-registry.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const SUPPORTED_TOOL_NAMES_LITERAL = [
|
|
2
|
-
"read",
|
|
3
|
-
"bash",
|
|
4
|
-
"edit",
|
|
5
|
-
"write",
|
|
6
|
-
"grep",
|
|
7
|
-
"find",
|
|
8
|
-
"ls",
|
|
9
|
-
];
|
|
10
|
-
export const SUPPORTED_TOOL_NAMES = Object.freeze([...SUPPORTED_TOOL_NAMES_LITERAL]);
|
|
11
|
-
export function isSupportedToolName(name) {
|
|
12
|
-
return SUPPORTED_TOOL_NAMES.includes(name);
|
|
13
|
-
}
|