@zihanw/pi-forge 0.4.1 → 0.5.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.
- package/CHANGELOG.md +41 -1
- package/README.md +11 -11
- package/README.zh-CN.md +3 -5
- package/SUBAGENT_ADAPTER_CONTRACT.md +3 -1
- package/dist/agent-profile.d.ts +18 -62
- package/dist/agent-profile.d.ts.map +1 -1
- package/dist/agent-profile.js +27 -249
- package/dist/agent-profile.js.map +1 -1
- package/dist/codecs/agent-profile.d.ts +53 -0
- package/dist/codecs/agent-profile.d.ts.map +1 -0
- package/dist/codecs/agent-profile.js +176 -0
- package/dist/codecs/agent-profile.js.map +1 -0
- package/dist/codecs/index.d.ts +5 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +3 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/prompt-stack.d.ts +18 -0
- package/dist/codecs/prompt-stack.d.ts.map +1 -0
- package/dist/codecs/prompt-stack.js +479 -0
- package/dist/codecs/prompt-stack.js.map +1 -0
- package/dist/compile-cycle.d.ts +18 -0
- package/dist/compile-cycle.d.ts.map +1 -0
- package/dist/compile-cycle.js +13 -0
- package/dist/compile-cycle.js.map +1 -0
- package/dist/compiler.d.ts +10 -4
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +53 -19
- package/dist/compiler.js.map +1 -1
- package/dist/extension-registry.d.ts.map +1 -1
- package/dist/extension-registry.js +5 -2
- package/dist/extension-registry.js.map +1 -1
- package/dist/forge-config.d.ts +0 -105
- package/dist/forge-config.d.ts.map +1 -1
- package/dist/forge-config.js +1 -313
- package/dist/forge-config.js.map +1 -1
- package/dist/forge-v1/analyzer.d.ts +3 -0
- package/dist/forge-v1/analyzer.d.ts.map +1 -0
- package/dist/forge-v1/analyzer.js +50 -0
- package/dist/forge-v1/analyzer.js.map +1 -0
- package/dist/forge-v1/index.d.ts +6 -0
- package/dist/forge-v1/index.d.ts.map +1 -0
- package/dist/forge-v1/index.js +13 -0
- package/dist/forge-v1/index.js.map +1 -0
- package/dist/forge-v1/parser.d.ts +3 -0
- package/dist/forge-v1/parser.d.ts.map +1 -0
- package/dist/forge-v1/parser.js +186 -0
- package/dist/forge-v1/parser.js.map +1 -0
- package/dist/forge-v1/renderer.d.ts +9 -0
- package/dist/forge-v1/renderer.d.ts.map +1 -0
- package/dist/forge-v1/renderer.js +181 -0
- package/dist/forge-v1/renderer.js.map +1 -0
- package/dist/forge-v1/types.d.ts +87 -0
- package/dist/forge-v1/types.d.ts.map +1 -0
- package/dist/forge-v1/types.js +4 -0
- package/dist/forge-v1/types.js.map +1 -0
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -81
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +6 -5
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +43 -112
- package/dist/lifecycle.js.map +1 -1
- package/dist/loader.d.ts +5 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +10 -467
- package/dist/loader.js.map +1 -1
- package/dist/macro-engine.d.ts +9 -14
- package/dist/macro-engine.d.ts.map +1 -1
- package/dist/macro-engine.js +5 -238
- package/dist/macro-engine.js.map +1 -1
- package/dist/payload-command.d.ts +6 -6
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js.map +1 -1
- package/dist/payload-state.d.ts +16 -0
- package/dist/payload-state.d.ts.map +1 -0
- package/dist/payload-state.js +14 -0
- package/dist/payload-state.js.map +1 -0
- package/dist/preset-command.d.ts +4 -4
- package/dist/preset-command.d.ts.map +1 -1
- package/dist/preset-command.js +33 -104
- package/dist/preset-command.js.map +1 -1
- package/dist/preview.d.ts +4 -4
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +17 -8
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.d.ts +2 -2
- package/dist/profile-command.d.ts.map +1 -1
- package/dist/profile-command.js +15 -14
- package/dist/profile-command.js.map +1 -1
- package/dist/profile-service.d.ts.map +1 -1
- package/dist/profile-service.js +23 -39
- package/dist/profile-service.js.map +1 -1
- package/dist/prompt-analysis.d.ts +24 -0
- package/dist/prompt-analysis.d.ts.map +1 -0
- package/dist/prompt-analysis.js +84 -0
- package/dist/prompt-analysis.js.map +1 -0
- package/dist/prompt-runtime.d.ts +19 -0
- package/dist/prompt-runtime.d.ts.map +1 -0
- package/dist/prompt-runtime.js +30 -0
- package/dist/prompt-runtime.js.map +1 -0
- package/dist/regex.js +6 -12
- package/dist/regex.js.map +1 -1
- package/dist/render-helpers.d.ts +2 -10
- package/dist/render-helpers.d.ts.map +1 -1
- package/dist/render-helpers.js +3 -53
- package/dist/render-helpers.js.map +1 -1
- package/dist/repositories/agent-profile.d.ts +36 -0
- package/dist/repositories/agent-profile.d.ts.map +1 -0
- package/dist/repositories/agent-profile.js +153 -0
- package/dist/repositories/agent-profile.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +3 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/prompt-stack.d.ts +57 -0
- package/dist/repositories/prompt-stack.d.ts.map +1 -0
- package/dist/repositories/prompt-stack.js +175 -0
- package/dist/repositories/prompt-stack.js.map +1 -0
- package/dist/runtime/profile-runtime.d.ts +2 -2
- package/dist/runtime/profile-runtime.d.ts.map +1 -1
- package/dist/runtime/profile-runtime.js +13 -10
- package/dist/runtime/profile-runtime.js.map +1 -1
- package/dist/runtime/prompt-stack-runtime.d.ts +4 -3
- package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
- package/dist/runtime/prompt-stack-runtime.js +42 -57
- package/dist/runtime/prompt-stack-runtime.js.map +1 -1
- package/dist/runtime/tool-policy-runtime.d.ts +2 -2
- package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
- package/dist/runtime/tool-policy-runtime.js +3 -3
- package/dist/runtime/tool-policy-runtime.js.map +1 -1
- package/dist/session-adapter.d.ts +17 -0
- package/dist/session-adapter.d.ts.map +1 -0
- package/dist/session-adapter.js +57 -0
- package/dist/session-adapter.js.map +1 -0
- package/dist/slot-renderers.d.ts +16 -3
- package/dist/slot-renderers.d.ts.map +1 -1
- package/dist/slot-renderers.js +15 -63
- package/dist/slot-renderers.js.map +1 -1
- package/dist/stack-migration.d.ts +6 -0
- package/dist/stack-migration.d.ts.map +1 -1
- package/dist/stack-migration.js +49 -52
- package/dist/stack-migration.js.map +1 -1
- package/dist/subagent/fingerprints.d.ts +24 -0
- package/dist/subagent/fingerprints.d.ts.map +1 -0
- package/dist/subagent/fingerprints.js +81 -0
- package/dist/subagent/fingerprints.js.map +1 -0
- package/dist/subagent/host-port.d.ts +296 -0
- package/dist/subagent/host-port.d.ts.map +1 -0
- package/dist/subagent/host-port.js +560 -0
- package/dist/subagent/host-port.js.map +1 -0
- package/dist/subagent/index.d.ts +10 -10
- package/dist/subagent/index.d.ts.map +1 -1
- package/dist/subagent/index.js +9 -10
- package/dist/subagent/index.js.map +1 -1
- package/dist/subagent-host.d.ts +99 -18
- package/dist/subagent-host.d.ts.map +1 -1
- package/dist/subagent-host.js +143 -146
- package/dist/subagent-host.js.map +1 -1
- package/dist/template-render.d.ts +18 -0
- package/dist/template-render.d.ts.map +1 -0
- package/dist/template-render.js +232 -0
- package/dist/template-render.js.map +1 -0
- package/dist/types.d.ts +40 -27
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web-editor/client-script.generated.d.ts.map +1 -1
- package/dist/web-editor/client-script.generated.js +1 -1
- package/dist/web-editor/client-script.generated.js.map +1 -1
- package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
- package/dist/web-editor/client-styles.generated.js +1 -1
- package/dist/web-editor/client-styles.generated.js.map +1 -1
- package/dist/web-editor/server.d.ts.map +1 -1
- package/dist/web-editor/server.js +1 -68
- package/dist/web-editor/server.js.map +1 -1
- package/dist/web-editor/styles.d.ts.map +1 -1
- package/dist/web-editor/styles.js +13 -0
- package/dist/web-editor/styles.js.map +1 -1
- package/dist/web-editor/types.d.ts +0 -35
- package/dist/web-editor/types.d.ts.map +1 -1
- package/dist/web-host.d.ts +4 -2
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +32 -103
- package/dist/web-host.js.map +1 -1
- package/dist/workspace.d.ts +74 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +351 -0
- package/dist/workspace.js.map +1 -0
- package/docs/README.md +6 -4
- package/docs/concepts/agent-profiles.md +1 -1
- package/docs/concepts/prompt-stacks.md +5 -5
- package/docs/design/README.md +21 -3
- package/docs/design/architecture-0.5.md +211 -0
- package/docs/design/archive/0.5-full-proposal/0.5-consumer-audit.md +62 -0
- package/docs/design/archive/0.5-full-proposal/0.5-inventory.md +208 -0
- package/docs/design/archive/0.5-full-proposal/0.5-phase0-decision-drafts.md +237 -0
- package/docs/design/archive/0.5-full-proposal/README.md +12 -0
- package/docs/design/archive/0.5-full-proposal/architecture-0.5.md +423 -0
- package/docs/design/archive/0.5-full-proposal/host-discovery-spike.md +103 -0
- package/docs/design/archive/0.5-full-proposal/template-language-spike.md +156 -0
- package/docs/design/context-diff-plan.md +72 -0
- package/docs/design/decision-template.md +33 -0
- package/docs/design/roadmap-0.4-archive.md +1 -1
- package/docs/design/subagents/interface-design.md +1 -1
- package/docs/development/architecture-rules.md +148 -0
- package/docs/development/roadmap.md +37 -5
- package/docs/development/scoped-global-profiles-stacks.md +1 -1
- package/docs/development/setup.md +6 -4
- package/docs/getting-started.md +5 -4
- package/docs/guides/custom-macros-and-slots.md +8 -7
- package/docs/guides/debugging.md +1 -1
- package/docs/guides/delegation.md +18 -22
- package/docs/guides/migrating-to-0.5.md +107 -0
- package/docs/guides/use-cases.md +7 -11
- package/docs/guides/web-editor.md +5 -9
- package/docs/reference/commands.md +4 -3
- package/docs/reference/configuration.md +17 -18
- package/docs/reference/features.md +34 -80
- package/docs/reference/macros-and-slots.md +70 -49
- package/docs/reference/public-api.md +64 -17
- package/docs/reference/stack-schema.md +14 -9
- package/docs/reference/subagent-host-port.md +49 -0
- package/docs/zh-CN/README.md +3 -3
- package/docs/zh-CN/concepts/agent-profiles.md +1 -1
- package/docs/zh-CN/concepts/prompt-stacks.md +4 -4
- package/docs/zh-CN/getting-started.md +3 -2
- package/docs/zh-CN/guides/delegation.md +10 -12
- package/docs/zh-CN/guides/migrating-to-0.5.md +92 -0
- package/docs/zh-CN/guides/web-editor.md +4 -4
- package/docs/zh-CN/reference/commands.md +3 -2
- package/examples/custom-system-status-extension/README.md +3 -3
- package/examples/custom-system-status-extension/index.ts +2 -1
- package/examples/custom-system-status-extension/prompt-stack.json +4 -3
- package/examples/default-prompt-stack.json +9 -4
- package/examples/image-reader-prompt-stack.json +16 -26
- package/examples/reviewer-prompt-stack.json +13 -24
- package/package.json +101 -120
- package/dist/runtime/subagent-runtime.d.ts +0 -45
- package/dist/runtime/subagent-runtime.d.ts.map +0 -1
- package/dist/runtime/subagent-runtime.js +0 -343
- package/dist/runtime/subagent-runtime.js.map +0 -1
- package/dist/runtime-state.d.ts +0 -30
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js +0 -17
- package/dist/runtime-state.js.map +0 -1
- package/dist/sillytavern-importer/items.d.ts +0 -3
- package/dist/sillytavern-importer/items.d.ts.map +0 -1
- package/dist/sillytavern-importer/items.js +0 -88
- package/dist/sillytavern-importer/items.js.map +0 -1
- package/dist/sillytavern-importer/macros.d.ts +0 -15
- package/dist/sillytavern-importer/macros.d.ts.map +0 -1
- package/dist/sillytavern-importer/macros.js +0 -141
- package/dist/sillytavern-importer/macros.js.map +0 -1
- package/dist/sillytavern-importer/prompt-order.d.ts +0 -6
- package/dist/sillytavern-importer/prompt-order.d.ts.map +0 -1
- package/dist/sillytavern-importer/prompt-order.js +0 -38
- package/dist/sillytavern-importer/prompt-order.js.map +0 -1
- package/dist/sillytavern-importer/regex.d.ts +0 -3
- package/dist/sillytavern-importer/regex.d.ts.map +0 -1
- package/dist/sillytavern-importer/regex.js +0 -275
- package/dist/sillytavern-importer/regex.js.map +0 -1
- package/dist/sillytavern-importer/report.d.ts +0 -21
- package/dist/sillytavern-importer/report.d.ts.map +0 -1
- package/dist/sillytavern-importer/report.js +0 -166
- package/dist/sillytavern-importer/report.js.map +0 -1
- package/dist/sillytavern-importer/types.d.ts +0 -106
- package/dist/sillytavern-importer/types.d.ts.map +0 -1
- package/dist/sillytavern-importer/types.js +0 -2
- package/dist/sillytavern-importer/types.js.map +0 -1
- package/dist/sillytavern-importer.d.ts +0 -5
- package/dist/sillytavern-importer.d.ts.map +0 -1
- package/dist/sillytavern-importer.js +0 -117
- package/dist/sillytavern-importer.js.map +0 -1
- package/dist/subagent/canonical.d.ts +0 -22
- package/dist/subagent/canonical.d.ts.map +0 -1
- package/dist/subagent/canonical.js +0 -24
- package/dist/subagent/canonical.js.map +0 -1
- package/dist/subagent/context.d.ts +0 -8
- package/dist/subagent/context.d.ts.map +0 -1
- package/dist/subagent/context.js +0 -125
- package/dist/subagent/context.js.map +0 -1
- package/dist/subagent/contract.d.ts +0 -10
- package/dist/subagent/contract.d.ts.map +0 -1
- package/dist/subagent/contract.js +0 -10
- package/dist/subagent/contract.js.map +0 -1
- package/dist/subagent/plan.d.ts +0 -18
- package/dist/subagent/plan.d.ts.map +0 -1
- package/dist/subagent/plan.js +0 -157
- package/dist/subagent/plan.js.map +0 -1
- package/dist/subagent/preflight.d.ts +0 -4
- package/dist/subagent/preflight.d.ts.map +0 -1
- package/dist/subagent/preflight.js +0 -108
- package/dist/subagent/preflight.js.map +0 -1
- package/dist/subagent/request.d.ts +0 -4
- package/dist/subagent/request.d.ts.map +0 -1
- package/dist/subagent/request.js +0 -154
- package/dist/subagent/request.js.map +0 -1
- package/dist/subagent/response.d.ts +0 -8
- package/dist/subagent/response.d.ts.map +0 -1
- package/dist/subagent/response.js +0 -155
- package/dist/subagent/response.js.map +0 -1
- package/dist/subagent/tools.d.ts +0 -4
- package/dist/subagent/tools.d.ts.map +0 -1
- package/dist/subagent/tools.js +0 -42
- package/dist/subagent/tools.js.map +0 -1
- package/dist/subagent/types.d.ts +0 -272
- package/dist/subagent/types.d.ts.map +0 -1
- package/dist/subagent/types.js +0 -3
- package/dist/subagent/types.js.map +0 -1
- package/dist/subagent/validation.d.ts +0 -35
- package/dist/subagent/validation.d.ts.map +0 -1
- package/dist/subagent/validation.js +0 -314
- package/dist/subagent/validation.js.map +0 -1
- package/dist/subagent-command.d.ts +0 -5
- package/dist/subagent-command.d.ts.map +0 -1
- package/dist/subagent-command.js +0 -249
- package/dist/subagent-command.js.map +0 -1
- package/dist/subagent-profile-tool.d.ts +0 -49
- package/dist/subagent-profile-tool.d.ts.map +0 -1
- package/dist/subagent-profile-tool.js +0 -125
- package/dist/subagent-profile-tool.js.map +0 -1
- package/dist/subagent-tool.d.ts +0 -77
- package/dist/subagent-tool.d.ts.map +0 -1
- package/dist/subagent-tool.js +0 -559
- package/dist/subagent-tool.js.map +0 -1
- package/docs/guides/sillytavern-import.md +0 -47
- package/docs/reference/subagent-adapter.md +0 -204
- package/examples/sillytavern-dm-writer-prompt-stack.json +0 -190
package/dist/subagent-tool.js
DELETED
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
import { getMarkdownTheme, } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
3
|
-
import { Type } from "typebox";
|
|
4
|
-
import { loadForgeSubagentSettings, resolveSubagentProfilePolicy } from "./forge-config.js";
|
|
5
|
-
import { formatResourceKey } from "./resource-identity.js";
|
|
6
|
-
import { summarizeProfile } from "./subagent-profile-tool.js";
|
|
7
|
-
import { sanitizePiSubprocessRunReport, } from "@zihanw/pi-subagent-runtime/backends/subprocess";
|
|
8
|
-
import { isRecord } from "@zihanw/pi-subagent-runtime";
|
|
9
|
-
const APPROVE = "Approve and run";
|
|
10
|
-
const VIEW_FULL_PROMPT = "View full prompt";
|
|
11
|
-
const REJECT = "Reject";
|
|
12
|
-
const MAX_PROGRESS_ITEMS = 100;
|
|
13
|
-
const MAX_APPROVAL_TASK_PREVIEW_CHARS = 48;
|
|
14
|
-
const MAX_APPROVAL_EXECUTION_PREVIEW_CHARS = 44;
|
|
15
|
-
const MAX_APPROVAL_PATH_PREVIEW_CHARS = 44;
|
|
16
|
-
const MAX_APPROVAL_FINGERPRINT_PREVIEW_CHARS = 24;
|
|
17
|
-
const MAX_EMBEDDED_PROFILES = 8;
|
|
18
|
-
const MAX_EMBEDDED_SUMMARY_CHARS = 1_000;
|
|
19
|
-
const ForgeSubagentParameters = Type.Object({
|
|
20
|
-
profileId: Type.String({
|
|
21
|
-
minLength: 1,
|
|
22
|
-
description: "ID of a Pi Forge agent profile explicitly enabled for subagent delegation.",
|
|
23
|
-
}),
|
|
24
|
-
task: Type.String({
|
|
25
|
-
minLength: 1,
|
|
26
|
-
description: "The focused task to delegate to the subagent.",
|
|
27
|
-
}),
|
|
28
|
-
backend: Type.Optional(Type.String({
|
|
29
|
-
minLength: 1,
|
|
30
|
-
description: "Backend ID to prepare and execute through (see /forge-agent backends). Honored only for interactively approved runs; trusted-project unattended invocation always uses the configured default backend.",
|
|
31
|
-
})),
|
|
32
|
-
});
|
|
33
|
-
export function registerForgeSubagentTool(pi, runtime, profileIds, resolveProfileKey, options = {}) {
|
|
34
|
-
// The description is static at registration time; re-registering the tool
|
|
35
|
-
// by name replaces its definition and refreshes the tool registry. Track
|
|
36
|
-
// the last embedded summary so lifecycle refreshes (every turn included)
|
|
37
|
-
// are no-ops unless the profile summary actually changed.
|
|
38
|
-
let lastSummary;
|
|
39
|
-
function register(embedded) {
|
|
40
|
-
pi.registerTool({
|
|
41
|
-
name: "forge_subagent",
|
|
42
|
-
label: "Forge Subagent",
|
|
43
|
-
description: forgeSubagentToolDescription(embedded),
|
|
44
|
-
parameters: ForgeSubagentParameters,
|
|
45
|
-
// Parallel execution lets the parent model issue several subagent calls
|
|
46
|
-
// in one turn. Pi serializes a whole batch only when any call in it is
|
|
47
|
-
// sequential; approvals stay safe because requestForgeSubagentApproval
|
|
48
|
-
// serializes its dialogs internally.
|
|
49
|
-
executionMode: "parallel",
|
|
50
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
51
|
-
const settings = loadForgeSubagentSettings(ctx);
|
|
52
|
-
const approvalRequired = !settings.allowAgentInvocationWithoutApproval;
|
|
53
|
-
const configDiagnostics = settings.warnings.map((message) => ({ level: "warning", code: "host.config", message }));
|
|
54
|
-
const baseDetails = {
|
|
55
|
-
status: "preparing",
|
|
56
|
-
profileId: params.profileId,
|
|
57
|
-
task: params.task,
|
|
58
|
-
approval: {
|
|
59
|
-
required: approvalRequired,
|
|
60
|
-
approved: false,
|
|
61
|
-
viewedFullPrompt: false,
|
|
62
|
-
source: approvalRequired ? "none" : "trusted-project-config",
|
|
63
|
-
},
|
|
64
|
-
diagnostics: configDiagnostics,
|
|
65
|
-
progress: [],
|
|
66
|
-
};
|
|
67
|
-
const knownProfileIds = profileIds();
|
|
68
|
-
const enabledProfileIds = knownProfileIds.filter((profileId) => resolveSubagentProfilePolicy(settings, profileId).enabled);
|
|
69
|
-
const profileKey = resolveProfileKey(params.profileId);
|
|
70
|
-
if (!profileKey) {
|
|
71
|
-
const available = enabledProfileIds.join(", ") || "none";
|
|
72
|
-
return toolResult(`Unknown Pi Forge agent profile: ${params.profileId}. Enabled subagent profiles: ${available}.`, { ...baseDetails, status: "failed" }, true);
|
|
73
|
-
}
|
|
74
|
-
const canonicalProfileId = formatResourceKey(profileKey);
|
|
75
|
-
baseDetails.profileId = canonicalProfileId;
|
|
76
|
-
const configuredPolicy = resolveSubagentProfilePolicy(settings, canonicalProfileId);
|
|
77
|
-
if (!configuredPolicy.enabled) {
|
|
78
|
-
return toolResult(`Pi Forge agent profile "${params.profileId}" is not enabled for subagent delegation. Use forge_subagent_profiles to discover enabled profiles.`, { ...baseDetails, status: "failed" }, true);
|
|
79
|
-
}
|
|
80
|
-
const configuredBackend = configuredPolicy.backend;
|
|
81
|
-
if (!approvalRequired && params.backend && params.backend !== configuredBackend.id) {
|
|
82
|
-
return toolResult(`Subagent invocation was not run: unattended invocation is pinned to the configured backend "${configuredBackend.id}". To use "${params.backend}", run interactively or change the trusted subagent configuration.`, {
|
|
83
|
-
...baseDetails,
|
|
84
|
-
status: "failed",
|
|
85
|
-
approval: { required: false, approved: false, viewedFullPrompt: false, source: "trusted-project-config" },
|
|
86
|
-
}, true);
|
|
87
|
-
}
|
|
88
|
-
const runPolicy = resolveSubagentProfilePolicy(settings, canonicalProfileId, approvalRequired ? params.backend : undefined);
|
|
89
|
-
if (approvalRequired && !ctx.hasUI) {
|
|
90
|
-
return toolResult("Subagent invocation was not run: interactive human approval is unavailable.", { ...baseDetails, status: "cancelled" });
|
|
91
|
-
}
|
|
92
|
-
onUpdate?.(toolResult("Preparing the exact subagent prompt; provider transport is still closed.", baseDetails));
|
|
93
|
-
let prepared;
|
|
94
|
-
try {
|
|
95
|
-
const preparation = await runtime.prepare(canonicalProfileId, params.task, ctx, {
|
|
96
|
-
backendId: runPolicy.backend.id,
|
|
97
|
-
timeoutMs: runPolicy.timeout.milliseconds,
|
|
98
|
-
});
|
|
99
|
-
if (!preparation.ok) {
|
|
100
|
-
const diagnostics = [...configDiagnostics, ...preparation.diagnostics];
|
|
101
|
-
return toolResult(`Subagent preparation failed:\n${renderDiagnostics(diagnostics)}`, { ...baseDetails, status: "failed", diagnostics }, true);
|
|
102
|
-
}
|
|
103
|
-
prepared = preparation.prepared;
|
|
104
|
-
const plan = summarizeForgeSubagentPlan(prepared, ctx.cwd);
|
|
105
|
-
const preparedDetails = {
|
|
106
|
-
...baseDetails,
|
|
107
|
-
status: approvalRequired ? "awaiting-approval" : "prepared",
|
|
108
|
-
plan,
|
|
109
|
-
diagnostics: [...configDiagnostics, ...prepared.diagnostics],
|
|
110
|
-
};
|
|
111
|
-
onUpdate?.(toolResult(approvalRequired
|
|
112
|
-
? "The exact plan is ready and awaiting human approval."
|
|
113
|
-
: "The exact plan is ready; per-run approval is bypassed by trusted-project configuration.", preparedDetails));
|
|
114
|
-
const approval = approvalRequired
|
|
115
|
-
? await requestForgeSubagentApproval(prepared, params.task, ctx, signal)
|
|
116
|
-
: { approved: true, viewedFullPrompt: false };
|
|
117
|
-
if (!approval.approved) {
|
|
118
|
-
await runtime.discard(prepared);
|
|
119
|
-
prepared = undefined;
|
|
120
|
-
return toolResult("Subagent invocation was rejected by the human before provider transport.", {
|
|
121
|
-
...preparedDetails,
|
|
122
|
-
status: "cancelled",
|
|
123
|
-
approval: { required: true, approved: false, viewedFullPrompt: approval.viewedFullPrompt, source: "none" },
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
const approvedAt = new Date().toISOString();
|
|
127
|
-
const progress = [];
|
|
128
|
-
const running = {
|
|
129
|
-
...preparedDetails,
|
|
130
|
-
status: "running",
|
|
131
|
-
approval: {
|
|
132
|
-
required: approvalRequired,
|
|
133
|
-
approved: true,
|
|
134
|
-
viewedFullPrompt: approval.viewedFullPrompt,
|
|
135
|
-
source: approvalRequired ? "human" : "trusted-project-config",
|
|
136
|
-
executionFingerprint: prepared.plan.executionFingerprint,
|
|
137
|
-
approvedAt,
|
|
138
|
-
},
|
|
139
|
-
progress,
|
|
140
|
-
};
|
|
141
|
-
const response = await runtime.execute(prepared, ctx, signal, (update) => {
|
|
142
|
-
progress.push(structuredClone(update));
|
|
143
|
-
if (progress.length > MAX_PROGRESS_ITEMS)
|
|
144
|
-
progress.splice(0, progress.length - MAX_PROGRESS_ITEMS);
|
|
145
|
-
onUpdate?.(toolResult(truncate(update.message, 2_000), { ...running, progress: [...progress] }));
|
|
146
|
-
});
|
|
147
|
-
prepared = undefined;
|
|
148
|
-
const rawReport = runtime.takeReport?.(response.runId);
|
|
149
|
-
const report = rawReport ? sanitizePiSubprocessRunReport(rawReport) : undefined;
|
|
150
|
-
const finalDetails = {
|
|
151
|
-
...running,
|
|
152
|
-
status: toolStatus(response),
|
|
153
|
-
progress: [...progress],
|
|
154
|
-
response,
|
|
155
|
-
report,
|
|
156
|
-
};
|
|
157
|
-
return toolResult(renderResponseForModel(response), finalDetails, response.status === "failed");
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
if (prepared)
|
|
161
|
-
await runtime.discard(prepared).catch(() => undefined);
|
|
162
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
163
|
-
return toolResult(`Subagent invocation failed: ${message}`, { ...baseDetails, status: "failed" }, true);
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
renderCall(args, theme) {
|
|
167
|
-
const task = truncate(args.task.replace(/\s+/g, " ").trim(), 100);
|
|
168
|
-
return new Text(`${theme.fg("toolTitle", theme.bold("forge subagent "))}${theme.fg("accent", args.profileId)}\n${theme.fg("dim", task)}`, 0, 0);
|
|
169
|
-
},
|
|
170
|
-
renderResult(result, { expanded, isPartial }, theme) {
|
|
171
|
-
const details = result.details;
|
|
172
|
-
if (!details)
|
|
173
|
-
return new Text(textContent(result) || "(no subagent result)", 0, 0);
|
|
174
|
-
if (!expanded)
|
|
175
|
-
return renderCollapsedResult(result, details, isPartial, theme);
|
|
176
|
-
return renderExpandedResult(result, details, theme);
|
|
177
|
-
},
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
function refresh(ctx) {
|
|
181
|
-
const summary = options.summarize?.(ctx);
|
|
182
|
-
if (summary === lastSummary)
|
|
183
|
-
return;
|
|
184
|
-
lastSummary = summary;
|
|
185
|
-
register(summary);
|
|
186
|
-
}
|
|
187
|
-
register(undefined);
|
|
188
|
-
return refresh;
|
|
189
|
-
}
|
|
190
|
-
function forgeSubagentToolDescription(embedded) {
|
|
191
|
-
const lines = [
|
|
192
|
-
"Delegate one foreground task to a Pi Forge agent profile explicitly enabled in subagents.profiles.",
|
|
193
|
-
"Multiple forge_subagent calls in one turn run concurrently; interactive approvals are serialized one at a time.",
|
|
194
|
-
embedded
|
|
195
|
-
? "The enabled profiles are summarized below; run forge_subagent_profiles for full descriptions, diagnostics, and approval mode."
|
|
196
|
-
: "Use forge_subagent_profiles first when the user has not already specified a profile ID.",
|
|
197
|
-
"Runs require human approval after exact preparation unless the trusted project explicitly enables unattended agent invocation.",
|
|
198
|
-
"The child receives only approved read tools, but runs with the invoking user's OS permissions; read-only is not a sandbox.",
|
|
199
|
-
"The optional backend parameter selects the execution backend for interactively approved runs; unattended invocation always uses the configured default backend.",
|
|
200
|
-
"Use the final report as evidence and do not repeatedly request the same rejected delegation.",
|
|
201
|
-
].join(" ");
|
|
202
|
-
return embedded ? `${lines}\n\n${embedded}` : lines;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Compact summary of enabled subagent profiles for the forge_subagent tool
|
|
206
|
-
* description. Rendered only when subagents.summaryInToolDescription
|
|
207
|
-
* is enabled; ready profiles come first, unavailable profiles stay visible so
|
|
208
|
-
* the model does not attempt them. Returns undefined when disabled or when no
|
|
209
|
-
* profile is enabled for delegation.
|
|
210
|
-
*/
|
|
211
|
-
export function renderEmbeddedSubagentSummary(settings, profiles, resolve) {
|
|
212
|
-
if (!settings.summaryInToolDescription)
|
|
213
|
-
return undefined;
|
|
214
|
-
const summaries = [];
|
|
215
|
-
for (const loaded of profiles) {
|
|
216
|
-
const policy = resolveSubagentProfilePolicy(settings, formatResourceKey(loaded.key));
|
|
217
|
-
if (!policy.enabled)
|
|
218
|
-
continue;
|
|
219
|
-
summaries.push(summarizeProfile(loaded, resolve(loaded), policy));
|
|
220
|
-
}
|
|
221
|
-
if (summaries.length === 0)
|
|
222
|
-
return undefined;
|
|
223
|
-
const readyFirst = [...summaries].sort((a, b) => statusRank(a.status) - statusRank(b.status));
|
|
224
|
-
return renderEmbeddedSummaryText(readyFirst);
|
|
225
|
-
}
|
|
226
|
-
export function renderEmbeddedSummaryText(summaries) {
|
|
227
|
-
const total = summaries.length;
|
|
228
|
-
const visible = summaries.slice(0, MAX_EMBEDDED_PROFILES);
|
|
229
|
-
const lines = ["Enabled subagent profiles:"];
|
|
230
|
-
for (const profile of visible)
|
|
231
|
-
lines.push(`- ${embeddedProfileLine(profile)}`);
|
|
232
|
-
if (total > visible.length) {
|
|
233
|
-
const omitted = total - visible.length;
|
|
234
|
-
lines.push(`- ... and ${omitted} more enabled profile${omitted === 1 ? "" : "s"} (forge_subagent_profiles lists all)`);
|
|
235
|
-
}
|
|
236
|
-
const text = lines.join("\n");
|
|
237
|
-
return text.length <= MAX_EMBEDDED_SUMMARY_CHARS
|
|
238
|
-
? text
|
|
239
|
-
: `${text.slice(0, Math.max(0, MAX_EMBEDDED_SUMMARY_CHARS - 3))}...`;
|
|
240
|
-
}
|
|
241
|
-
function statusRank(status) {
|
|
242
|
-
return status === "ready" ? 0 : 1;
|
|
243
|
-
}
|
|
244
|
-
function embeddedProfileLine(profile) {
|
|
245
|
-
const label = profile.name ? `${profile.id} — ${compact(profile.name)}` : profile.id;
|
|
246
|
-
const target = `${profile.model.provider}/${profile.model.id} · thinking ${profile.thinkingLevel} · stack ${profile.promptStack ?? "none"}`;
|
|
247
|
-
const execution = `backend ${profile.backend.id} · ${formatTimeoutMs(profile.timeout.milliseconds)}`;
|
|
248
|
-
if (profile.status === "ready")
|
|
249
|
-
return `${label}: ${target}; ${execution}`;
|
|
250
|
-
const reason = profile.diagnostics.find((diagnostic) => diagnostic.level === "error")?.message
|
|
251
|
-
?? "profile resolution failed";
|
|
252
|
-
return `${label}: ${target}; ${execution} (unavailable: ${compact(reason)})`;
|
|
253
|
-
}
|
|
254
|
-
function formatTimeoutMs(milliseconds) {
|
|
255
|
-
return milliseconds % 1_000 === 0 ? `${milliseconds / 1_000}s` : `${milliseconds}ms`;
|
|
256
|
-
}
|
|
257
|
-
// Pi's select/editor UI is a single slot: a second concurrent dialog clears
|
|
258
|
-
// the first component and leaves its promise permanently unresolved. Parallel
|
|
259
|
-
// tool calls must therefore serialize the interactive approval flow through
|
|
260
|
-
// this gate. Execution after each approval is not gated, so approved runs
|
|
261
|
-
// still overlap; unattended invocation never enters the gate.
|
|
262
|
-
let approvalDialogGate = Promise.resolve();
|
|
263
|
-
function withApprovalDialog(run) {
|
|
264
|
-
const next = approvalDialogGate.then(run);
|
|
265
|
-
approvalDialogGate = next.then(() => undefined, () => undefined);
|
|
266
|
-
return next;
|
|
267
|
-
}
|
|
268
|
-
export async function requestForgeSubagentApproval(prepared, task, ctx, signal) {
|
|
269
|
-
return withApprovalDialog(async () => {
|
|
270
|
-
let viewedFullPrompt = false;
|
|
271
|
-
while (!signal?.aborted) {
|
|
272
|
-
const choice = await ctx.ui.select(renderApprovalSummary(prepared, task, ctx.cwd), [APPROVE, VIEW_FULL_PROMPT, REJECT], { signal });
|
|
273
|
-
if (choice === VIEW_FULL_PROMPT) {
|
|
274
|
-
viewedFullPrompt = true;
|
|
275
|
-
await ctx.ui.editor(`Subagent approval details: ${prepared.plan.profile.profileId} (view only; edits are ignored)`, [
|
|
276
|
-
renderApprovalDetails(prepared, task, ctx.cwd),
|
|
277
|
-
"",
|
|
278
|
-
renderFullForgeSubagentPrompt(prepared),
|
|
279
|
-
].join("\n"));
|
|
280
|
-
continue;
|
|
281
|
-
}
|
|
282
|
-
return { approved: choice === APPROVE, viewedFullPrompt };
|
|
283
|
-
}
|
|
284
|
-
return { approved: false, viewedFullPrompt };
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
export function summarizeForgeSubagentPlan(prepared, cwd) {
|
|
288
|
-
const plan = prepared.plan;
|
|
289
|
-
return {
|
|
290
|
-
backendId: plan.backendId,
|
|
291
|
-
profileId: plan.profile.profileId,
|
|
292
|
-
promptStackId: plan.profile.promptStackId,
|
|
293
|
-
provider: plan.model.provider,
|
|
294
|
-
model: plan.model.id,
|
|
295
|
-
thinkingLevel: plan.thinkingLevel,
|
|
296
|
-
effectiveToolIds: [...plan.effectiveToolIds],
|
|
297
|
-
executionBoundary: plan.access.executionBoundary ?? "isolated",
|
|
298
|
-
workingDirectory: cwd,
|
|
299
|
-
systemPromptChars: plan.systemPrompt.length,
|
|
300
|
-
messageCount: plan.messages.length,
|
|
301
|
-
messageRoles: plan.messages.map((message) => message.role),
|
|
302
|
-
...(plan.limits.timeoutMs ? {
|
|
303
|
-
timeoutMs: plan.limits.timeoutMs.value,
|
|
304
|
-
timeoutEnforcement: plan.limits.timeoutMs.enforcement,
|
|
305
|
-
} : {}),
|
|
306
|
-
promptRuntimeFingerprint: plan.promptRuntimeFingerprint,
|
|
307
|
-
conversationFingerprint: plan.conversationFingerprint,
|
|
308
|
-
executionFingerprint: plan.executionFingerprint,
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
export function renderApprovalSummary(prepared, task, cwd) {
|
|
312
|
-
const plan = prepared.plan;
|
|
313
|
-
const summary = summarizeForgeSubagentPlan(prepared, cwd);
|
|
314
|
-
const timeout = summary.timeoutMs === undefined
|
|
315
|
-
? "none"
|
|
316
|
-
: `${summary.timeoutMs} ms ${summary.timeoutEnforcement ?? "unknown enforcement"}`;
|
|
317
|
-
return [
|
|
318
|
-
`Run foreground subagent ${oneLinePreview(summary.profileId, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}?`,
|
|
319
|
-
`Task: ${oneLinePreview(task, MAX_APPROVAL_TASK_PREVIEW_CHARS)}`,
|
|
320
|
-
`Backend: ${oneLinePreview(summary.backendId, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
|
|
321
|
-
`Model: ${oneLinePreview(`${summary.provider}/${summary.model} · thinking ${summary.thinkingLevel}`, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
|
|
322
|
-
`Stack/tools: ${oneLinePreview(`${summary.promptStackId ?? "none"} · ${toolNames(plan).join(", ") || "none"}`, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
|
|
323
|
-
`Directory: ${oneLinePreview(summary.workingDirectory, MAX_APPROVAL_PATH_PREVIEW_CHARS)}`,
|
|
324
|
-
`Boundary: ${oneLinePreview(summary.executionBoundary, 16)} · ${timeout}`,
|
|
325
|
-
`Payload: ${summary.systemPromptChars} system chars + ${summary.messageCount} messages`,
|
|
326
|
-
`Execution: ${compactIdentifier(summary.executionFingerprint, MAX_APPROVAL_FINGERPRINT_PREVIEW_CHARS)} (see full prompt)`,
|
|
327
|
-
"No OS sandbox; provider gets prompt/files read by agent.",
|
|
328
|
-
].join("\n");
|
|
329
|
-
}
|
|
330
|
-
export function renderApprovalDetails(prepared, task, cwd) {
|
|
331
|
-
const plan = prepared.plan;
|
|
332
|
-
const summary = summarizeForgeSubagentPlan(prepared, cwd);
|
|
333
|
-
return [
|
|
334
|
-
"# Subagent approval details",
|
|
335
|
-
"",
|
|
336
|
-
"Agent prompt:",
|
|
337
|
-
indent(truncate(task, 2_000)),
|
|
338
|
-
"",
|
|
339
|
-
`Backend: ${summary.backendId}`,
|
|
340
|
-
`Provider: ${summary.provider}`,
|
|
341
|
-
`Model: ${summary.model}`,
|
|
342
|
-
`Thinking: ${summary.thinkingLevel}`,
|
|
343
|
-
`Prompt stack: ${summary.promptStackId ?? "none"}`,
|
|
344
|
-
`Tools: ${toolNames(plan).join(", ") || "none"}`,
|
|
345
|
-
`Working directory: ${summary.workingDirectory}`,
|
|
346
|
-
`Boundary: ${summary.executionBoundary} (read-only tool policy; no OS sandbox)`,
|
|
347
|
-
...(summary.timeoutMs === undefined ? [] : [`Timeout: ${summary.timeoutMs} ms (${summary.timeoutEnforcement ?? "unknown enforcement"})`]),
|
|
348
|
-
`Full payload: ${summary.systemPromptChars} system chars + ${summary.messageCount} messages`,
|
|
349
|
-
`Prompt runtime fingerprint: ${summary.promptRuntimeFingerprint}`,
|
|
350
|
-
`Conversation fingerprint: ${summary.conversationFingerprint}`,
|
|
351
|
-
`Execution fingerprint: ${summary.executionFingerprint}`,
|
|
352
|
-
"",
|
|
353
|
-
"The provider receives the compiled prompt and any files the read tools access.",
|
|
354
|
-
"The subprocess retains your user permissions even though write/process tools are unavailable.",
|
|
355
|
-
].join("\n");
|
|
356
|
-
}
|
|
357
|
-
export function renderFullForgeSubagentPrompt(prepared) {
|
|
358
|
-
const plan = prepared.plan;
|
|
359
|
-
const messages = plan.messages.flatMap((message, index) => [
|
|
360
|
-
`## Message ${index + 1}: ${message.role}${message.protectedTask ? " (protected delegated task)" : ""}${message.source ? ` [${message.source}]` : ""}`,
|
|
361
|
-
"",
|
|
362
|
-
message.content.map((part) => part.type === "text" ? part.text : `[${part.mimeType} media ${part.mediaId}]`).join("\n"),
|
|
363
|
-
"",
|
|
364
|
-
]);
|
|
365
|
-
return [
|
|
366
|
-
`# Exact provider-bound subagent prompt`,
|
|
367
|
-
"",
|
|
368
|
-
`Backend: ${plan.backendId}`,
|
|
369
|
-
`Profile: ${plan.profile.profileId}`,
|
|
370
|
-
`Provider/model: ${plan.model.provider}/${plan.model.id}`,
|
|
371
|
-
`Thinking: ${plan.thinkingLevel}`,
|
|
372
|
-
`Tools: ${toolNames(plan).join(", ") || "none"}`,
|
|
373
|
-
`Timeout: ${plan.limits.timeoutMs ? `${plan.limits.timeoutMs.value} ms (${plan.limits.timeoutMs.enforcement})` : "none"}`,
|
|
374
|
-
`Conversation fingerprint: ${plan.conversationFingerprint}`,
|
|
375
|
-
`Execution fingerprint: ${plan.executionFingerprint}`,
|
|
376
|
-
"",
|
|
377
|
-
"## System prompt",
|
|
378
|
-
"",
|
|
379
|
-
plan.systemPrompt,
|
|
380
|
-
"",
|
|
381
|
-
...messages,
|
|
382
|
-
].join("\n");
|
|
383
|
-
}
|
|
384
|
-
function renderCollapsedResult(result, details, isPartial, theme) {
|
|
385
|
-
const icon = details.status === "completed"
|
|
386
|
-
? theme.fg("success", "✓")
|
|
387
|
-
: details.status === "failed"
|
|
388
|
-
? theme.fg("error", "✗")
|
|
389
|
-
: details.status === "cancelled" || details.status === "timed-out"
|
|
390
|
-
? theme.fg("warning", "○")
|
|
391
|
-
: theme.fg("accent", "●");
|
|
392
|
-
const lines = [`${icon} ${theme.fg("toolTitle", theme.bold(details.profileId))} ${theme.fg("muted", `[${details.status}${isPartial ? ", live" : ""}]`)}`];
|
|
393
|
-
if (details.plan)
|
|
394
|
-
lines.push(theme.fg("dim", `${details.plan.provider}/${details.plan.model} · ${details.plan.thinkingLevel} · ${details.plan.executionBoundary}`));
|
|
395
|
-
const output = textContent(result);
|
|
396
|
-
if (output)
|
|
397
|
-
lines.push(theme.fg(details.status === "failed" ? "error" : "toolOutput", truncateLines(output, 8, 2_000)));
|
|
398
|
-
if (details.report)
|
|
399
|
-
lines.push(theme.fg("dim", usageText(details.report)));
|
|
400
|
-
if (details.report && details.report.messages.length > 0)
|
|
401
|
-
lines.push(theme.fg("muted", "Ctrl+O to view the full subagent transcript"));
|
|
402
|
-
return new Text(lines.join("\n"), 0, 0);
|
|
403
|
-
}
|
|
404
|
-
function renderExpandedResult(result, details, theme) {
|
|
405
|
-
const container = new Container();
|
|
406
|
-
container.addChild(new Text(theme.fg("toolTitle", theme.bold(`${details.profileId} [${details.status}]`)), 0, 0));
|
|
407
|
-
if (details.plan) {
|
|
408
|
-
container.addChild(new Text([
|
|
409
|
-
`${theme.fg("muted", "Model:")} ${details.plan.provider}/${details.plan.model} (${details.plan.thinkingLevel})`,
|
|
410
|
-
`${theme.fg("muted", "Boundary:")} ${details.plan.executionBoundary}; read-only model tools`,
|
|
411
|
-
...(details.plan.timeoutMs === undefined ? [] : [`${theme.fg("muted", "Timeout:")} ${details.plan.timeoutMs} ms (${details.plan.timeoutEnforcement ?? "unknown"})`]),
|
|
412
|
-
`${theme.fg("muted", "Tools:")} ${details.plan.effectiveToolIds.join(", ") || "none"}`,
|
|
413
|
-
`${theme.fg("muted", "Fingerprint:")} ${details.plan.executionFingerprint}`,
|
|
414
|
-
`${theme.fg("muted", "Approval:")} ${approvalText(details.approval)}`,
|
|
415
|
-
].join("\n"), 0, 0));
|
|
416
|
-
}
|
|
417
|
-
container.addChild(new Spacer(1));
|
|
418
|
-
container.addChild(new Text(theme.fg("muted", "─── Delegated task ───"), 0, 0));
|
|
419
|
-
container.addChild(new Text(details.task, 0, 0));
|
|
420
|
-
if (details.report?.messages.length) {
|
|
421
|
-
container.addChild(new Spacer(1));
|
|
422
|
-
const transcriptLabel = details.report.retention.truncated
|
|
423
|
-
? `─── Bounded subagent transcript tail (${details.report.retention.omittedMessages} earlier/oversized message${details.report.retention.omittedMessages === 1 ? "" : "s"} omitted) ───`
|
|
424
|
-
: "─── Subagent transcript ───";
|
|
425
|
-
container.addChild(new Text(theme.fg("muted", transcriptLabel), 0, 0));
|
|
426
|
-
for (const message of details.report.messages)
|
|
427
|
-
appendMessage(container, message, theme);
|
|
428
|
-
container.addChild(new Spacer(1));
|
|
429
|
-
container.addChild(new Text(theme.fg("dim", usageText(details.report)), 0, 0));
|
|
430
|
-
if (details.report.stderr.trim()) {
|
|
431
|
-
container.addChild(new Spacer(1));
|
|
432
|
-
container.addChild(new Text(theme.fg("warning", `stderr:\n${details.report.stderr.trim()}`), 0, 0));
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
const output = textContent(result);
|
|
437
|
-
if (output) {
|
|
438
|
-
container.addChild(new Spacer(1));
|
|
439
|
-
container.addChild(new Text(theme.fg("muted", "─── Result ───"), 0, 0));
|
|
440
|
-
container.addChild(new Markdown(output, 0, 0, getMarkdownTheme()));
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
return container;
|
|
444
|
-
}
|
|
445
|
-
function appendMessage(container, value, theme) {
|
|
446
|
-
if (!isRecord(value))
|
|
447
|
-
return;
|
|
448
|
-
if (value.role === "assistant" && Array.isArray(value.content)) {
|
|
449
|
-
for (const part of value.content) {
|
|
450
|
-
if (!isRecord(part))
|
|
451
|
-
continue;
|
|
452
|
-
if (part.type === "toolCall") {
|
|
453
|
-
const name = typeof part.name === "string" ? part.name : "tool";
|
|
454
|
-
const args = isRecord(part.arguments) ? JSON.stringify(part.arguments) : "{}";
|
|
455
|
-
container.addChild(new Text(`${theme.fg("muted", "→")} ${theme.fg("accent", name)} ${theme.fg("dim", args)}`, 0, 0));
|
|
456
|
-
}
|
|
457
|
-
else if (part.type === "text" && typeof part.text === "string" && part.text.trim()) {
|
|
458
|
-
container.addChild(new Markdown(part.text.trim(), 0, 0, getMarkdownTheme()));
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
return;
|
|
462
|
-
}
|
|
463
|
-
if (value.role === "toolResult") {
|
|
464
|
-
const name = typeof value.toolName === "string" ? value.toolName : "tool";
|
|
465
|
-
const header = value.isError === true ? theme.fg("error", `← ${name} failed`) : theme.fg("muted", `← ${name}`);
|
|
466
|
-
container.addChild(new Text(header, 0, 0));
|
|
467
|
-
const content = messageText(value.content);
|
|
468
|
-
if (content)
|
|
469
|
-
container.addChild(new Text(theme.fg("toolOutput", content), 1, 0));
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
function toolResult(text, details, _isError = false) {
|
|
473
|
-
return { content: [{ type: "text", text }], details: structuredClone(details) };
|
|
474
|
-
}
|
|
475
|
-
function renderResponseForModel(response) {
|
|
476
|
-
if (response.status === "completed")
|
|
477
|
-
return response.output?.text || "Subagent completed without a textual report.";
|
|
478
|
-
if (response.status === "failed")
|
|
479
|
-
return `Subagent failed (${response.error.code}): ${response.error.message}${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
|
|
480
|
-
if (response.status === "cancelled" || response.status === "timed-out")
|
|
481
|
-
return `Subagent ${response.status}: ${response.reason}${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
|
|
482
|
-
return `Subagent stopped after reaching ${response.reachedLimit}.${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
|
|
483
|
-
}
|
|
484
|
-
function toolStatus(response) {
|
|
485
|
-
if (response.status === "completed")
|
|
486
|
-
return "completed";
|
|
487
|
-
if (response.status === "failed" || response.status === "limit-reached")
|
|
488
|
-
return "failed";
|
|
489
|
-
return response.status;
|
|
490
|
-
}
|
|
491
|
-
function renderDiagnostics(diagnostics) {
|
|
492
|
-
return diagnostics.map((item) => `${item.level.toUpperCase()} ${item.code}: ${item.message}`).join("\n") || "No diagnostics.";
|
|
493
|
-
}
|
|
494
|
-
function toolNames(plan) {
|
|
495
|
-
const names = new Map(plan.preflight.toolCatalog.map((tool) => [tool.id, tool.name]));
|
|
496
|
-
return plan.effectiveToolIds.map((id) => names.get(id) ?? id);
|
|
497
|
-
}
|
|
498
|
-
function textContent(result) {
|
|
499
|
-
return result.content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
|
|
500
|
-
}
|
|
501
|
-
function messageText(value) {
|
|
502
|
-
if (typeof value === "string")
|
|
503
|
-
return value;
|
|
504
|
-
if (!Array.isArray(value))
|
|
505
|
-
return "";
|
|
506
|
-
return value.filter(isRecord).flatMap((part) => {
|
|
507
|
-
if (part.type === "text" && typeof part.text === "string")
|
|
508
|
-
return [part.text];
|
|
509
|
-
if (part.type === "image") {
|
|
510
|
-
const mimeType = typeof part.mimeType === "string" ? part.mimeType : "image/unknown";
|
|
511
|
-
const encodedBytes = typeof part.encodedBytes === "number" ? `; ${formatBytes(part.encodedBytes)} encoded` : "";
|
|
512
|
-
return [`[Image data omitted from retained subagent report: ${mimeType}${encodedBytes}]`];
|
|
513
|
-
}
|
|
514
|
-
return [];
|
|
515
|
-
}).join("\n");
|
|
516
|
-
}
|
|
517
|
-
function formatBytes(bytes) {
|
|
518
|
-
if (bytes < 1024)
|
|
519
|
-
return `${bytes} B`;
|
|
520
|
-
if (bytes < 1024 * 1024)
|
|
521
|
-
return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
522
|
-
return `${(bytes / (1024 * 1024)).toFixed(2)} MiB`;
|
|
523
|
-
}
|
|
524
|
-
function usageText(report) {
|
|
525
|
-
const usage = report.usage;
|
|
526
|
-
const retention = report.retention.truncated ? ` · ${report.retention.omittedMessages} transcript message${report.retention.omittedMessages === 1 ? "" : "s"} omitted` : "";
|
|
527
|
-
return `${usage.turns} turn${usage.turns === 1 ? "" : "s"} · ${usage.input} input · ${usage.output} output · ${usage.totalTokens} total · $${usage.cost.toFixed(4)}${retention}`;
|
|
528
|
-
}
|
|
529
|
-
function approvalText(approval) {
|
|
530
|
-
if (!approval.approved)
|
|
531
|
-
return approval.required ? "not approved" : "not executed";
|
|
532
|
-
if (approval.source === "trusted-project-config")
|
|
533
|
-
return "per-run approval bypassed by trusted-project config";
|
|
534
|
-
return `approved${approval.viewedFullPrompt ? " after full-prompt review" : ""}`;
|
|
535
|
-
}
|
|
536
|
-
function indent(text) {
|
|
537
|
-
return text.split("\n").map((line) => ` ${line}`).join("\n");
|
|
538
|
-
}
|
|
539
|
-
function truncate(text, maxChars) {
|
|
540
|
-
return text.length <= maxChars ? text : `${text.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
541
|
-
}
|
|
542
|
-
function compact(value) {
|
|
543
|
-
return value.replace(/\s+/g, " ").trim();
|
|
544
|
-
}
|
|
545
|
-
function oneLinePreview(text, maxChars) {
|
|
546
|
-
return truncate(text.replace(/\s+/g, " ").trim(), maxChars);
|
|
547
|
-
}
|
|
548
|
-
function compactIdentifier(value, maxChars) {
|
|
549
|
-
if (value.length <= maxChars)
|
|
550
|
-
return value;
|
|
551
|
-
const visibleChars = Math.max(2, maxChars - 3);
|
|
552
|
-
const startChars = Math.ceil(visibleChars / 2);
|
|
553
|
-
const endChars = Math.floor(visibleChars / 2);
|
|
554
|
-
return `${value.slice(0, startChars)}...${value.slice(-endChars)}`;
|
|
555
|
-
}
|
|
556
|
-
function truncateLines(text, maxLines, maxChars) {
|
|
557
|
-
return truncate(text.split("\n").slice(0, maxLines).join("\n"), maxChars);
|
|
558
|
-
}
|
|
559
|
-
//# sourceMappingURL=subagent-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-tool.js","sourceRoot":"","sources":["../src/subagent-tool.ts"],"names":[],"mappings":"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"}
|