@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
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { FINGERPRINT_PATTERN, LIMIT_NAMES, OPAQUE_ID_PATTERN, error, hasErrors, isFingerprint, isRecord, isSafeRelativePath, validateAccessEnforcement, validateAccessRequest as validatePortableAccessRequest, validateBackendDescriptor as validatePortableBackendDescriptor, validateLimitReceipt as validatePortableLimitReceipt, validateLimitRequest as validatePortableLimitRequest, validatePromptRuntime as validatePortablePromptRuntime, } from "@zihanw/pi-subagent-runtime";
|
|
2
|
-
// ---------------------------------------------------------------------------
|
|
3
|
-
// Portable leaves owned by @zihanw/pi-subagent-runtime core.
|
|
4
|
-
//
|
|
5
|
-
// The runtime package is the single source of truth for validators over the
|
|
6
|
-
// portable execution contract. This module re-exports the identical helpers
|
|
7
|
-
// and adapts the runtime's returning-style validators to the collecting-style
|
|
8
|
-
// signatures the 0.4 host contract always used. Only host-specific artifacts
|
|
9
|
-
// (selected context, context budgets, media references, usage, artifacts,
|
|
10
|
-
// traces, and the richer host access-receipt checks) keep local
|
|
11
|
-
// implementations below.
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
export { FINGERPRINT_PATTERN, LIMIT_NAMES as SUBAGENT_LIMIT_NAMES, OPAQUE_ID_PATTERN, error, hasErrors, hasErrors as hasSubagentErrors, isFingerprint, isRecord, isSafeRelativePath, validateAccessEnforcement, };
|
|
14
|
-
export const NAMESPACE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
15
|
-
export function validateAccessRequest(value, path, diagnostics) {
|
|
16
|
-
diagnostics.push(...validatePortableAccessRequest(value, path));
|
|
17
|
-
}
|
|
18
|
-
export function validateLimitRequest(value, path, diagnostics) {
|
|
19
|
-
diagnostics.push(...validatePortableLimitRequest(value, path));
|
|
20
|
-
}
|
|
21
|
-
export function validateLimitReceipt(value, path, diagnostics) {
|
|
22
|
-
diagnostics.push(...validatePortableLimitReceipt(value, path));
|
|
23
|
-
}
|
|
24
|
-
export function validateBackendDescriptor(value, path, diagnostics) {
|
|
25
|
-
diagnostics.push(...repath(validatePortableBackendDescriptor(value), path));
|
|
26
|
-
// Host-only capability booleans the portable descriptor does not carry.
|
|
27
|
-
if (isRecord(value.capabilities)) {
|
|
28
|
-
for (const field of ["traceInspection", "artifactRetention"]) {
|
|
29
|
-
if (typeof value.capabilities[field] !== "boolean")
|
|
30
|
-
diagnostics.push(error("backend.boolean-capability", `${field} must be boolean.`, `${path}.capabilities.${field}`));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export function validatePreparationRuntime(value, path, diagnostics, expectedFidelity) {
|
|
35
|
-
diagnostics.push(...repath(validatePortablePromptRuntime(value, expectedFidelity), path));
|
|
36
|
-
}
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// Host-specific validators with no portable counterpart.
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
export function validateMediaReference(value, path, diagnostics) {
|
|
41
|
-
if (!isRecord(value)) {
|
|
42
|
-
diagnostics.push(error("request.media-item", "Media reference must be an object.", path));
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
validateOpaqueId(value.id, `${path}.id`, diagnostics);
|
|
46
|
-
if (value.kind !== "image")
|
|
47
|
-
diagnostics.push(error("request.media-kind", "Only image media is supported in v1.", `${path}.kind`));
|
|
48
|
-
if (typeof value.mimeType !== "string" || !/^image\/[A-Za-z0-9.+-]+$/.test(value.mimeType))
|
|
49
|
-
diagnostics.push(error("request.media-mime", "mimeType must be an image MIME type.", `${path}.mimeType`));
|
|
50
|
-
validateFingerprint(value.digest, `${path}.digest`, diagnostics);
|
|
51
|
-
validateOpaqueId(value.resourceHandle, `${path}.resourceHandle`, diagnostics);
|
|
52
|
-
}
|
|
53
|
-
export function validateSelectedContext(value, path, diagnostics) {
|
|
54
|
-
if (!isRecord(value)) {
|
|
55
|
-
diagnostics.push(error("context.type", "selectedContext must be an object.", path));
|
|
56
|
-
return diagnostics;
|
|
57
|
-
}
|
|
58
|
-
if (!isPositiveInteger(value.maxBytes))
|
|
59
|
-
diagnostics.push(error("context.max-bytes", "maxBytes must be a positive integer.", `${path}.maxBytes`));
|
|
60
|
-
if (!Array.isArray(value.items)) {
|
|
61
|
-
diagnostics.push(error("context.items", "items must be an array.", `${path}.items`));
|
|
62
|
-
return diagnostics;
|
|
63
|
-
}
|
|
64
|
-
const ids = new Set();
|
|
65
|
-
value.items.forEach((item, index) => {
|
|
66
|
-
const itemPath = `${path}.items[${index}]`;
|
|
67
|
-
if (!isRecord(item)) {
|
|
68
|
-
diagnostics.push(error("context.item", "Context item must be an object.", itemPath));
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
validateOpaqueId(item.id, `${itemPath}.id`, diagnostics);
|
|
72
|
-
if (typeof item.id === "string" && ids.has(item.id))
|
|
73
|
-
diagnostics.push(error("context.duplicate-id", `Duplicate context item id: ${item.id}`, `${itemPath}.id`));
|
|
74
|
-
if (typeof item.id === "string")
|
|
75
|
-
ids.add(item.id);
|
|
76
|
-
if (!["summary", "user-excerpt", "assistant-excerpt", "tool-result-excerpt", "resource-excerpt"].includes(String(item.kind)))
|
|
77
|
-
diagnostics.push(error("context.kind", "Unsupported context item kind.", `${itemPath}.kind`));
|
|
78
|
-
if (typeof item.text !== "string" || !item.text.trim())
|
|
79
|
-
diagnostics.push(error("context.text", "Context item text must not be empty.", `${itemPath}.text`));
|
|
80
|
-
if (item.required !== undefined && typeof item.required !== "boolean")
|
|
81
|
-
diagnostics.push(error("context.required", "required must be boolean.", `${itemPath}.required`));
|
|
82
|
-
if (!isRecord(item.provenance) || typeof item.provenance.source !== "string" || !item.provenance.source.trim())
|
|
83
|
-
diagnostics.push(error("context.provenance", "Context item provenance.source is required.", `${itemPath}.provenance`));
|
|
84
|
-
});
|
|
85
|
-
return diagnostics;
|
|
86
|
-
}
|
|
87
|
-
export function validateToolCatalog(value, diagnostics) {
|
|
88
|
-
const ids = new Set();
|
|
89
|
-
const names = new Set();
|
|
90
|
-
value.forEach((tool, index) => {
|
|
91
|
-
if (!isRecord(tool))
|
|
92
|
-
return diagnostics.push(error("tools.catalog-entry", "Tool catalog entry must be an object.", `toolCatalog[${index}]`));
|
|
93
|
-
validateOpaqueId(tool.id, `toolCatalog[${index}].id`, diagnostics);
|
|
94
|
-
validateOpaqueId(tool.name, `toolCatalog[${index}].name`, diagnostics);
|
|
95
|
-
if (typeof tool.id === "string" && ids.has(tool.id))
|
|
96
|
-
diagnostics.push(error("tools.duplicate-id", `Duplicate tool id: ${tool.id}`, `toolCatalog[${index}].id`));
|
|
97
|
-
if (typeof tool.name === "string" && names.has(tool.name))
|
|
98
|
-
diagnostics.push(error("tools.duplicate-name", `Duplicate tool name: ${tool.name}`, `toolCatalog[${index}].name`));
|
|
99
|
-
if (typeof tool.id === "string")
|
|
100
|
-
ids.add(tool.id);
|
|
101
|
-
if (typeof tool.name === "string")
|
|
102
|
-
names.add(tool.name);
|
|
103
|
-
if (!Array.isArray(tool.effects) || tool.effects.some((effect) => !["filesystem-read", "filesystem-write", "process", "network"].includes(String(effect))))
|
|
104
|
-
diagnostics.push(error("tools.effects", "Tool effects must be a valid effect array.", `toolCatalog[${index}].effects`));
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Host access-receipt validation. The portable runtime validator intentionally
|
|
109
|
-
* checks less: the host additionally enforces mount uniqueness, access-level
|
|
110
|
-
* consistency, and the isolation claims a receipt may make for its execution
|
|
111
|
-
* boundary, because these cross-checks are the honesty terms of the host
|
|
112
|
-
* contract (a shared-user boundary must never claim OS isolation).
|
|
113
|
-
*/
|
|
114
|
-
export function validateAccessReceipt(value, path, diagnostics) {
|
|
115
|
-
if (!isRecord(value)) {
|
|
116
|
-
diagnostics.push(error("access-receipt.type", "Access receipt must be an object.", path));
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (!["none", "read-only", "workspace-write"].includes(String(value.level)))
|
|
120
|
-
diagnostics.push(error("access-receipt.level", "Invalid access receipt level.", `${path}.level`));
|
|
121
|
-
if (!Array.isArray(value.mounts))
|
|
122
|
-
diagnostics.push(error("access-receipt.mounts", "Access receipt mounts must be an array.", `${path}.mounts`));
|
|
123
|
-
else {
|
|
124
|
-
const handles = new Set();
|
|
125
|
-
const mountIds = new Set();
|
|
126
|
-
value.mounts.forEach((mount, index) => {
|
|
127
|
-
if (!isRecord(mount))
|
|
128
|
-
return diagnostics.push(error("access-receipt.mount", "Mount mapping must be an object.", `${path}.mounts[${index}]`));
|
|
129
|
-
validateOpaqueId(mount.workspaceHandle, `${path}.mounts[${index}].workspaceHandle`, diagnostics);
|
|
130
|
-
validateOpaqueId(mount.mountId, `${path}.mounts[${index}].mountId`, diagnostics);
|
|
131
|
-
if (mount.mode !== "read-only" && mount.mode !== "read-write")
|
|
132
|
-
diagnostics.push(error("access-receipt.mount-mode", "Mount mode must be read-only or read-write.", `${path}.mounts[${index}].mode`));
|
|
133
|
-
if (typeof mount.workspaceHandle === "string" && handles.has(mount.workspaceHandle))
|
|
134
|
-
diagnostics.push(error("access-receipt.duplicate-workspace", `Duplicate workspace mapping: ${mount.workspaceHandle}`, `${path}.mounts[${index}].workspaceHandle`));
|
|
135
|
-
if (typeof mount.mountId === "string" && mountIds.has(mount.mountId))
|
|
136
|
-
diagnostics.push(error("access-receipt.duplicate-mount", `Duplicate mount id: ${mount.mountId}`, `${path}.mounts[${index}].mountId`));
|
|
137
|
-
if (typeof mount.workspaceHandle === "string")
|
|
138
|
-
handles.add(mount.workspaceHandle);
|
|
139
|
-
if (typeof mount.mountId === "string")
|
|
140
|
-
mountIds.add(mount.mountId);
|
|
141
|
-
});
|
|
142
|
-
if (value.level === "none" && value.mounts.length > 0)
|
|
143
|
-
diagnostics.push(error("access-receipt.none-mounts", "Access none cannot produce mount mappings.", `${path}.mounts`));
|
|
144
|
-
if (value.level === "read-only" && value.mounts.some((mount) => isRecord(mount) && mount.mode === "read-write"))
|
|
145
|
-
diagnostics.push(error("access-receipt.read-only-write", "Read-only access cannot produce a read-write mount.", `${path}.mounts`));
|
|
146
|
-
if (value.level === "workspace-write" && !value.mounts.some((mount) => isRecord(mount) && mount.mode === "read-write"))
|
|
147
|
-
diagnostics.push(error("access-receipt.write-missing", "workspace-write receipt requires a read-write mount.", `${path}.mounts`));
|
|
148
|
-
if (value.workingDirectory !== undefined) {
|
|
149
|
-
if (!isRecord(value.workingDirectory))
|
|
150
|
-
diagnostics.push(error("access-receipt.cwd", "workingDirectory must be an object.", `${path}.workingDirectory`));
|
|
151
|
-
else {
|
|
152
|
-
if (!mountIds.has(String(value.workingDirectory.mountId)))
|
|
153
|
-
diagnostics.push(error("access-receipt.cwd-mount", "workingDirectory must reference a receipt mount.", `${path}.workingDirectory.mountId`));
|
|
154
|
-
if (!isSafeRelativePath(value.workingDirectory.path, true))
|
|
155
|
-
diagnostics.push(error("access-receipt.cwd-path", "workingDirectory path must be normalized and relative.", `${path}.workingDirectory.path`));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
if (value.network !== "deny" && value.network !== "allow")
|
|
160
|
-
diagnostics.push(error("access-receipt.network", "Invalid access receipt network policy.", `${path}.network`));
|
|
161
|
-
if (typeof value.process !== "boolean")
|
|
162
|
-
diagnostics.push(error("access-receipt.process", "Access receipt process must be boolean.", `${path}.process`));
|
|
163
|
-
if (value.process === true && value.level !== "workspace-write")
|
|
164
|
-
diagnostics.push(error("access-receipt.process-level", "Process access requires workspace-write.", `${path}.process`));
|
|
165
|
-
if (value.executionBoundary !== undefined && value.executionBoundary !== "isolated" && value.executionBoundary !== "shared-user") {
|
|
166
|
-
diagnostics.push(error("access-receipt.boundary", "executionBoundary must be isolated or shared-user.", `${path}.executionBoundary`));
|
|
167
|
-
}
|
|
168
|
-
const executionBoundary = value.executionBoundary ?? "isolated";
|
|
169
|
-
if (!isRecord(value.enforcement))
|
|
170
|
-
diagnostics.push(error("access-receipt.enforcement", "Access enforcement receipt is required.", `${path}.enforcement`));
|
|
171
|
-
else {
|
|
172
|
-
validateAccessCapabilities(value.enforcement, `${path}.enforcement`, diagnostics);
|
|
173
|
-
if (executionBoundary === "shared-user") {
|
|
174
|
-
for (const field of ["readOnlyMountIsolation", "readWriteMountIsolation", "symlinkSafeContainment", "processIsolation", "agentNetworkIsolation"]) {
|
|
175
|
-
if (value.enforcement[field] === true)
|
|
176
|
-
diagnostics.push(error("access-receipt.shared-user-claim", `A shared-user boundary cannot claim ${field}.`, `${path}.enforcement.${field}`));
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (executionBoundary === "isolated" && value.level === "read-only" && (!value.enforcement.readOnlyMountIsolation || !value.enforcement.symlinkSafeContainment))
|
|
180
|
-
diagnostics.push(error("access-receipt.read-isolation", "Isolated read-only access requires mount isolation and symlink-safe containment.", `${path}.enforcement`));
|
|
181
|
-
if (value.level === "workspace-write" && (!value.enforcement.readWriteMountIsolation || !value.enforcement.symlinkSafeContainment))
|
|
182
|
-
diagnostics.push(error("access-receipt.write-isolation", "Workspace-write receipt requires write isolation and symlink-safe containment.", `${path}.enforcement`));
|
|
183
|
-
if (value.process === true && !value.enforcement.processIsolation)
|
|
184
|
-
diagnostics.push(error("access-receipt.process-isolation", "Process receipt requires process isolation.", `${path}.enforcement.processIsolation`));
|
|
185
|
-
if (value.network === "deny" && !value.enforcement.agentNetworkIsolation)
|
|
186
|
-
diagnostics.push(error("access-receipt.network-isolation", "Denied network receipt requires agent network isolation.", `${path}.enforcement.agentNetworkIsolation`));
|
|
187
|
-
}
|
|
188
|
-
if (value.level === "none" && value.workingDirectory !== undefined)
|
|
189
|
-
diagnostics.push(error("access-receipt.none-cwd", "Access none cannot produce a workingDirectory.", `${path}.workingDirectory`));
|
|
190
|
-
}
|
|
191
|
-
export function validateAccessCapabilities(value, path, diagnostics) {
|
|
192
|
-
for (const field of [
|
|
193
|
-
"readOnlyMountIsolation", "readWriteMountIsolation", "symlinkSafeContainment", "processIsolation", "agentNetworkIsolation",
|
|
194
|
-
]) {
|
|
195
|
-
if (typeof value[field] !== "boolean")
|
|
196
|
-
diagnostics.push(error("access-capability.boolean", `${field} must be boolean.`, `${path}.${field}`));
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
export function validatePreparedMessage(value, path, diagnostics) {
|
|
200
|
-
if (!isRecord(value)) {
|
|
201
|
-
diagnostics.push(error("plan.message", "Prepared message must be an object.", path));
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
if (!["user", "assistant", "custom"].includes(String(value.role)))
|
|
205
|
-
diagnostics.push(error("plan.message-role", "Unsupported prepared message role.", `${path}.role`));
|
|
206
|
-
if (!Array.isArray(value.content) || value.content.length === 0) {
|
|
207
|
-
diagnostics.push(error("plan.message-content", "Prepared message content must be a non-empty array.", `${path}.content`));
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
value.content.forEach((part, index) => {
|
|
211
|
-
if (!isRecord(part))
|
|
212
|
-
return diagnostics.push(error("plan.content-part", "Content part must be an object.", `${path}.content[${index}]`));
|
|
213
|
-
if (part.type === "text") {
|
|
214
|
-
if (typeof part.text !== "string")
|
|
215
|
-
diagnostics.push(error("plan.text-part", "Text content requires text.", `${path}.content[${index}].text`));
|
|
216
|
-
}
|
|
217
|
-
else if (part.type === "media") {
|
|
218
|
-
validateOpaqueId(part.mediaId, `${path}.content[${index}].mediaId`, diagnostics);
|
|
219
|
-
if (typeof part.mimeType !== "string" || !part.mimeType.includes("/"))
|
|
220
|
-
diagnostics.push(error("plan.media-mime", "Media content requires mimeType.", `${path}.content[${index}].mimeType`));
|
|
221
|
-
validateFingerprint(part.digest, `${path}.content[${index}].digest`, diagnostics);
|
|
222
|
-
if (part.backendResourceId !== undefined)
|
|
223
|
-
validateOpaqueId(part.backendResourceId, `${path}.content[${index}].backendResourceId`, diagnostics);
|
|
224
|
-
}
|
|
225
|
-
else
|
|
226
|
-
diagnostics.push(error("plan.content-type", "Unsupported prepared content part type.", `${path}.content[${index}].type`));
|
|
227
|
-
});
|
|
228
|
-
if (value.protectedTask !== undefined && typeof value.protectedTask !== "boolean")
|
|
229
|
-
diagnostics.push(error("plan.protected-flag", "protectedTask must be boolean.", `${path}.protectedTask`));
|
|
230
|
-
}
|
|
231
|
-
export function validateContextBudgetReceipt(value, path, diagnostics) {
|
|
232
|
-
if (!isRecord(value)) {
|
|
233
|
-
diagnostics.push(error("context-receipt.type", "Context budget receipt must be an object.", path));
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if (!isPositiveInteger(value.maxBytes))
|
|
237
|
-
diagnostics.push(error("context-receipt.max", "maxBytes must be a positive integer.", `${path}.maxBytes`));
|
|
238
|
-
if (!isNonNegativeInteger(value.includedBytes) || (isPositiveInteger(value.maxBytes) && value.includedBytes > value.maxBytes))
|
|
239
|
-
diagnostics.push(error("context-receipt.bytes", "includedBytes must be non-negative and no greater than maxBytes.", `${path}.includedBytes`));
|
|
240
|
-
for (const field of ["includedItemIds", "omittedItemIds"]) {
|
|
241
|
-
if (!Array.isArray(value[field]))
|
|
242
|
-
diagnostics.push(error("context-receipt.ids", `${field} must be an array.`, `${path}.${field}`));
|
|
243
|
-
else
|
|
244
|
-
validateUniqueStringArray(value[field], `${path}.${field}`, diagnostics);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
export function validateUniqueStringArray(value, path, diagnostics) {
|
|
248
|
-
const seen = new Set();
|
|
249
|
-
value.forEach((item, index) => {
|
|
250
|
-
if (typeof item !== "string")
|
|
251
|
-
diagnostics.push(error("array.string", "Expected a string.", `${path}[${index}]`));
|
|
252
|
-
else if (seen.has(item))
|
|
253
|
-
diagnostics.push(error("array.duplicate", `Duplicate value: ${item}`, `${path}[${index}]`));
|
|
254
|
-
else
|
|
255
|
-
seen.add(item);
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
export function validateDiagnosticArray(value, path, diagnostics) {
|
|
259
|
-
value.forEach((item, index) => {
|
|
260
|
-
if (!isRecord(item) || !["error", "warning", "info"].includes(String(item.level)) || typeof item.code !== "string" || typeof item.message !== "string")
|
|
261
|
-
diagnostics.push(error("diagnostic.invalid", "Diagnostic requires level, code, and message.", `${path}[${index}]`));
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
export function validateUsage(value, path, diagnostics) {
|
|
265
|
-
if (!isRecord(value)) {
|
|
266
|
-
diagnostics.push(error("usage.type", "usage must be an object.", path));
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
if (value.tokens !== undefined) {
|
|
270
|
-
if (!isRecord(value.tokens) || !isNonNegativeInteger(value.tokens.input) || !isNonNegativeInteger(value.tokens.output) || !isNonNegativeInteger(value.tokens.total))
|
|
271
|
-
diagnostics.push(error("usage.tokens", "Token usage values must be non-negative integers.", `${path}.tokens`));
|
|
272
|
-
else if (value.tokens.total < value.tokens.input + value.tokens.output)
|
|
273
|
-
diagnostics.push(error("usage.token-total", "Token total cannot be less than input + output.", `${path}.tokens.total`));
|
|
274
|
-
}
|
|
275
|
-
if (value.cost !== undefined && (!isRecord(value.cost) || !isNonNegativeFinite(value.cost.amount) || typeof value.cost.currency !== "string" || !/^[A-Z]{3}$/.test(value.cost.currency)))
|
|
276
|
-
diagnostics.push(error("usage.cost", "Cost requires a non-negative amount and ISO 4217 currency code.", `${path}.cost`));
|
|
277
|
-
}
|
|
278
|
-
export function validateModelReference(value, path, diagnostics) {
|
|
279
|
-
if (!isRecord(value) || typeof value.provider !== "string" || !value.provider.trim() || typeof value.id !== "string" || !value.id.trim())
|
|
280
|
-
diagnostics.push(error("model.reference", "Model reference requires provider and id.", path));
|
|
281
|
-
}
|
|
282
|
-
export function validateOpaqueId(value, path, diagnostics) {
|
|
283
|
-
if (typeof value !== "string" || !OPAQUE_ID_PATTERN.test(value))
|
|
284
|
-
diagnostics.push(error("id.invalid", "Expected an opaque id using letters, numbers, dot, underscore, colon, or hyphen (max 128).", path));
|
|
285
|
-
}
|
|
286
|
-
export function validateNamespace(value, path, diagnostics) {
|
|
287
|
-
if (typeof value !== "string" || !NAMESPACE_PATTERN.test(value))
|
|
288
|
-
diagnostics.push(error("namespace.invalid", "Expected a namespace using letters, numbers, dot, underscore, or hyphen (max 128).", path));
|
|
289
|
-
}
|
|
290
|
-
export function validateFingerprint(value, path, diagnostics) {
|
|
291
|
-
if (!isFingerprint(value))
|
|
292
|
-
diagnostics.push(error("fingerprint.invalid", "Expected sha256:v1 followed by 64 lowercase hex characters.", path));
|
|
293
|
-
}
|
|
294
|
-
export function isIsoDate(value) {
|
|
295
|
-
return typeof value === "string" && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString() === value;
|
|
296
|
-
}
|
|
297
|
-
export function isPositiveInteger(value) {
|
|
298
|
-
return Number.isSafeInteger(value) && value > 0;
|
|
299
|
-
}
|
|
300
|
-
export function isNonNegativeInteger(value) {
|
|
301
|
-
return Number.isSafeInteger(value) && value >= 0;
|
|
302
|
-
}
|
|
303
|
-
export function isNonNegativeFinite(value) {
|
|
304
|
-
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
305
|
-
}
|
|
306
|
-
/** Remap a runtime-core diagnostic rooted at "$" onto the caller's path. */
|
|
307
|
-
function repath(diagnostics, path) {
|
|
308
|
-
return diagnostics.map((diagnostic) => {
|
|
309
|
-
if (!diagnostic.path || !diagnostic.path.startsWith("$"))
|
|
310
|
-
return diagnostic;
|
|
311
|
-
return { ...diagnostic, path: `${path}${diagnostic.path.slice(1)}` };
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/subagent/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { type ResourceKey } from "./resource-identity.ts";
|
|
3
|
-
import type { ForgeSubagentRuntime } from "./runtime/subagent-runtime.ts";
|
|
4
|
-
export declare function registerForgeSubagentCommand(pi: ExtensionAPI, runtime: ForgeSubagentRuntime, profileIds: () => string[], resolveProfileKey: (selector: string) => ResourceKey | undefined): void;
|
|
5
|
-
//# sourceMappingURL=subagent-command.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-command.d.ts","sourceRoot":"","sources":["../src/subagent-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,iCAAiC,CAAC;AAO7F,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE7E,OAAO,KAAK,EAA4B,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIpG,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,MAAM,EAAE,EAC1B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,GAC9D,IAAI,CAsGN"}
|
package/dist/subagent-command.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { loadForgeSubagentSettings, resolveSubagentBackend, resolveSubagentProfilePolicy, } from "./forge-config.js";
|
|
2
|
-
import { formatResourceKey } from "./resource-identity.js";
|
|
3
|
-
import { showText } from "./preview.js";
|
|
4
|
-
import { requestForgeSubagentApproval } from "./subagent-tool.js";
|
|
5
|
-
export function registerForgeSubagentCommand(pi, runtime, profileIds, resolveProfileKey) {
|
|
6
|
-
pi.registerCommand("forge-agent", {
|
|
7
|
-
description: "Plan or run a foreground human-approved read-only agent profile",
|
|
8
|
-
getArgumentCompletions: (prefix) => completeForgeAgentArguments(prefix, profileIds(), runtime.backendIds()),
|
|
9
|
-
handler: async (args, ctx) => {
|
|
10
|
-
const parsed = parseForgeAgentArgs(args);
|
|
11
|
-
if (parsed.command === "help") {
|
|
12
|
-
await showText(ctx, "pi-forge agent backend", helpText());
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
const settings = loadForgeSubagentSettings(ctx);
|
|
16
|
-
if (parsed.command === "backends") {
|
|
17
|
-
const resolved = resolveSubagentBackend(settings);
|
|
18
|
-
const descriptors = runtime.descriptors(ctx);
|
|
19
|
-
const loadedProfileIds = profileIds();
|
|
20
|
-
const lines = descriptors.map((descriptor) => [
|
|
21
|
-
`${descriptor.id} @ ${descriptor.version}${descriptor.id === resolved.id ? ` (default: ${backendSourceLabel(resolved)})` : ""}`,
|
|
22
|
-
` default boundary: shared-user subprocess with read-only model tools`,
|
|
23
|
-
` prompt runtime: ${descriptor.capabilities.promptRuntimeFidelity}`,
|
|
24
|
-
` cancellation: ${descriptor.capabilities.cancellation ? "yes" : "no"}`,
|
|
25
|
-
` remote transport: ${descriptor.capabilities.remoteTransport ? "yes" : "no"}`,
|
|
26
|
-
].join("\n"));
|
|
27
|
-
if (!descriptors.some((descriptor) => descriptor.id === resolved.id)) {
|
|
28
|
-
lines.push(`Configured default backend "${resolved.id}" (${backendSourceLabel(resolved)}) is not registered.`);
|
|
29
|
-
}
|
|
30
|
-
lines.push(`Configured timeout: ${settings.timeoutMs} ms (${settings.timeoutSource}; best-effort host abort).`);
|
|
31
|
-
const enabledPolicies = loadedProfileIds
|
|
32
|
-
.map((profileId) => resolveSubagentProfilePolicy(settings, profileId))
|
|
33
|
-
.filter((policy) => policy.enabled);
|
|
34
|
-
lines.push(enabledPolicies.length === 0
|
|
35
|
-
? "Enabled subagent profiles: none. Add subagents.profiles.<id>.enabled: true to the trusted project's .pi/forge/config.json."
|
|
36
|
-
: [
|
|
37
|
-
"Enabled subagent profiles:",
|
|
38
|
-
...enabledPolicies.map((policy) => ` ${policy.profileId}: backend ${policy.backend.id} (${backendSourceLabel(policy.backend)}${descriptors.some((descriptor) => descriptor.id === policy.backend.id) ? "" : "; not registered"}); timeout ${policy.timeout.milliseconds} ms (${policy.timeout.source}).`),
|
|
39
|
-
].join("\n"));
|
|
40
|
-
for (const warning of settings.warnings)
|
|
41
|
-
lines.push(`Configuration warning: ${warning}`);
|
|
42
|
-
await showText(ctx, "pi-forge subagent backends", lines.join("\n\n") || "No subagent backends registered.");
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (parsed.error) {
|
|
46
|
-
ctx.ui.notify(`pi-forge: ${parsed.error}`, "warning");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (!parsed.profileId || !parsed.task) {
|
|
50
|
-
ctx.ui.notify(`Usage: /forge-agent ${parsed.command} <profile> [--backend <id>] <task>`, "warning");
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
for (const warning of settings.warnings)
|
|
54
|
-
ctx.ui.notify(warning, "warning");
|
|
55
|
-
const profileKey = resolveProfileKey(parsed.profileId);
|
|
56
|
-
if (!profileKey) {
|
|
57
|
-
ctx.ui.notify(`pi-forge: unknown agent profile: ${parsed.profileId}`, "error");
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const canonicalProfileId = formatResourceKey(profileKey);
|
|
61
|
-
const policy = resolveSubagentProfilePolicy(settings, canonicalProfileId, parsed.backend);
|
|
62
|
-
if (!policy.enabled) {
|
|
63
|
-
ctx.ui.notify(`pi-forge: agent profile "${parsed.profileId}" is not enabled for subagent delegation in subagents.profiles.`, "error");
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (parsed.command === "run" && !ctx.hasUI) {
|
|
67
|
-
ctx.ui.notify("pi-forge: subagent execution requires interactive provider-egress confirmation; use /forge-agent plan in non-UI mode.", "error");
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
ctx.ui.setStatus("pi-forge-subagent", ctx.ui.theme.fg("accent", parsed.command === "plan" ? "agent:preparing" : "agent:running"));
|
|
71
|
-
let prepared;
|
|
72
|
-
try {
|
|
73
|
-
const result = await runtime.prepare(canonicalProfileId, parsed.task, ctx, {
|
|
74
|
-
backendId: policy.backend.id,
|
|
75
|
-
timeoutMs: policy.timeout.milliseconds,
|
|
76
|
-
});
|
|
77
|
-
if (!result.ok) {
|
|
78
|
-
await showText(ctx, "pi-forge subagent diagnostics", renderDiagnostics(result.diagnostics));
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
prepared = result.prepared;
|
|
82
|
-
if (parsed.command === "plan") {
|
|
83
|
-
await showText(ctx, `pi-forge subagent plan: ${parsed.profileId}`, renderPlan(prepared));
|
|
84
|
-
await runtime.discard(prepared);
|
|
85
|
-
prepared = undefined;
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const approval = await requestForgeSubagentApproval(prepared, parsed.task, ctx, ctx.signal);
|
|
89
|
-
if (!approval.approved) {
|
|
90
|
-
await runtime.discard(prepared);
|
|
91
|
-
prepared = undefined;
|
|
92
|
-
ctx.ui.notify("pi-forge: subagent run cancelled before provider transport.", "info");
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const response = await runtime.execute(prepared, ctx, ctx.signal);
|
|
96
|
-
prepared = undefined;
|
|
97
|
-
runtime.takeReport?.(response.runId);
|
|
98
|
-
await showText(ctx, `pi-forge subagent result: ${parsed.profileId}`, renderResponse(response));
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
if (prepared)
|
|
102
|
-
await runtime.discard(prepared).catch(() => undefined);
|
|
103
|
-
ctx.ui.notify(`pi-forge subagent failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
104
|
-
}
|
|
105
|
-
finally {
|
|
106
|
-
ctx.ui.setStatus("pi-forge-subagent", undefined);
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
function parseForgeAgentArgs(args) {
|
|
112
|
-
const trimmed = args.trim();
|
|
113
|
-
if (!trimmed)
|
|
114
|
-
return { command: "help" };
|
|
115
|
-
const firstSpace = trimmed.search(/\s/);
|
|
116
|
-
const command = (firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace)).toLowerCase();
|
|
117
|
-
const rest = firstSpace === -1 ? "" : trimmed.slice(firstSpace).trim();
|
|
118
|
-
if (command === "backends")
|
|
119
|
-
return { command: "backends" };
|
|
120
|
-
if (command !== "plan" && command !== "run")
|
|
121
|
-
return { command: "help" };
|
|
122
|
-
const positional = [];
|
|
123
|
-
let backend;
|
|
124
|
-
const tokens = rest ? rest.split(/\s+/) : [];
|
|
125
|
-
for (let index = 0; index < tokens.length; index++) {
|
|
126
|
-
const token = tokens[index];
|
|
127
|
-
if (token === "--backend") {
|
|
128
|
-
const value = tokens[index + 1];
|
|
129
|
-
if (!value || value.startsWith("--"))
|
|
130
|
-
return { command, error: "--backend requires a backend id value." };
|
|
131
|
-
backend = value;
|
|
132
|
-
index++;
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
if (token.startsWith("--backend=")) {
|
|
136
|
-
const value = token.slice("--backend=".length);
|
|
137
|
-
if (!value)
|
|
138
|
-
return { command, error: "--backend requires a backend id value." };
|
|
139
|
-
backend = value;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
if (token.startsWith("--"))
|
|
143
|
-
return { command, error: `Unknown option: ${token}` };
|
|
144
|
-
positional.push(token);
|
|
145
|
-
}
|
|
146
|
-
const [profileId, ...taskTokens] = positional;
|
|
147
|
-
return { command, profileId: profileId || undefined, task: taskTokens.join(" ") || undefined, ...(backend ? { backend } : {}) };
|
|
148
|
-
}
|
|
149
|
-
function completeForgeAgentArguments(prefix, profileIds, backendIds) {
|
|
150
|
-
const trimmed = prefix.trimStart();
|
|
151
|
-
if (!trimmed.includes(" ")) {
|
|
152
|
-
return ["backends", "plan", "run"].filter((command) => command.startsWith(trimmed)).map((command) => ({ value: command, label: command }));
|
|
153
|
-
}
|
|
154
|
-
const commandMatch = trimmed.match(/^(plan|run)\s+(.*)$/);
|
|
155
|
-
if (!commandMatch)
|
|
156
|
-
return null;
|
|
157
|
-
const rest = commandMatch[2] ?? "";
|
|
158
|
-
const tokens = rest.split(/\s+/);
|
|
159
|
-
const last = tokens[tokens.length - 1] ?? "";
|
|
160
|
-
const previous = tokens[tokens.length - 2];
|
|
161
|
-
if (previous === "--backend" || previous?.startsWith("--backend=")) {
|
|
162
|
-
const head = trimmed.slice(0, trimmed.length - last.length);
|
|
163
|
-
return backendIds.filter((id) => id.startsWith(last)).map((id) => ({ value: `${head}${id}`, label: id }));
|
|
164
|
-
}
|
|
165
|
-
if (tokens.length === 1) {
|
|
166
|
-
const partial = tokens[0] ?? "";
|
|
167
|
-
return profileIds.filter((id) => id.startsWith(partial)).map((id) => ({ value: `${commandMatch[1]} ${id}`, label: id }));
|
|
168
|
-
}
|
|
169
|
-
if (last.startsWith("-") && "--backend".startsWith(last)) {
|
|
170
|
-
const head = trimmed.slice(0, trimmed.length - last.length);
|
|
171
|
-
return [{ value: `${head}--backend `, label: "--backend" }];
|
|
172
|
-
}
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
function backendSourceLabel(backend) {
|
|
176
|
-
switch (backend.source) {
|
|
177
|
-
case "explicit": return "per-run override";
|
|
178
|
-
case "project-profile": return "project profile override";
|
|
179
|
-
case "project": return "project config";
|
|
180
|
-
case "global": return "global config";
|
|
181
|
-
default: return "built-in";
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
function renderPlan(prepared) {
|
|
185
|
-
const plan = prepared.plan;
|
|
186
|
-
return [
|
|
187
|
-
`Backend: ${plan.backendId}`,
|
|
188
|
-
`Model: ${plan.model.provider}/${plan.model.id}`,
|
|
189
|
-
`Thinking: ${plan.thinkingLevel}`,
|
|
190
|
-
`Profile: ${plan.profile.profileId}`,
|
|
191
|
-
`Prompt stack: ${plan.profile.promptStackId ?? "none"}`,
|
|
192
|
-
`Access: ${plan.access.level}; network ${plan.access.network}; process ${plan.access.process ? "allowed" : "denied"}`,
|
|
193
|
-
`Timeout: ${plan.limits.timeoutMs ? `${plan.limits.timeoutMs.value} ms (${plan.limits.timeoutMs.enforcement})` : "none"}`,
|
|
194
|
-
`Effective tools: ${plan.effectiveToolIds.join(", ") || "none"}`,
|
|
195
|
-
`System prompt: ${plan.systemPrompt.length} chars`,
|
|
196
|
-
`Messages: ${plan.messages.map((message) => `${message.role}${message.protectedTask ? " (protected task)" : ""}`).join(" -> ")}`,
|
|
197
|
-
`Runtime fingerprint: ${plan.promptRuntimeFingerprint}`,
|
|
198
|
-
`Conversation fingerprint: ${plan.conversationFingerprint}`,
|
|
199
|
-
`Execution fingerprint: ${plan.executionFingerprint}`,
|
|
200
|
-
"Provider transport: not started; dry plan discarded.",
|
|
201
|
-
"",
|
|
202
|
-
"Diagnostics:",
|
|
203
|
-
renderDiagnostics(prepared.diagnostics),
|
|
204
|
-
].join("\n");
|
|
205
|
-
}
|
|
206
|
-
function renderResponse(response) {
|
|
207
|
-
const lines = [
|
|
208
|
-
`Status: ${response.status}`,
|
|
209
|
-
`Backend: ${response.backendId}`,
|
|
210
|
-
`Model: ${response.model.provider}/${response.model.id}`,
|
|
211
|
-
`Duration: ${response.durationMs} ms`,
|
|
212
|
-
`Effective tools: ${response.effectiveToolIds.join(", ") || "none"}`,
|
|
213
|
-
];
|
|
214
|
-
if (response.status === "failed")
|
|
215
|
-
lines.push(`Error: ${response.error.code}: ${response.error.message}`);
|
|
216
|
-
if (response.status === "cancelled" || response.status === "timed-out")
|
|
217
|
-
lines.push(`Reason: ${response.reason}`);
|
|
218
|
-
if (response.status === "limit-reached")
|
|
219
|
-
lines.push(`Reached limit: ${response.reachedLimit}`);
|
|
220
|
-
if (response.output?.text)
|
|
221
|
-
lines.push("", "Output:", response.output.text);
|
|
222
|
-
return lines.join("\n");
|
|
223
|
-
}
|
|
224
|
-
function renderDiagnostics(diagnostics) {
|
|
225
|
-
if (diagnostics.length === 0)
|
|
226
|
-
return "No diagnostics.";
|
|
227
|
-
return diagnostics.map((diagnostic) => `${diagnostic.level.toUpperCase()} ${diagnostic.code}${diagnostic.path ? ` [${diagnostic.path}]` : ""}: ${diagnostic.message}`).join("\n");
|
|
228
|
-
}
|
|
229
|
-
function helpText() {
|
|
230
|
-
return [
|
|
231
|
-
"Foreground read-only subprocess agent commands:",
|
|
232
|
-
"",
|
|
233
|
-
" /forge-agent backends",
|
|
234
|
-
" /forge-agent plan <profile> [--backend <id>] <task>",
|
|
235
|
-
" /forge-agent run <profile> [--backend <id>] <task>",
|
|
236
|
-
"",
|
|
237
|
-
"plan prepares and validates the exact request without provider transport.",
|
|
238
|
-
"run prepares the exact prompt, asks for human approval, then executes one foreground text task.",
|
|
239
|
-
"The default child exposes read, grep, find, and ls only. It shares the invoking user's OS permissions and is not sandboxed.",
|
|
240
|
-
"",
|
|
241
|
-
"Backend selection: --backend overrides one run. Set subagents.backend in .pi/forge/config.json",
|
|
242
|
-
"(trusted project) or ~/.pi/forge/config.json (global default; project wins). There is no fallback:",
|
|
243
|
-
"if the selected backend is unavailable the run fails before provider transport.",
|
|
244
|
-
"Set subagents.timeoutMs in the same config locations to an integer from 1000 to 3600000.",
|
|
245
|
-
"Profiles are not delegatable by default. Enable and optionally override one with",
|
|
246
|
-
"subagents.profiles.<id>.enabled, backend, and timeoutMs.",
|
|
247
|
-
].join("\n");
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=subagent-command.js.map
|