@zihanw/pi-forge 0.3.2 → 0.4.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +160 -0
- package/PUBLIC_API.md +28 -0
- package/README.md +137 -11
- package/README.zh-CN.md +137 -11
- package/SUBAGENT_ADAPTER_CONTRACT.md +199 -0
- package/dist/agent-profile.d.ts +71 -0
- package/dist/agent-profile.d.ts.map +1 -0
- package/dist/agent-profile.js +303 -0
- package/dist/agent-profile.js.map +1 -0
- package/dist/forge-config.d.ts +8 -0
- package/dist/forge-config.d.ts.map +1 -0
- package/dist/forge-config.js +40 -0
- package/dist/forge-config.js.map +1 -0
- package/dist/forge-extensions.d.ts.map +1 -1
- package/dist/forge-extensions.js +19 -3
- package/dist/forge-extensions.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -361
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +11 -3
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +90 -4
- package/dist/lifecycle.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +116 -5
- package/dist/loader.js.map +1 -1
- package/dist/payload-capture.d.ts.map +1 -1
- package/dist/payload-capture.js +27 -0
- package/dist/payload-capture.js.map +1 -1
- package/dist/payload-command.d.ts +3 -3
- package/dist/payload-command.d.ts.map +1 -1
- package/dist/payload-command.js.map +1 -1
- package/dist/preview.d.ts +2 -2
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +2 -3
- package/dist/preview.js.map +1 -1
- package/dist/profile-command.d.ts +12 -0
- package/dist/profile-command.d.ts.map +1 -0
- package/dist/profile-command.js +291 -0
- package/dist/profile-command.js.map +1 -0
- package/dist/profile-service.d.ts +103 -0
- package/dist/profile-service.d.ts.map +1 -0
- package/dist/profile-service.js +215 -0
- package/dist/profile-service.js.map +1 -0
- package/dist/runtime/profile-runtime.d.ts +13 -0
- package/dist/runtime/profile-runtime.d.ts.map +1 -0
- package/dist/runtime/profile-runtime.js +47 -0
- package/dist/runtime/profile-runtime.js.map +1 -0
- package/dist/runtime/prompt-stack-runtime.d.ts +22 -0
- package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -0
- package/dist/runtime/prompt-stack-runtime.js +104 -0
- package/dist/runtime/prompt-stack-runtime.js.map +1 -0
- package/dist/runtime/subagent-runtime.d.ts +30 -0
- package/dist/runtime/subagent-runtime.d.ts.map +1 -0
- package/dist/runtime/subagent-runtime.js +114 -0
- package/dist/runtime/subagent-runtime.js.map +1 -0
- package/dist/runtime/tool-policy-runtime.d.ts +15 -0
- package/dist/runtime/tool-policy-runtime.d.ts.map +1 -0
- package/dist/runtime/tool-policy-runtime.js +170 -0
- package/dist/runtime/tool-policy-runtime.js.map +1 -0
- package/dist/runtime/web-editor-runtime.d.ts +9 -0
- package/dist/runtime/web-editor-runtime.d.ts.map +1 -0
- package/dist/runtime/web-editor-runtime.js +131 -0
- package/dist/runtime/web-editor-runtime.js.map +1 -0
- package/dist/runtime-state.d.ts +4 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +2 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/storage.d.ts +3 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +9 -0
- package/dist/storage.js.map +1 -1
- package/dist/subagent/backend-registry.d.ts +75 -0
- package/dist/subagent/backend-registry.d.ts.map +1 -0
- package/dist/subagent/backend-registry.js +463 -0
- package/dist/subagent/backend-registry.js.map +1 -0
- package/dist/subagent/canonical.d.ts +10 -0
- package/dist/subagent/canonical.d.ts.map +1 -0
- package/dist/subagent/canonical.js +52 -0
- package/dist/subagent/canonical.js.map +1 -0
- package/dist/subagent/context.d.ts +8 -0
- package/dist/subagent/context.d.ts.map +1 -0
- package/dist/subagent/context.js +125 -0
- package/dist/subagent/context.js.map +1 -0
- package/dist/subagent/contract.d.ts +11 -0
- package/dist/subagent/contract.d.ts.map +1 -0
- package/dist/subagent/contract.js +11 -0
- package/dist/subagent/contract.js.map +1 -0
- package/dist/subagent/diagnostics.d.ts +3 -0
- package/dist/subagent/diagnostics.d.ts.map +1 -0
- package/dist/subagent/diagnostics.js +5 -0
- package/dist/subagent/diagnostics.js.map +1 -0
- package/dist/subagent/index.d.ts +13 -0
- package/dist/subagent/index.d.ts.map +1 -0
- package/dist/subagent/index.js +13 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/pi-model-runtime.d.ts +8 -0
- package/dist/subagent/pi-model-runtime.d.ts.map +1 -0
- package/dist/subagent/pi-model-runtime.js +22 -0
- package/dist/subagent/pi-model-runtime.js.map +1 -0
- package/dist/subagent/pi-sdk-backend.d.ts +23 -0
- package/dist/subagent/pi-sdk-backend.d.ts.map +1 -0
- package/dist/subagent/pi-sdk-backend.js +383 -0
- package/dist/subagent/pi-sdk-backend.js.map +1 -0
- package/dist/subagent/pi-subprocess-backend.d.ts +72 -0
- package/dist/subagent/pi-subprocess-backend.d.ts.map +1 -0
- package/dist/subagent/pi-subprocess-backend.js +756 -0
- package/dist/subagent/pi-subprocess-backend.js.map +1 -0
- package/dist/subagent/plan.d.ts +14 -0
- package/dist/subagent/plan.d.ts.map +1 -0
- package/dist/subagent/plan.js +160 -0
- package/dist/subagent/plan.js.map +1 -0
- package/dist/subagent/preflight.d.ts +4 -0
- package/dist/subagent/preflight.d.ts.map +1 -0
- package/dist/subagent/preflight.js +108 -0
- package/dist/subagent/preflight.js.map +1 -0
- package/dist/subagent/request.d.ts +4 -0
- package/dist/subagent/request.d.ts.map +1 -0
- package/dist/subagent/request.js +122 -0
- package/dist/subagent/request.js.map +1 -0
- package/dist/subagent/response.d.ts +8 -0
- package/dist/subagent/response.d.ts.map +1 -0
- package/dist/subagent/response.js +155 -0
- package/dist/subagent/response.js.map +1 -0
- package/dist/subagent/subprocess-bridge.d.ts +21 -0
- package/dist/subagent/subprocess-bridge.d.ts.map +1 -0
- package/dist/subagent/subprocess-bridge.js +87 -0
- package/dist/subagent/subprocess-bridge.js.map +1 -0
- package/dist/subagent/subprocess-report.d.ts +4 -0
- package/dist/subagent/subprocess-report.d.ts.map +1 -0
- package/dist/subagent/subprocess-report.js +55 -0
- package/dist/subagent/subprocess-report.js.map +1 -0
- package/dist/subagent/tools.d.ts +4 -0
- package/dist/subagent/tools.d.ts.map +1 -0
- package/dist/subagent/tools.js +42 -0
- package/dist/subagent/tools.js.map +1 -0
- package/dist/subagent/types.d.ts +384 -0
- package/dist/subagent/types.d.ts.map +1 -0
- package/dist/subagent/types.js +3 -0
- package/dist/subagent/types.js.map +1 -0
- package/dist/subagent/validation.d.ts +35 -0
- package/dist/subagent/validation.d.ts.map +1 -0
- package/dist/subagent/validation.js +500 -0
- package/dist/subagent/validation.js.map +1 -0
- package/dist/subagent-command.d.ts +4 -0
- package/dist/subagent-command.d.ts.map +1 -0
- package/dist/subagent-command.js +153 -0
- package/dist/subagent-command.js.map +1 -0
- package/dist/subagent-contract.d.ts +8 -0
- package/dist/subagent-contract.d.ts.map +1 -0
- package/dist/subagent-contract.js +8 -0
- package/dist/subagent-contract.js.map +1 -0
- package/dist/subagent-host.d.ts +44 -0
- package/dist/subagent-host.d.ts.map +1 -0
- package/dist/subagent-host.js +291 -0
- package/dist/subagent-host.js.map +1 -0
- package/dist/subagent-profile-tool.d.ts +26 -0
- package/dist/subagent-profile-tool.d.ts.map +1 -0
- package/dist/subagent-profile-tool.js +93 -0
- package/dist/subagent-profile-tool.js.map +1 -0
- package/dist/subagent-tool.d.ts +50 -0
- package/dist/subagent-tool.d.ts.map +1 -0
- package/dist/subagent-tool.js +385 -0
- package/dist/subagent-tool.js.map +1 -0
- package/dist/web-editor/client/api.d.ts +9 -0
- package/dist/web-editor/client/api.d.ts.map +1 -0
- package/dist/web-editor/client/api.js +26 -0
- package/dist/web-editor/client/api.js.map +1 -0
- package/dist/web-editor/client/dom.d.ts +13 -0
- package/dist/web-editor/client/dom.d.ts.map +1 -0
- package/dist/web-editor/client/dom.js +30 -0
- package/dist/web-editor/client/dom.js.map +1 -0
- package/dist/web-editor/client/inspector.d.ts +22 -0
- package/dist/web-editor/client/inspector.d.ts.map +1 -0
- package/dist/web-editor/client/inspector.js +226 -0
- package/dist/web-editor/client/inspector.js.map +1 -0
- package/dist/web-editor/client/main.d.ts +2 -0
- package/dist/web-editor/client/main.d.ts.map +1 -0
- package/dist/web-editor/client/main.js +1468 -0
- package/dist/web-editor/client/main.js.map +1 -0
- package/dist/web-editor/client/policy-editor.d.ts +16 -0
- package/dist/web-editor/client/policy-editor.d.ts.map +1 -0
- package/dist/web-editor/client/policy-editor.js +330 -0
- package/dist/web-editor/client/policy-editor.js.map +1 -0
- package/dist/web-editor/client/regex-editor.d.ts +19 -0
- package/dist/web-editor/client/regex-editor.d.ts.map +1 -0
- package/dist/web-editor/client/regex-editor.js +281 -0
- package/dist/web-editor/client/regex-editor.js.map +1 -0
- package/dist/web-editor/client/types.d.ts +60 -0
- package/dist/web-editor/client/types.d.ts.map +1 -0
- package/dist/web-editor/client/types.js +2 -0
- package/dist/web-editor/client/types.js.map +1 -0
- package/dist/web-editor/client-script.d.ts +2 -0
- package/dist/web-editor/client-script.d.ts.map +1 -0
- package/dist/web-editor/client-script.generated.d.ts +2 -0
- package/dist/web-editor/client-script.generated.d.ts.map +1 -0
- package/dist/web-editor/client-script.generated.js +3 -0
- package/dist/web-editor/client-script.generated.js.map +1 -0
- package/dist/web-editor/client-script.js +2 -0
- package/dist/web-editor/client-script.js.map +1 -0
- package/dist/web-editor/page.d.ts.map +1 -1
- package/dist/web-editor/page.js +6 -3249
- package/dist/web-editor/page.js.map +1 -1
- package/dist/web-editor/styles.d.ts +2 -0
- package/dist/web-editor/styles.d.ts.map +1 -0
- package/dist/web-editor/styles.js +996 -0
- package/dist/web-editor/styles.js.map +1 -0
- package/dist/web-host.d.ts +3 -3
- package/dist/web-host.d.ts.map +1 -1
- package/dist/web-host.js +6 -0
- package/dist/web-host.js.map +1 -1
- package/package.json +42 -14
- package/src/compiler.ts +0 -578
- package/src/extension-registry.ts +0 -33
- package/src/forge-extensions.ts +0 -223
- package/src/index.ts +0 -445
- package/src/lifecycle.ts +0 -171
- package/src/loader.ts +0 -394
- package/src/macro-engine.ts +0 -358
- package/src/payload-capture.ts +0 -85
- package/src/payload-command.ts +0 -138
- package/src/policy.ts +0 -42
- package/src/preset-command.ts +0 -280
- package/src/preview.ts +0 -226
- package/src/regex.ts +0 -500
- package/src/render-helpers.ts +0 -169
- package/src/runtime-state.ts +0 -40
- package/src/sillytavern-importer/items.ts +0 -98
- package/src/sillytavern-importer/macros.ts +0 -159
- package/src/sillytavern-importer/prompt-order.ts +0 -54
- package/src/sillytavern-importer/regex.ts +0 -270
- package/src/sillytavern-importer/report.ts +0 -202
- package/src/sillytavern-importer/types.ts +0 -120
- package/src/sillytavern-importer.ts +0 -152
- package/src/slot-renderers.ts +0 -414
- package/src/stack-migration.ts +0 -159
- package/src/storage.ts +0 -45
- package/src/types.ts +0 -209
- package/src/web-editor/index.ts +0 -2
- package/src/web-editor/page.ts +0 -3330
- package/src/web-editor/server.ts +0 -294
- package/src/web-editor/types.ts +0 -98
- package/src/web-host.ts +0 -232
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { agentProfilePath, agentProfilesDir, isResolvedAgentProfileUsable, isValidAgentProfileId, renderAgentProfileDiagnostics, } from "./agent-profile.js";
|
|
3
|
+
import { applyResolvedAgentProfile, captureAgentProfile, createAgentProfilePreview, forgetAgentProfileProvenance, getAgentProfileRuntimeStatus, writeAgentProfile, } from "./profile-service.js";
|
|
4
|
+
import { showText } from "./preview.js";
|
|
5
|
+
export function registerProfileCommand(pi, state, deps) {
|
|
6
|
+
pi.registerCommand("profile", {
|
|
7
|
+
description: "Manage pi-forge agent profiles: list, use, save, status, preview, validate, reload, forget",
|
|
8
|
+
getArgumentCompletions: (prefix) => profileArgumentCompletions(state, prefix),
|
|
9
|
+
handler: async (args, ctx) => {
|
|
10
|
+
await handleProfileCommand(pi, state, deps, args, ctx);
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function profileArgumentCompletions(state, prefix) {
|
|
15
|
+
const parts = prefix.trimStart().split(/\s+/);
|
|
16
|
+
if (parts.length <= 1 && !prefix.endsWith(" ")) {
|
|
17
|
+
const commands = ["list", "use", "save", "status", "preview", "validate", "reload", "forget"];
|
|
18
|
+
return commands.filter((command) => command.startsWith(parts[0] ?? "")).map((command) => ({ value: command, label: command }));
|
|
19
|
+
}
|
|
20
|
+
const command = parts[0];
|
|
21
|
+
if (["use", "preview", "validate"].includes(command)) {
|
|
22
|
+
const fragment = parts[1] ?? "";
|
|
23
|
+
return state.profiles
|
|
24
|
+
.map((loaded) => loaded.profile.id)
|
|
25
|
+
.filter((id, index, ids) => ids.indexOf(id) === index && id.startsWith(fragment))
|
|
26
|
+
.map((id) => ({ value: `${command} ${id}`, label: id }));
|
|
27
|
+
}
|
|
28
|
+
if (command === "save" && parts.length > 2) {
|
|
29
|
+
const fragment = parts.at(-1) ?? "";
|
|
30
|
+
return "--overwrite".startsWith(fragment) ? [{ value: `${parts.slice(0, -1).join(" ")} --overwrite`, label: "--overwrite" }] : [];
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
async function handleProfileCommand(pi, state, deps, args, ctx) {
|
|
35
|
+
const trimmed = args.trim();
|
|
36
|
+
const [command = "list", ...rest] = trimmed ? trimmed.split(/\s+/) : ["list"];
|
|
37
|
+
switch (command) {
|
|
38
|
+
case "list":
|
|
39
|
+
await showText(ctx, "pi-forge agent profiles", renderProfileList(state, deps, ctx));
|
|
40
|
+
return;
|
|
41
|
+
case "use":
|
|
42
|
+
await useProfile(pi, state, deps, rest[0], ctx);
|
|
43
|
+
return;
|
|
44
|
+
case "save":
|
|
45
|
+
await saveProfile(pi, state, deps, rest, ctx);
|
|
46
|
+
return;
|
|
47
|
+
case "status":
|
|
48
|
+
await showText(ctx, "pi-forge profile status", renderProfileStatus(pi, state, ctx));
|
|
49
|
+
return;
|
|
50
|
+
case "preview":
|
|
51
|
+
await previewProfile(pi, state, deps, rest[0], ctx);
|
|
52
|
+
return;
|
|
53
|
+
case "validate":
|
|
54
|
+
await validateProfiles(state, deps, rest[0], ctx);
|
|
55
|
+
return;
|
|
56
|
+
case "reload":
|
|
57
|
+
if (!ctx.isProjectTrusted()) {
|
|
58
|
+
ctx.ui.notify("pi-forge: project is not trusted; agent profiles remain disabled.", "warning");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await deps.reloadProfiles(ctx);
|
|
62
|
+
ctx.ui.notify(`pi-forge: reloaded ${state.profiles.length} agent profile(s); no profile was applied.`, "info");
|
|
63
|
+
return;
|
|
64
|
+
case "forget":
|
|
65
|
+
forgetProfileProvenance(pi, state, ctx);
|
|
66
|
+
return;
|
|
67
|
+
default:
|
|
68
|
+
ctx.ui.notify(`Unknown /profile subcommand: ${command}`, "warning");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function useProfile(pi, state, deps, id, ctx) {
|
|
72
|
+
if (!id) {
|
|
73
|
+
ctx.ui.notify("Usage: /profile use <id>", "warning");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!ctx.isProjectTrusted()) {
|
|
77
|
+
ctx.ui.notify("pi-forge: project is not trusted; refusing to apply an agent profile.", "warning");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!ctx.isIdle()) {
|
|
81
|
+
ctx.ui.notify("pi-forge: wait for the current agent operation to finish before applying a profile.", "warning");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const target = findProfile(state, id);
|
|
85
|
+
if (!target) {
|
|
86
|
+
ctx.ui.notify(`Unknown agent profile: ${id}`, "error");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const resolved = deps.resolveProfile(target, ctx);
|
|
90
|
+
if (!isResolvedAgentProfileUsable(resolved) || !resolved.model) {
|
|
91
|
+
ctx.ui.notify(`pi-forge: profile ${id} failed preflight; runtime state was not changed.`, "error");
|
|
92
|
+
await showText(ctx, `pi-forge profile validation: ${id}`, renderAgentProfileDiagnostics(resolved.diagnostics));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const result = await applyResolvedAgentProfile(pi, state, deps, resolved, ctx);
|
|
96
|
+
if (!result.ok) {
|
|
97
|
+
const rollbackSuffix = result.rollbackErrors.length > 0 ? ` Rollback problems: ${result.rollbackErrors.join("; ")}` : " Previous runtime state was restored.";
|
|
98
|
+
const detail = result.detail;
|
|
99
|
+
ctx.ui.notify(`pi-forge: failed to apply profile ${id}: ${detail}${detail.endsWith(".") ? "" : "."}${rollbackSuffix}`, "error");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const warningCount = result.warningCount;
|
|
103
|
+
ctx.ui.notify(`pi-forge: applied profile ${id} once${warningCount ? ` with ${warningCount} warning(s)` : ""}; later manual changes will be preserved.`, warningCount ? "warning" : "info");
|
|
104
|
+
}
|
|
105
|
+
async function saveProfile(pi, state, deps, rest, ctx) {
|
|
106
|
+
const id = rest[0];
|
|
107
|
+
const flags = new Set(rest.slice(1));
|
|
108
|
+
if (!id || [...flags].some((flag) => flag !== "--overwrite")) {
|
|
109
|
+
ctx.ui.notify("Usage: /profile save <id> [--overwrite]", "warning");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!isValidAgentProfileId(id)) {
|
|
113
|
+
ctx.ui.notify("Profile id must start with a letter or number and contain only letters, numbers, dots, underscores, and hyphens.", "error");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!ctx.isProjectTrusted()) {
|
|
117
|
+
ctx.ui.notify("pi-forge: project is not trusted; refusing to write an agent profile.", "warning");
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!ctx.model) {
|
|
121
|
+
ctx.ui.notify("pi-forge: cannot save a profile because no model is currently selected.", "error");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const existingMatches = state.profiles.filter((loaded) => loaded.profile.id === id);
|
|
125
|
+
if (existingMatches.length > 1) {
|
|
126
|
+
ctx.ui.notify(`pi-forge: cannot save profile ${id} while duplicate profile ids exist.`, "error");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const existing = existingMatches[0];
|
|
130
|
+
const filePath = existing?.filePath ?? agentProfilePath(ctx.cwd, id);
|
|
131
|
+
let overwrite = flags.has("--overwrite");
|
|
132
|
+
if (existsSync(filePath) && !overwrite) {
|
|
133
|
+
if (!ctx.hasUI) {
|
|
134
|
+
ctx.ui.notify(`pi-forge: profile ${id} already exists; re-run with --overwrite.`, "error");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
overwrite = await ctx.ui.confirm("Overwrite agent profile?", `Replace ${filePath} with the current model, thinking level, and prompt-stack selection?`);
|
|
138
|
+
if (!overwrite) {
|
|
139
|
+
ctx.ui.notify("pi-forge: profile save cancelled; the existing file was left unchanged.", "info");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const capture = captureAgentProfile(id, {
|
|
144
|
+
model: { provider: ctx.model.provider, id: ctx.model.id },
|
|
145
|
+
thinkingLevel: pi.getThinkingLevel(),
|
|
146
|
+
promptStack: state.active?.stack.id ?? null,
|
|
147
|
+
}, existing);
|
|
148
|
+
if (!capture.ok) {
|
|
149
|
+
ctx.ui.notify(`pi-forge: current runtime could not be saved as profile ${id}.`, "error");
|
|
150
|
+
await showText(ctx, `pi-forge profile validation: ${id}`, renderAgentProfileDiagnostics(capture.diagnostics));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const write = writeAgentProfile(ctx.cwd, capture.profile, { filePath, overwrite });
|
|
154
|
+
if (!write.ok) {
|
|
155
|
+
if (write.reason === "exists") {
|
|
156
|
+
ctx.ui.notify(`pi-forge: profile ${id} already exists; re-run with --overwrite.`, "error");
|
|
157
|
+
}
|
|
158
|
+
else if (write.reason === "validation") {
|
|
159
|
+
ctx.ui.notify(`pi-forge: current runtime could not be saved as profile ${id}.`, "error");
|
|
160
|
+
await showText(ctx, `pi-forge profile validation: ${id}`, renderAgentProfileDiagnostics(write.diagnostics));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
ctx.ui.notify(`pi-forge: failed to save profile ${id}: ${write.error ?? write.reason}`, "error");
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
await deps.reloadProfiles(ctx);
|
|
168
|
+
ctx.ui.notify(`pi-forge: saved current runtime as profile ${id}; the profile was not applied or marked active.`, "info");
|
|
169
|
+
}
|
|
170
|
+
async function previewProfile(pi, state, deps, id, ctx) {
|
|
171
|
+
if (!id) {
|
|
172
|
+
ctx.ui.notify("Usage: /profile preview <id>", "warning");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const target = findProfile(state, id);
|
|
176
|
+
if (!target) {
|
|
177
|
+
ctx.ui.notify(`Unknown agent profile: ${id}`, "error");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const resolved = deps.resolveProfile(target, ctx);
|
|
181
|
+
const targetEffectiveTools = resolved.promptStack || resolved.loaded.profile.promptStack === null
|
|
182
|
+
? deps.previewToolNames(resolved.promptStack?.stack)
|
|
183
|
+
: [];
|
|
184
|
+
const preview = createAgentProfilePreview(resolved, currentRuntime(pi, state, ctx), targetEffectiveTools);
|
|
185
|
+
await showText(ctx, `pi-forge profile preview: ${id}`, renderProfilePreview(preview));
|
|
186
|
+
}
|
|
187
|
+
async function validateProfiles(state, deps, id, ctx) {
|
|
188
|
+
const targets = id ? state.profiles.filter((loaded) => loaded.profile.id === id) : state.profiles;
|
|
189
|
+
if (targets.length === 0) {
|
|
190
|
+
ctx.ui.notify(id ? `Unknown agent profile: ${id}` : "No agent profiles found.", "warning");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const text = targets.map((target) => {
|
|
194
|
+
const resolved = deps.resolveProfile(target, ctx);
|
|
195
|
+
return `## ${target.profile.id}\n\nSource: ${target.filePath}\n\n${renderAgentProfileDiagnostics(resolved.diagnostics)}`;
|
|
196
|
+
}).join("\n\n");
|
|
197
|
+
await showText(ctx, id ? `pi-forge profile validation: ${id}` : "pi-forge profile validation", text);
|
|
198
|
+
}
|
|
199
|
+
function forgetProfileProvenance(pi, state, ctx) {
|
|
200
|
+
if (!forgetAgentProfileProvenance(pi, state)) {
|
|
201
|
+
ctx.ui.notify("pi-forge: there is no last-applied profile provenance to forget.", "info");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
ctx.ui.notify("pi-forge: forgot last-applied profile provenance; model, thinking level, and prompt stack were not changed.", "info");
|
|
205
|
+
}
|
|
206
|
+
function renderProfileList(state, deps, ctx) {
|
|
207
|
+
const lines = [
|
|
208
|
+
`Agent profile directory: ${agentProfilesDir(ctx.cwd)}`,
|
|
209
|
+
`Last applied: ${state.lastAppliedProfile?.profileId ?? "(none)"}`,
|
|
210
|
+
"",
|
|
211
|
+
];
|
|
212
|
+
if (state.profiles.length === 0) {
|
|
213
|
+
lines.push("No agent profiles found.", "Use /profile save <id> to capture the current runtime.");
|
|
214
|
+
return lines.join("\n");
|
|
215
|
+
}
|
|
216
|
+
for (const loaded of state.profiles) {
|
|
217
|
+
const resolved = deps.resolveProfile(loaded, ctx);
|
|
218
|
+
const errors = resolved.diagnostics.filter((diagnostic) => diagnostic.level === "error").length;
|
|
219
|
+
const warnings = resolved.diagnostics.filter((diagnostic) => diagnostic.level === "warning").length;
|
|
220
|
+
const markers = [
|
|
221
|
+
loaded.profile.autoActivate === true ? "auto" : undefined,
|
|
222
|
+
state.lastAppliedProfile?.sourcePath === loaded.filePath ? "last applied" : "profile",
|
|
223
|
+
].filter((marker) => !!marker);
|
|
224
|
+
const suffix = errors || warnings ? ` (${errors} errors, ${warnings} warnings)` : "";
|
|
225
|
+
lines.push(`${loaded.profile.id}${loaded.profile.name ? ` — ${loaded.profile.name}` : ""} [${markers.join(", ")}]${suffix}`);
|
|
226
|
+
lines.push(` ${loaded.filePath}`);
|
|
227
|
+
}
|
|
228
|
+
lines.push("", "Commands:", " /profile use <id>", " /profile save <id> [--overwrite]", " /profile status", " /profile preview <id>", " /profile validate [id]", " /profile reload", " /profile forget");
|
|
229
|
+
return lines.join("\n");
|
|
230
|
+
}
|
|
231
|
+
function renderProfilePreview(preview) {
|
|
232
|
+
return [
|
|
233
|
+
`Profile: ${preview.profileId}${preview.name ? ` — ${preview.name}` : ""}`,
|
|
234
|
+
`Source: ${preview.sourcePath}`,
|
|
235
|
+
preview.description ? `Description: ${preview.description}` : undefined,
|
|
236
|
+
`Auto-activate for fresh sessions: ${preview.autoActivate ? "yes" : "no"}`,
|
|
237
|
+
"",
|
|
238
|
+
`Model: ${modelReferenceLabel(preview.current.model)} → ${modelReferenceLabel(preview.target.model)}`,
|
|
239
|
+
`Thinking level: ${preview.current.thinkingLevel} → ${preview.target.thinkingLevel}`,
|
|
240
|
+
`Prompt stack: ${preview.current.promptStack ?? "(none)"} → ${preview.target.promptStack ?? "(none)"}`,
|
|
241
|
+
`Tool policy: ${formatToolPolicy(preview.target.toolPolicy)}`,
|
|
242
|
+
`Effective tools after stack policy: ${preview.target.effectiveTools.length > 0 ? preview.target.effectiveTools.join(", ") : "(none)"}`,
|
|
243
|
+
`Applicable: ${preview.applicable ? "yes" : "no"}`,
|
|
244
|
+
"",
|
|
245
|
+
"Diagnostics:",
|
|
246
|
+
renderAgentProfileDiagnostics(preview.diagnostics),
|
|
247
|
+
].filter((line) => line !== undefined).join("\n");
|
|
248
|
+
}
|
|
249
|
+
function renderProfileStatus(pi, state, ctx) {
|
|
250
|
+
const status = getAgentProfileRuntimeStatus(state.profiles, state.lastAppliedProfile, currentRuntime(pi, state, ctx));
|
|
251
|
+
const lines = [
|
|
252
|
+
`Current model: ${modelReferenceLabel(status.current.model)}`,
|
|
253
|
+
`Current thinking level: ${status.current.thinkingLevel}`,
|
|
254
|
+
`Current prompt stack: ${status.current.promptStack ?? "(none)"}`,
|
|
255
|
+
`Current effective tools: ${status.current.effectiveTools.join(", ") || "(none)"}`,
|
|
256
|
+
"",
|
|
257
|
+
];
|
|
258
|
+
if (!status.lastApplied) {
|
|
259
|
+
lines.push("Last applied profile: (none)");
|
|
260
|
+
return lines.join("\n");
|
|
261
|
+
}
|
|
262
|
+
const { provenance, drift } = status.lastApplied;
|
|
263
|
+
const sourceState = status.lastApplied.sourceState === "changed" ? "changed since application" : status.lastApplied.sourceState;
|
|
264
|
+
lines.push(`Last applied profile: ${provenance.profileId}`, `Applied at: ${provenance.appliedAt}`, `Source: ${provenance.sourcePath}`, `Profile source: ${sourceState}`, "", "Runtime drift:", ` model: ${formatDrift(drift.model, modelReferenceLabel)}`, ` thinking level: ${formatDrift(drift.thinkingLevel, String)}`, ` prompt stack: ${formatDrift(drift.promptStack, (value) => value ?? "(none)")}`);
|
|
265
|
+
return lines.join("\n");
|
|
266
|
+
}
|
|
267
|
+
function findProfile(state, id) {
|
|
268
|
+
return state.profiles.find((loaded) => loaded.profile.id === id);
|
|
269
|
+
}
|
|
270
|
+
function currentRuntime(pi, state, ctx) {
|
|
271
|
+
return {
|
|
272
|
+
model: ctx.model ? { provider: ctx.model.provider, id: ctx.model.id } : null,
|
|
273
|
+
thinkingLevel: pi.getThinkingLevel(),
|
|
274
|
+
promptStack: state.active?.stack.id ?? null,
|
|
275
|
+
effectiveTools: pi.getActiveTools(),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function modelReferenceLabel(model) {
|
|
279
|
+
return model ? `${model.provider}/${model.id}` : "(none)";
|
|
280
|
+
}
|
|
281
|
+
function formatDrift(field, render) {
|
|
282
|
+
return field.changed ? `${render(field.expected)} → ${render(field.actual)}` : "unchanged";
|
|
283
|
+
}
|
|
284
|
+
function formatToolPolicy(policy) {
|
|
285
|
+
if (policy?.allow?.length)
|
|
286
|
+
return `allow ${policy.allow.join(", ")}`;
|
|
287
|
+
if (policy?.deny?.length)
|
|
288
|
+
return `deny ${policy.deny.join(", ")}`;
|
|
289
|
+
return "unrestricted runtime baseline";
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=profile-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-command.js","sourceRoot":"","sources":["../src/profile-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { type AgentProfile, type AgentProfileDiagnostic, type AgentProfileModelReference, type AgentProfileProvenance, type LoadedAgentProfile, type ResolvedAgentProfile } from "./agent-profile.ts";
|
|
4
|
+
import type { LoadedPromptStack, PromptResourcePolicy } from "./types.ts";
|
|
5
|
+
export interface AgentProfileCurrentRuntime {
|
|
6
|
+
model: AgentProfileModelReference | null;
|
|
7
|
+
thinkingLevel: ThinkingLevel;
|
|
8
|
+
promptStack: string | null;
|
|
9
|
+
effectiveTools: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface AgentProfileCaptureInput {
|
|
12
|
+
model: AgentProfileModelReference | null;
|
|
13
|
+
thinkingLevel: ThinkingLevel;
|
|
14
|
+
promptStack: string | null;
|
|
15
|
+
}
|
|
16
|
+
export type AgentProfileCaptureResult = {
|
|
17
|
+
ok: true;
|
|
18
|
+
profile: AgentProfile;
|
|
19
|
+
diagnostics: AgentProfileDiagnostic[];
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
diagnostics: AgentProfileDiagnostic[];
|
|
23
|
+
};
|
|
24
|
+
export type AgentProfileWriteResult = {
|
|
25
|
+
ok: true;
|
|
26
|
+
profile: AgentProfile;
|
|
27
|
+
filePath: string;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
reason: "exists" | "invalid-path" | "validation" | "io";
|
|
31
|
+
diagnostics: AgentProfileDiagnostic[];
|
|
32
|
+
error?: string;
|
|
33
|
+
};
|
|
34
|
+
export type AgentProfileDeleteResult = {
|
|
35
|
+
ok: true;
|
|
36
|
+
filePath: string;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
reason: "missing" | "invalid-path" | "io";
|
|
40
|
+
filePath: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
};
|
|
43
|
+
export interface AgentProfileApplicationState {
|
|
44
|
+
active?: LoadedPromptStack;
|
|
45
|
+
lastAppliedProfile?: AgentProfileProvenance;
|
|
46
|
+
}
|
|
47
|
+
export interface AgentProfileApplicationDeps {
|
|
48
|
+
setActive(id: string | undefined, ctx?: ExtensionContext): boolean;
|
|
49
|
+
}
|
|
50
|
+
export type AgentProfileApplicationResult = {
|
|
51
|
+
ok: true;
|
|
52
|
+
warningCount: number;
|
|
53
|
+
provenance: AgentProfileProvenance;
|
|
54
|
+
} | {
|
|
55
|
+
ok: false;
|
|
56
|
+
detail: string;
|
|
57
|
+
rollbackErrors: string[];
|
|
58
|
+
};
|
|
59
|
+
export interface AgentProfilePreview {
|
|
60
|
+
profileId: string;
|
|
61
|
+
name?: string;
|
|
62
|
+
description?: string;
|
|
63
|
+
sourcePath: string;
|
|
64
|
+
autoActivate: boolean;
|
|
65
|
+
current: AgentProfileCurrentRuntime;
|
|
66
|
+
target: {
|
|
67
|
+
model: AgentProfileModelReference;
|
|
68
|
+
thinkingLevel: ThinkingLevel;
|
|
69
|
+
promptStack: string | null;
|
|
70
|
+
effectiveTools: string[];
|
|
71
|
+
toolPolicy?: PromptResourcePolicy;
|
|
72
|
+
};
|
|
73
|
+
applicable: boolean;
|
|
74
|
+
diagnostics: AgentProfileDiagnostic[];
|
|
75
|
+
}
|
|
76
|
+
export interface AgentProfileDriftField<T> {
|
|
77
|
+
expected: T;
|
|
78
|
+
actual: T;
|
|
79
|
+
changed: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface AgentProfileRuntimeStatus {
|
|
82
|
+
current: AgentProfileCurrentRuntime;
|
|
83
|
+
lastApplied?: {
|
|
84
|
+
provenance: AgentProfileProvenance;
|
|
85
|
+
sourceState: "unchanged" | "changed" | "missing";
|
|
86
|
+
drift: {
|
|
87
|
+
model: AgentProfileDriftField<AgentProfileModelReference | null>;
|
|
88
|
+
thinkingLevel: AgentProfileDriftField<ThinkingLevel>;
|
|
89
|
+
promptStack: AgentProfileDriftField<string | null>;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export declare function captureAgentProfile(id: string, runtime: AgentProfileCaptureInput, existing?: LoadedAgentProfile): AgentProfileCaptureResult;
|
|
94
|
+
export declare function writeAgentProfile(cwd: string, profile: AgentProfile, options?: {
|
|
95
|
+
filePath?: string;
|
|
96
|
+
overwrite?: boolean;
|
|
97
|
+
}): AgentProfileWriteResult;
|
|
98
|
+
export declare function deleteAgentProfile(cwd: string, loaded: LoadedAgentProfile): AgentProfileDeleteResult;
|
|
99
|
+
export declare function applyResolvedAgentProfile(pi: ExtensionAPI, state: AgentProfileApplicationState, deps: AgentProfileApplicationDeps, resolved: ResolvedAgentProfile, ctx: ExtensionContext): Promise<AgentProfileApplicationResult>;
|
|
100
|
+
export declare function forgetAgentProfileProvenance(pi: ExtensionAPI, state: AgentProfileApplicationState): boolean;
|
|
101
|
+
export declare function createAgentProfilePreview(resolved: ResolvedAgentProfile, current: AgentProfileCurrentRuntime, targetEffectiveTools: string[]): AgentProfilePreview;
|
|
102
|
+
export declare function getAgentProfileRuntimeStatus(profiles: readonly LoadedAgentProfile[], provenance: AgentProfileProvenance | undefined, current: AgentProfileCurrentRuntime): AgentProfileRuntimeStatus;
|
|
103
|
+
//# sourceMappingURL=profile-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-service.d.ts","sourceRoot":"","sources":["../src/profile-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { AGENT_PROFILE_TYPE, agentProfileFingerprint, agentProfilePath, hasAgentProfileErrors, isResolvedAgentProfileUsable, validateAgentProfile, } from "./agent-profile.js";
|
|
4
|
+
import { PROFILE_ENTRY_TYPE } from "./runtime-state.js";
|
|
5
|
+
import { isInsideAgentProfileStorage } from "./storage.js";
|
|
6
|
+
export function captureAgentProfile(id, runtime, existing) {
|
|
7
|
+
if (!runtime.model) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
diagnostics: [{ level: "error", field: "model", message: "Cannot capture an agent profile without a selected model." }],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const profile = {
|
|
14
|
+
schemaVersion: 1,
|
|
15
|
+
type: AGENT_PROFILE_TYPE,
|
|
16
|
+
id,
|
|
17
|
+
name: existing?.profile.name ?? id,
|
|
18
|
+
description: existing?.profile.description,
|
|
19
|
+
autoActivate: existing?.profile.autoActivate,
|
|
20
|
+
model: { ...runtime.model },
|
|
21
|
+
thinkingLevel: runtime.thinkingLevel,
|
|
22
|
+
promptStack: runtime.promptStack,
|
|
23
|
+
};
|
|
24
|
+
const diagnostics = validateAgentProfile(profile);
|
|
25
|
+
return hasAgentProfileErrors(diagnostics)
|
|
26
|
+
? { ok: false, diagnostics }
|
|
27
|
+
: { ok: true, profile, diagnostics };
|
|
28
|
+
}
|
|
29
|
+
export function writeAgentProfile(cwd, profile, options = {}) {
|
|
30
|
+
const diagnostics = validateAgentProfile(profile);
|
|
31
|
+
if (hasAgentProfileErrors(diagnostics))
|
|
32
|
+
return { ok: false, reason: "validation", diagnostics };
|
|
33
|
+
const filePath = options.filePath ?? agentProfilePath(cwd, profile.id);
|
|
34
|
+
if (!isInsideAgentProfileStorage(cwd, filePath)) {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
reason: "invalid-path",
|
|
38
|
+
diagnostics,
|
|
39
|
+
error: `Profile path is outside project agent-profile storage: ${filePath}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (existsSync(filePath) && !options.overwrite)
|
|
43
|
+
return { ok: false, reason: "exists", diagnostics };
|
|
44
|
+
try {
|
|
45
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
46
|
+
writeFileSync(filePath, JSON.stringify(profile, null, 2) + "\n", { encoding: "utf8", flag: options.overwrite ? "w" : "wx" });
|
|
47
|
+
return { ok: true, profile, filePath };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const code = error && typeof error === "object" && "code" in error ? String(error.code) : undefined;
|
|
51
|
+
if (code === "EEXIST")
|
|
52
|
+
return { ok: false, reason: "exists", diagnostics };
|
|
53
|
+
return { ok: false, reason: "io", diagnostics, error: error instanceof Error ? error.message : String(error) };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function deleteAgentProfile(cwd, loaded) {
|
|
57
|
+
const filePath = loaded.filePath;
|
|
58
|
+
if (!isInsideAgentProfileStorage(cwd, filePath))
|
|
59
|
+
return { ok: false, reason: "invalid-path", filePath };
|
|
60
|
+
if (!existsSync(filePath))
|
|
61
|
+
return { ok: false, reason: "missing", filePath };
|
|
62
|
+
try {
|
|
63
|
+
unlinkSync(filePath);
|
|
64
|
+
return { ok: true, filePath };
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return { ok: false, reason: "io", filePath, error: error instanceof Error ? error.message : String(error) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function applyResolvedAgentProfile(pi, state, deps, resolved, ctx) {
|
|
71
|
+
if (!isResolvedAgentProfileUsable(resolved) || !resolved.model) {
|
|
72
|
+
return { ok: false, detail: "Profile failed preflight; runtime state was not changed", rollbackErrors: [] };
|
|
73
|
+
}
|
|
74
|
+
const previousModel = ctx.model;
|
|
75
|
+
const previousThinkingLevel = pi.getThinkingLevel();
|
|
76
|
+
const previousPromptStack = state.active?.stack.id ?? null;
|
|
77
|
+
const modelChanged = !sameModelReference(previousModel, resolved.model);
|
|
78
|
+
try {
|
|
79
|
+
if (modelChanged && !(await pi.setModel(resolved.model))) {
|
|
80
|
+
throw new Error(`Pi could not activate model ${resolved.model.provider}/${resolved.model.id}; authentication may have changed after preflight.`);
|
|
81
|
+
}
|
|
82
|
+
pi.setThinkingLevel(resolved.effectiveThinkingLevel);
|
|
83
|
+
const actualThinkingLevel = pi.getThinkingLevel();
|
|
84
|
+
if (actualThinkingLevel !== resolved.effectiveThinkingLevel) {
|
|
85
|
+
throw new Error(`Pi applied thinking level ${actualThinkingLevel} instead of ${resolved.effectiveThinkingLevel}.`);
|
|
86
|
+
}
|
|
87
|
+
if (!deps.setActive(resolved.loaded.profile.promptStack ?? "none", ctx)) {
|
|
88
|
+
throw new Error(`Prompt stack ${String(resolved.loaded.profile.promptStack)} disappeared after preflight.`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const rollbackErrors = await rollbackAgentProfileApplication(pi, deps, ctx, {
|
|
93
|
+
model: previousModel,
|
|
94
|
+
thinkingLevel: previousThinkingLevel,
|
|
95
|
+
promptStack: previousPromptStack,
|
|
96
|
+
modelChanged,
|
|
97
|
+
});
|
|
98
|
+
return { ok: false, detail: error instanceof Error ? error.message : String(error), rollbackErrors };
|
|
99
|
+
}
|
|
100
|
+
const provenance = {
|
|
101
|
+
profileId: resolved.loaded.profile.id,
|
|
102
|
+
sourcePath: resolved.loaded.filePath,
|
|
103
|
+
sourceFingerprint: agentProfileFingerprint(resolved.loaded.profile),
|
|
104
|
+
appliedAt: new Date().toISOString(),
|
|
105
|
+
snapshot: {
|
|
106
|
+
model: { provider: resolved.model.provider, id: resolved.model.id },
|
|
107
|
+
thinkingLevel: resolved.effectiveThinkingLevel,
|
|
108
|
+
promptStack: resolved.loaded.profile.promptStack,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
state.lastAppliedProfile = provenance;
|
|
112
|
+
pi.appendEntry(PROFILE_ENTRY_TYPE, { provenance });
|
|
113
|
+
return {
|
|
114
|
+
ok: true,
|
|
115
|
+
warningCount: resolved.diagnostics.filter((diagnostic) => diagnostic.level === "warning").length,
|
|
116
|
+
provenance,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function forgetAgentProfileProvenance(pi, state) {
|
|
120
|
+
if (!state.lastAppliedProfile)
|
|
121
|
+
return false;
|
|
122
|
+
state.lastAppliedProfile = undefined;
|
|
123
|
+
pi.appendEntry(PROFILE_ENTRY_TYPE, { provenance: null });
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
export function createAgentProfilePreview(resolved, current, targetEffectiveTools) {
|
|
127
|
+
const profile = resolved.loaded.profile;
|
|
128
|
+
return {
|
|
129
|
+
profileId: profile.id,
|
|
130
|
+
name: profile.name,
|
|
131
|
+
description: profile.description,
|
|
132
|
+
sourcePath: resolved.loaded.filePath,
|
|
133
|
+
autoActivate: profile.autoActivate === true,
|
|
134
|
+
current: cloneCurrentRuntime(current),
|
|
135
|
+
target: {
|
|
136
|
+
model: { ...profile.model },
|
|
137
|
+
thinkingLevel: resolved.effectiveThinkingLevel,
|
|
138
|
+
promptStack: profile.promptStack,
|
|
139
|
+
effectiveTools: [...targetEffectiveTools],
|
|
140
|
+
toolPolicy: resolved.promptStack?.stack.tools ? structuredClone(resolved.promptStack.stack.tools) : undefined,
|
|
141
|
+
},
|
|
142
|
+
applicable: isResolvedAgentProfileUsable(resolved),
|
|
143
|
+
diagnostics: resolved.diagnostics.map((diagnostic) => ({ ...diagnostic })),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function getAgentProfileRuntimeStatus(profiles, provenance, current) {
|
|
147
|
+
const status = { current: cloneCurrentRuntime(current) };
|
|
148
|
+
if (!provenance)
|
|
149
|
+
return status;
|
|
150
|
+
const currentSource = profiles.find((loaded) => loaded.filePath === provenance.sourcePath);
|
|
151
|
+
const sourceState = !currentSource
|
|
152
|
+
? "missing"
|
|
153
|
+
: agentProfileFingerprint(currentSource.profile) === provenance.sourceFingerprint ? "unchanged" : "changed";
|
|
154
|
+
status.lastApplied = {
|
|
155
|
+
provenance: structuredClone(provenance),
|
|
156
|
+
sourceState,
|
|
157
|
+
drift: {
|
|
158
|
+
model: driftField(provenance.snapshot.model, current.model, sameModelReferenceValue),
|
|
159
|
+
thinkingLevel: driftField(provenance.snapshot.thinkingLevel, current.thinkingLevel),
|
|
160
|
+
promptStack: driftField(provenance.snapshot.promptStack, current.promptStack),
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
return status;
|
|
164
|
+
}
|
|
165
|
+
async function rollbackAgentProfileApplication(pi, deps, ctx, previous) {
|
|
166
|
+
const errors = [];
|
|
167
|
+
try {
|
|
168
|
+
if (!deps.setActive(previous.promptStack ?? "none", ctx))
|
|
169
|
+
errors.push(`could not restore prompt stack ${String(previous.promptStack)}`);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
errors.push(`prompt stack restore failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
173
|
+
}
|
|
174
|
+
if (previous.modelChanged) {
|
|
175
|
+
if (!previous.model) {
|
|
176
|
+
errors.push("Pi has no API for restoring an unset model");
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
try {
|
|
180
|
+
if (!(await pi.setModel(previous.model)))
|
|
181
|
+
errors.push(`could not restore model ${previous.model.provider}/${previous.model.id}`);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
errors.push(`model restore failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
pi.setThinkingLevel(previous.thinkingLevel);
|
|
190
|
+
if (pi.getThinkingLevel() !== previous.thinkingLevel)
|
|
191
|
+
errors.push(`could not restore thinking level ${previous.thinkingLevel}`);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
errors.push(`thinking-level restore failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
195
|
+
}
|
|
196
|
+
return errors;
|
|
197
|
+
}
|
|
198
|
+
function cloneCurrentRuntime(current) {
|
|
199
|
+
return {
|
|
200
|
+
model: current.model ? { ...current.model } : null,
|
|
201
|
+
thinkingLevel: current.thinkingLevel,
|
|
202
|
+
promptStack: current.promptStack,
|
|
203
|
+
effectiveTools: [...current.effectiveTools],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function driftField(expected, actual, equals = Object.is) {
|
|
207
|
+
return { expected, actual, changed: !equals(expected, actual) };
|
|
208
|
+
}
|
|
209
|
+
function sameModelReference(left, right) {
|
|
210
|
+
return !!left && !!right && left.provider === right.provider && left.id === right.id;
|
|
211
|
+
}
|
|
212
|
+
function sameModelReferenceValue(left, right) {
|
|
213
|
+
return left === null || right === null ? left === right : left.provider === right.provider && left.id === right.id;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=profile-service.js.map
|