@narumitw/pi-subagents 3.3.3 → 3.4.1
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/README.md +74 -25
- package/dist/child-communication-bridge.ts +3 -2
- package/dist/child-communication-bridge.ts.map +1 -1
- package/dist/child-readiness-probe.ts +114 -17
- package/dist/child-readiness-probe.ts.map +2 -2
- package/dist/chunks/{chunk-FY5HIU6Y.ts → chunk-5OXDVXXO.ts} +1 -1
- package/dist/chunks/{chunk-FY5HIU6Y.ts.map → chunk-5OXDVXXO.ts.map} +1 -1
- package/dist/chunks/chunk-B3RWNGDX.ts +192 -0
- package/dist/chunks/chunk-B3RWNGDX.ts.map +7 -0
- package/dist/chunks/{chunk-ZOAFWLDJ.ts → chunk-PRIDTAJL.ts} +4 -16
- package/dist/chunks/chunk-PRIDTAJL.ts.map +7 -0
- package/dist/chunks/{chunk-YMVSJ5GE.ts → chunk-YV2P6XJX.ts} +46 -17
- package/dist/chunks/chunk-YV2P6XJX.ts.map +7 -0
- package/dist/chunks/{menu-KAIUEWL7.ts → menu-2UH4ICLL.ts} +74 -3
- package/dist/chunks/menu-2UH4ICLL.ts.map +7 -0
- package/dist/index.ts +554 -293
- package/dist/index.ts.map +3 -3
- package/docs/attachments.md +9 -3
- package/docs/design-principles.md +3 -1
- package/docs/messaging.md +3 -1
- package/docs/tools.md +15 -1
- package/package.json +3 -3
- package/src/broker-credentials.ts +44 -13
- package/src/child-communication-tools.ts +2 -19
- package/src/child-readiness-probe.ts +144 -18
- package/src/child-readiness.ts +118 -0
- package/src/menu.ts +82 -3
- package/src/message-broker.ts +23 -10
- package/src/process.ts +59 -167
- package/src/resource-attachments.ts +1 -3
- package/src/rpc-line-decoder.ts +61 -0
- package/src/runtime.ts +22 -10
- package/src/settings.ts +2 -2
- package/src/subagents.ts +110 -18
- package/src/tools.ts +83 -37
- package/src/types.ts +1 -0
- package/src/widget-renderer.ts +119 -0
- package/src/widget.ts +245 -121
- package/dist/chunks/chunk-3FCHXUKZ.ts +0 -98
- package/dist/chunks/chunk-3FCHXUKZ.ts.map +0 -7
- package/dist/chunks/chunk-YMVSJ5GE.ts.map +0 -7
- package/dist/chunks/chunk-ZOAFWLDJ.ts.map +0 -7
- package/dist/chunks/menu-KAIUEWL7.ts.map +0 -7
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
// @ts-nocheck -- generated entries use .ts extensions for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
4
|
JOB_STATES
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-5OXDVXXO.ts";
|
|
6
6
|
|
|
7
7
|
// src/menu.ts
|
|
8
8
|
import { defineMenu, runConfirmation, runMenu, runTask, sanitizeTerminalText } from "@narumitw/pi-tui-kit";
|
|
9
9
|
async function showSubagentsMenu(ctx, options) {
|
|
10
10
|
if (options.signal.aborted || !options.isCurrent()) return;
|
|
11
11
|
let selectedJobId;
|
|
12
|
+
let selectedItem;
|
|
13
|
+
const widget = ctx.mode === "tui" ? options.widget : void 0;
|
|
12
14
|
const current = (signal) => !signal.aborted && options.isCurrent();
|
|
13
15
|
const menu = defineMenu({
|
|
14
16
|
start: "main",
|
|
@@ -20,6 +22,7 @@ async function showSubagentsMenu(ctx, options) {
|
|
|
20
22
|
items: [
|
|
21
23
|
{ id: "jobs", label: "Jobs", to: "jobs" },
|
|
22
24
|
{ id: "settings", label: "Settings", action: "settings" },
|
|
25
|
+
...widget ? [{ id: "view", label: "Widget view", to: "view" }] : [],
|
|
23
26
|
{ id: "status", label: "Status", to: "status" },
|
|
24
27
|
{ id: "help", label: "Help", to: "help" },
|
|
25
28
|
{ id: "close", label: "Close", close: true }
|
|
@@ -44,10 +47,57 @@ async function showSubagentsMenu(ctx, options) {
|
|
|
44
47
|
kind: "actions",
|
|
45
48
|
title: "Subagent Job",
|
|
46
49
|
lines: job ? jobLines(job) : ["This job is no longer available."],
|
|
47
|
-
items: job && isActive(job) ? [
|
|
50
|
+
items: job && isActive(job) ? [
|
|
51
|
+
{ id: "cancel", label: "Cancel job\u2026", action: "cancelJob" },
|
|
52
|
+
...widget && selectedItem ? [
|
|
53
|
+
{ id: "expand", label: "Widget: job details", action: "itemView" },
|
|
54
|
+
{ id: "compact", label: "Widget: job summary", action: "itemView" },
|
|
55
|
+
{ id: "remove", label: "Remove from widget (keep job)", action: "itemView" }
|
|
56
|
+
] : []
|
|
57
|
+
] : [],
|
|
48
58
|
hint: "back"
|
|
49
59
|
};
|
|
50
60
|
},
|
|
61
|
+
view: ({ state }) => ({
|
|
62
|
+
kind: "actions",
|
|
63
|
+
title: "Subagents Widget View",
|
|
64
|
+
lines: [
|
|
65
|
+
`View: ${widget?.state().mode ?? "default"} \xB7 pinned: ${widget?.state().pinned ?? false}`,
|
|
66
|
+
`Automatic compaction: ${widget?.state().trigger ?? "manual"}`,
|
|
67
|
+
...state.settings.showWidget ? [] : ["Disabled by Settings. View controls do not enable the widget."],
|
|
68
|
+
"Display changes never cancel jobs. No completed-job history is shown."
|
|
69
|
+
],
|
|
70
|
+
items: [
|
|
71
|
+
{ id: "expanded", label: "Show details", action: "view" },
|
|
72
|
+
{ id: "compact", label: "Show summary", action: "view" },
|
|
73
|
+
{
|
|
74
|
+
id: "visibility",
|
|
75
|
+
label: widget?.state().mode === "hidden" ? "Show widget" : "Hide widget",
|
|
76
|
+
action: "view"
|
|
77
|
+
},
|
|
78
|
+
{ id: "pin", label: widget?.state().pinned ? "Unpin view" : "Pin view", action: "view" },
|
|
79
|
+
{ id: "trigger", label: "Automatic compaction", to: "trigger" },
|
|
80
|
+
{ id: "reset-items", label: "Reset item views", action: "view" }
|
|
81
|
+
],
|
|
82
|
+
hint: "back"
|
|
83
|
+
}),
|
|
84
|
+
trigger: () => ({
|
|
85
|
+
kind: "actions",
|
|
86
|
+
title: "Subagents Automatic Compaction",
|
|
87
|
+
lines: [
|
|
88
|
+
"Opt-in. A pending rule rearms on meaningful active-job changes, not timing ticks.",
|
|
89
|
+
"User messages count only when consumed, including extension-generated user messages.",
|
|
90
|
+
"Settlement requires a non-aborted cycle with an observed non-error, non-aborted final turn.",
|
|
91
|
+
"A later cycle needs its own post-arm consumed user message; queued batches can share a cycle.",
|
|
92
|
+
"The cycle already active when armed is excluded. Pins and disabled/hidden views prevent compaction."
|
|
93
|
+
],
|
|
94
|
+
items: [
|
|
95
|
+
{ id: "manual", label: "Manual only", action: "trigger" },
|
|
96
|
+
{ id: "user-message", label: "Next consumed user message", action: "trigger" },
|
|
97
|
+
{ id: "settled-cycle", label: "Next eligible settled cycle", action: "trigger" }
|
|
98
|
+
],
|
|
99
|
+
hint: "back"
|
|
100
|
+
}),
|
|
51
101
|
status: ({ state }) => ({
|
|
52
102
|
kind: "detail",
|
|
53
103
|
title: "Subagents Status",
|
|
@@ -83,10 +133,31 @@ async function showSubagentsMenu(ctx, options) {
|
|
|
83
133
|
})
|
|
84
134
|
},
|
|
85
135
|
actions: {
|
|
136
|
+
view: ({ itemId, signal }) => {
|
|
137
|
+
if (!current(signal)) return { kind: "close" };
|
|
138
|
+
if (!widget) return { kind: "stay" };
|
|
139
|
+
if (itemId === "expanded" || itemId === "compact") widget.setMode(itemId);
|
|
140
|
+
else if (itemId === "visibility") widget.setMode(widget.state().mode === "hidden" ? "expanded" : "hidden");
|
|
141
|
+
else if (itemId === "pin") widget.setPinned(!widget.state().pinned);
|
|
142
|
+
else if (itemId === "reset-items") widget.resetItems();
|
|
143
|
+
return { kind: "stay" };
|
|
144
|
+
},
|
|
145
|
+
trigger: ({ itemId, signal }) => {
|
|
146
|
+
if (!current(signal)) return { kind: "close" };
|
|
147
|
+
if (itemId === "manual" || itemId === "user-message" || itemId === "settled-cycle") widget?.setTrigger(itemId);
|
|
148
|
+
return { kind: "stay" };
|
|
149
|
+
},
|
|
150
|
+
itemView: ({ itemId, signal }) => {
|
|
151
|
+
if (!current(signal)) return { kind: "close" };
|
|
152
|
+
if (itemId === "compact" || itemId === "expand" || itemId === "remove") selectedItem?.[itemId]();
|
|
153
|
+
selectedItem = selectedJobId === void 0 ? void 0 : widget?.item(selectedJobId);
|
|
154
|
+
return { kind: "stay" };
|
|
155
|
+
},
|
|
86
156
|
selectJob: ({ itemId, signal }) => {
|
|
87
157
|
if (!current(signal)) return { kind: "close" };
|
|
88
158
|
if (!options.getState().jobs.some((job) => job.jobId === itemId)) return { kind: "stay" };
|
|
89
159
|
selectedJobId = itemId;
|
|
160
|
+
selectedItem = widget?.item(itemId);
|
|
90
161
|
return { kind: "to", screen: "job" };
|
|
91
162
|
},
|
|
92
163
|
settings: async ({ signal }) => {
|
|
@@ -168,4 +239,4 @@ function timestamp(value) {
|
|
|
168
239
|
export {
|
|
169
240
|
showSubagentsMenu
|
|
170
241
|
};
|
|
171
|
-
//# sourceMappingURL=menu-
|
|
242
|
+
//# sourceMappingURL=menu-2UH4ICLL.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/menu.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runConfirmation, runMenu, runTask, sanitizeTerminalText } from \"@narumitw/pi-tui-kit\";\nimport type { EditorStatusItemHandle } from \"@narumitw/pi-tui-kit/editor-status-collection\";\nimport type { SubagentSettings } from \"./settings.js\";\nimport { JOB_STATES, type JobSummary } from \"./types.js\";\nimport type { SubagentWidgetControls } from \"./widget.js\";\n\ninterface SubagentsMenuState {\n settings: SubagentSettings;\n settingsPath: string;\n jobs: JobSummary[];\n omitted: number;\n}\n\ninterface SubagentsMenuOptions {\n signal: AbortSignal;\n isCurrent(): boolean;\n getState(): SubagentsMenuState;\n cancelJob(jobId: string, signal: AbortSignal): Promise<void>;\n showSettings(signal: AbortSignal): Promise<\"back\" | \"close\" | \"stale\">;\n widget?: SubagentWidgetControls;\n}\n\nexport async function showSubagentsMenu(ctx: ExtensionCommandContext, options: SubagentsMenuOptions): Promise<void> {\n if (options.signal.aborted || !options.isCurrent()) return;\n let selectedJobId: string | undefined;\n let selectedItem: EditorStatusItemHandle | undefined;\n const widget = ctx.mode === \"tui\" ? options.widget : undefined;\n const current = (signal: AbortSignal) => !signal.aborted && options.isCurrent();\n const menu = defineMenu<\n SubagentsMenuState,\n \"main\" | \"jobs\" | \"job\" | \"status\" | \"help\" | \"view\" | \"trigger\",\n \"selectJob\" | \"cancelJob\" | \"settings\" | \"view\" | \"trigger\" | \"itemView\"\n >({\n start: \"main\",\n screens: {\n main: ({ state }) => ({\n kind: \"actions\",\n title: \"Subagents\",\n lines: [jobCounts(state)],\n items: [\n { id: \"jobs\", label: \"Jobs\", to: \"jobs\" },\n { id: \"settings\", label: \"Settings\", action: \"settings\" },\n ...(widget ? [{ id: \"view\", label: \"Widget view\", to: \"view\" as const }] : []),\n { id: \"status\", label: \"Status\", to: \"status\" },\n { id: \"help\", label: \"Help\", to: \"help\" },\n { id: \"close\", label: \"Close\", close: true },\n ],\n hint: \"close\",\n }),\n jobs: ({ state }) => ({\n kind: \"choice\",\n title: \"Subagent Jobs\",\n lines: [jobCounts(state), ...(state.jobs.length === 0 ? [\"No jobs in this session.\"] : [])],\n items: state.jobs.map((job) => ({\n id: job.jobId,\n label: sanitizeTerminalText(job.jobId),\n description: sanitizeTerminalText(job.state),\n })),\n action: \"selectJob\",\n hint: \"back\",\n }),\n job: ({ state }) => {\n const job = state.jobs.find((candidate) => candidate.jobId === selectedJobId);\n return {\n kind: \"actions\",\n title: \"Subagent Job\",\n lines: job ? jobLines(job) : [\"This job is no longer available.\"],\n items:\n job && isActive(job)\n ? [\n { id: \"cancel\", label: \"Cancel job\u2026\", action: \"cancelJob\" },\n ...(widget && selectedItem\n ? [\n { id: \"expand\", label: \"Widget: job details\", action: \"itemView\" as const },\n { id: \"compact\", label: \"Widget: job summary\", action: \"itemView\" as const },\n { id: \"remove\", label: \"Remove from widget (keep job)\", action: \"itemView\" as const },\n ]\n : []),\n ]\n : [],\n hint: \"back\",\n };\n },\n view: ({ state }) => ({\n kind: \"actions\",\n title: \"Subagents Widget View\",\n lines: [\n `View: ${widget?.state().mode ?? \"default\"} \u00B7 pinned: ${widget?.state().pinned ?? false}`,\n `Automatic compaction: ${widget?.state().trigger ?? \"manual\"}`,\n ...(state.settings.showWidget ? [] : [\"Disabled by Settings. View controls do not enable the widget.\"]),\n \"Display changes never cancel jobs. No completed-job history is shown.\",\n ],\n items: [\n { id: \"expanded\", label: \"Show details\", action: \"view\" },\n { id: \"compact\", label: \"Show summary\", action: \"view\" },\n {\n id: \"visibility\",\n label: widget?.state().mode === \"hidden\" ? \"Show widget\" : \"Hide widget\",\n action: \"view\",\n },\n { id: \"pin\", label: widget?.state().pinned ? \"Unpin view\" : \"Pin view\", action: \"view\" },\n { id: \"trigger\", label: \"Automatic compaction\", to: \"trigger\" },\n { id: \"reset-items\", label: \"Reset item views\", action: \"view\" },\n ],\n hint: \"back\",\n }),\n trigger: () => ({\n kind: \"actions\",\n title: \"Subagents Automatic Compaction\",\n lines: [\n \"Opt-in. A pending rule rearms on meaningful active-job changes, not timing ticks.\",\n \"User messages count only when consumed, including extension-generated user messages.\",\n \"Settlement requires a non-aborted cycle with an observed non-error, non-aborted final turn.\",\n \"A later cycle needs its own post-arm consumed user message; queued batches can share a cycle.\",\n \"The cycle already active when armed is excluded. Pins and disabled/hidden views prevent compaction.\",\n ],\n items: [\n { id: \"manual\", label: \"Manual only\", action: \"trigger\" },\n { id: \"user-message\", label: \"Next consumed user message\", action: \"trigger\" },\n { id: \"settled-cycle\", label: \"Next eligible settled cycle\", action: \"trigger\" },\n ],\n hint: \"back\",\n }),\n status: ({ state }) => ({\n kind: \"detail\",\n title: \"Subagents Status\",\n lines: [\n \"Runtime: active for this session\",\n `Retained jobs: ${state.jobs.length}`,\n `Active jobs: ${state.jobs.filter(isActive).length}`,\n `Omitted jobs: ${state.omitted}`,\n ...JOB_STATES.map((status) => `${status}: ${state.jobs.filter((job) => job.state === status).length}`),\n `Show widget: ${state.settings.showWidget}`,\n `Show job ID: ${state.settings.showJobId}`,\n `Show tools: ${state.settings.showTools}`,\n `Show timing: ${state.settings.showTiming}`,\n `User settings: ${sanitizeTerminalText(state.settingsPath)}`,\n ],\n hint: \"back\",\n }),\n help: () => ({\n kind: \"detail\",\n title: \"Subagents Help\",\n lines: [\n \"/subagents opens the job manager.\",\n \"/subagents settings opens the same settings screen directly.\",\n \"Jobs shows this session's job summaries. Only queued or running jobs can be cancelled, after confirmation.\",\n \"The model uses subagent_spawn to start jobs, subagent_inspect to check them, and subagent_wait to wait for results.\",\n \"subagent_send sends a message; subagent_cancel cancels a job.\",\n \"Jobs are session-only. The runtime retains up to 32 terminal jobs for up to 24 hours.\",\n \"Settings changes display preferences only. All four settings default to true.\",\n \"Successful saves apply immediately. Use /reload after manual settings edits.\",\n \"In RPC mode, Settings reports the user settings file path.\",\n ],\n hint: \"back\",\n }),\n },\n actions: {\n view: ({ itemId, signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n if (!widget) return { kind: \"stay\" };\n if (itemId === \"expanded\" || itemId === \"compact\") widget.setMode(itemId);\n else if (itemId === \"visibility\") widget.setMode(widget.state().mode === \"hidden\" ? \"expanded\" : \"hidden\");\n else if (itemId === \"pin\") widget.setPinned(!widget.state().pinned);\n else if (itemId === \"reset-items\") widget.resetItems();\n return { kind: \"stay\" };\n },\n trigger: ({ itemId, signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n if (itemId === \"manual\" || itemId === \"user-message\" || itemId === \"settled-cycle\") widget?.setTrigger(itemId);\n return { kind: \"stay\" };\n },\n itemView: ({ itemId, signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n if (itemId === \"compact\" || itemId === \"expand\" || itemId === \"remove\") selectedItem?.[itemId]();\n selectedItem = selectedJobId === undefined ? undefined : widget?.item(selectedJobId);\n return { kind: \"stay\" };\n },\n selectJob: ({ itemId, signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n if (!options.getState().jobs.some((job) => job.jobId === itemId)) return { kind: \"stay\" };\n selectedJobId = itemId;\n selectedItem = widget?.item(itemId);\n return { kind: \"to\", screen: \"job\" };\n },\n settings: async ({ signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n const reason = await options.showSettings(signal);\n return { kind: current(signal) && reason === \"back\" ? \"stay\" : \"close\" };\n },\n cancelJob: async ({ signal }) => {\n if (!current(signal)) return { kind: \"close\" };\n const jobId = selectedJobId;\n const job = options.getState().jobs.find((candidate) => candidate.jobId === jobId);\n if (!job || !isActive(job)) return { kind: \"stay\" };\n const confirmation = await runConfirmation(ctx, {\n title: \"Cancel subagent job?\",\n message: `Cancel job ${sanitizeTerminalText(job.jobId)} (${sanitizeTerminalText(job.state)})?`,\n confirmLabel: \"Cancel job\",\n cancelLabel: \"Keep job\",\n signal,\n isCurrent: options.isCurrent,\n onError: () => undefined,\n });\n if (!current(signal)) return { kind: \"close\" };\n if (confirmation.kind === \"closed\") {\n return { kind: confirmation.reason === \"close\" ? \"close\" : \"stay\" };\n }\n if (confirmation.kind === \"error\") throw confirmation.error;\n if (confirmation.kind !== \"confirmed\") return { kind: \"close\" };\n // The runtime can finish or remove a job while its confirmation is open.\n const latest = options.getState().jobs.find((candidate) => candidate.jobId === jobId);\n if (selectedJobId !== jobId || !latest || !isActive(latest)) return { kind: \"stay\" };\n const result = await runTask(ctx, {\n label: \"Cancelling subagent job\u2026\",\n signal,\n isCurrent: options.isCurrent,\n task: ({ signal: taskSignal }) => options.cancelJob(latest.jobId, taskSignal),\n onError: () => undefined,\n });\n if (!current(signal)) return { kind: \"close\" };\n if (result.kind === \"error\") throw result.error;\n if (result.kind === \"stale\") return { kind: \"close\" };\n if (result.kind === \"cancelled\") return { kind: \"close\" };\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n signal: options.signal,\n isCurrent: options.isCurrent,\n getState: options.getState,\n onError: (_ctx, error) => {\n if (!options.signal.aborted && options.isCurrent() && ctx.hasUI) {\n ctx.ui.notify(\n sanitizeTerminalText(`Subagents menu failed: ${error instanceof Error ? error.message : String(error)}`),\n \"error\",\n );\n }\n },\n });\n}\n\nfunction isActive(job: JobSummary): boolean {\n return job.state === \"queued\" || job.state === \"running\";\n}\n\nfunction jobCounts(state: SubagentsMenuState): string {\n return `Jobs: ${state.jobs.length} shown, ${state.jobs.filter(isActive).length} active, ${state.omitted} omitted`;\n}\n\nfunction jobLines(job: JobSummary): string[] {\n return [\n `Job ID: ${sanitizeTerminalText(job.jobId)}`,\n `State: ${sanitizeTerminalText(job.state)}`,\n `Created: ${timestamp(job.createdAt)}`,\n ...(job.startedAt === undefined ? [] : [`Started: ${timestamp(job.startedAt)}`]),\n ...(job.finishedAt === undefined ? [] : [`Finished: ${timestamp(job.finishedAt)}`]),\n ...(job.timeout === undefined ? [] : [`Timeout: ${job.timeout} seconds`]),\n ];\n}\n\nfunction timestamp(value: number): string {\n const date = new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : \"unknown\";\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|