@fiale-plus/pi-rogue 0.2.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/README.md +50 -0
- package/node_modules/@fiale-plus/pi-core/README.md +13 -0
- package/node_modules/@fiale-plus/pi-core/package.json +25 -0
- package/node_modules/@fiale-plus/pi-core/src/context-broker.ts +109 -0
- package/node_modules/@fiale-plus/pi-core/src/index.ts +5 -0
- package/node_modules/@fiale-plus/pi-core/src/paths.ts +36 -0
- package/node_modules/@fiale-plus/pi-core/src/risk.test.ts +129 -0
- package/node_modules/@fiale-plus/pi-core/src/risk.ts +97 -0
- package/node_modules/@fiale-plus/pi-core/src/storage.ts +39 -0
- package/node_modules/@fiale-plus/pi-core/src/text.test.ts +36 -0
- package/node_modules/@fiale-plus/pi-core/src/text.ts +14 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/README.md +59 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/advisor/index.ts +1 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/assets/binary-gate-model.json +24026 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/package.json +50 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/skills/advisor/SKILL.md +51 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/binary-gate-features.test.ts +19 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/binary-gate-features.ts +248 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/binary-gate.test.ts +66 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/completions.test.ts +28 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/completions.ts +79 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/extension.test.ts +364 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/extension.ts +1677 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/index.ts +3 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/internal.ts +63 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/loop-convergence.test.ts +512 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/preflight-signals.test.ts +22 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/preflight-signals.ts +21 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/router.test.ts +126 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/router.ts +580 -0
- package/node_modules/@fiale-plus/pi-rogue-advisor/src/state-versioning.test.ts +227 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/README.md +53 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/package.json +31 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/extension.test.ts +749 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/extension.ts +818 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/file.ts +191 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/index.test.ts +302 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/index.ts +369 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/sqlite.test.ts +122 -0
- package/node_modules/@fiale-plus/pi-rogue-context-broker/src/sqlite.ts +561 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/README.md +56 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/orchestration/index.ts +1 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/package.json +44 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/skills/orchestration/SKILL.md +44 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/advisor-checkins.test.ts +142 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/advisor-checkins.ts +102 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/autoresearch-state.ts +70 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/autoresearch.test.ts +143 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/autoresearch.ts +139 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/completions.test.ts +23 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/completions.ts +53 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/extension.ts +23 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/goal-resolution.ts +36 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/goal.test.ts +182 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/goal.ts +232 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/index.ts +1 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/internal.ts +98 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/loop.ts +274 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/novelty-guard.test.ts +35 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/novelty-guard.ts +145 -0
- package/node_modules/@fiale-plus/pi-rogue-orchestration/src/state.ts +24 -0
- package/package.json +51 -0
- package/src/context-broker-file.ts +1 -0
- package/src/context-broker-sqlite.ts +1 -0
- package/src/context-broker.ts +1 -0
- package/src/extension.test.ts +68 -0
- package/src/extension.ts +27 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { formatAdvisorDisplay, heuristicRoute, routeNote, shouldQueryClassifier, summarizeRoute, type AdvisorRouteInput } from "./router.js";
|
|
3
|
+
|
|
4
|
+
describe("advisor router heuristics", () => {
|
|
5
|
+
it("keeps tiny edits in continue mode", () => {
|
|
6
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "fix a typo in README" };
|
|
7
|
+
const route = heuristicRoute(input);
|
|
8
|
+
|
|
9
|
+
expect(route.label).toBe("continue");
|
|
10
|
+
expect(route.preflight).toBe("off");
|
|
11
|
+
expect(route.review).toBe("off");
|
|
12
|
+
expect(route.escalate).toBe(false);
|
|
13
|
+
expect(route.safety).toBe(false);
|
|
14
|
+
expect(shouldQueryClassifier(route)).toBe(false);
|
|
15
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: continue, reason: [a-z0-9 ,.'-]+\]$/);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("escalates complex architecture work", () => {
|
|
19
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "need to refactor the architecture and tradeoffs" };
|
|
20
|
+
const route = heuristicRoute(input);
|
|
21
|
+
|
|
22
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
23
|
+
expect(route.preflight).toBe("full");
|
|
24
|
+
expect(route.review).toBe("light");
|
|
25
|
+
expect(route.escalate).toBe(true);
|
|
26
|
+
expect(summarizeRoute(route)).toContain("preflight:escalate_to_advisor");
|
|
27
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: review, reason: [a-z0-9 ,.'-]+\]$/);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("escalates strategy and decision prompts", () => {
|
|
31
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "does it make sense to buy 3x usage 2x higher sustained speed? what would you choose as a strategy" };
|
|
32
|
+
const route = heuristicRoute(input);
|
|
33
|
+
|
|
34
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
35
|
+
expect(route.escalate).toBe(true);
|
|
36
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: review, reason: [a-z0-9 ,.'-]+\]$/);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("flags safety-sensitive prompts", () => {
|
|
40
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "run rm -rf on prod" };
|
|
41
|
+
const route = heuristicRoute(input);
|
|
42
|
+
|
|
43
|
+
expect(route.safety).toBe(true);
|
|
44
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
45
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: review, reason: [a-z0-9 ,.'-]+\]$/);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("does not treat historical token mentions as safety escalation", () => {
|
|
49
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "We previously had HF token rotation and forgot to update this thread" };
|
|
50
|
+
const route = heuristicRoute(input);
|
|
51
|
+
|
|
52
|
+
expect(route.safety).toBe(false);
|
|
53
|
+
expect(route.label).not.toBe("escalate_to_advisor");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("does not escalate bare token mentions", () => {
|
|
57
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "token" };
|
|
58
|
+
const route = heuristicRoute(input);
|
|
59
|
+
|
|
60
|
+
expect(route.safety).toBe(false);
|
|
61
|
+
expect(route.label).not.toBe("escalate_to_advisor");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("keeps non-token safety indicators active", () => {
|
|
65
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "run sudo cat the token file" };
|
|
66
|
+
const route = heuristicRoute(input);
|
|
67
|
+
|
|
68
|
+
expect(route.safety).toBe(true);
|
|
69
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("escalates sensitive token operations", () => {
|
|
73
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "rotate the leaked GitHub token immediately" };
|
|
74
|
+
const route = heuristicRoute(input);
|
|
75
|
+
|
|
76
|
+
expect(route.safety).toBe(true);
|
|
77
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("keeps exfiltration-sensitive token mentions on safety path", () => {
|
|
81
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "exfiltrate the GitHub token" };
|
|
82
|
+
const route = heuristicRoute(input);
|
|
83
|
+
|
|
84
|
+
expect(route.safety).toBe(true);
|
|
85
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("flags inflected token operations as safety-sensitive", () => {
|
|
89
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "rotating the GitHub token and revoking the old one" };
|
|
90
|
+
const route = heuristicRoute(input);
|
|
91
|
+
|
|
92
|
+
expect(route.safety).toBe(true);
|
|
93
|
+
expect(route.label).toBe("escalate_to_advisor");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("reviews incomplete work as not done", () => {
|
|
97
|
+
const input: AdvisorRouteInput = { phase: "review", text: "still incomplete, tests fail", failed: true };
|
|
98
|
+
const route = heuristicRoute(input);
|
|
99
|
+
|
|
100
|
+
expect(route.label).toBe("not_done");
|
|
101
|
+
expect(route.review).toBe("strict");
|
|
102
|
+
expect(route.escalate).toBe(true);
|
|
103
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: review, reason: [a-z0-9 ,.'-]+\]$/);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("abstains when review signal is weak", () => {
|
|
107
|
+
const input: AdvisorRouteInput = { phase: "review", text: "looks okay" };
|
|
108
|
+
const route = heuristicRoute(input);
|
|
109
|
+
|
|
110
|
+
expect(route.label).toBe("abstain");
|
|
111
|
+
expect(route.review).toBe("off");
|
|
112
|
+
expect(shouldQueryClassifier(route)).toBe(true);
|
|
113
|
+
expect(routeNote(route)).toMatch(/^\[advisor:rules: defer, reason: [a-z0-9 ,.'-]+\]$/);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("tags model-routed notes explicitly", () => {
|
|
117
|
+
const input: AdvisorRouteInput = { phase: "preflight", text: "what would you choose as a strategy for this decision" };
|
|
118
|
+
const route = { ...heuristicRoute(input), source: "model" as const };
|
|
119
|
+
|
|
120
|
+
expect(routeNote(route)).toMatch(/^\[advisor:model: review, reason: [a-z0-9 ,.'-]+\]$/);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("formats llm advisor messages with the llm tag", () => {
|
|
124
|
+
expect(formatAdvisorDisplay("advisor:llm", "review", "All set and reviewed")).toBe("[advisor:llm: review, reason: all set and reviewed]");
|
|
125
|
+
});
|
|
126
|
+
});
|