jfl 0.9.6 → 0.9.7
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/dist/commands/agents.js +1 -1
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +77 -18
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/deploy.js +1 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/hud.js +1 -1
- package/dist/commands/hud.js.map +1 -1
- package/dist/commands/init-from-service.js +1 -1
- package/dist/commands/init-from-service.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +2 -13
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +6 -44
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/organize.d.ts +16 -0
- package/dist/commands/organize.d.ts.map +1 -0
- package/dist/commands/organize.js +334 -0
- package/dist/commands/organize.js.map +1 -0
- package/dist/commands/peter.d.ts.map +1 -1
- package/dist/commands/peter.js +273 -0
- package/dist/commands/peter.js.map +1 -1
- package/dist/commands/pi.d.ts.map +1 -1
- package/dist/commands/pi.js +8 -2
- package/dist/commands/pi.js.map +1 -1
- package/dist/commands/repair.js +1 -1
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +113 -45
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-config.d.ts.map +1 -1
- package/dist/lib/agent-config.js +24 -2
- package/dist/lib/agent-config.js.map +1 -1
- package/dist/lib/hub-health.d.ts.map +1 -1
- package/dist/lib/hub-health.js +14 -2
- package/dist/lib/hub-health.js.map +1 -1
- package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -1
- package/dist/lib/resource-optimizer-middleware.js +8 -2
- package/dist/lib/resource-optimizer-middleware.js.map +1 -1
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +13 -12
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/utils/auth-status.d.ts +21 -0
- package/dist/utils/auth-status.d.ts.map +1 -0
- package/dist/utils/auth-status.js +53 -0
- package/dist/utils/auth-status.js.map +1 -0
- package/package.json +3 -2
- package/packages/pi/dist/agent-grid.d.ts +24 -0
- package/packages/pi/dist/agent-grid.d.ts.map +1 -0
- package/packages/pi/dist/agent-grid.js +162 -0
- package/packages/pi/dist/agent-grid.js.map +1 -0
- package/packages/pi/dist/agent-names.d.ts +43 -0
- package/packages/pi/dist/agent-names.d.ts.map +1 -0
- package/packages/pi/dist/agent-names.js +156 -0
- package/packages/pi/dist/agent-names.js.map +1 -0
- package/packages/pi/dist/autoresearch.d.ts +15 -0
- package/packages/pi/dist/autoresearch.d.ts.map +1 -0
- package/packages/pi/dist/autoresearch.js +372 -0
- package/packages/pi/dist/autoresearch.js.map +1 -0
- package/packages/pi/dist/bookmarks.d.ts +15 -0
- package/packages/pi/dist/bookmarks.d.ts.map +1 -0
- package/packages/pi/dist/bookmarks.js +77 -0
- package/packages/pi/dist/bookmarks.js.map +1 -0
- package/packages/pi/dist/context.d.ts +17 -0
- package/packages/pi/dist/context.d.ts.map +1 -0
- package/packages/pi/dist/context.js +152 -0
- package/packages/pi/dist/context.js.map +1 -0
- package/packages/pi/dist/crm-tool.d.ts +12 -0
- package/packages/pi/dist/crm-tool.d.ts.map +1 -0
- package/packages/pi/dist/crm-tool.js +58 -0
- package/packages/pi/dist/crm-tool.js.map +1 -0
- package/packages/pi/dist/eval-tool.d.ts +11 -0
- package/packages/pi/dist/eval-tool.d.ts.map +1 -0
- package/packages/pi/dist/eval-tool.js +188 -0
- package/packages/pi/dist/eval-tool.js.map +1 -0
- package/packages/pi/dist/eval.d.ts +12 -0
- package/packages/pi/dist/eval.d.ts.map +1 -0
- package/packages/pi/dist/eval.js +43 -0
- package/packages/pi/dist/eval.js.map +1 -0
- package/packages/pi/dist/footer.d.ts +20 -0
- package/packages/pi/dist/footer.d.ts.map +1 -0
- package/packages/pi/dist/footer.js +222 -0
- package/packages/pi/dist/footer.js.map +1 -0
- package/packages/pi/dist/header.d.ts +17 -0
- package/packages/pi/dist/header.d.ts.map +1 -0
- package/packages/pi/dist/header.js +156 -0
- package/packages/pi/dist/header.js.map +1 -0
- package/packages/pi/dist/hub-resolver.d.ts +11 -0
- package/packages/pi/dist/hub-resolver.d.ts.map +1 -0
- package/packages/pi/dist/hub-resolver.js +58 -0
- package/packages/pi/dist/hub-resolver.js.map +1 -0
- package/packages/pi/dist/hub-tools.d.ts +14 -0
- package/packages/pi/dist/hub-tools.d.ts.map +1 -0
- package/packages/pi/dist/hub-tools.js +266 -0
- package/packages/pi/dist/hub-tools.js.map +1 -0
- package/packages/pi/dist/hud-tool.d.ts +17 -0
- package/packages/pi/dist/hud-tool.d.ts.map +1 -0
- package/packages/pi/dist/hud-tool.js +297 -0
- package/packages/pi/dist/hud-tool.js.map +1 -0
- package/packages/pi/dist/index.d.ts +12 -0
- package/packages/pi/dist/index.d.ts.map +1 -0
- package/packages/pi/dist/index.js +436 -0
- package/packages/pi/dist/index.js.map +1 -0
- package/packages/pi/dist/jfl-resolve.d.ts +29 -0
- package/packages/pi/dist/jfl-resolve.d.ts.map +1 -0
- package/packages/pi/dist/jfl-resolve.js +89 -0
- package/packages/pi/dist/jfl-resolve.js.map +1 -0
- package/packages/pi/dist/journal.d.ts +23 -0
- package/packages/pi/dist/journal.d.ts.map +1 -0
- package/packages/pi/dist/journal.js +250 -0
- package/packages/pi/dist/journal.js.map +1 -0
- package/packages/pi/dist/map-bridge.d.ts +20 -0
- package/packages/pi/dist/map-bridge.d.ts.map +1 -0
- package/packages/pi/dist/map-bridge.js +181 -0
- package/packages/pi/dist/map-bridge.js.map +1 -0
- package/packages/pi/dist/memory-tool.d.ts +11 -0
- package/packages/pi/dist/memory-tool.d.ts.map +1 -0
- package/packages/pi/dist/memory-tool.js +148 -0
- package/packages/pi/dist/memory-tool.js.map +1 -0
- package/packages/pi/dist/notifications.d.ts +15 -0
- package/packages/pi/dist/notifications.d.ts.map +1 -0
- package/packages/pi/dist/notifications.js +65 -0
- package/packages/pi/dist/notifications.js.map +1 -0
- package/packages/pi/dist/onboarding-v1.d.ts +15 -0
- package/packages/pi/dist/onboarding-v1.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v1.js +417 -0
- package/packages/pi/dist/onboarding-v1.js.map +1 -0
- package/packages/pi/dist/onboarding-v2.d.ts +18 -0
- package/packages/pi/dist/onboarding-v2.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v2.js +402 -0
- package/packages/pi/dist/onboarding-v2.js.map +1 -0
- package/packages/pi/dist/onboarding-v3.d.ts +13 -0
- package/packages/pi/dist/onboarding-v3.d.ts.map +1 -0
- package/packages/pi/dist/onboarding-v3.js +581 -0
- package/packages/pi/dist/onboarding-v3.js.map +1 -0
- package/packages/pi/dist/peter-parker.d.ts +12 -0
- package/packages/pi/dist/peter-parker.d.ts.map +1 -0
- package/packages/pi/dist/peter-parker.js +162 -0
- package/packages/pi/dist/peter-parker.js.map +1 -0
- package/packages/pi/dist/pivot-tool.d.ts +11 -0
- package/packages/pi/dist/pivot-tool.d.ts.map +1 -0
- package/packages/pi/dist/pivot-tool.js +56 -0
- package/packages/pi/dist/pivot-tool.js.map +1 -0
- package/packages/pi/dist/policy-head-tool.d.ts +15 -0
- package/packages/pi/dist/policy-head-tool.d.ts.map +1 -0
- package/packages/pi/dist/policy-head-tool.js +220 -0
- package/packages/pi/dist/policy-head-tool.js.map +1 -0
- package/packages/pi/dist/portfolio-bridge.d.ts +12 -0
- package/packages/pi/dist/portfolio-bridge.d.ts.map +1 -0
- package/packages/pi/dist/portfolio-bridge.js +81 -0
- package/packages/pi/dist/portfolio-bridge.js.map +1 -0
- package/packages/pi/dist/service-skills.d.ts +15 -0
- package/packages/pi/dist/service-skills.d.ts.map +1 -0
- package/packages/pi/dist/service-skills.js +198 -0
- package/packages/pi/dist/service-skills.js.map +1 -0
- package/packages/pi/dist/session.d.ts +24 -0
- package/packages/pi/dist/session.d.ts.map +1 -0
- package/packages/pi/dist/session.js +394 -0
- package/packages/pi/dist/session.js.map +1 -0
- package/packages/pi/dist/shortcuts.d.ts +11 -0
- package/packages/pi/dist/shortcuts.d.ts.map +1 -0
- package/packages/pi/dist/shortcuts.js +231 -0
- package/packages/pi/dist/shortcuts.js.map +1 -0
- package/packages/pi/dist/startup-briefing.d.ts +13 -0
- package/packages/pi/dist/startup-briefing.d.ts.map +1 -0
- package/packages/pi/dist/startup-briefing.js +271 -0
- package/packages/pi/dist/startup-briefing.js.map +1 -0
- package/packages/pi/dist/stratus-bridge.d.ts +14 -0
- package/packages/pi/dist/stratus-bridge.d.ts.map +1 -0
- package/packages/pi/dist/stratus-bridge.js +104 -0
- package/packages/pi/dist/stratus-bridge.js.map +1 -0
- package/packages/pi/dist/subway-mesh.d.ts +88 -0
- package/packages/pi/dist/subway-mesh.d.ts.map +1 -0
- package/packages/pi/dist/subway-mesh.js +813 -0
- package/packages/pi/dist/subway-mesh.js.map +1 -0
- package/packages/pi/dist/synopsis-tool.d.ts +12 -0
- package/packages/pi/dist/synopsis-tool.d.ts.map +1 -0
- package/packages/pi/dist/synopsis-tool.js +84 -0
- package/packages/pi/dist/synopsis-tool.js.map +1 -0
- package/packages/pi/dist/tool-renderers.d.ts +55 -0
- package/packages/pi/dist/tool-renderers.d.ts.map +1 -0
- package/packages/pi/dist/tool-renderers.js +349 -0
- package/packages/pi/dist/tool-renderers.js.map +1 -0
- package/packages/pi/dist/training-buffer-tool.d.ts +16 -0
- package/packages/pi/dist/training-buffer-tool.d.ts.map +1 -0
- package/packages/pi/dist/training-buffer-tool.js +319 -0
- package/packages/pi/dist/training-buffer-tool.js.map +1 -0
- package/packages/pi/dist/types.d.ts +195 -0
- package/packages/pi/dist/types.d.ts.map +1 -0
- package/packages/pi/dist/types.js +11 -0
- package/packages/pi/dist/types.js.map +1 -0
- package/packages/pi/extensions/session.ts +115 -8
- package/packages/pi/extensions/training-buffer-tool.ts +15 -8
- package/packages/pi/extensions/types.ts +1 -0
- package/packages/pi/package.json +2 -3
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peter Parker Extension — Full Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Replaces the WebSocket bridge with a proper Pi extension orchestrator.
|
|
5
|
+
* Subscribes to MAP events, queries Stratus predictor for optimal action,
|
|
6
|
+
* spawns Pi RPC subprocesses, and runs the review loop (max 5 iterations).
|
|
7
|
+
*
|
|
8
|
+
* @purpose Full Peter Parker orchestrator — review loop with Stratus dispatch via Pi RPC
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from "child_process";
|
|
11
|
+
import { join } from "path";
|
|
12
|
+
import { jflImport } from "./jfl-resolve.js";
|
|
13
|
+
import { emitCustomEvent } from "./map-bridge.js";
|
|
14
|
+
const MAX_ITERATIONS = 5;
|
|
15
|
+
let projectRoot = "";
|
|
16
|
+
let maxIterations = MAX_ITERATIONS;
|
|
17
|
+
let activeIterations = new Map();
|
|
18
|
+
async function getPredictor(root) {
|
|
19
|
+
try {
|
|
20
|
+
// @ts-ignore — resolved from jfl package at runtime
|
|
21
|
+
const { Predictor } = await jflImport("predictor");
|
|
22
|
+
return new Predictor(root);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function spawnPiAgent(ctx, task, extensionPath) {
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
const args = [
|
|
31
|
+
"--mode", "rpc",
|
|
32
|
+
"--extension", extensionPath,
|
|
33
|
+
"--task", task.prompt,
|
|
34
|
+
"--yolo",
|
|
35
|
+
];
|
|
36
|
+
ctx.log(`PP: spawning agent for task ${task.id}`, "debug");
|
|
37
|
+
const proc = spawn("pi", args, {
|
|
38
|
+
cwd: projectRoot,
|
|
39
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
40
|
+
env: {
|
|
41
|
+
...process.env,
|
|
42
|
+
JFL_SESSION_ID: ctx.session.id,
|
|
43
|
+
JFL_TASK_ID: task.id,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
proc.stdout?.on("data", (d) => ctx.log(`PP agent: ${d.toString().trim()}`, "debug"));
|
|
47
|
+
proc.stderr?.on("data", (d) => ctx.log(`PP agent err: ${d.toString().trim()}`, "debug"));
|
|
48
|
+
proc.on("close", (code) => resolve({ exitCode: code }));
|
|
49
|
+
proc.on("error", () => resolve({ exitCode: -1 }));
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
proc.kill();
|
|
52
|
+
resolve({ exitCode: -1 });
|
|
53
|
+
}, 5 * 60 * 1000);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async function runReviewLoop(ctx, task) {
|
|
57
|
+
const current = activeIterations.get(task.id);
|
|
58
|
+
const iteration = current ? current.iteration + 1 : 1;
|
|
59
|
+
if (iteration > maxIterations) {
|
|
60
|
+
ctx.log(`PP: max iterations (${maxIterations}) reached for task ${task.id}`, "warn");
|
|
61
|
+
await emitCustomEvent(ctx, "peter:max-iterations", { taskId: task.id, iterations: iteration - 1 });
|
|
62
|
+
activeIterations.delete(task.id);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const iterRecord = {
|
|
66
|
+
taskId: task.id,
|
|
67
|
+
iteration,
|
|
68
|
+
startTime: new Date(),
|
|
69
|
+
};
|
|
70
|
+
const predictor = await getPredictor(projectRoot);
|
|
71
|
+
if (predictor) {
|
|
72
|
+
try {
|
|
73
|
+
const prediction = await predictor.predict({
|
|
74
|
+
proposal: {
|
|
75
|
+
description: task.prompt,
|
|
76
|
+
change_type: "fix",
|
|
77
|
+
scope: "small",
|
|
78
|
+
},
|
|
79
|
+
current_score: 0,
|
|
80
|
+
goal: "resolve review findings",
|
|
81
|
+
recent_trajectory: [],
|
|
82
|
+
});
|
|
83
|
+
iterRecord.prediction = { delta: prediction.predicted_delta, recommendation: prediction.recommendation };
|
|
84
|
+
if (prediction.recommendation === "abandon") {
|
|
85
|
+
ctx.log(`PP: predictor recommends abandon for task ${task.id}`, "info");
|
|
86
|
+
activeIterations.delete(task.id);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch { }
|
|
91
|
+
}
|
|
92
|
+
activeIterations.set(task.id, iterRecord);
|
|
93
|
+
await emitCustomEvent(ctx, "peter:dispatched", { taskId: task.id, iteration, prediction: iterRecord.prediction });
|
|
94
|
+
const extensionPath = join(projectRoot, "node_modules", "@jfl", "pi", "dist", "extensions", "index.js");
|
|
95
|
+
const result = await spawnPiAgent(ctx, task, extensionPath);
|
|
96
|
+
iterRecord.result = result.exitCode === 0 ? "success" : "failed";
|
|
97
|
+
activeIterations.set(task.id, iterRecord);
|
|
98
|
+
if (result.exitCode !== 0) {
|
|
99
|
+
ctx.log(`PP: agent failed (iteration ${iteration}), will retry`, "info");
|
|
100
|
+
await runReviewLoop(ctx, task);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
await emitCustomEvent(ctx, "peter:completed", { taskId: task.id, iterations: iteration });
|
|
104
|
+
activeIterations.delete(task.id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function setupPeterParker(ctx, config) {
|
|
108
|
+
projectRoot = ctx.session.projectRoot;
|
|
109
|
+
maxIterations = config.pi?.max_peter_iterations ?? MAX_ITERATIONS;
|
|
110
|
+
ctx.on("map:eval:scored", async (data) => {
|
|
111
|
+
const event = data;
|
|
112
|
+
if (!event.taskId || !event.findings?.length)
|
|
113
|
+
return;
|
|
114
|
+
const task = {
|
|
115
|
+
id: event.taskId,
|
|
116
|
+
prompt: `Review findings to address:\n${event.findings.join("\n")}`,
|
|
117
|
+
source: "eval:scored",
|
|
118
|
+
};
|
|
119
|
+
await runReviewLoop(ctx, task);
|
|
120
|
+
});
|
|
121
|
+
ctx.on("map:review:findings", async (data) => {
|
|
122
|
+
const event = data;
|
|
123
|
+
if (!event.findings)
|
|
124
|
+
return;
|
|
125
|
+
const task = {
|
|
126
|
+
id: event.id ?? `review-${Date.now()}`,
|
|
127
|
+
prompt: event.findings,
|
|
128
|
+
source: "review:findings",
|
|
129
|
+
priority: event.priority,
|
|
130
|
+
};
|
|
131
|
+
await runReviewLoop(ctx, task);
|
|
132
|
+
});
|
|
133
|
+
ctx.on("map:task:requested", async (data) => {
|
|
134
|
+
const event = data;
|
|
135
|
+
if (!event.prompt)
|
|
136
|
+
return;
|
|
137
|
+
const task = {
|
|
138
|
+
id: event.id ?? `task-${Date.now()}`,
|
|
139
|
+
prompt: event.prompt,
|
|
140
|
+
source: "task:requested",
|
|
141
|
+
};
|
|
142
|
+
await runReviewLoop(ctx, task);
|
|
143
|
+
});
|
|
144
|
+
ctx.registerCommand({
|
|
145
|
+
name: "peter",
|
|
146
|
+
description: "Peter Parker orchestrator — run a task through the review loop",
|
|
147
|
+
async handler(args, ctx) {
|
|
148
|
+
if (!args.trim()) {
|
|
149
|
+
ctx.ui.notify("Usage: /peter <task description>", { level: "info" });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const task = {
|
|
153
|
+
id: `peter-${Date.now()}`,
|
|
154
|
+
prompt: args.trim(),
|
|
155
|
+
source: "manual",
|
|
156
|
+
};
|
|
157
|
+
ctx.ui.notify(`Starting Peter Parker loop for: ${args.trim().slice(0, 60)}`, { level: "info" });
|
|
158
|
+
await runReviewLoop(ctx, task);
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=peter-parker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peter-parker.js","sourceRoot":"","sources":["../extensions/peter-parker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAqB,MAAM,iBAAiB,CAAA;AAkBpE,MAAM,cAAc,GAAG,CAAC,CAAA;AACxB,IAAI,WAAW,GAAG,EAAE,CAAA;AACpB,IAAI,aAAa,GAAG,cAAc,CAAA;AAClC,IAAI,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAA;AAExD,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAA;QAClD,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAc,EACd,IAAgB,EAChB,aAAqB;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,KAAK;YACf,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,QAAQ;SACT,CAAA;QAED,GAAG,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QAE1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;gBAC9B,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QAC5F,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QAEhG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACvD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAEjD,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,IAAI,EAAE,CAAA;YACX,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAc,EAAE,IAAgB;IAC3D,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAErD,IAAI,SAAS,GAAG,aAAa,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,uBAAuB,aAAa,sBAAsB,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;QACpF,MAAM,eAAe,CAAC,GAAG,EAAE,sBAAsB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,CAAA;QAClG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChC,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAmB;QACjC,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,SAAS;QACT,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACzC,QAAQ,EAAE;oBACR,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,WAAW,EAAE,KAAK;oBAClB,KAAK,EAAE,OAAO;iBACf;gBACD,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,yBAAyB;gBAC/B,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAA;YACF,UAAU,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,eAAe,EAAE,cAAc,EAAE,UAAU,CAAC,cAAc,EAAE,CAAA;YAExG,IAAI,UAAU,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBAC5C,GAAG,CAAC,GAAG,CAAC,6CAA6C,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;gBACvE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAChC,OAAM;YACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IACzC,MAAM,eAAe,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;IAEjH,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;IACvG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,CAAA;IAE3D,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;IAChE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IAEzC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,+BAA+B,SAAS,eAAe,EAAE,MAAM,CAAC,CAAA;QACxE,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,CAAC,GAAG,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;QACzF,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAc,EAAE,MAAiB;IACtE,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAA;IACrC,aAAa,GAAG,MAAM,CAAC,EAAE,EAAE,oBAAoB,IAAI,cAAc,CAAA;IAEjE,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,IAAgE,CAAA;QAC9E,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM;YAAE,OAAM;QAEpD,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,KAAK,CAAC,MAAM;YAChB,MAAM,EAAE,gCAAgC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnE,MAAM,EAAE,aAAa;SACtB,CAAA;QACD,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,IAA6D,CAAA;QAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAM;QAE3B,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;YACtC,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAA;QACD,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAwC,CAAA;QACtD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAM;QAEzB,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;YACpC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,gBAAgB;SACzB,CAAA;QACD,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,gEAAgE;QAC7E,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kCAAkC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;gBACpE,OAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAe;gBACvB,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;gBACnB,MAAM,EAAE,QAAQ;aACjB,CAAA;YACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC/F,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pivot Tool Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers jfl_pivot tool and /pivot command.
|
|
5
|
+
* Checkpoints current work to journals/memory without ending the session.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Pivot tool — flush context to durable stores, stay on same branch
|
|
8
|
+
*/
|
|
9
|
+
import type { PiContext } from "./types.js";
|
|
10
|
+
export declare function setupPivotTool(ctx: PiContext): void;
|
|
11
|
+
//# sourceMappingURL=pivot-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pivot-tool.d.ts","sourceRoot":"","sources":["../extensions/pivot-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG3C,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CA8CnD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pivot Tool Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers jfl_pivot tool and /pivot command.
|
|
5
|
+
* Checkpoints current work to journals/memory without ending the session.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Pivot tool — flush context to durable stores, stay on same branch
|
|
8
|
+
*/
|
|
9
|
+
import { pivot } from "./session.js";
|
|
10
|
+
export function setupPivotTool(ctx) {
|
|
11
|
+
ctx.registerTool({
|
|
12
|
+
name: "jfl_pivot",
|
|
13
|
+
description: "Checkpoint current work — commit, write pivot journal entry, index memory. " +
|
|
14
|
+
"Stays on the same branch. Use when switching topics or the context window is full.",
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: "object",
|
|
17
|
+
properties: {
|
|
18
|
+
summary: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Summary of what was being worked on (required for good handoff)",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
required: ["summary"],
|
|
24
|
+
},
|
|
25
|
+
async handler(args) {
|
|
26
|
+
const result = await pivot(ctx, args.summary);
|
|
27
|
+
if (!result.ok) {
|
|
28
|
+
return "Pivot failed. Work is still safe on the current branch.";
|
|
29
|
+
}
|
|
30
|
+
const lines = [
|
|
31
|
+
`Pivot #${result.pivotNumber} complete.`,
|
|
32
|
+
result.committed ? `Committed: ${result.commitHash} (${result.filesChanged} files)` : "No uncommitted changes.",
|
|
33
|
+
`Journal entry written.`,
|
|
34
|
+
result.indexed ? "Memory indexed." : "Memory index skipped (hub unavailable).",
|
|
35
|
+
"",
|
|
36
|
+
"Context has been saved. Ready for a new topic.",
|
|
37
|
+
];
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
ctx.registerCommand({
|
|
42
|
+
name: "pivot",
|
|
43
|
+
description: "Checkpoint current work and reset context — same branch, no restart hooks",
|
|
44
|
+
async handler(args, ctx) {
|
|
45
|
+
const summary = args || "Topic transition";
|
|
46
|
+
const result = await pivot(ctx, summary);
|
|
47
|
+
if (result.ok) {
|
|
48
|
+
ctx.ui.notify(`Pivot #${result.pivotNumber} saved. Ready for new topic.`, { level: "info" });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
ctx.ui.notify("Pivot failed — work is still safe on current branch.", { level: "warn" });
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=pivot-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pivot-tool.js","sourceRoot":"","sources":["../extensions/pivot-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,MAAM,UAAU,cAAc,CAAC,GAAc;IAC3C,GAAG,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,6EAA6E;YAC7E,oFAAoF;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iEAAiE;iBAC/E;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,KAAK,CAAC,OAAO,CAAC,IAA0B;YACtC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,yDAAyD,CAAA;YAClE,CAAC;YACD,MAAM,KAAK,GAAG;gBACZ,UAAU,MAAM,CAAC,WAAW,YAAY;gBACxC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,SAAS,CAAC,CAAC,CAAC,yBAAyB;gBAC/G,wBAAwB;gBACxB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,yCAAyC;gBAC9E,EAAE;gBACF,gDAAgD;aACjD,CAAA;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;KACF,CAAC,CAAA;IAEF,GAAG,CAAC,eAAe,CAAC;QAClB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2EAA2E;QACxF,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAAA;YAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YACxC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,WAAW,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC9F,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sDAAsD,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC1F,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Head Tool
|
|
3
|
+
*
|
|
4
|
+
* Exposes the RL policy head to the agent as a tool. The agent can score
|
|
5
|
+
* candidate actions before executing them — "should I fix this test or
|
|
6
|
+
* refactor that module?" — and get a predicted reward delta.
|
|
7
|
+
*
|
|
8
|
+
* Also registers /policy command to show policy head stats and rank
|
|
9
|
+
* ad-hoc proposals interactively.
|
|
10
|
+
*
|
|
11
|
+
* @purpose Pi tool for RL policy head — score candidate actions, rank proposals
|
|
12
|
+
*/
|
|
13
|
+
import type { PiContext, JflConfig } from "./types.js";
|
|
14
|
+
export declare function setupPolicyHeadTool(ctx: PiContext, _config: JflConfig): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=policy-head-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-head-tool.d.ts","sourceRoot":"","sources":["../extensions/policy-head-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA6CtD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwN3F"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Head Tool
|
|
3
|
+
*
|
|
4
|
+
* Exposes the RL policy head to the agent as a tool. The agent can score
|
|
5
|
+
* candidate actions before executing them — "should I fix this test or
|
|
6
|
+
* refactor that module?" — and get a predicted reward delta.
|
|
7
|
+
*
|
|
8
|
+
* Also registers /policy command to show policy head stats and rank
|
|
9
|
+
* ad-hoc proposals interactively.
|
|
10
|
+
*
|
|
11
|
+
* @purpose Pi tool for RL policy head — score candidate actions, rank proposals
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "fs";
|
|
14
|
+
import { join } from "path";
|
|
15
|
+
import { jflImport } from "./jfl-resolve.js";
|
|
16
|
+
import { emitCustomEvent } from "./map-bridge.js";
|
|
17
|
+
let projectRoot = "";
|
|
18
|
+
function getWeightsInfo() {
|
|
19
|
+
const weightsPath = join(projectRoot, ".jfl", "policy-weights.json");
|
|
20
|
+
if (!existsSync(weightsPath))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(weightsPath, "utf-8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function getPolicyHead() {
|
|
30
|
+
try {
|
|
31
|
+
// @ts-ignore — resolved from jfl package at runtime
|
|
32
|
+
const { PolicyHeadInference } = await jflImport("policy-head");
|
|
33
|
+
return new PolicyHeadInference(projectRoot);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function getTrainingBuffer() {
|
|
40
|
+
try {
|
|
41
|
+
// @ts-ignore — resolved from jfl package at runtime
|
|
42
|
+
const { TrainingBuffer } = await jflImport("training-buffer");
|
|
43
|
+
return new TrainingBuffer(projectRoot);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function setupPolicyHeadTool(ctx, _config) {
|
|
50
|
+
projectRoot = ctx.session.projectRoot;
|
|
51
|
+
ctx.registerTool({
|
|
52
|
+
name: "jfl_policy_score",
|
|
53
|
+
description: "Score a candidate action using the RL policy head. Returns predicted reward delta to help decide which action to take next. Requires trained policy weights (.jfl/policy-weights.json).",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
action_type: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "Type of action",
|
|
60
|
+
enum: ["fix", "refactor", "feature", "test", "config", "experiment"],
|
|
61
|
+
},
|
|
62
|
+
description: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "What the action does (1-2 sentences)",
|
|
65
|
+
},
|
|
66
|
+
files: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Comma-separated list of files affected",
|
|
69
|
+
},
|
|
70
|
+
scope: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Scope of change",
|
|
73
|
+
enum: ["small", "medium", "large"],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
required: ["action_type", "description"],
|
|
77
|
+
},
|
|
78
|
+
async handler(input) {
|
|
79
|
+
const { action_type, description, files, scope, } = input;
|
|
80
|
+
const policyHead = await getPolicyHead();
|
|
81
|
+
if (!policyHead || !policyHead.isLoaded) {
|
|
82
|
+
return "Policy head not available. No trained weights found at .jfl/policy-weights.json. Run `jfl eval train` to train the policy head from existing training tuples.";
|
|
83
|
+
}
|
|
84
|
+
const tb = await getTrainingBuffer();
|
|
85
|
+
const entries = tb ? tb.read() : [];
|
|
86
|
+
const recentDeltas = entries.slice(-10).map((e) => e.reward.composite_delta);
|
|
87
|
+
const state = {
|
|
88
|
+
composite_score: entries.length > 0
|
|
89
|
+
? entries[entries.length - 1].reward.composite_delta + entries[entries.length - 1].state.composite_score
|
|
90
|
+
: 0,
|
|
91
|
+
dimension_scores: {},
|
|
92
|
+
tests_passing: 0,
|
|
93
|
+
tests_total: 0,
|
|
94
|
+
trajectory_length: entries.length,
|
|
95
|
+
recent_deltas: recentDeltas,
|
|
96
|
+
agent: "pi-agent",
|
|
97
|
+
};
|
|
98
|
+
const action = {
|
|
99
|
+
type: action_type,
|
|
100
|
+
description,
|
|
101
|
+
files_affected: files ? files.split(",").map(f => f.trim()) : [],
|
|
102
|
+
scope: (scope || "medium"),
|
|
103
|
+
branch: ctx.session.branch,
|
|
104
|
+
};
|
|
105
|
+
try {
|
|
106
|
+
const predicted = await policyHead.predictReward(state, action);
|
|
107
|
+
const stats = policyHead.stats;
|
|
108
|
+
await emitCustomEvent(ctx, "policy:scored", {
|
|
109
|
+
action_type,
|
|
110
|
+
description: description.slice(0, 80),
|
|
111
|
+
predicted_reward: predicted,
|
|
112
|
+
});
|
|
113
|
+
const lines = [
|
|
114
|
+
`Predicted reward delta: ${predicted >= 0 ? "+" : ""}${predicted.toFixed(4)}`,
|
|
115
|
+
`Recommendation: ${predicted > 0.01 ? "PROCEED — positive expected outcome" : predicted > -0.005 ? "NEUTRAL — marginal expected impact" : "SKIP — negative expected outcome"}`,
|
|
116
|
+
"",
|
|
117
|
+
`Policy head stats:`,
|
|
118
|
+
` Trained on: ${stats?.trained_on ?? "?"} tuples`,
|
|
119
|
+
` Direction accuracy: ${stats?.direction_accuracy ? (stats.direction_accuracy * 100).toFixed(1) + "%" : "?"}`,
|
|
120
|
+
` Rank correlation: ${stats?.rank_correlation?.toFixed(3) ?? "?"}`,
|
|
121
|
+
];
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return `Policy head inference failed: ${err}. Ensure STRATUS_API_KEY is set for embedding generation.`;
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
ctx.registerTool({
|
|
130
|
+
name: "jfl_policy_rank",
|
|
131
|
+
description: "Rank multiple candidate actions by predicted reward. Pass 2-5 actions as JSON array. Returns ranked list with predicted deltas.",
|
|
132
|
+
inputSchema: {
|
|
133
|
+
type: "object",
|
|
134
|
+
properties: {
|
|
135
|
+
actions: {
|
|
136
|
+
type: "string",
|
|
137
|
+
description: 'JSON array of actions, each with: {"type": "fix|refactor|feature|test|config|experiment", "description": "what it does", "files": ["file1.ts"], "scope": "small|medium|large"}',
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
required: ["actions"],
|
|
141
|
+
},
|
|
142
|
+
async handler(input) {
|
|
143
|
+
const { actions: actionsStr } = input;
|
|
144
|
+
const policyHead = await getPolicyHead();
|
|
145
|
+
if (!policyHead || !policyHead.isLoaded) {
|
|
146
|
+
return "Policy head not available. No trained weights at .jfl/policy-weights.json.";
|
|
147
|
+
}
|
|
148
|
+
let candidates;
|
|
149
|
+
try {
|
|
150
|
+
candidates = JSON.parse(actionsStr);
|
|
151
|
+
if (!Array.isArray(candidates) || candidates.length < 2) {
|
|
152
|
+
return "Provide at least 2 actions as a JSON array.";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return "Invalid JSON. Provide a JSON array of action objects.";
|
|
157
|
+
}
|
|
158
|
+
const tb = await getTrainingBuffer();
|
|
159
|
+
const entries = tb ? tb.read() : [];
|
|
160
|
+
const state = {
|
|
161
|
+
composite_score: entries.length > 0
|
|
162
|
+
? entries[entries.length - 1].reward.composite_delta + entries[entries.length - 1].state.composite_score
|
|
163
|
+
: 0,
|
|
164
|
+
dimension_scores: {},
|
|
165
|
+
tests_passing: 0,
|
|
166
|
+
tests_total: 0,
|
|
167
|
+
trajectory_length: entries.length,
|
|
168
|
+
recent_deltas: entries.slice(-10).map((e) => e.reward.composite_delta),
|
|
169
|
+
agent: "pi-agent",
|
|
170
|
+
};
|
|
171
|
+
const rlActions = candidates.map(c => ({
|
|
172
|
+
type: (c.type || "feature"),
|
|
173
|
+
description: c.description,
|
|
174
|
+
files_affected: c.files || [],
|
|
175
|
+
scope: (c.scope || "medium"),
|
|
176
|
+
branch: ctx.session.branch,
|
|
177
|
+
}));
|
|
178
|
+
try {
|
|
179
|
+
const ranked = await policyHead.rankActions(state, rlActions);
|
|
180
|
+
await emitCustomEvent(ctx, "policy:ranked", {
|
|
181
|
+
count: ranked.length,
|
|
182
|
+
top: ranked[0]?.action.description.slice(0, 60),
|
|
183
|
+
});
|
|
184
|
+
const lines = ["Ranked actions (best first):", ""];
|
|
185
|
+
for (const r of ranked) {
|
|
186
|
+
const sign = r.predictedReward >= 0 ? "+" : "";
|
|
187
|
+
lines.push(` #${r.rank} [${sign}${r.predictedReward.toFixed(4)}] ${r.action.type}: ${r.action.description.slice(0, 80)}`);
|
|
188
|
+
}
|
|
189
|
+
return lines.join("\n");
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
return `Ranking failed: ${err}`;
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
ctx.registerCommand({
|
|
197
|
+
name: "policy",
|
|
198
|
+
description: "Show policy head status and training buffer stats",
|
|
199
|
+
async handler(_args, ctx) {
|
|
200
|
+
const weights = getWeightsInfo();
|
|
201
|
+
const tb = await getTrainingBuffer();
|
|
202
|
+
const stats = tb ? tb.stats() : null;
|
|
203
|
+
const lines = [];
|
|
204
|
+
if (weights) {
|
|
205
|
+
lines.push("Policy Head: LOADED", ` Trained on: ${weights.trained_on} tuples`, ` Direction accuracy: ${(weights.direction_accuracy * 100).toFixed(1)}%`, ` Rank correlation: ${weights.rank_correlation.toFixed(3)}`, "");
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
lines.push("Policy Head: NOT LOADED (no .jfl/policy-weights.json)", "");
|
|
209
|
+
}
|
|
210
|
+
if (stats) {
|
|
211
|
+
lines.push(`Training Buffer: ${stats.total} tuples`, ` Avg reward: ${stats.avgReward.toFixed(4)}`, ` Improvement rate: ${(stats.improvedRate * 100).toFixed(1)}%`, ` By agent: ${Object.entries(stats.byAgent).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`, ` By source: ${Object.entries(stats.bySource).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
lines.push("Training Buffer: empty or unavailable");
|
|
215
|
+
}
|
|
216
|
+
ctx.ui.notify(lines.join("\n"), { level: "info" });
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=policy-head-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-head-tool.js","sourceRoot":"","sources":["../extensions/policy-head-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portfolio Bridge Extension
|
|
3
|
+
*
|
|
4
|
+
* Handles cross-GTM coordination: phoneHome on session end, journal sync to parent,
|
|
5
|
+
* and eval scores propagated to portfolio hub for cross-GTM RL training.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Portfolio-GTM coordination — phoneHome, journal sync, eval propagation
|
|
8
|
+
*/
|
|
9
|
+
import type { PiContext, JflConfig } from "./types.js";
|
|
10
|
+
export declare function setupPortfolioBridge(ctx: PiContext, config: JflConfig): Promise<void>;
|
|
11
|
+
export declare function onPortfolioShutdown(ctx: PiContext): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=portfolio-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-bridge.d.ts","sourceRoot":"","sources":["../extensions/portfolio-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA0DtD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3F;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portfolio Bridge Extension
|
|
3
|
+
*
|
|
4
|
+
* Handles cross-GTM coordination: phoneHome on session end, journal sync to parent,
|
|
5
|
+
* and eval scores propagated to portfolio hub for cross-GTM RL training.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Portfolio-GTM coordination — phoneHome, journal sync, eval propagation
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from "fs";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
import { emitCustomEvent } from "./map-bridge.js";
|
|
12
|
+
import { jflImport } from "./jfl-resolve.js";
|
|
13
|
+
let projectRoot = "";
|
|
14
|
+
let portfolioParent = null;
|
|
15
|
+
async function phoneHome(ctx) {
|
|
16
|
+
if (!portfolioParent || !existsSync(portfolioParent))
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
const { phoneHomeToPortfolio } = await jflImport("service-gtm");
|
|
20
|
+
await phoneHomeToPortfolio(projectRoot);
|
|
21
|
+
ctx.log("Portfolio phoneHome complete", "debug");
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
ctx.log(`Portfolio phoneHome failed: ${err}`, "debug");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function syncJournalEntry(ctx, entry) {
|
|
28
|
+
if (!portfolioParent || !existsSync(portfolioParent))
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const { writeSyncToParent } = await jflImport("service-gtm");
|
|
32
|
+
await writeSyncToParent(projectRoot, entry);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
ctx.log(`Journal sync to parent failed: ${err}`, "debug");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function propagateEvalToPortfolio(ctx, evalData) {
|
|
39
|
+
if (!portfolioParent)
|
|
40
|
+
return;
|
|
41
|
+
const portfolioConfigPath = join(portfolioParent, ".jfl", "context-hub.port");
|
|
42
|
+
if (!existsSync(portfolioConfigPath))
|
|
43
|
+
return;
|
|
44
|
+
try {
|
|
45
|
+
const port = readFileSync(portfolioConfigPath, "utf-8").trim();
|
|
46
|
+
const portfolioHub = `http://localhost:${port}`;
|
|
47
|
+
const tokenPath = join(portfolioParent, ".jfl", "context-hub.token");
|
|
48
|
+
const token = existsSync(tokenPath) ? readFileSync(tokenPath, "utf-8").trim() : null;
|
|
49
|
+
await fetch(`${portfolioHub}/api/events`, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: {
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({
|
|
56
|
+
type: "eval:scored",
|
|
57
|
+
source: projectRoot,
|
|
58
|
+
data: evalData,
|
|
59
|
+
ts: new Date().toISOString(),
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch { }
|
|
64
|
+
}
|
|
65
|
+
export async function setupPortfolioBridge(ctx, config) {
|
|
66
|
+
projectRoot = ctx.session.projectRoot;
|
|
67
|
+
portfolioParent = config.portfolio_parent ?? null;
|
|
68
|
+
if (!portfolioParent)
|
|
69
|
+
return;
|
|
70
|
+
ctx.on("map:journal:entry", (data) => syncJournalEntry(ctx, data));
|
|
71
|
+
ctx.on("map:eval:scored", (data) => propagateEvalToPortfolio(ctx, data));
|
|
72
|
+
ctx.on("map:portfolio:directive", async (data) => {
|
|
73
|
+
const directive = data;
|
|
74
|
+
ctx.log(`Portfolio directive received: ${directive.action}`, "info");
|
|
75
|
+
await emitCustomEvent(ctx, "portfolio:directive:received", directive);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export async function onPortfolioShutdown(ctx) {
|
|
79
|
+
await phoneHome(ctx);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=portfolio-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-bridge.js","sourceRoot":"","sources":["../extensions/portfolio-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Skills Bridge
|
|
3
|
+
*
|
|
4
|
+
* Scans .claude/skills/ for service-type skills (generated during jfl init
|
|
5
|
+
* service onboarding) and registers them as Pi commands + tools.
|
|
6
|
+
* This gives Pi parity with Claude Code's service agent access.
|
|
7
|
+
*
|
|
8
|
+
* Service skills in .claude/skills/ have frontmatter `type: service` and
|
|
9
|
+
* include commands like status, logs, start, stop, restart, health.
|
|
10
|
+
*
|
|
11
|
+
* @purpose Bridge .claude/skills/ service agents into Pi sessions
|
|
12
|
+
*/
|
|
13
|
+
import type { PiContext, JflConfig } from "./types.js";
|
|
14
|
+
export declare function setupServiceSkills(ctx: PiContext, _config: JflConfig): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=service-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-skills.d.ts","sourceRoot":"","sources":["../extensions/service-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAgJtD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D1F"}
|